From ac45dc9f59f3053586a396e3a724c3447ce3c76f Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Fri, 14 Mar 2014 04:14:03 +0100 Subject: [PATCH] Add client.maximized (a shortcut for ~_horizontal and ~_vertical) This also adds the signals `property::maximized`. Signed-off-by: Daniel Hahler --- luadoc/client.lua | 1 + objects/client.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- objects/client.h | 1 + 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/luadoc/client.lua b/luadoc/client.lua index 2e0c181c..9c62a1cf 100644 --- a/luadoc/client.lua +++ b/luadoc/client.lua @@ -31,6 +31,7 @@ module("client") -- @field above The client is above normal windows. -- @field below The client is below normal windows. -- @field fullscreen The client is fullscreen or not. +-- @field maximized The client is maximized (horizontally and vertically) or not. -- @field maximized_horizontal The client is maximized horizontally or not. -- @field maximized_vertical The client is maximized vertically or not. -- @field transient_for The client the window is transient for. diff --git a/objects/client.c b/objects/client.c index b36e26bd..9639e8a2 100644 --- a/objects/client.c +++ b/objects/client.c @@ -961,8 +961,7 @@ client_set_fullscreen(lua_State *L, int cidx, bool s) if(s) { /* remove any max state */ - client_set_maximized_horizontal(L, cidx, false); - client_set_maximized_vertical(L, cidx, false); + client_set_maximized(L, cidx, false); /* You can only be part of one of the special layers. */ client_set_below(L, cidx, false); client_set_above(L, cidx, false); @@ -979,6 +978,16 @@ client_set_fullscreen(lua_State *L, int cidx, bool s) } } +/** Get a clients maximized state (horizontally and vertically). + * \param c The client. + * \return The maximized state. + */ +static int +client_get_maximized(client_t *c) +{ + return c->maximized_horizontal && c->maximized_vertical; +} + /** Set a client horizontally|vertically maximized. * \param L The Lua VM state. * \param cidx The client index. @@ -995,9 +1004,12 @@ client_set_fullscreen(lua_State *L, int cidx, bool s) if(s) \ client_set_fullscreen(L, abs_cidx, false); \ lua_pushboolean(L, s); \ + int max_before = client_get_maximized(c); \ c->maximized_##type = s; \ luaA_object_emit_signal(L, abs_cidx, "request::maximized_" #type, 1); \ luaA_object_emit_signal(L, abs_cidx, "property::maximized_" #type, 0); \ + if(max_before != client_get_maximized(c)) \ + luaA_object_emit_signal(L, abs_cidx, "property::maximized", 0); \ stack_windows(); \ } \ } @@ -1005,6 +1017,18 @@ DO_FUNCTION_CLIENT_MAXIMIZED(vertical) DO_FUNCTION_CLIENT_MAXIMIZED(horizontal) #undef DO_FUNCTION_CLIENT_MAXIMIZED +/** Set a client maximized (horizontally and vertically). + * \param L The Lua VM state. + * \param cidx The client index. + * \param s Set or not the client maximized attribute. + */ +void +client_set_maximized(lua_State *L, int cidx, bool s) +{ + client_set_maximized_horizontal(L, cidx, s); + client_set_maximized_vertical(L, cidx, s); +} + /** Set a client above, or not. * \param L The Lua VM state. * \param cidx The client index. @@ -1680,6 +1704,13 @@ luaA_client_set_modal(lua_State *L, client_t *c) } static int +luaA_client_set_maximized(lua_State *L, client_t *c) +{ + client_set_maximized(L, -3, luaA_checkboolean(L, -1)); + return 0; +} + +static int luaA_client_set_maximized_horizontal(lua_State *L, client_t *c) { client_set_maximized_horizontal(L, -3, luaA_checkboolean(L, -1)); @@ -1790,6 +1821,13 @@ LUA_OBJECT_EXPORT_PROPERTY(client, client_t, maximized_horizontal, lua_pushboole LUA_OBJECT_EXPORT_PROPERTY(client, client_t, maximized_vertical, lua_pushboolean) static int +luaA_client_get_maximized(lua_State *L, client_t *c) +{ + lua_pushboolean(L, client_get_maximized(c)); + return 1; +} + +static int luaA_client_get_content(lua_State *L, client_t *c) { xcb_get_window_attributes_cookie_t cookie; @@ -2250,6 +2288,10 @@ client_class_setup(lua_State *L) NULL, (lua_class_propfunc_t) luaA_client_get_group_window, NULL); + luaA_class_add_property(&client_class, "maximized", + (lua_class_propfunc_t) luaA_client_set_maximized, + (lua_class_propfunc_t) luaA_client_get_maximized, + (lua_class_propfunc_t) luaA_client_set_maximized); luaA_class_add_property(&client_class, "maximized_horizontal", (lua_class_propfunc_t) luaA_client_set_maximized_horizontal, (lua_class_propfunc_t) luaA_client_get_maximized_horizontal, @@ -2332,6 +2374,7 @@ client_class_setup(lua_State *L) signal_add(&client_class.signals, "property::instance"); signal_add(&client_class.signals, "property::keys"); signal_add(&client_class.signals, "property::machine"); + signal_add(&client_class.signals, "property::maximized"); signal_add(&client_class.signals, "property::maximized_horizontal"); signal_add(&client_class.signals, "property::maximized_vertical"); signal_add(&client_class.signals, "property::minimized"); diff --git a/objects/client.h b/objects/client.h index 5375418f..f95618d1 100644 --- a/objects/client.h +++ b/objects/client.h @@ -150,6 +150,7 @@ void client_set_below(lua_State *, int, bool); void client_set_modal(lua_State *, int, bool); void client_set_ontop(lua_State *, int, bool); void client_set_fullscreen(lua_State *, int, bool); +void client_set_maximized(lua_State *, int, bool); void client_set_maximized_horizontal(lua_State *, int, bool); void client_set_maximized_vertical(lua_State *, int, bool); void client_set_minimized(lua_State *, int, bool); -- 2.11.4.GIT