diff -Naur evilwm-0.99.25.org/events.c evilwm-0.99.25/events.c --- evilwm-0.99.25.org/events.c 2006-04-26 12:53:10.000000000 -0600 +++ evilwm-0.99.25/events.c 2008-04-01 22:25:12.000000000 -0600 @@ -141,6 +141,9 @@ case KEY_FIX: fix_client(c); break; + case KEY_FULLSCREEN: + set_fullscreen(c); + break; #endif default: break; } @@ -235,6 +238,17 @@ } } +static void handle_client_message(XClientMessageEvent *e) { + Client *c = find_client(e->window); + + if (c) { + if (e->message_type == xa_net_wm_state) { + add_fullscreen(c); + set_fullscreen(c); + } + } +} + static void handle_unmap_event(XUnmapEvent *e) { Client *c = find_client(e->window); @@ -321,6 +335,8 @@ handle_configure_request(&ev.xconfigurerequest); break; case MapRequest: handle_map_request(&ev.xmaprequest); break; + case ClientMessage: + handle_client_message(&ev.xclient); break; #ifdef COLOURMAP case ColormapNotify: handle_colormap_change(&ev.xcolormap); break; diff -Naur evilwm-0.99.25.org/evilwm.h evilwm-0.99.25/evilwm.h --- evilwm-0.99.25.org/evilwm.h 2007-02-27 19:39:51.000000000 -0700 +++ evilwm-0.99.25/evilwm.h 2008-04-01 22:20:53.000000000 -0600 @@ -88,6 +88,11 @@ #define remove_sticky(c) c->sticky = 0 #define toggle_sticky(c) c->sticky = !c->sticky +#define is_fullscreen(c) (c->fullscreen) +#define add_fullscreen(c) c->fullscreen = 1 +#define remove_fullscreen(c) c->fullscreen = 0 +#define toggle_fullscreen(c) c->fullscreen = !c->fullscreen + #define discard_enter_events() do { \ XEvent dummy; \ XSync(dpy, False); \ @@ -134,6 +139,7 @@ #ifdef VWM int vdesk; int sticky; + int fullscreen; #endif int remove; /* set when client needs to be removed */ Client *next; @@ -149,6 +155,7 @@ #ifdef VWM int vdesk; int sticky; + int fullscreen; #endif Application *next; }; @@ -178,6 +185,7 @@ extern Atom xa_net_wm_desktop; extern Atom xa_net_wm_state; extern Atom xa_net_wm_state_sticky; +extern Atom xa_net_wm_state_fullscreen; #endif /* Things that affect user interaction */ @@ -209,6 +217,7 @@ void select_client(Client *c); #ifdef VWM void fix_client(Client *c); +void set_fullscreen(Client *c); #endif void remove_client(Client *c); void send_config(Client *c); diff -Naur evilwm-0.99.25.org/ewmh.c evilwm-0.99.25/ewmh.c --- evilwm-0.99.25.org/ewmh.c 2006-02-10 04:10:02.000000000 -0700 +++ evilwm-0.99.25/ewmh.c 2008-04-01 22:20:53.000000000 -0600 @@ -18,6 +18,8 @@ int i = 0; if (is_sticky(c)) state[i++] = xa_net_wm_state_sticky; + if (is_fullscreen(c)) + state[i++] = xa_net_wm_state_fullscreen; XChangeProperty(dpy, c->window, xa_net_wm_state, XA_ATOM, 32, PropModeReplace, (unsigned char *)&state, i); diff -Naur evilwm-0.99.25.org/keymap.h evilwm-0.99.25/keymap.h --- evilwm-0.99.25.org/keymap.h 2006-02-22 05:38:57.000000000 -0700 +++ evilwm-0.99.25/keymap.h 2008-04-01 22:20:53.000000000 -0600 @@ -17,7 +17,8 @@ #define KEY_MAXVERT XK_equal #define KEY_MAX XK_x #ifdef VWM -# define KEY_FIX XK_f +# define KEY_FIX XK_s +# define KEY_FULLSCREEN XK_f # define KEY_PREVDESK XK_Left # define KEY_NEXTDESK XK_Right #endif diff -Naur evilwm-0.99.25.org/main.c evilwm-0.99.25/main.c --- evilwm-0.99.25.org/main.c 2006-04-26 12:53:10.000000000 -0600 +++ evilwm-0.99.25/main.c 2008-04-01 22:20:53.000000000 -0600 @@ -33,6 +33,7 @@ Atom xa_net_wm_desktop; Atom xa_net_wm_state; Atom xa_net_wm_state_sticky; +Atom xa_net_wm_state_fullscreen; #endif /* Things that affect user interaction */ @@ -102,6 +103,7 @@ #ifdef VWM new->vdesk = -1; new->sticky = 0; + new->fullscreen = 0; #endif if ((tmp = strchr(argv[i], '/'))) { *(tmp++) = 0; @@ -131,6 +133,9 @@ } else if (!strcmp(argv[i], "-s")) { if (head_app) head_app->sticky = 1; + } else if (!strcmp(argv[i], "-f")) { + if (head_app) + head_app->fullscreen = 1; #endif } else if (!strcmp(argv[i], "-mask1") && i+1vdesk != -1) c->vdesk = a->vdesk; c->sticky = a->sticky; + c->fullscreen = a->fullscreen; #endif } a = a->next; @@ -187,6 +188,7 @@ } #ifdef VWM + c->vdesk = c->screen->vdesk; if ( (lprop = get_property(c->window, xa_net_wm_desktop, XA_CARDINAL, &nitems)) ) { if (nitems && valid_vdesk(lprop[0])) @@ -194,10 +196,13 @@ XFree(lprop); } remove_sticky(c); + remove_fullscreen(c); if ( (aprop = get_property(c->window, xa_net_wm_state, XA_ATOM, &nitems)) ) { for (i = 0; i < nitems; i++) { if (aprop[i] == xa_net_wm_state_sticky) add_sticky(c); + if (aprop[i] == xa_net_wm_state_fullscreen) + add_fullscreen(c); } XFree(aprop); } @@ -239,6 +244,9 @@ #else c->x = c->y = c->border; #endif + if (is_fullscreen(c)) + set_fullscreen(c); + send_config(c); } diff -Naur evilwm-0.99.25.org/screen.c evilwm-0.99.25/screen.c --- evilwm-0.99.25.org/screen.c 2006-04-26 12:53:10.000000000 -0600 +++ evilwm-0.99.25/screen.c 2008-04-01 22:20:53.000000000 -0600 @@ -328,6 +328,35 @@ } #ifdef VWM +void set_fullscreen(Client *c) { + if (is_fullscreen(c)) { + c->oldx=c->x; + c->oldy=c->y; + c->oldw=c->width; + c->oldh=c->height; + c->x=0; + c->y=0; + c->width = DisplayWidth(dpy, c->screen->screen); + c->height = DisplayHeight(dpy, c->screen->screen); + moveresize(c); + } else { + /* Restore previous geometry */ + if (c->oldx) { + c->x=c->oldx; + c->y=c->oldy; + c->width=c->oldw; + c->height=c->oldh; + c->oldx=0; + c->oldy=0; + c->oldw=0; + c->oldh=0; + moveresize(c); + } + } + toggle_fullscreen(c); + update_net_wm_state(c); +} + void hide(Client *c) { /* This will generate an unmap event. Tell event handler * to ignore it. */ @@ -453,7 +482,7 @@ KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, KEY_LOWER, KEY_ALTLOWER, KEY_INFO, KEY_MAXVERT, KEY_MAX, #ifdef VWM - KEY_FIX, KEY_PREVDESK, KEY_NEXTDESK, + KEY_FIX, KEY_FULLSCREEN, KEY_PREVDESK, KEY_NEXTDESK, XK_1, XK_2, XK_3, XK_4, XK_5, XK_6, XK_7, XK_8, #endif 0