Works on EWMH: add _NET_WM_STATE_FULLSCREEN management

This commit is contained in:
Martin Duquesnoy 2011-12-25 17:08:08 +01:00
parent 900847dcec
commit 6c75b86256
6 changed files with 68 additions and 7 deletions

View File

@ -982,9 +982,10 @@ client_moveresize(struct client *c, struct geo *g)
c->rgeo.x, c->rgeo.y,
c->rgeo.w, c->rgeo.h);
XMoveResizeWindow(W->dpy, c->win,
c->wgeo.x, c->wgeo.y,
c->wgeo.w, c->wgeo.h);
if(!(c->flags & CLIENT_FULLSCREEN))
XMoveResizeWindow(W->dpy, c->win,
c->wgeo.x, c->wgeo.y,
c->wgeo.w, c->wgeo.h);
c->flags &= ~CLIENT_DID_WINSIZE;

View File

@ -102,6 +102,7 @@ client_map(struct client *c)
if(!(c->flags & CLIENT_MAPPED))
{
WIN_STATE(c->frame, Map);
WIN_STATE(c->win, Map);
ewmh_set_wm_state(c->win, NormalState);
c->flags ^= CLIENT_MAPPED;
}
@ -113,6 +114,7 @@ client_unmap(struct client *c)
if(c->flags & CLIENT_MAPPED)
{
WIN_STATE(c->frame, Unmap);
WIN_STATE(c->win, Unmap);
ewmh_set_wm_state(c->win, IconicState);
c->flags ^= CLIENT_MAPPED;
}

View File

@ -59,9 +59,29 @@ event_enternotify(XEvent *e)
static void
event_clientmessageevent(XEvent *e)
{
(void)e;
/* XClientMessageEvent *ev = &e->xclient;
client *c;*/
XClientMessageEvent *ev = &e->xclient;
struct client *c;
int type = 0;
while(type < net_last && W->net_atom[type] != ev->message_type)
++type;
switch(type)
{
/* _NET_WM_STATE */
case net_wm_state:
if((c = client_gb_win(ev->window)))
ewmh_manage_state(ev->data.l, c);
break;
/* _NET_CLOSE_WINDOW */
case net_close_window:
if((c = client_gb_win(ev->window)))
client_close(c);
break;
/* _NET_WM_DESKTOP */
case net_wm_desktop:
break;
}
}
static void

View File

@ -6,6 +6,12 @@
#include "ewmh.h"
#include "util.h"
#include "screen.h"
#include "client.h"
/* Taken From standards.freedesktop.org */
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
#define _NET_WM_STATE_ADD 1 /* add/set property */
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */
void
ewmh_init(void)
@ -112,10 +118,11 @@ ewmh_update_wmfs_props(void)
cts = xcalloc(ns, sizeof(long));
for(i = 0; i < ns; ++i)
{
s = screen_gb_id(i);
cts[i] = s->seltag->id;
cts[i] = (s->seltag ? s->seltag->id : 0);
}
XChangeProperty(W->dpy, W->root, W->net_atom[wmfs_current_tag], XA_CARDINAL, 32,
@ -128,3 +135,32 @@ ewmh_update_wmfs_props(void)
free(cts);
}
void
ewmh_manage_state(long data[], struct client *c)
{
/* _NET_WM_STATE_FULLSCREEN */
if(data[1] == (long)W->net_atom[net_wm_state_fullscreen])
{
if(data[0] == _NET_WM_STATE_ADD
|| (data[0] == _NET_WM_STATE_TOGGLE && !(c->flags & CLIENT_FULLSCREEN)))
{
c->flags |= CLIENT_FULLSCREEN;
XReparentWindow(W->dpy, c->win, W->root, c->screen->geo.x, c->screen->geo.y);
XResizeWindow(W->dpy, c->win, c->screen->geo.w, c->screen->geo.h);
client_focus(c);
XRaiseWindow(W->dpy, c->win);
}
else if(data[0] == _NET_WM_STATE_REMOVE
|| (data[0] == _NET_WM_STATE_TOGGLE && c->flags & CLIENT_FULLSCREEN))
{
c->flags &= ~CLIENT_FULLSCREEN;
XReparentWindow(W->dpy, c->win, c->frame, c->wgeo.x, c->wgeo.y);
client_moveresize(c, &c->geo);
}
}
}

View File

@ -75,5 +75,6 @@ enum
void ewmh_init(void);
void ewmh_set_wm_state(Window w, int state);
void ewmh_update_wmfs_props(void);
void ewmh_manage_state(long data[], struct client *c);
#endif /* EWMH_H */

View File

@ -166,6 +166,7 @@ struct client
#define CLIENT_DYING 0x100 /* Saddest flag ever */
#define CLIENT_REMOVEALL 0x200
#define CLIENT_MAPPED 0x400
#define CLIENT_FULLSCREEN 0x800
Flags flags;
Window win, frame, tmp;
SLIST_ENTRY(client) next; /* Global list */