diff --git a/lib/awful/ewmh.lua b/lib/awful/ewmh.lua index 57bab35b3..ae34b6ba0 100644 --- a/lib/awful/ewmh.lua +++ b/lib/awful/ewmh.lua @@ -224,6 +224,7 @@ end local context_mapper = { maximized_vertical = "maximize_vertically", maximized_horizontal = "maximize_horizontally", + maximized = "maximize", fullscreen = "maximize" } diff --git a/lib/awful/titlebar.lua b/lib/awful/titlebar.lua index c055349e2..36863576e 100644 --- a/lib/awful/titlebar.lua +++ b/lib/awful/titlebar.lua @@ -460,13 +460,11 @@ end -- @param c The client for which the button is wanted. function titlebar.widget.maximizedbutton(c) local widget = titlebar.widget.button(c, "maximized", function(cl) - return cl.maximized_horizontal or cl.maximized_vertical + return cl.maximized end, function(cl, state) - cl.maximized_horizontal = not state - cl.maximized_vertical = not state + cl.maximized = not state end) - c:connect_signal("property::maximized_vertical", widget.update) - c:connect_signal("property::maximized_horizontal", widget.update) + c:connect_signal("property::maximized", widget.update) return widget end diff --git a/lib/awful/widget/tasklist.lua b/lib/awful/widget/tasklist.lua index eb0bffbac..fa773c351 100644 --- a/lib/awful/widget/tasklist.lua +++ b/lib/awful/widget/tasklist.lua @@ -453,6 +453,7 @@ function tasklist.new(screen, filter, buttons, style, update_function, base_widg capi.client.connect_signal("property::floating", u) capi.client.connect_signal("property::maximized_horizontal", u) capi.client.connect_signal("property::maximized_vertical", u) + capi.client.connect_signal("property::maximized", u) capi.client.connect_signal("property::minimized", u) capi.client.connect_signal("property::name", u) capi.client.connect_signal("property::icon_name", u) diff --git a/objects/client.c b/objects/client.c index 334bbc729..f38b25739 100644 --- a/objects/client.c +++ b/objects/client.c @@ -805,9 +805,16 @@ * @function set_newindex_miss_handler */ +typedef enum { + CLIENT_MAXIMIZED_NONE = 0 << 0, + CLIENT_MAXIMIZED_V = 1 << 0, + CLIENT_MAXIMIZED_H = 1 << 1, +} client_maximized_t; + static area_t titlebar_get_area(client_t *c, client_titlebar_t bar); static drawable_t *titlebar_get_drawable(lua_State *L, client_t *c, int cl_idx, client_titlebar_t bar); static void client_resize_do(client_t *c, area_t geometry); +static void client_set_maximized_common(lua_State *L, int cidx, bool s, const char* type, const int val); /** Collect a client. * \param L The Lua VM state. @@ -1948,38 +1955,68 @@ client_get_maximized(client_t *c) * \param cidx The client index. * \param s The maximized status. */ -#define DO_FUNCTION_CLIENT_MAXIMIZED(type) \ - void \ - client_set_maximized_##type(lua_State *L, int cidx, bool s) \ - { \ - client_t *c = luaA_checkudata(L, cidx, &client_class); \ - if(c->maximized_##type != s) \ - { \ - int abs_cidx = luaA_absindex(L, cidx); \ - int max_before = client_get_maximized(c); \ - c->maximized_##type = s; \ - lua_pushstring(L, "maximized_"#type);\ - luaA_object_emit_signal(L, abs_cidx, "request::geometry", 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(); \ - } \ - } -DO_FUNCTION_CLIENT_MAXIMIZED(vertical) -DO_FUNCTION_CLIENT_MAXIMIZED(horizontal) -#undef DO_FUNCTION_CLIENT_MAXIMIZED +void +client_set_maximized_common(lua_State *L, int cidx, bool s, const char* type, const int val) +{ + client_t *c = luaA_checkudata(L, cidx, &client_class); + + /* Store the current and next state on 2 bit */ + const client_maximized_t current = ( + (c->maximized_vertical ? CLIENT_MAXIMIZED_V : CLIENT_MAXIMIZED_NONE)| + (c->maximized_horizontal ? CLIENT_MAXIMIZED_H : CLIENT_MAXIMIZED_NONE) + ); + const client_maximized_t next = s ? val : CLIENT_MAXIMIZED_NONE; + + if(current != next) + { + int abs_cidx = luaA_absindex(L, cidx); + int max_before = client_get_maximized(c); + int h_before = c->maximized_horizontal; + int v_before = c->maximized_vertical; + + /*Update the client properties */ + c->maximized_horizontal = !!(next & CLIENT_MAXIMIZED_H); + c->maximized_vertical = !!(next & CLIENT_MAXIMIZED_V); + + /* Request the changes to be applied */ + lua_pushstring(L, type); + luaA_object_emit_signal(L, abs_cidx, "request::geometry", 1); + + /* Notify changes in the relevant properties */ + if (h_before != c->maximized_horizontal) + luaA_object_emit_signal(L, abs_cidx, "property::maximized_horizontal", 0); + if (v_before != c->maximized_vertical) + luaA_object_emit_signal(L, abs_cidx, "property::maximized_vertical", 0); + if(max_before != client_get_maximized(c)) + luaA_object_emit_signal(L, abs_cidx, "property::maximized", 0); + + stack_windows(); + } +} -/** 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); + return client_set_maximized_common( + L, cidx, s, "maximized", + CLIENT_MAXIMIZED_H | CLIENT_MAXIMIZED_V + ); +} + +void +client_set_maximized_horizontal(lua_State *L, int cidx, bool s) +{ + return client_set_maximized_common( + L, cidx, s, "maximized_horizontal", CLIENT_MAXIMIZED_H + ); +} + +void +client_set_maximized_vertical(lua_State *L, int cidx, bool s) +{ + return client_set_maximized_common( + L, cidx, s, "maximized_vertical", CLIENT_MAXIMIZED_V + ); } /** Set a client above, or not.