Atom WM_DELETE_WINDOW;
Atom _NET_ACTIVE_WINDOW;
Atom _NET_WM_WINDOW_TYPE;
+Atom _NET_WM_WINDOW_TYPE_DESKTOP;
+Atom _NET_WM_WINDOW_TYPE_DOCK;
+Atom _NET_WM_WINDOW_TYPE_TOOLBAR;
+Atom _NET_WM_WINDOW_TYPE_MENU;
+Atom _NET_WM_WINDOW_TYPE_UTILITY;
+Atom _NET_WM_WINDOW_TYPE_SPLASH;
Atom _NET_WM_WINDOW_TYPE_DIALOG;
+Atom _NET_WM_WINDOW_TYPE_NORMAL;
void Atoms_Init(void) {
WM_STATE = XInternAtom(X.disp, "WM_STATE", False);
WM_DELETE_WINDOW = XInternAtom(X.disp, "WM_DELETE_WINDOW", False);
_NET_ACTIVE_WINDOW = XInternAtom(X.disp, "_NET_ACTIVE_WINDOW", False);
_NET_WM_WINDOW_TYPE = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE", False);
+ _NET_WM_WINDOW_TYPE_DESKTOP = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DESKTOP", False);
+ _NET_WM_WINDOW_TYPE_DOCK = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DOCK", False);
+ _NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_TOOLBAR", False);
+ _NET_WM_WINDOW_TYPE_MENU = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_MENU", False);
+ _NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_UTILITY", False);
+ _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);
}
extern Atom WM_DELETE_WINDOW;
extern Atom _NET_ACTIVE_WINDOW;
extern Atom _NET_WM_WINDOW_TYPE;
+extern Atom _NET_WM_WINDOW_TYPE_DESKTOP;
+extern Atom _NET_WM_WINDOW_TYPE_DOCK;
+extern Atom _NET_WM_WINDOW_TYPE_TOOLBAR;
+extern Atom _NET_WM_WINDOW_TYPE_MENU;
+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;
void Atoms_Init(void);
#define LIST_FOR_EACH(val,list) \
for (val = list; (val != NULL); val = val->next)
+static void ReadWindowTypes(Client* c);
static void ReadProps(Client* c);
static void Redraw(Client* c);
static void LayerWindows(void);
static void ReadProps(Client* c)
{
- Atom *protos = NULL, actual_type, *wintype;
+ Atom actual_type, *protos = NULL;
int format, nprotos = 0;
unsigned long n, extra;
// TODO: read client machine property
/* check if the window is a dialog */
- XGetWindowProperty(
- X.disp, c->win, _NET_WM_WINDOW_TYPE, 0L, -1, False, XA_ATOM, &actual_type, &format, &n, &extra, (unsigned char **)&wintype);
- if ((wintype && *wintype == _NET_WM_WINDOW_TYPE_DIALOG) || (c->transient_for != None))
- {
- c->flags |= F_DIALOG|F_FLOATING;
- }
- xfree(wintype);
+ ReadWindowTypes(c);
/* The following properties are unused currently */
/* WM_ICON_NAME - window title when iconified */
/* WM_COLORMAP_WINDOWS - */
}
+static void ReadWindowTypes(Client* c)
+{
+ Atom actual_type, *types;
+ int format;
+ unsigned long ntypes, extra;
+
+ XGetWindowProperty(
+ X.disp, c->win, _NET_WM_WINDOW_TYPE, 0L, -1, False, XA_ATOM, &actual_type, &format, &ntypes, &extra, (unsigned char **)&types);
+
+ 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(types);
+}
+
static void Redraw(Client* c)
{
if (c->frame)