|
@@ -54,6 +54,9 @@ static int barheight; |
|
|
|
|
|
|
|
|
Atom atoms[ATOM_COUNT]; |
|
|
Atom atoms[ATOM_COUNT]; |
|
|
|
|
|
|
|
|
|
|
|
static Bool fs_support; |
|
|
|
|
|
static Bool fs_warned; |
|
|
|
|
|
|
|
|
void win_init_font(Display *dpy, const char *fontstr) |
|
|
void win_init_font(Display *dpy, const char *fontstr) |
|
|
{ |
|
|
{ |
|
|
int n; |
|
|
int n; |
|
@@ -102,6 +105,36 @@ unsigned long win_alloc_color(win_t *win, const char *name) |
|
|
return col.pixel; |
|
|
return col.pixel; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void win_check_wm_support(Display *dpy, Window root) |
|
|
|
|
|
{ |
|
|
|
|
|
int format; |
|
|
|
|
|
long offset = 0, length = 16; |
|
|
|
|
|
Atom *data, type; |
|
|
|
|
|
unsigned long i, nitems, bytes_left; |
|
|
|
|
|
Bool found = False; |
|
|
|
|
|
|
|
|
|
|
|
while (!found && length > 0) { |
|
|
|
|
|
if (XGetWindowProperty(dpy, root, atoms[ATOM__NET_SUPPORTED], |
|
|
|
|
|
offset, length, False, XA_ATOM, &type, &format, |
|
|
|
|
|
&nitems, &bytes_left, (unsigned char**) &data)) |
|
|
|
|
|
{ |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
if (type == XA_ATOM && format == 32) { |
|
|
|
|
|
for (i = 0; i < nitems; i++) { |
|
|
|
|
|
if (data[i] == atoms[ATOM__NET_WM_STATE_FULLSCREEN]) { |
|
|
|
|
|
found = True; |
|
|
|
|
|
fs_support = True; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
XFree(data); |
|
|
|
|
|
offset += nitems; |
|
|
|
|
|
length = MIN(length, bytes_left / 4); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
#define INIT_ATOM_(atom) \ |
|
|
#define INIT_ATOM_(atom) \ |
|
|
atoms[ATOM_##atom] = XInternAtom(e->dpy, #atom, False); |
|
|
atoms[ATOM_##atom] = XInternAtom(e->dpy, #atom, False); |
|
|
|
|
|
|
|
@@ -150,6 +183,9 @@ void win_init(win_t *win) |
|
|
INIT_ATOM_(_NET_WM_ICON); |
|
|
INIT_ATOM_(_NET_WM_ICON); |
|
|
INIT_ATOM_(_NET_WM_STATE); |
|
|
INIT_ATOM_(_NET_WM_STATE); |
|
|
INIT_ATOM_(_NET_WM_STATE_FULLSCREEN); |
|
|
INIT_ATOM_(_NET_WM_STATE_FULLSCREEN); |
|
|
|
|
|
INIT_ATOM_(_NET_SUPPORTED); |
|
|
|
|
|
|
|
|
|
|
|
win_check_wm_support(e->dpy, RootWindow(e->dpy, e->scr)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void win_update_sizehints(win_t *win) |
|
|
void win_update_sizehints(win_t *win) |
|
@@ -379,6 +415,13 @@ void win_toggle_fullscreen(win_t *win) |
|
|
if (win == NULL || win->xwin == None) |
|
|
if (win == NULL || win->xwin == None) |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
if (!fs_support) { |
|
|
|
|
|
if (!fs_warned) { |
|
|
|
|
|
warn("window manager does not support fullscreen"); |
|
|
|
|
|
fs_warned = True; |
|
|
|
|
|
} |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
win->fullscreen = !win->fullscreen; |
|
|
win->fullscreen = !win->fullscreen; |
|
|
|
|
|
|
|
|
memset(&ev, 0, sizeof(ev)); |
|
|
memset(&ev, 0, sizeof(ev)); |
|
|