diff --git a/Makefile b/Makefile index 85c092e..4e2ea91 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ dist: $(PACKAGE)-$(VERSION)/src/applets/tasks.c \ $(PACKAGE)-$(VERSION)/src/applets/volume.c \ $(PACKAGE)-$(VERSION)/src/applets/Makefile \ + $(PACKAGE)-$(VERSION)/src/applets/tasks.atoms \ $(PACKAGE)-$(VERSION)/src/applets/project.conf \ $(PACKAGE)-$(VERSION)/Makefile \ $(PACKAGE)-$(VERSION)/config.h \ diff --git a/src/applets/Makefile b/src/applets/Makefile index ec29838..26cef50 100644 --- a/src/applets/Makefile +++ b/src/applets/Makefile @@ -132,7 +132,7 @@ memory.o: memory.c ../../include/Panel.h pager.o: pager.c ../../include/Panel.h $(CC) $(pager_CFLAGS) -c pager.c -tasks.o: tasks.c ../../include/Panel.h +tasks.o: tasks.c ../../include/Panel.h tasks.atoms $(CC) $(tasks_CFLAGS) -c tasks.c volume.o: volume.c ../../include/Panel.h diff --git a/src/applets/project.conf b/src/applets/project.conf index e8b22e8..9818a08 100644 --- a/src/applets/project.conf +++ b/src/applets/project.conf @@ -3,7 +3,7 @@ cppflags_force=-I $(PREFIX)/include -I ../../include #cppflags=-D EMBEDDED cflags_force=-W `pkg-config --cflags gtk+-2.0` -fPIC cflags=-Wall -g -O2 -pedantic -dist=Makefile +dist=Makefile,tasks.atoms [battery] type=plugin @@ -92,7 +92,7 @@ sources=tasks.c install=$(LIBDIR)/Panel/applets [tasks.c] -depends=../../include/Panel.h +depends=../../include/Panel.h,tasks.atoms [volume] type=plugin diff --git a/src/applets/tasks.atoms b/src/applets/tasks.atoms new file mode 100644 index 0000000..771592b --- /dev/null +++ b/src/applets/tasks.atoms @@ -0,0 +1,29 @@ +atom(_NET_ACTIVE_WINDOW), +atom(_NET_CLIENT_LIST), +atom(_NET_CLOSE_WINDOW), +atom(_NET_CURRENT_DESKTOP), +atom(_NET_WM_ACTION_CHANGE_DESKTOP), +atom(_NET_WM_ACTION_CLOSE), +atom(_NET_WM_ACTION_MOVE), +atom(_NET_WM_ACTION_RESIZE), +atom(_NET_WM_ACTION_MINIMIZE), +atom(_NET_WM_ACTION_SHADE), +atom(_NET_WM_ACTION_STICK), +atom(_NET_WM_ACTION_MAXIMIZE_HORZ), +atom(_NET_WM_ACTION_MAXIMIZE_VERT), +atom(_NET_WM_ACTION_FULLSCREEN), +atom(_NET_WM_ALLOWED_ACTIONS), +atom(_NET_WM_DESKTOP), +atom(_NET_WM_ICON), +atom(_NET_WM_NAME), +atom(_NET_WM_STATE), +atom(_NET_WM_STATE_FULLSCREEN), +atom(_NET_WM_STATE_MAXIMIZED_HORZ), +atom(_NET_WM_STATE_MAXIMIZED_VERT), +atom(_NET_WM_STATE_SHADED), +atom(_NET_WM_STATE_STICKY), +atom(_NET_WM_STATE_TOGGLE), +atom(_NET_WM_VISIBLE_NAME), +atom(_NET_WM_WINDOW_TYPE), +atom(_NET_WM_WINDOW_TYPE_NORMAL), +atom(UTF8_STRING) diff --git a/src/applets/tasks.c b/src/applets/tasks.c index 07b029a..bc36ac6 100644 --- a/src/applets/tasks.c +++ b/src/applets/tasks.c @@ -27,40 +27,14 @@ /* Tasks */ /* private */ /* types */ +#define atom(a) TASKS_ATOM_ ## a typedef enum _TasksAtom { - TASKS_ATOM_NET_ACTIVE_WINDOW = 0, - TASKS_ATOM_NET_CLIENT_LIST, - TASKS_ATOM_NET_CLOSE_WINDOW, - TASKS_ATOM_NET_CURRENT_DESKTOP, - TASKS_ATOM_NET_WM_ACTION_CHANGE_DESKTOP, - TASKS_ATOM_NET_WM_ACTION_CLOSE, - TASKS_ATOM_NET_WM_ACTION_MOVE, - TASKS_ATOM_NET_WM_ACTION_RESIZE, - TASKS_ATOM_NET_WM_ACTION_MINIMIZE, - TASKS_ATOM_NET_WM_ACTION_SHADE, - TASKS_ATOM_NET_WM_ACTION_STICK, - TASKS_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ, - TASKS_ATOM_NET_WM_ACTION_MAXIMIZE_VERT, - TASKS_ATOM_NET_WM_ACTION_FULLSCREEN, - TASKS_ATOM_NET_WM_ALLOWED_ACTIONS, - TASKS_ATOM_NET_WM_DESKTOP, - TASKS_ATOM_NET_WM_ICON, - TASKS_ATOM_NET_WM_NAME, - TASKS_ATOM_NET_WM_STATE, - TASKS_ATOM_NET_WM_STATE_FULLSCREEN, - TASKS_ATOM_NET_WM_STATE_MAXIMIZED_HORZ, - TASKS_ATOM_NET_WM_STATE_MAXIMIZED_VERT, - TASKS_ATOM_NET_WM_STATE_SHADED, - TASKS_ATOM_NET_WM_STATE_STICKY, - TASKS_ATOM_NET_WM_STATE_TOGGLE, - TASKS_ATOM_NET_WM_VISIBLE_NAME, - TASKS_ATOM_NET_WM_WINDOW_TYPE, - TASKS_ATOM_NET_WM_WINDOW_TYPE_NORMAL, - TASKS_ATOM_UTF8_STRING +#include "tasks.atoms" } TasksAtom; #define TASKS_ATOM_LAST TASKS_ATOM_UTF8_STRING #define TASKS_ATOM_COUNT (TASKS_ATOM_LAST + 1) +#undef atom typedef struct _Tasks Tasks; @@ -95,38 +69,12 @@ struct _Tasks /* constants */ +#define atom(a) "" # a static const char * _tasks_atom[TASKS_ATOM_COUNT] = { - "_NET_ACTIVE_WINDOW", - "_NET_CLIENT_LIST", - "_NET_CLOSE_WINDOW", - "_NET_CURRENT_DESKTOP", - "_NET_WM_ACTION_CHANGE_DESKTOP", - "_NET_WM_ACTION_CLOSE", - "_NET_WM_ACTION_MOVE", - "_NET_WM_ACTION_RESIZE", - "_NET_WM_ACTION_MINIMIZE", - "_NET_WM_ACTION_SHADE", - "_NET_WM_ACTION_STICK", - "_NET_WM_ACTION_MAXIMIZE_HORZ", - "_NET_WM_ACTION_MAXIMIZE_VERT", - "_NET_WM_ACTION_FULLSCREEN", - "_NET_WM_ALLOWED_ACTIONS", - "_NET_WM_DESKTOP", - "_NET_WM_ICON", - "_NET_WM_NAME", - "_NET_WM_STATE", - "_NET_WM_STATE_FULLSCREEN", - "_NET_WM_STATE_MAXIMIZED_HORZ", - "_NET_WM_STATE_MAXIMIZED_VERT", - "_NET_WM_STATE_SHADED", - "_NET_WM_STATE_STICKY", - "_NET_WM_STATE_TOGGLE", - "_NET_WM_VISIBLE_NAME", - "_NET_WM_WINDOW_TYPE", - "_NET_WM_WINDOW_TYPE_NORMAL", - "UTF8_STRING" +#include "tasks.atoms" }; +#undef atom /* prototypes */ @@ -275,9 +223,9 @@ static void _task_toggle_state(Task * task, TasksAtom state) memset(&xev, 0, sizeof(xev)); xev.xclient.type = ClientMessage; xev.xclient.window = task->window; - xev.xclient.message_type = tasks->atom[TASKS_ATOM_NET_WM_STATE]; + xev.xclient.message_type = tasks->atom[TASKS_ATOM__NET_WM_STATE]; xev.xclient.format = 32; - xev.xclient.data.l[0] = tasks->atom[TASKS_ATOM_NET_WM_STATE_TOGGLE]; + xev.xclient.data.l[0] = tasks->atom[TASKS_ATOM__NET_WM_STATE_TOGGLE]; xev.xclient.data.l[1] = tasks->atom[state]; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 2; @@ -349,7 +297,7 @@ static int _tasks_get_current_desktop(Tasks * tasks) unsigned long *p; if(_tasks_get_window_property(tasks, GDK_WINDOW_XWINDOW(tasks->root), - TASKS_ATOM_NET_CURRENT_DESKTOP, XA_CARDINAL, + TASKS_ATOM__NET_CURRENT_DESKTOP, XA_CARDINAL, &cnt, (void*)&p) != 0) return -1; cnt = *p; @@ -450,7 +398,7 @@ static void _tasks_do(Tasks * tasks) fprintf(stderr, "DEBUG: %s()\n", __func__); #endif if(_tasks_get_window_property(tasks, GDK_WINDOW_XWINDOW(tasks->root), - TASKS_ATOM_NET_CLIENT_LIST, + TASKS_ATOM__NET_CLIENT_LIST, XA_WINDOW, &cnt, (void*)&windows) != 0) return; desktop = _tasks_get_current_desktop(tasks); @@ -474,10 +422,11 @@ static char * _do_name(Tasks * tasks, Window window) { char * ret; - if((ret = _do_name_utf8(tasks, window, TASKS_ATOM_NET_WM_VISIBLE_NAME)) + if((ret = _do_name_utf8(tasks, window, TASKS_ATOM__NET_WM_VISIBLE_NAME)) != NULL) return ret; - if((ret = _do_name_utf8(tasks, window, TASKS_ATOM_NET_WM_NAME)) != NULL) + if((ret = _do_name_utf8(tasks, window, TASKS_ATOM__NET_WM_NAME)) + != NULL) return ret; if((ret = _do_name_text(tasks, window, XA_WM_NAME)) != NULL) return ret; @@ -522,7 +471,7 @@ static GdkPixbuf * _do_pixbuf(Tasks * tasks, Window window) unsigned long j; GdkPixbuf * p; - if(_tasks_get_window_property(tasks, window, TASKS_ATOM_NET_WM_ICON, + if(_tasks_get_window_property(tasks, window, TASKS_ATOM__NET_WM_ICON, XA_CARDINAL, &cnt, (void*)&buf) != 0) return NULL; for(i = 0; i < cnt - 3; i++) @@ -571,7 +520,7 @@ static int _do_tasks_add(Tasks * tasks, int desktop, Window window, Task ** q; #ifndef EMBEDDED - if(_tasks_get_window_property(tasks, window, TASKS_ATOM_NET_WM_DESKTOP, + if(_tasks_get_window_property(tasks, window, TASKS_ATOM__NET_WM_DESKTOP, XA_CARDINAL, &cnt, (void*)&l) == 0) { if(cnt == 1) @@ -638,13 +587,13 @@ static int _do_typehint_normal(Tasks * tasks, Window window) unsigned long cnt = 0; if(_tasks_get_window_property(tasks, window, - TASKS_ATOM_NET_WM_WINDOW_TYPE, XA_ATOM, &cnt, + TASKS_ATOM__NET_WM_WINDOW_TYPE, XA_ATOM, &cnt, (void*)&p) == 0) { typehint = *p; XFree(p); return typehint == tasks->atom[ - TASKS_ATOM_NET_WM_WINDOW_TYPE_NORMAL] ? 0 : 1; + TASKS_ATOM__NET_WM_WINDOW_TYPE_NORMAL] ? 0 : 1; } /* FIXME return 1 if WM_TRANSIENT_FOR is set */ return 0; @@ -687,7 +636,7 @@ static void _clicked_activate(Task * task) xev.xclient.type = ClientMessage; xev.xclient.window = task->window; xev.xclient.message_type = task->tasks->atom[ - TASKS_ATOM_NET_ACTIVE_WINDOW]; + TASKS_ATOM__NET_ACTIVE_WINDOW]; xev.xclient.format = 32; xev.xclient.data.l[0] = 2; xev.xclient.data.l[1] = gdk_x11_display_get_user_time(display); @@ -715,10 +664,10 @@ static GdkFilterReturn _on_filter(GdkXEvent * xevent, GdkEvent * event, if(xev->type != PropertyNotify) return GDK_FILTER_CONTINUE; - if(xev->xproperty.atom != tasks->atom[TASKS_ATOM_NET_CLIENT_LIST] + if(xev->xproperty.atom != tasks->atom[TASKS_ATOM__NET_CLIENT_LIST] #ifndef EMBEDDED && xev->xproperty.atom - != tasks->atom[TASKS_ATOM_NET_CURRENT_DESKTOP] + != tasks->atom[TASKS_ATOM__NET_CURRENT_DESKTOP] #endif ) return GDK_FILTER_CONTINUE; @@ -739,21 +688,21 @@ static gboolean _on_popup(gpointer data) void (*callback)(gpointer data); char const * stock; } items[] = { - { TASKS_ATOM_NET_WM_ACTION_MOVE, _on_popup_move, "Move" }, - { TASKS_ATOM_NET_WM_ACTION_RESIZE, _on_popup_resize, "Resize" }, - { TASKS_ATOM_NET_WM_ACTION_MINIMIZE, _on_popup_minimize, + { TASKS_ATOM__NET_WM_ACTION_MOVE, _on_popup_move, "Move" }, + { TASKS_ATOM__NET_WM_ACTION_RESIZE, _on_popup_resize, "Resize" }, + { TASKS_ATOM__NET_WM_ACTION_MINIMIZE, _on_popup_minimize, "Minimize" }, - { TASKS_ATOM_NET_WM_ACTION_SHADE, _on_popup_shade, "Shade" }, - { TASKS_ATOM_NET_WM_ACTION_STICK, _on_popup_stick, "Stick" }, - { TASKS_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ, + { TASKS_ATOM__NET_WM_ACTION_SHADE, _on_popup_shade, "Shade" }, + { TASKS_ATOM__NET_WM_ACTION_STICK, _on_popup_stick, "Stick" }, + { TASKS_ATOM__NET_WM_ACTION_MAXIMIZE_HORZ, _on_popup_maximize_horz, "Maximize horizontally" }, - { TASKS_ATOM_NET_WM_ACTION_MAXIMIZE_VERT, + { TASKS_ATOM__NET_WM_ACTION_MAXIMIZE_VERT, _on_popup_maximize_vert, "Maximize vertically" }, - { TASKS_ATOM_NET_WM_ACTION_FULLSCREEN, _on_popup_fullscreen, + { TASKS_ATOM__NET_WM_ACTION_FULLSCREEN, _on_popup_fullscreen, GTK_STOCK_FULLSCREEN}, - { TASKS_ATOM_NET_WM_ACTION_CHANGE_DESKTOP, + { TASKS_ATOM__NET_WM_ACTION_CHANGE_DESKTOP, _on_popup_change_desktop, "Change desktop" }, - { TASKS_ATOM_NET_WM_ACTION_CLOSE, _on_popup_close, + { TASKS_ATOM__NET_WM_ACTION_CLOSE, _on_popup_close, GTK_STOCK_CLOSE } }; size_t j; @@ -761,7 +710,7 @@ static gboolean _on_popup(gpointer data) GtkWidget * menuitem; if(_tasks_get_window_property(task->tasks, task->window, - TASKS_ATOM_NET_WM_ALLOWED_ACTIONS, XA_ATOM, + TASKS_ATOM__NET_WM_ALLOWED_ACTIONS, XA_ATOM, &cnt, (void*)&buf) != 0) return FALSE; for(i = 0; i < cnt; i++) @@ -771,7 +720,7 @@ static gboolean _on_popup(gpointer data) break; if(j >= sizeof(items) / sizeof(*items)) continue; - if(items[j].atom == TASKS_ATOM_NET_WM_ACTION_CHANGE_DESKTOP) + if(items[j].atom == TASKS_ATOM__NET_WM_ACTION_CHANGE_DESKTOP) continue; /* FIXME implement as a special case */ if(menu == NULL) menu = gtk_menu_new(); @@ -810,7 +759,7 @@ static void _on_popup_close(gpointer data) xev.xclient.type = ClientMessage; xev.xclient.window = task->window; xev.xclient.message_type = task->tasks->atom[ - TASKS_ATOM_NET_CLOSE_WINDOW]; + TASKS_ATOM__NET_CLOSE_WINDOW]; xev.xclient.format = 32; xev.xclient.data.l[0] = gdk_x11_display_get_user_time(display); xev.xclient.data.l[1] = 2; @@ -828,7 +777,7 @@ static void _on_popup_fullscreen(gpointer data) { Task * task = data; - _task_toggle_state(task, TASKS_ATOM_NET_WM_STATE_FULLSCREEN); + _task_toggle_state(task, TASKS_ATOM__NET_WM_STATE_FULLSCREEN); } @@ -837,7 +786,7 @@ static void _on_popup_maximize_horz(gpointer data) { Task * task = data; - _task_toggle_state(task, TASKS_ATOM_NET_WM_STATE_MAXIMIZED_HORZ); + _task_toggle_state(task, TASKS_ATOM__NET_WM_STATE_MAXIMIZED_HORZ); } @@ -846,7 +795,7 @@ static void _on_popup_maximize_vert(gpointer data) { Task * task = data; - _task_toggle_state(task, TASKS_ATOM_NET_WM_STATE_MAXIMIZED_VERT); + _task_toggle_state(task, TASKS_ATOM__NET_WM_STATE_MAXIMIZED_VERT); } @@ -876,7 +825,7 @@ static void _on_popup_shade(gpointer data) { Task * task = data; - _task_toggle_state(task, TASKS_ATOM_NET_WM_STATE_SHADED); + _task_toggle_state(task, TASKS_ATOM__NET_WM_STATE_SHADED); } @@ -885,7 +834,7 @@ static void _on_popup_stick(gpointer data) { Task * task = data; - _task_toggle_state(task, TASKS_ATOM_NET_WM_STATE_STICKY); + _task_toggle_state(task, TASKS_ATOM__NET_WM_STATE_STICKY); }