{
XClientMessageEvent* ev = &(e->xclient);
printf("CLIENT_MSG(w: 0x%lx a: '%s')\n", ev->window, XGetAtomName(X.disp, ev->message_type));
- if (ev->message_type == atom("_NET_ACTIVE_WINDOW"))
+ if (ev->message_type == _NET_ACTIVE_WINDOW)
{
mons_activate(ev->window);
}
mons_init();
client_initall();
keys_init();
+ atoms_init();
/* setup event handlers */
X.eventfns[ButtonPress] = xbtnpress;
#include <stdio.h>
#include <string.h>
#include <assert.h>
+#include "atoms.h"
#define min(a,b) (a < b ? a : b)
#define max(a,b) (a > b ? a : b)
void die(char* str);
void* ecalloc(size_t n, size_t sz);
void xfree(void* p);
-Atom atom(char* str);
void sendmsg(Window win, Atom proto, Atom type);
#endif
--- /dev/null
+WM_NAME
+WM_ICON_NAME
+WM_NORMAL_HINTS
+WM_HINTS
+WM_CLASS
+WM_TRANSIENT_FOR
+WM_PROTOCOLS
+WM_COLORMAP_WINDOWS
+WM_CLIENT_MACHINE
+WM_DELETE_WINDOW
+_NET_ACTIVE_WINDOW
+_NET_WM_WINDOW_TYPE
+_NET_WM_WINDOW_TYPE_DIALOG
--- /dev/null
+#include "anvil.h"
+Atom WM_NAME;
+Atom WM_ICON_NAME;
+Atom WM_NORMAL_HINTS;
+Atom WM_HINTS;
+Atom WM_CLASS;
+Atom WM_TRANSIENT_FOR;
+Atom WM_PROTOCOLS;
+Atom WM_COLORMAP_WINDOWS;
+Atom WM_CLIENT_MACHINE;
+Atom WM_DELETE_WINDOW;
+Atom _NET_ACTIVE_WINDOW;
+Atom _NET_WM_WINDOW_TYPE;
+Atom _NET_WM_WINDOW_TYPE_DIALOG;
+
+void atoms_init(void) {
+ WM_NAME = XInternAtom(X.disp, "WM_NAME", False);
+ WM_ICON_NAME = XInternAtom(X.disp, "WM_ICON_NAME", False);
+ WM_NORMAL_HINTS = XInternAtom(X.disp, "WM_NORMAL_HINTS", False);
+ WM_HINTS = XInternAtom(X.disp, "WM_HINTS", False);
+ WM_CLASS = XInternAtom(X.disp, "WM_CLASS", False);
+ WM_TRANSIENT_FOR = XInternAtom(X.disp, "WM_TRANSIENT_FOR", False);
+ WM_PROTOCOLS = XInternAtom(X.disp, "WM_PROTOCOLS", False);
+ WM_COLORMAP_WINDOWS = XInternAtom(X.disp, "WM_COLORMAP_WINDOWS", False);
+ WM_CLIENT_MACHINE = XInternAtom(X.disp, "WM_CLIENT_MACHINE", 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_DIALOG = XInternAtom(X.disp, "_NET_WM_WINDOW_TYPE_DIALOG", False);
+}
--- /dev/null
+
+extern Atom WM_NAME;
+extern Atom WM_ICON_NAME;
+extern Atom WM_NORMAL_HINTS;
+extern Atom WM_HINTS;
+extern Atom WM_CLASS;
+extern Atom WM_TRANSIENT_FOR;
+extern Atom WM_PROTOCOLS;
+extern Atom WM_COLORMAP_WINDOWS;
+extern Atom WM_CLIENT_MACHINE;
+extern Atom WM_DELETE_WINDOW;
+extern Atom _NET_ACTIVE_WINDOW;
+extern Atom _NET_WM_WINDOW_TYPE;
+extern Atom _NET_WM_WINDOW_TYPE_DIALOG;
+
+void atoms_init(void);
{
if (c->flags & F_WM_DELETE)
{
- sendmsg(c->win, atom("WM_PROTOCOLS"), atom("WM_DELETE_WINDOW"));
+ sendmsg(c->win, WM_PROTOCOLS, WM_DELETE_WINDOW);
}
else
{
/* check if the window is a dialog */
XGetWindowProperty(
- X.disp, c->win, atom("_NET_WM_WINDOW_TYPE"), 0L, -1, False, XA_ATOM, &actual_type, &format, &n, &extra, (unsigned char **)&wintype);
- if (wintype && *wintype == atom("_NET_WM_WINDOW_TYPE_DIALOG"))
+ 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->flags |= F_DIALOG|F_FLOATING;
}
XGetWMProtocols(X.disp, c->win, &protos, &nprotos);
for (int i = 0; i < nprotos; i++)
{
- if (protos[i] == atom("WM_DELETE_WINDOW"))
+ if (protos[i] == WM_DELETE_WINDOW)
{
c->flags |= F_WM_DELETE;
}
--- /dev/null
+#!/bin/bash
+
+hdr="atoms.h"
+src="atoms.c"
+
+echo "" > $hdr
+echo -e "#include \"anvil.h\"" > $src
+
+while IFS= read -r line; do
+ echo "extern Atom $line;" >> "$hdr"
+ echo "Atom $line;" >> "$src"
+done < atoms
+echo "" >> "$hdr"
+echo "void atoms_init(void);" >> "$hdr"
+
+echo "" >> "$src"
+echo "void atoms_init(void) {" >> "$src"
+while IFS= read -r atom; do
+ echo " $atom = XInternAtom(X.disp, \"$atom\", False);" >> "$src"
+done < atoms
+echo "}" >> "$src"
\ No newline at end of file
}
}
-Atom atom(char* str)
-{
- return XInternAtom(X.disp, str, False);
-}
-
void sendmsg(Window win, Atom proto, Atom type)
{
XEvent ev;