diff --git a/event.c b/event.c index f8a99ccb..4f2167f1 100644 --- a/event.c +++ b/event.c @@ -135,6 +135,7 @@ handle_event_configurerequest(XEvent * e) XWindowChanges wc; int old_screen; Tag **curtags; + return; if((c = get_client_bywin(globalconf.clients, ev->window))) { @@ -146,9 +147,9 @@ handle_event_configurerequest(XEvent * e) || curtags[0]->layout->arrange == layout_floating) { if(ev->value_mask & CWX) - c->rx = c->x = ev->x; + c->rx = c->x = ev->x - c->border; if(ev->value_mask & CWY) - c->ry = c->y = ev->y; + c->ry = c->y = ev->y - c->border; if(ev->value_mask & CWWidth) c->rw = c->w = ev->width; if(ev->value_mask & CWHeight) @@ -165,6 +166,7 @@ handle_event_configurerequest(XEvent * e) statusbar_draw(c->screen); } tag_client_with_rules(c); + c->isfloating = True; XMoveResizeWindow(e->xany.display, c->win, c->rx, c->ry, c->rw, c->rh); arrange(c->screen); } diff --git a/ewmh.c b/ewmh.c index 4dea9262..3b1ea099 100644 --- a/ewmh.c +++ b/ewmh.c @@ -26,6 +26,8 @@ #include "util.h" #include "tag.h" #include "focus.h" +#include "screen.h" +#include "layout.h" extern AwesomeConf globalconf; @@ -42,6 +44,7 @@ static Atom net_wm_name; static Atom net_wm_icon; static Atom net_wm_state; static Atom net_wm_state_sticky; +static Atom net_wm_state_fullscreen; static Atom utf8_string; @@ -66,12 +69,17 @@ static AtomItem AtomNames[] = { "_NET_WM_ICON", &net_wm_icon }, { "_NET_WM_STATE", &net_wm_state }, { "_NET_WM_STATE_STICKY", &net_wm_state_sticky }, + { "_NET_WM_STATE_FULLSCREEN", &net_wm_state_fullscreen }, { "UTF8_STRING", &utf8_string }, }; #define ATOM_NUMBER (sizeof(AtomNames)/sizeof(AtomItem)) +#define _NET_WM_STATE_REMOVE 0 +#define _NET_WM_STATE_ADD 1 +#define _NET_WM_STATE_TOGGLE 2 + void ewmh_init_atoms(void) { @@ -105,6 +113,7 @@ ewmh_set_supported_hints(int phys_screen) atom[i++] = net_wm_icon; atom[i++] = net_wm_state; atom[i++] = net_wm_state_sticky; + atom[i++] = net_wm_state_fullscreen; XChangeProperty(globalconf.display, RootWindow(globalconf.display, phys_screen), net_supported, XA_ATOM, 32, @@ -197,7 +206,7 @@ ewmh_update_net_active_window(int phys_screen) } static void -ewmh_process_state_atom(Client *c, Atom state) +ewmh_process_state_atom(Client *c, Atom state, int set) { if(state == net_wm_state_sticky) { @@ -205,6 +214,16 @@ ewmh_process_state_atom(Client *c, Atom state) for(tag = globalconf.screens[c->screen].tags; tag; tag = tag->next) tag_client(c, tag); } + else if(state == net_wm_state_fullscreen) + { + Area area = get_screen_area(c->screen, NULL, NULL); + /* reset max attribute */ + if(set == _NET_WM_STATE_REMOVE) + c->ismax = True; + else if(set == _NET_WM_STATE_ADD) + c->ismax = False; + client_maximize(c, area.x, area.y, area.width, area.height); + } } void @@ -221,9 +240,9 @@ ewmh_process_client_message(XClientMessageEvent *ev) { if((c = get_client_bywin(globalconf.clients, ev->window))) { - ewmh_process_state_atom(c, (Atom) ev->data.l[1]); + ewmh_process_state_atom(c, (Atom) ev->data.l[1], ev->data.l[0]); if(ev->data.l[2]) - ewmh_process_state_atom(c, (Atom) ev->data.l[2]); + ewmh_process_state_atom(c, (Atom) ev->data.l[2], ev->data.l[0]); } } } @@ -243,7 +262,7 @@ ewmh_check_client_hints(Client *c) state = (Atom *) data; for(i = 0; i < n; i++) - ewmh_process_state_atom(c, state[i]); + ewmh_process_state_atom(c, state[i], _NET_WM_STATE_ADD); XFree(data); } diff --git a/layout.c b/layout.c index 6fd60b80..caa9d824 100644 --- a/layout.c +++ b/layout.c @@ -252,26 +252,25 @@ uicb_tag_setlayout(int screen, char *arg) saveawesomeprops(screen); } -static void -maximize(int x, int y, int w, int h, int screen) +void +client_maximize(Client *c, int x, int y, int w, int h) { - Client *sel = globalconf.focus->client; - - if(!sel) - return; - - if((sel->ismax = !sel->ismax)) + if((c->ismax = !c->ismax)) { - sel->wasfloating = sel->isfloating; - sel->isfloating = True; - client_resize(sel, x, y, w, h, True, True); + c->oldborder = c->border; + c->border = 0; + c->wasfloating = c->isfloating; + c->isfloating = True; + client_resize(c, x, y, w, h, False, True); } - else if(sel->wasfloating) - client_resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True, False); + else if(c->wasfloating) + client_resize(c, c->rx, c->ry, c->rw, c->rh, True, False); else - sel->isfloating = False; + c->isfloating = False; - arrange(screen); + c->border = c->oldborder; + + arrange(c->screen); } /** Toggle maximize for client @@ -282,13 +281,14 @@ maximize(int x, int y, int w, int h, int screen) void uicb_client_togglemax(int screen, char *arg __attribute__ ((unused))) { + Client *sel = globalconf.focus->client; Area area = get_screen_area(screen, globalconf.screens[screen].statusbar, &globalconf.screens[screen].padding); - maximize(area.x, area.y, - area.width - 2 * globalconf.screens[screen].borderpx, - area.height - 2 * globalconf.screens[screen].borderpx, - screen); + if(sel) + client_maximize(sel, area.x, area.y, + area.width - 2 * globalconf.screens[screen].borderpx, + area.height - 2 * globalconf.screens[screen].borderpx); } /** Toggle vertical maximize for client @@ -305,11 +305,9 @@ uicb_client_toggleverticalmax(int screen, char *arg __attribute__ ((unused))) &globalconf.screens[screen].padding); if(sel) - maximize(sel->x, - area.y, - sel->w, - area.height - 2 * globalconf.screens[screen].borderpx, - screen); + client_maximize(sel, sel->x, area.y, + sel->w, + area.height - 2 * globalconf.screens[screen].borderpx); } @@ -327,11 +325,9 @@ uicb_client_togglehorizontalmax(int screen, char *arg __attribute__ ((unused))) &globalconf.screens[screen].padding); if(sel) - maximize(area.x, - sel->y, - area.height - 2 * globalconf.screens[screen].borderpx, - sel->h, - screen); + client_maximize(sel, area.x, sel->y, + area.height - 2 * globalconf.screens[screen].borderpx, + sel->h); } /** Zoom client diff --git a/layout.h b/layout.h index a652dcca..8c7a422b 100644 --- a/layout.h +++ b/layout.h @@ -30,6 +30,7 @@ void arrange(int); void restack(int); void loadawesomeprops(int); void saveawesomeprops(int); +void client_maximize(Client *c, int, int, int, int); UICB_PROTO(uicb_client_focusnext); UICB_PROTO(uicb_client_focusprev);