diff --git a/objects/drawin.c b/objects/drawin.c index 0033aeec..6d9abccb 100644 --- a/objects/drawin.c +++ b/objects/drawin.c @@ -63,6 +63,7 @@ * @field window The X window id. * @field shape_bounding The drawin's bounding shape as a (native) cairo surface. * @field shape_clip The drawin's clip shape as a (native) cairo surface. + * @field shape_input The drawin's input shape as a (native) cairo surface. * @table drawin */ @@ -78,6 +79,10 @@ * @signal property::shape_clip */ +/** + * @signal property::shape_input + */ + /** * @signal property::border_width */ @@ -690,6 +695,45 @@ luaA_drawin_set_shape_clip(lua_State *L, drawin_t *drawin) return 0; } +/** Get the drawin's input shape. + * \param L The Lua VM state. + * \param drawin The drawin object. + * \return The number of elements pushed on stack. + */ +static int +luaA_drawin_get_shape_input(lua_State *L, drawin_t *drawin) +{ + cairo_surface_t *surf = xwindow_get_shape(drawin->window, XCB_SHAPE_SK_INPUT); + if (!surf) + return 0; + /* lua has to make sure to free the ref or we have a leak */ + lua_pushlightuserdata(L, surf); + return 1; +} + +/** Set the drawin's input shape. + * \param L The Lua VM state. + * \param drawin The drawin object. + * \return The number of elements pushed on stack. + */ +static int +luaA_drawin_set_shape_input(lua_State *L, drawin_t *drawin) +{ + cairo_surface_t *surf = NULL; + if(!lua_isnil(L, -1)) + surf = (cairo_surface_t *)lua_touserdata(L, -1); + + /* The drawin might have been resized to a larger size. Apply that. */ + drawin_apply_moveresize(drawin); + + xwindow_set_shape(drawin->window, + drawin->geometry.width + 2*drawin->border_width, + drawin->geometry.height + 2*drawin->border_width, + XCB_SHAPE_SK_INPUT, surf, -drawin->border_width); + luaA_object_emit_signal(L, -3, "property::shape_input", 0); + return 0; +} + void drawin_class_setup(lua_State *L) { @@ -758,6 +802,10 @@ drawin_class_setup(lua_State *L) (lua_class_propfunc_t) luaA_drawin_set_shape_clip, (lua_class_propfunc_t) luaA_drawin_get_shape_clip, (lua_class_propfunc_t) luaA_drawin_set_shape_clip); + luaA_class_add_property(&drawin_class, "shape_input", + (lua_class_propfunc_t) luaA_drawin_set_shape_input, + (lua_class_propfunc_t) luaA_drawin_get_shape_input, + (lua_class_propfunc_t) luaA_drawin_set_shape_input); } // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80