Merge pull request #22 from phillbush/fullscreen

Make fullscreen work on GTK applications
This commit is contained in:
Adrian Chadd
2026-01-18 18:33:36 -08:00
committed by GitHub
4 changed files with 30 additions and 9 deletions

17
icc.c
View File

@@ -16,15 +16,17 @@ extern struct Library *XLibBase;
extern void redraw(Client *, Window); extern void redraw(Client *, Window);
Atom utf8_string, net_wm_name;
Atom wm_state, wm_change_state, wm_protocols, wm_delete, wm_take_focus; Atom wm_state, wm_change_state, wm_protocols, wm_delete, wm_take_focus;
Atom wm_colormaps, wm_name, wm_normal_hints, wm_hints, wm_icon_name, wm_class; Atom wm_colormaps, wm_name, wm_normal_hints, wm_hints, wm_icon_name, wm_class;
Atom net_supported, net_wm_state, net_wm_state_fullscreen; Atom net_supporting_wm_check, net_supported, net_wm_state, net_wm_state_fullscreen;
Atom amiwm_screen, swm_vroot, amiwm_wflags, amiwm_appiconmsg, amiwm_appwindowmsg; Atom amiwm_screen, swm_vroot, amiwm_wflags, amiwm_appiconmsg, amiwm_appwindowmsg;
extern Display *dpy; extern Display *dpy;
void init_atoms() void init_atoms()
{ {
utf8_string = XInternAtom(dpy, "UTF8_STRING", False);
wm_state = XInternAtom(dpy, "WM_STATE", False); wm_state = XInternAtom(dpy, "WM_STATE", False);
wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False); wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
wm_protocols = XInternAtom(dpy, "WM_PROTOCOLS", False); wm_protocols = XInternAtom(dpy, "WM_PROTOCOLS", False);
@@ -37,6 +39,8 @@ void init_atoms()
wm_icon_name = XInternAtom(dpy, "WM_ICON_NAME", False); wm_icon_name = XInternAtom(dpy, "WM_ICON_NAME", False);
wm_class = XInternAtom(dpy, "WM_CLASS", False); wm_class = XInternAtom(dpy, "WM_CLASS", False);
net_supported = XInternAtom(dpy, "_NET_SUPPORTED", False); net_supported = XInternAtom(dpy, "_NET_SUPPORTED", False);
net_supporting_wm_check = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
net_wm_name = XInternAtom(dpy, "_NET_WM_NAME", False);
net_wm_state = XInternAtom(dpy, "_NET_WM_STATE", False); net_wm_state = XInternAtom(dpy, "_NET_WM_STATE", False);
net_wm_state_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); net_wm_state_fullscreen = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
amiwm_screen = XInternAtom(dpy, "AMIWM_SCREEN", False); amiwm_screen = XInternAtom(dpy, "AMIWM_SCREEN", False);
@@ -46,14 +50,21 @@ void init_atoms()
amiwm_appwindowmsg = XInternAtom(dpy, "AMIWM_APPWINDOWMSG", False); amiwm_appwindowmsg = XInternAtom(dpy, "AMIWM_APPWINDOWMSG", False);
} }
void setsupports(Window root) void setsupports(Window root, Window checkwin)
{ {
Atom atoms[] = { Atom atoms[] = {
net_wm_state_fullscreen net_wm_state,
net_wm_state_fullscreen,
}; };
XChangeProperty(dpy, root, net_supported, XA_ATOM, 32, XChangeProperty(dpy, root, net_supported, XA_ATOM, 32,
PropModeReplace, (unsigned char *)atoms, PropModeReplace, (unsigned char *)atoms,
sizeof(atoms)/sizeof(atoms[0])); sizeof(atoms)/sizeof(atoms[0]));
XChangeProperty(dpy, root, net_supporting_wm_check, XA_WINDOW, 32,
PropModeReplace, (void *)(Window[]){checkwin}, 1);
XChangeProperty(dpy, checkwin, net_supporting_wm_check, XA_WINDOW, 32,
PropModeReplace, (void *)(Window[]){checkwin}, 1);
XChangeProperty(dpy, checkwin, net_wm_name, utf8_string, 8,
PropModeReplace, (void *)"AmiWM", 5);
} }
void setstringprop(Window w, Atom a, char *str) void setstringprop(Window w, Atom a, char *str)

2
icc.h
View File

@@ -6,7 +6,7 @@
#include "client.h" #include "client.h"
extern void init_atoms(void); extern void init_atoms(void);
extern void setsupports(Window); extern void setsupports(Window, Window);
extern void sendcmessage(Window, Atom, long); extern void sendcmessage(Window, Atom, long);
extern void getproto(Client *c); extern void getproto(Client *c);
extern void getwmstate(Client *c); extern void getwmstate(Client *c);

19
main.c
View File

@@ -91,6 +91,7 @@ Scrn *dragscreen=NULL, *menuactive=NULL;
static int d_offset=0; static int d_offset=0;
static fd_set master_fd_set; static fd_set master_fd_set;
static int max_fd=0; static int max_fd=0;
static Window *checkwins;
char *free_screentitle=NULL; char *free_screentitle=NULL;
char *x_server=NULL; char *x_server=NULL;
int shape_event_base, shape_error_base, shape_extn=0; int shape_event_base, shape_error_base, shape_extn=0;
@@ -857,11 +858,15 @@ static void update_clock(void *dontcare)
void cleanup() void cleanup()
{ {
int sc;
extern void free_prefs(); extern void free_prefs();
struct coevent *e; struct coevent *e;
flushmodules(); flushmodules();
flushclients(); flushclients();
scr = get_front_scr(); scr = get_front_scr();
for(sc=0; checkwins!=NULL && sc<ScreenCount(dpy); sc++)
XDestroyWindow(dpy, checkwins[sc]);
free(checkwins);
while(scr) while(scr)
closescreen(); closescreen();
free_prefs(); free_prefs();
@@ -966,13 +971,19 @@ int main(int argc, char *argv[])
lookup_keysyms(dpy, &meta_mask, &switch_mask); lookup_keysyms(dpy, &meta_mask, &switch_mask);
for(sc=0; sc<ScreenCount(dpy); sc++) checkwins = calloc(ScreenCount(dpy), sizeof(*checkwins));
if(sc==DefaultScreen(dpy) || prefs.manage_all) for(sc=0; sc<ScreenCount(dpy); sc++) {
if(!getscreenbyroot(RootWindow(dpy, sc))) { if(sc==DefaultScreen(dpy) || prefs.manage_all) {
Window root = RootWindow(dpy, sc);
checkwins[sc] = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 1, 1, 1);
setsupports(scr->root, checkwins[sc]);
if(!getscreenbyroot(root)) {
char buf[64]; char buf[64];
sprintf(buf, "Screen.%d", sc); sprintf(buf, "Screen.%d", sc);
openscreen((sc? strdup(buf):"Workbench Screen"), RootWindow(dpy, sc)); openscreen((sc? strdup(buf):"Workbench Screen"), root);
} }
}
}
/* /*
if(!front) if(!front)
openscreen("Workbench Screen", DefaultRootWindow(dpy)); openscreen("Workbench Screen", DefaultRootWindow(dpy));

View File

@@ -350,7 +350,6 @@ void realizescreens(void)
XMapWindow(dpy, scr->inputbox); XMapWindow(dpy, scr->inputbox);
} }
setsupports(scr->root);
XSelectInput(dpy, scr->root, XSelectInput(dpy, scr->root,
SubstructureNotifyMask|SubstructureRedirectMask| SubstructureNotifyMask|SubstructureRedirectMask|
KeyPressMask|KeyReleaseMask| KeyPressMask|KeyReleaseMask|