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);
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;
/* 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)