From: Mike Lowis Date: Fri, 9 Aug 2024 16:18:33 +0000 (-0400) Subject: added reading of window types and states X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=4d295542748f99b927a1301c07652678dca63b7a;p=proto%2Fanvil.git added reading of window types and states --- diff --git a/atoms b/atoms index 0e97d85..bddebae 100644 --- a/atoms +++ b/atoms @@ -19,6 +19,7 @@ _NET_WM_WINDOW_TYPE_UTILITY _NET_WM_WINDOW_TYPE_SPLASH _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_WINDOW_TYPE_NORMAL +_NET_WM_STATE _NET_WM_STATE_MODAL _NET_WM_STATE_STICKY _NET_WM_STATE_MAXIMIZED_VERT diff --git a/atoms.c b/atoms.c index 7621517..7f9a684 100644 --- a/atoms.c +++ b/atoms.c @@ -20,6 +20,7 @@ Atom _NET_WM_WINDOW_TYPE_UTILITY; Atom _NET_WM_WINDOW_TYPE_SPLASH; Atom _NET_WM_WINDOW_TYPE_DIALOG; Atom _NET_WM_WINDOW_TYPE_NORMAL; +Atom _NET_WM_STATE; Atom _NET_WM_STATE_MODAL; Atom _NET_WM_STATE_STICKY; Atom _NET_WM_STATE_MAXIMIZED_VERT; @@ -55,6 +56,7 @@ void Atoms_Init(void) { _NET_WM_WINDOW_TYPE_SPLASH = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_SPLASH", False); _NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DIALOG", False); _NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_NORMAL", False); + _NET_WM_STATE = XInternAtom(X.disp, "_NET_WM_STATE", False); _NET_WM_STATE_MODAL = XInternAtom(X.disp, "_NET_WM_STATE_MODAL", False); _NET_WM_STATE_STICKY = XInternAtom(X.disp, "_NET_WM_STATE_STICKY", False); _NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(X.disp, "_NET_WM_STATE_MAXIMIZED_VERT", False); diff --git a/atoms.h b/atoms.h index bd2d3f6..e71cdf5 100644 --- a/atoms.h +++ b/atoms.h @@ -20,6 +20,7 @@ extern Atom _NET_WM_WINDOW_TYPE_UTILITY; extern Atom _NET_WM_WINDOW_TYPE_SPLASH; extern Atom _NET_WM_WINDOW_TYPE_DIALOG; extern Atom _NET_WM_WINDOW_TYPE_NORMAL; +extern Atom _NET_WM_STATE; extern Atom _NET_WM_STATE_MODAL; extern Atom _NET_WM_STATE_STICKY; extern Atom _NET_WM_STATE_MAXIMIZED_VERT; diff --git a/client.c b/client.c index e47ccaa..539ceb7 100644 --- a/client.c +++ b/client.c @@ -6,6 +6,7 @@ for (val = list; (val != NULL); val = val->next) static void ReadWindowTypes(Client* c); +static void ReadWindowState(Client* c); static void ReadProps(Client* c); static void Redraw(Client* c); static void LayerWindows(void); @@ -16,6 +17,38 @@ static void SendMessage(Window win, Atom proto, Atom type); static void SetWMState(Client *c, int state); static void* ListDelete(void* list, void* node); +typedef struct { + Atom* atom; + int flags; +} AtomMap; + +static AtomMap WindowTypes[] = { + { .atom = &_NET_WM_WINDOW_TYPE, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_DESKTOP, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_DOCK, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_TOOLBAR, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_MENU, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_UTILITY, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_SPLASH, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_DIALOG, .flags = 0 }, + { .atom = &_NET_WM_WINDOW_TYPE_NORMAL, .flags = 0 }, +}; + +static AtomMap WindowStates[] = { + { .atom = &_NET_WM_STATE_MODAL, .flags = 0 }, + { .atom = &_NET_WM_STATE_STICKY, .flags = 0 }, + { .atom = &_NET_WM_STATE_MAXIMIZED_VERT, .flags = 0 }, + { .atom = &_NET_WM_STATE_MAXIMIZED_HORZ, .flags = 0 }, + { .atom = &_NET_WM_STATE_SHADED, .flags = 0 }, + { .atom = &_NET_WM_STATE_SKIP_TASKBAR, .flags = 0 }, + { .atom = &_NET_WM_STATE_SKIP_PAGER, .flags = 0 }, + { .atom = &_NET_WM_STATE_HIDDEN, .flags = 0 }, + { .atom = &_NET_WM_STATE_FULLSCREEN, .flags = 0 }, + { .atom = &_NET_WM_STATE_ABOVE, .flags = 0 }, + { .atom = &_NET_WM_STATE_BELOW, .flags = 0 }, + { .atom = &_NET_WM_STATE_DEMANDS_ATTENTION, .flags = 0 }, +}; + Client* Client_Find(Window win) { Client* curr = AllClients; @@ -343,58 +376,84 @@ static void ReadProps(Client* c) /* check if the window is a dialog */ ReadWindowTypes(c); + ReadWindowState(c); + /* The following properties are unused currently */ /* WM_ICON_NAME - window title when iconified */ /* WM_COLORMAP_WINDOWS - */ } -static void ReadWindowTypes(Client* c) +static void ReadFlagHint(Client* c, Atom hint, AtomMap* known, unsigned long nknown, int* flags) { - Atom actual_type, *types; + Atom actual_type, *atoms; int format; - unsigned long ntypes, extra; + unsigned long natoms, extra; XGetWindowProperty( - X.disp, c->win, _NET_WM_WINDOW_TYPE, 0L, -1, False, XA_ATOM, &actual_type, &format, &ntypes, &extra, (unsigned char **)&types); + X.disp, c->win, hint, 0L, -1, False, XA_ATOM, &actual_type, &format, &natoms, &extra, (unsigned char **)&atoms); - for (unsigned long i = 0; i < ntypes; i++) + for (unsigned long i = 0; i < natoms; i++) { - if (types[i] == _NET_WM_WINDOW_TYPE_DIALOG) - { - c->flags |= F_DIALOG|F_FLOATING; - } - if (types[i] == _NET_WM_WINDOW_TYPE_DESKTOP) - { - c->flags |= F_FLOATING|F_NO_FRAME; - } - if (types[i] == _NET_WM_WINDOW_TYPE_DOCK) - { - c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; - } - if (types[i] == _NET_WM_WINDOW_TYPE_TOOLBAR) - { - c->flags |= F_DIALOG|F_FLOATING; - } - if (types[i] == _NET_WM_WINDOW_TYPE_MENU) - { - c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; - } - if (types[i] == _NET_WM_WINDOW_TYPE_UTILITY) - { - c->flags |= F_DIALOG|F_FLOATING; - } - if (types[i] == _NET_WM_WINDOW_TYPE_SPLASH) + for (unsigned long x = 0; x < nknown; x++) { - c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; - } - if (types[i] == _NET_WM_WINDOW_TYPE_NORMAL) - { - c->flags |= 0; + if (*known[x].atom == atoms[i]) + { + *flags |= known[x].flags; + } } } - xfree(types); + xfree(atoms); } +static void ReadWindowTypes(Client* c) +{ + ReadFlagHint(c, _NET_WM_WINDOW_TYPE, WindowTypes, sizeof(WindowTypes)/sizeof(WindowTypes[0]), &(c->flags)); + +// for (unsigned long i = 0; i < ntypes; i++) +// { +// if (types[i] == _NET_WM_WINDOW_TYPE_DIALOG) +// { +// c->flags |= F_DIALOG|F_FLOATING; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_DESKTOP) +// { +// c->flags |= F_FLOATING|F_NO_FRAME; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_DOCK) +// { +// c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_TOOLBAR) +// { +// c->flags |= F_DIALOG|F_FLOATING; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_MENU) +// { +// c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_UTILITY) +// { +// c->flags |= F_DIALOG|F_FLOATING; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_SPLASH) +// { +// c->flags |= F_DIALOG|F_FLOATING|F_NO_FRAME; +// } +// if (types[i] == _NET_WM_WINDOW_TYPE_NORMAL) +// { +// c->flags |= 0; +// } +// } +// xfree(atoms); +} + +static void ReadWindowState(Client* c) +{ + ReadFlagHint(c, _NET_WM_STATE, WindowStates, sizeof(WindowStates)/sizeof(WindowStates[0]), &(c->flags)); + +} + + static void Redraw(Client* c) { if (c->frame)