atoms: add all used atoms

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-06-30 18:55:14 +02:00
parent 5daa38ac2d
commit b584b19104
13 changed files with 242 additions and 455 deletions

View File

@ -38,6 +38,7 @@
#include "systray.h" #include "systray.h"
#include "layouts/floating.h" #include "layouts/floating.h"
#include "common/markup.h" #include "common/markup.h"
#include "common/atoms.h"
extern awesome_t globalconf; extern awesome_t globalconf;
extern const name_func_link_t FloatingPlacementList[]; extern const name_func_link_t FloatingPlacementList[];
@ -69,12 +70,7 @@ client_loadprops(client_t * c, screen_t *screen)
tag_array_t *tags = &screen->tags; tag_array_t *tags = &screen->tags;
char *prop = NULL; char *prop = NULL;
if(!xutil_gettextprop(globalconf.connection, c->win, &globalconf.atoms, if(!xutil_gettextprop(globalconf.connection, c->win, _AWESOME_PROPERTIES, &prop))
xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms,
xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"_AWESOME_PROPERTIES")),
&prop))
return false; return false;
if(a_strlen(prop) != tags->len + 2) if(a_strlen(prop) != tags->len + 2)
@ -104,19 +100,13 @@ static bool
window_isprotodel(xcb_window_t win) window_isprotodel(xcb_window_t win)
{ {
uint32_t i, n; uint32_t i, n;
xcb_atom_t wm_delete_win_atom;
xcb_atom_t *protocols; xcb_atom_t *protocols;
bool ret = false; bool ret = false;
if(xcb_get_wm_protocols(globalconf.connection, win, &n, &protocols)) if(xcb_get_wm_protocols(globalconf.connection, win, &n, &protocols))
{ {
wm_delete_win_atom = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms,
xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"WM_DELETE_WINDOW"));
for(i = 0; !ret && i < n; i++) for(i = 0; !ret && i < n; i++)
if(protocols[i] == wm_delete_win_atom) if(protocols[i] == WM_DELETE_WINDOW)
ret = true; ret = true;
p_delete(&protocols); p_delete(&protocols);
} }
@ -161,14 +151,9 @@ void
client_updatetitle(client_t *c) client_updatetitle(client_t *c)
{ {
char *name; char *name;
xutil_intern_atom_request_t net_wm_name_q;
xcb_atom_t net_wm_name;
net_wm_name_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "_NET_WM_NAME"); if(!xutil_gettextprop(globalconf.connection, c->win, _NET_WM_NAME, &name))
net_wm_name = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, net_wm_name_q); if(!xutil_gettextprop(globalconf.connection, c->win, WM_NAME, &name))
if(!xutil_gettextprop(globalconf.connection, c->win, &globalconf.atoms, net_wm_name, &name))
if(!xutil_gettextprop(globalconf.connection, c->win, &globalconf.atoms, WM_NAME, &name))
return; return;
p_delete(&c->name); p_delete(&c->name);
@ -643,20 +628,15 @@ client_saveprops(client_t *c)
{ {
tag_array_t *tags = &globalconf.screens[c->screen].tags; tag_array_t *tags = &globalconf.screens[c->screen].tags;
unsigned char *prop = p_alloca(unsigned char, tags->len + 3); unsigned char *prop = p_alloca(unsigned char, tags->len + 3);
xutil_intern_atom_request_t atom_q;
int i; int i;
atom_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "_AWESOME_PROPERTIES");
for(i = 0; i < tags->len; i++) for(i = 0; i < tags->len; i++)
prop[i] = is_client_tagged(c, tags->tab[i]) ? '1' : '0'; prop[i] = is_client_tagged(c, tags->tab[i]) ? '1' : '0';
prop[i++] = c->isfloating ? '1' : '0'; prop[i++] = c->isfloating ? '1' : '0';
prop[i++] = '0' + c->layer; prop[i++] = '0' + c->layer;
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, c->win, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, c->win, _AWESOME_PROPERTIES, STRING, 8, i, prop);
xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, atom_q),
STRING, 8, i, prop);
} }
/** Unban a client. /** Unban a client.
@ -678,10 +658,6 @@ void
client_unmanage(client_t *c) client_unmanage(client_t *c)
{ {
tag_array_t *tags = &globalconf.screens[c->screen].tags; tag_array_t *tags = &globalconf.screens[c->screen].tags;
xutil_intern_atom_request_t awesome_properties_q;
xcb_atom_t awesome_properties;
awesome_properties_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "_AWESOME_PROPERTIES");
/* call hook */ /* call hook */
luaA_client_userdata_new(globalconf.L, c); luaA_client_userdata_new(globalconf.L, c);
@ -719,8 +695,7 @@ client_unmanage(client_t *c)
ewmh_update_net_client_list(c->phys_screen); ewmh_update_net_client_list(c->phys_screen);
/* delete properties */ /* delete properties */
awesome_properties = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, awesome_properties_q); xcb_delete_property(globalconf.connection, c->win, _AWESOME_PROPERTIES);
xcb_delete_property(globalconf.connection, c->win, awesome_properties);
p_delete(&c); p_delete(&c);
} }
@ -860,13 +835,9 @@ void
client_kill(client_t *c) client_kill(client_t *c)
{ {
xcb_client_message_event_t ev; xcb_client_message_event_t ev;
xutil_intern_atom_request_t wm_protocols_q, wm_delete_window_q;
if(window_isprotodel(c->win)) if(window_isprotodel(c->win))
{ {
wm_protocols_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "WM_PROTOCOLS");
wm_delete_window_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "WM_DELETE_WINDOW");
/* Initialize all of event's fields first */ /* Initialize all of event's fields first */
p_clear(&ev, 1); p_clear(&ev, 1);
@ -874,8 +845,8 @@ client_kill(client_t *c)
ev.window = c->win; ev.window = c->win;
ev.format = 32; ev.format = 32;
ev.data.data32[1] = XCB_CURRENT_TIME; ev.data.data32[1] = XCB_CURRENT_TIME;
ev.type = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, wm_protocols_q); ev.type = WM_PROTOCOLS;
ev.data.data32[0] = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, wm_delete_window_q); ev.data.data32[0] = WM_DELETE_WINDOW;
xcb_send_event(globalconf.connection, false, c->win, xcb_send_event(globalconf.connection, false, c->win,
XCB_EVENT_MASK_NO_EVENT, (char *) &ev); XCB_EVENT_MASK_NO_EVENT, (char *) &ev);

View File

@ -22,39 +22,51 @@
#include "common/atoms.h" #include "common/atoms.h"
#include "common/util.h" #include "common/util.h"
xcb_atom_t NET_SUPPORTED; xcb_atom_t _NET_SUPPORTED;
xcb_atom_t NET_CLIENT_LIST; xcb_atom_t _NET_CLIENT_LIST;
xcb_atom_t NET_CLIENT_LIST_STACKING; xcb_atom_t _NET_CLIENT_LIST_STACKING;
xcb_atom_t NET_NUMBER_OF_DESKTOPS; xcb_atom_t _NET_NUMBER_OF_DESKTOPS;
xcb_atom_t NET_CURRENT_DESKTOP; xcb_atom_t _NET_CURRENT_DESKTOP;
xcb_atom_t NET_DESKTOP_NAMES; xcb_atom_t _NET_DESKTOP_NAMES;
xcb_atom_t NET_ACTIVE_WINDOW; xcb_atom_t _NET_ACTIVE_WINDOW;
xcb_atom_t NET_WORKAREA; xcb_atom_t _NET_WORKAREA;
xcb_atom_t NET_SUPPORTING_WM_CHECK; xcb_atom_t _NET_SUPPORTING_WM_CHECK;
xcb_atom_t NET_CLOSE_WINDOW; xcb_atom_t _NET_CLOSE_WINDOW;
xcb_atom_t NET_WM_NAME; xcb_atom_t _NET_WM_NAME;
xcb_atom_t NET_WM_VISIBLE_NAME; xcb_atom_t _NET_WM_VISIBLE_NAME;
xcb_atom_t NET_WM_DESKTOP; xcb_atom_t _NET_WM_DESKTOP;
xcb_atom_t NET_WM_ICON_NAME; xcb_atom_t _NET_WM_ICON_NAME;
xcb_atom_t NET_WM_VISIBLE_ICON_NAME; xcb_atom_t _NET_WM_VISIBLE_ICON_NAME;
xcb_atom_t NET_WM_WINDOW_TYPE; xcb_atom_t _NET_WM_WINDOW_TYPE;
xcb_atom_t NET_WM_WINDOW_TYPE_NORMAL; xcb_atom_t _NET_WM_WINDOW_TYPE_NORMAL;
xcb_atom_t NET_WM_WINDOW_TYPE_DESKTOP; xcb_atom_t _NET_WM_WINDOW_TYPE_DESKTOP;
xcb_atom_t NET_WM_WINDOW_TYPE_DOCK; xcb_atom_t _NET_WM_WINDOW_TYPE_DOCK;
xcb_atom_t NET_WM_WINDOW_TYPE_SPLASH; xcb_atom_t _NET_WM_WINDOW_TYPE_SPLASH;
xcb_atom_t NET_WM_WINDOW_TYPE_DIALOG; xcb_atom_t _NET_WM_WINDOW_TYPE_DIALOG;
xcb_atom_t NET_WM_ICON; xcb_atom_t _NET_WM_ICON;
xcb_atom_t NET_WM_PID; xcb_atom_t _NET_WM_PID;
xcb_atom_t NET_WM_STATE; xcb_atom_t _NET_WM_STATE;
xcb_atom_t NET_WM_STATE_STICKY; xcb_atom_t _NET_WM_STATE_STICKY;
xcb_atom_t NET_WM_STATE_SKIP_TASKBAR; xcb_atom_t _NET_WM_STATE_SKIP_TASKBAR;
xcb_atom_t NET_WM_STATE_FULLSCREEN; xcb_atom_t _NET_WM_STATE_FULLSCREEN;
xcb_atom_t NET_WM_STATE_ABOVE; xcb_atom_t _NET_WM_STATE_ABOVE;
xcb_atom_t NET_WM_STATE_BELOW; xcb_atom_t _NET_WM_STATE_BELOW;
xcb_atom_t NET_WM_STATE_MODAL; xcb_atom_t _NET_WM_STATE_MODAL;
xcb_atom_t NET_WM_STATE_HIDDEN; xcb_atom_t _NET_WM_STATE_HIDDEN;
xcb_atom_t NET_WM_STATE_DEMANDS_ATTENTION; xcb_atom_t _NET_WM_STATE_DEMANDS_ATTENTION;
xcb_atom_t UTF8_STRING; xcb_atom_t UTF8_STRING;
xcb_atom_t _AWESOME_PROPERTIES;
xcb_atom_t WM_PROTOCOLS;
xcb_atom_t WM_DELETE_WINDOW;
xcb_atom_t _XEMBED;
xcb_atom_t _XEMBED_INFO;
xcb_atom_t _NET_SYSTEM_TRAY_OPCODE;
xcb_atom_t _KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR;
xcb_atom_t MANAGER;
xcb_atom_t _XROOTPMAP_ID;
xcb_atom_t WM_STATE;
xcb_atom_t _NET_WM_WINDOW_OPACITY;
xcb_atom_t _NET_SYSTEM_TRAY_ORIENTATION;
typedef struct typedef struct
{ {
@ -64,39 +76,51 @@ typedef struct
static atom_item_t ATOM_LIST[] = static atom_item_t ATOM_LIST[] =
{ {
{ "_NET_SUPPORTED", &NET_SUPPORTED }, { "_NET_SUPPORTED", &_NET_SUPPORTED },
{ "_NET_CLIENT_LIST", &NET_CLIENT_LIST }, { "_NET_CLIENT_LIST", &_NET_CLIENT_LIST },
{ "_NET_CLIENT_LIST_STACKING", &NET_CLIENT_LIST_STACKING }, { "_NET_CLIENT_LIST_STACKING", &_NET_CLIENT_LIST_STACKING },
{ "_NET_NUMBER_OF_DESKTOPS", &NET_NUMBER_OF_DESKTOPS }, { "_NET_NUMBER_OF_DESKTOPS", &_NET_NUMBER_OF_DESKTOPS },
{ "_NET_CURRENT_DESKTOP", &NET_CURRENT_DESKTOP }, { "_NET_CURRENT_DESKTOP", &_NET_CURRENT_DESKTOP },
{ "_NET_DESKTOP_NAMES", &NET_DESKTOP_NAMES }, { "_NET_DESKTOP_NAMES", &_NET_DESKTOP_NAMES },
{ "_NET_ACTIVE_WINDOW", &NET_ACTIVE_WINDOW }, { "_NET_ACTIVE_WINDOW", &_NET_ACTIVE_WINDOW },
{ "_NET_WORKAREA", &NET_WORKAREA }, { "_NET_WORKAREA", &_NET_WORKAREA },
{ "_NET_SUPPORTING_WM_CHECK", &NET_SUPPORTING_WM_CHECK }, { "_NET_SUPPORTING_WM_CHECK", &_NET_SUPPORTING_WM_CHECK },
{ "_NET_CLOSE_WINDOW", &NET_CLOSE_WINDOW }, { "_NET_CLOSE_WINDOW", &_NET_CLOSE_WINDOW },
{ "_NET_WM_NAME", &NET_WM_NAME }, { "_NET_WM_NAME", &_NET_WM_NAME },
{ "_NET_WM_VISIBLE_NAME", &NET_WM_VISIBLE_NAME }, { "_NET_WM_VISIBLE_NAME", &_NET_WM_VISIBLE_NAME },
{ "_NET_WM_DESKTOP", &NET_WM_DESKTOP }, { "_NET_WM_DESKTOP", &_NET_WM_DESKTOP },
{ "_NET_WM_ICON_NAME", &NET_WM_ICON_NAME }, { "_NET_WM_ICON_NAME", &_NET_WM_ICON_NAME },
{ "_NET_WM_VISIBLE_ICON_NAME", &NET_WM_VISIBLE_ICON_NAME }, { "_NET_WM_VISIBLE_ICON_NAME", &_NET_WM_VISIBLE_ICON_NAME },
{ "_NET_WM_WINDOW_TYPE", &NET_WM_WINDOW_TYPE }, { "_NET_WM_WINDOW_TYPE", &_NET_WM_WINDOW_TYPE },
{ "_NET_WM_WINDOW_TYPE_NORMAL", &NET_WM_WINDOW_TYPE_NORMAL }, { "_NET_WM_WINDOW_TYPE_NORMAL", &_NET_WM_WINDOW_TYPE_NORMAL },
{ "_NET_WM_WINDOW_TYPE_DESKTOP", &NET_WM_WINDOW_TYPE_DESKTOP }, { "_NET_WM_WINDOW_TYPE_DESKTOP", &_NET_WM_WINDOW_TYPE_DESKTOP },
{ "_NET_WM_WINDOW_TYPE_DOCK", &NET_WM_WINDOW_TYPE_DOCK }, { "_NET_WM_WINDOW_TYPE_DOCK", &_NET_WM_WINDOW_TYPE_DOCK },
{ "_NET_WM_WINDOW_TYPE_SPLASH", &NET_WM_WINDOW_TYPE_SPLASH }, { "_NET_WM_WINDOW_TYPE_SPLASH", &_NET_WM_WINDOW_TYPE_SPLASH },
{ "_NET_WM_WINDOW_TYPE_DIALOG", &NET_WM_WINDOW_TYPE_DIALOG }, { "_NET_WM_WINDOW_TYPE_DIALOG", &_NET_WM_WINDOW_TYPE_DIALOG },
{ "_NET_WM_ICON", &NET_WM_ICON }, { "_NET_WM_ICON", &_NET_WM_ICON },
{ "_NET_WM_PID", &NET_WM_PID }, { "_NET_WM_PID", &_NET_WM_PID },
{ "_NET_WM_STATE", &NET_WM_STATE }, { "_NET_WM_STATE", &_NET_WM_STATE },
{ "_NET_WM_STATE_STICKY", &NET_WM_STATE_STICKY }, { "_NET_WM_STATE_STICKY", &_NET_WM_STATE_STICKY },
{ "_NET_WM_STATE_SKIP_TASKBAR", &NET_WM_STATE_SKIP_TASKBAR }, { "_NET_WM_STATE_SKIP_TASKBAR", &_NET_WM_STATE_SKIP_TASKBAR },
{ "_NET_WM_STATE_FULLSCREEN", &NET_WM_STATE_FULLSCREEN }, { "_NET_WM_STATE_FULLSCREEN", &_NET_WM_STATE_FULLSCREEN },
{ "_NET_WM_STATE_ABOVE", &NET_WM_STATE_ABOVE }, { "_NET_WM_STATE_ABOVE", &_NET_WM_STATE_ABOVE },
{ "_NET_WM_STATE_BELOW", &NET_WM_STATE_BELOW }, { "_NET_WM_STATE_BELOW", &_NET_WM_STATE_BELOW },
{ "_NET_WM_STATE_MODAL", &NET_WM_STATE_MODAL }, { "_NET_WM_STATE_MODAL", &_NET_WM_STATE_MODAL },
{ "_NET_WM_STATE_HIDDEN", &NET_WM_STATE_HIDDEN }, { "_NET_WM_STATE_HIDDEN", &_NET_WM_STATE_HIDDEN },
{ "_NET_WM_STATE_DEMANDS_ATTENTION", &NET_WM_STATE_DEMANDS_ATTENTION }, { "_NET_WM_STATE_DEMANDS_ATTENTION", &_NET_WM_STATE_DEMANDS_ATTENTION },
{ "UTF8_STRING", &UTF8_STRING }, { "UTF8_STRING", &UTF8_STRING },
{ "_AWESOME_PROPERTIES", &_AWESOME_PROPERTIES },
{ "WM_PROTOCOLS", &WM_PROTOCOLS },
{ "WM_DELETE_WINDOW", &WM_DELETE_WINDOW },
{ "_XEMBED", &_XEMBED },
{ "_XEMBED_INFO", &_XEMBED_INFO },
{ "_NET_SYSTEM_TRAY_OPCODE", &_NET_SYSTEM_TRAY_OPCODE },
{ "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", &_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR },
{ "MANAGER", &MANAGER },
{ "_XROOTPMAP_ID", &_XROOTPMAP_ID },
{ "WM_STATE", &WM_STATE },
{ "_NET_WM_WINDOW_OPACITY", &_NET_WM_WINDOW_OPACITY },
{ "_NET_SYSTEM_TRAY_ORIENTATION", &_NET_SYSTEM_TRAY_ORIENTATION },
}; };
void void

View File

@ -24,39 +24,51 @@
#include <xcb/xcb.h> #include <xcb/xcb.h>
extern xcb_atom_t NET_SUPPORTED; extern xcb_atom_t _NET_SUPPORTED;
extern xcb_atom_t NET_CLIENT_LIST; extern xcb_atom_t _NET_CLIENT_LIST;
extern xcb_atom_t NET_CLIENT_LIST_STACKING; extern xcb_atom_t _NET_CLIENT_LIST_STACKING;
extern xcb_atom_t NET_NUMBER_OF_DESKTOPS; extern xcb_atom_t _NET_NUMBER_OF_DESKTOPS;
extern xcb_atom_t NET_CURRENT_DESKTOP; extern xcb_atom_t _NET_CURRENT_DESKTOP;
extern xcb_atom_t NET_DESKTOP_NAMES; extern xcb_atom_t _NET_DESKTOP_NAMES;
extern xcb_atom_t NET_ACTIVE_WINDOW; extern xcb_atom_t _NET_ACTIVE_WINDOW;
extern xcb_atom_t NET_WORKAREA; extern xcb_atom_t _NET_WORKAREA;
extern xcb_atom_t NET_SUPPORTING_WM_CHECK; extern xcb_atom_t _NET_SUPPORTING_WM_CHECK;
extern xcb_atom_t NET_CLOSE_WINDOW; extern xcb_atom_t _NET_CLOSE_WINDOW;
extern xcb_atom_t NET_WM_NAME; extern xcb_atom_t _NET_WM_NAME;
extern xcb_atom_t NET_WM_VISIBLE_NAME; extern xcb_atom_t _NET_WM_VISIBLE_NAME;
extern xcb_atom_t NET_WM_DESKTOP; extern xcb_atom_t _NET_WM_DESKTOP;
extern xcb_atom_t NET_WM_ICON_NAME; extern xcb_atom_t _NET_WM_ICON_NAME;
extern xcb_atom_t NET_WM_VISIBLE_ICON_NAME; extern xcb_atom_t _NET_WM_VISIBLE_ICON_NAME;
extern xcb_atom_t NET_WM_WINDOW_TYPE; extern xcb_atom_t _NET_WM_WINDOW_TYPE;
extern xcb_atom_t NET_WM_WINDOW_TYPE_NORMAL; extern xcb_atom_t _NET_WM_WINDOW_TYPE_NORMAL;
extern xcb_atom_t NET_WM_WINDOW_TYPE_DESKTOP; extern xcb_atom_t _NET_WM_WINDOW_TYPE_DESKTOP;
extern xcb_atom_t NET_WM_WINDOW_TYPE_DOCK; extern xcb_atom_t _NET_WM_WINDOW_TYPE_DOCK;
extern xcb_atom_t NET_WM_WINDOW_TYPE_SPLASH; extern xcb_atom_t _NET_WM_WINDOW_TYPE_SPLASH;
extern xcb_atom_t NET_WM_WINDOW_TYPE_DIALOG; extern xcb_atom_t _NET_WM_WINDOW_TYPE_DIALOG;
extern xcb_atom_t NET_WM_ICON; extern xcb_atom_t _NET_WM_ICON;
extern xcb_atom_t NET_WM_PID; extern xcb_atom_t _NET_WM_PID;
extern xcb_atom_t NET_WM_STATE; extern xcb_atom_t _NET_WM_STATE;
extern xcb_atom_t NET_WM_STATE_STICKY; extern xcb_atom_t _NET_WM_STATE_STICKY;
extern xcb_atom_t NET_WM_STATE_SKIP_TASKBAR; extern xcb_atom_t _NET_WM_STATE_SKIP_TASKBAR;
extern xcb_atom_t NET_WM_STATE_FULLSCREEN; extern xcb_atom_t _NET_WM_STATE_FULLSCREEN;
extern xcb_atom_t NET_WM_STATE_ABOVE; extern xcb_atom_t _NET_WM_STATE_ABOVE;
extern xcb_atom_t NET_WM_STATE_BELOW; extern xcb_atom_t _NET_WM_STATE_BELOW;
extern xcb_atom_t NET_WM_STATE_MODAL; extern xcb_atom_t _NET_WM_STATE_MODAL;
extern xcb_atom_t NET_WM_STATE_HIDDEN; extern xcb_atom_t _NET_WM_STATE_HIDDEN;
extern xcb_atom_t NET_WM_STATE_DEMANDS_ATTENTION; extern xcb_atom_t _NET_WM_STATE_DEMANDS_ATTENTION;
extern xcb_atom_t UTF8_STRING; extern xcb_atom_t UTF8_STRING;
extern xcb_atom_t _AWESOME_PROPERTIES;
extern xcb_atom_t WM_PROTOCOLS;
extern xcb_atom_t WM_DELETE_WINDOW;
extern xcb_atom_t _XEMBED;
extern xcb_atom_t _XEMBED_INFO;
extern xcb_atom_t _NET_SYSTEM_TRAY_OPCODE;
extern xcb_atom_t _KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR;
extern xcb_atom_t MANAGER;
extern xcb_atom_t _XROOTPMAP_ID;
extern xcb_atom_t WM_STATE;
extern xcb_atom_t _NET_WM_WINDOW_OPACITY;
extern xcb_atom_t _NET_SYSTEM_TRAY_ORIENTATION;
void atoms_init(xcb_connection_t *); void atoms_init(xcb_connection_t *);

View File

@ -23,6 +23,7 @@
#include "common/xembed.h" #include "common/xembed.h"
#include "common/xutil.h" #include "common/xutil.h"
#include "common/util.h" #include "common/util.h"
#include "common/atoms.h"
/** Have the embedder end XEMBED protocol communication with a child. /** Have the embedder end XEMBED protocol communication with a child.
* \param connection The X connection. * \param connection The X connection.
@ -59,10 +60,8 @@ xembed_message_send(xcb_connection_t *connection, xcb_window_t towin,
long message, long d1, long d2, long d3) long message, long d1, long d2, long d3)
{ {
xcb_client_message_event_t ev; xcb_client_message_event_t ev;
xutil_intern_atom_request_t atom_q;
/** \todo use atom cache */ /** \todo use atom cache */
atom_q = xutil_intern_atom(connection, NULL, "_XEMBED");
p_clear(&ev, 1); p_clear(&ev, 1);
ev.response_type = XCB_CLIENT_MESSAGE; ev.response_type = XCB_CLIENT_MESSAGE;
ev.window = towin; ev.window = towin;
@ -72,7 +71,7 @@ xembed_message_send(xcb_connection_t *connection, xcb_window_t towin,
ev.data.data32[2] = d1; ev.data.data32[2] = d1;
ev.data.data32[3] = d2; ev.data.data32[3] = d2;
ev.data.data32[4] = d3; ev.data.data32[4] = d3;
ev.type = xutil_intern_atom_reply(connection, NULL, atom_q); ev.type = _XEMBED;
xcb_send_event(connection, false, towin, XCB_EVENT_MASK_NO_EVENT, (char *) &ev); xcb_send_event(connection, false, towin, XCB_EVENT_MASK_NO_EVENT, (char *) &ev);
} }
@ -84,18 +83,13 @@ xembed_message_send(xcb_connection_t *connection, xcb_window_t towin,
bool bool
xembed_info_get(xcb_connection_t *connection, xcb_window_t win, xembed_info_t *info) xembed_info_get(xcb_connection_t *connection, xcb_window_t win, xembed_info_t *info)
{ {
xutil_intern_atom_request_t atom_q;
xcb_atom_t atom;
xcb_get_property_cookie_t prop_c; xcb_get_property_cookie_t prop_c;
xcb_get_property_reply_t *prop_r; xcb_get_property_reply_t *prop_r;
uint32_t *data; uint32_t *data;
bool ret = false; bool ret = false;
/** \todo use atom cache */ /** \todo use atom cache */
atom_q = xutil_intern_atom(connection, NULL, "_XEMBED_INFO"); prop_c = xcb_get_property_unchecked(connection, false, win, _XEMBED_INFO,
atom = xutil_intern_atom_reply(connection, NULL, atom_q);
prop_c = xcb_get_property_unchecked(connection, false, win, atom,
XCB_GET_PROPERTY_TYPE_ANY, 0L, 2); XCB_GET_PROPERTY_TYPE_ANY, 0L, 2);
prop_r = xcb_get_property_reply(connection, prop_c, NULL); prop_r = xcb_get_property_reply(connection, prop_c, NULL);

View File

@ -29,19 +29,17 @@
#include "common/util.h" #include "common/util.h"
#include "common/xutil.h" #include "common/xutil.h"
#include "common/atoms.h"
/** Get the string value of an atom. /** Get the string value of an atom.
* \param conn X connection * \param conn X connection
* \param w window * \param w window
* \param atoms atoms cache
* \param atom the atom * \param atom the atom
* \param text buffer to fill * \param text buffer to fill
* \return true on sucess, falsse on failure * \return true on sucess, falsse on failure
*/ */
bool bool
xutil_gettextprop(xcb_connection_t *conn, xcb_window_t w, xutil_gettextprop(xcb_connection_t *conn, xcb_window_t w, xcb_atom_t atom, char **text)
xutil_atom_cache_array_t *atoms,
xcb_atom_t atom, char **text)
{ {
xcb_get_property_cookie_t prop_c; xcb_get_property_cookie_t prop_c;
xcb_get_property_reply_t *prop_r; xcb_get_property_reply_t *prop_r;
@ -68,10 +66,7 @@ xutil_gettextprop(xcb_connection_t *conn, xcb_window_t w,
/* Check whether the returned property value is just an ascii /* Check whether the returned property value is just an ascii
* string or utf8 string. At the moment it doesn't handle * string or utf8 string. At the moment it doesn't handle
* COMPOUND_TEXT and multibyte but it's not needed... */ * COMPOUND_TEXT and multibyte but it's not needed... */
if(prop_r->type == STRING || if(prop_r->type == STRING || prop_r->type == UTF8_STRING)
prop_r->type == xutil_intern_atom_reply(conn, atoms,
xutil_intern_atom(conn, atoms,
"UTF8_STRING")))
{ {
*text = p_new(char, prop_r->value_len + 1); *text = p_new(char, prop_r->value_len + 1);
/* use memcpy() because prop_val may not be \0 terminated */ /* use memcpy() because prop_val may not be \0 terminated */
@ -156,127 +151,6 @@ xutil_get_transient_for_hint(xcb_connection_t *c, xcb_window_t win,
return true; return true;
} }
/** Send an unchecked InternAtom request if it is not already in the
* cache, in the second case it stores the cache entry (an ordered
* array).
* \param c X connection.
* \param atoms Atoms cache, or NULL if no cache.
* \param name Atom name.
* \return A request structure.
*/
xutil_intern_atom_request_t
xutil_intern_atom(xcb_connection_t *c,
xutil_atom_cache_array_t *atoms,
const char *name)
{
xutil_intern_atom_request_t atom_req;
int l = 0, r;
p_clear(&atom_req, 1);
/* Check if this atom is present in the cache ordered array */
if(atoms)
{
r = atoms->len;
while (l < r)
{
int i = (r + l) / 2;
switch (a_strcmp(name, atoms->tab[i]->name))
{
case -1: /* ev < atoms->tab[i] */
r = i;
break;
case 0: /* ev == atoms->tab[i] */
atom_req.cache_hit = true;
atom_req.cache = atoms->tab[i];
return atom_req;
case 1: /* ev > atoms->tab[i] */
l = i + 1;
break;
}
}
}
/* Otherwise send an InternAtom request to the server */
atom_req.name = a_strdup(name);
atom_req.cookie = xcb_intern_atom_unchecked(c, false, a_strlen(name), name);
return atom_req;
}
/** Treat the reply which may be a cache entry or a reply from
* InternAtom request (cookie), in the second case, add the atom to
* the cache.
* \param c X connection.
* \param atoms Atoms cache or NULL if no cache.
* \param atom_req Atom request.
* \return A brand new xcb_atom_t.
*/
xcb_atom_t
xutil_intern_atom_reply(xcb_connection_t *c,
xutil_atom_cache_array_t *atoms,
xutil_intern_atom_request_t atom_req)
{
xcb_intern_atom_reply_t *atom_rep;
xutil_atom_cache_t *atom_cache;
xcb_atom_t atom = 0;
int l = 0, r;
/* If the atom is present in the cache, just returns the
* atom... */
if(atom_req.cache_hit)
return atom_req.cache->atom;
/* Get the reply from InternAtom request */
if(!(atom_rep = xcb_intern_atom_reply(c, atom_req.cookie, NULL)))
goto bailout;
atom = atom_rep->atom;
if(atoms)
{
r = atoms->len;
/* Create a new atom cache entry */
atom_cache = p_new(xutil_atom_cache_t, 1);
atom_cache->atom = atom_rep->atom;
atom_cache->name = atom_req.name;
while (l < r)
{
int i = (r + l) / 2;
switch(a_strcmp(atom_cache->name, atoms->tab[i]->name))
{
case -1: /* k < atoms->tab[i] */
r = i;
break;
case 0: /* k == atoms->tab[i] cannot append */
assert(0);
case 1: /* k > atoms->tab[i] */
l = i + 1;
break;
}
}
xutil_atom_cache_array_splice(atoms, r, 0, &atom_cache, 1);
}
bailout:
p_delete(&atom_rep);
return atom;
}
/* Delete a atom cache entry.
* \param entry A cache entry.
*/
void
xutil_atom_cache_delete(xutil_atom_cache_t **entry)
{
p_delete(&(*entry)->name);
p_delete(entry);
}
class_hint_t * class_hint_t *
xutil_get_class_hint(xcb_connection_t *conn, xcb_window_t win) xutil_get_class_hint(xcb_connection_t *conn, xcb_window_t win)
{ {

View File

@ -96,44 +96,7 @@ typedef struct
class_hint_t *xutil_get_class_hint(xcb_connection_t *, xcb_window_t); class_hint_t *xutil_get_class_hint(xcb_connection_t *, xcb_window_t);
/** Cache entry */ bool xutil_gettextprop(xcb_connection_t *, xcb_window_t, xcb_atom_t, char **);
typedef struct
{
/** Atom X identifier */
xcb_atom_t atom;
/** Atom name */
char *name;
} xutil_atom_cache_t;
void xutil_atom_cache_delete(xutil_atom_cache_t **);
DO_ARRAY(xutil_atom_cache_t *, xutil_atom_cache, xutil_atom_cache_delete)
/** InternAtom request data structure which may hold the cookie if the
* atom is not already present in the cache */
typedef struct
{
/* Cache hit */
bool cache_hit;
/* Atom string name */
char *name;
union
{
/* Cookie of the InternAtom request */
xcb_intern_atom_cookie_t cookie;
/* Cache entry */
xutil_atom_cache_t *cache;
};
} xutil_intern_atom_request_t;
xutil_intern_atom_request_t xutil_intern_atom(xcb_connection_t *, xutil_atom_cache_array_t *,
const char *);
xcb_atom_t xutil_intern_atom_reply(xcb_connection_t *, xutil_atom_cache_array_t *,
xutil_intern_atom_request_t);
bool xutil_gettextprop(xcb_connection_t *, xcb_window_t, xutil_atom_cache_array_t *,
xcb_atom_t, char **);
void xutil_getlockmask(xcb_connection_t *, xcb_key_symbols_t *, void xutil_getlockmask(xcb_connection_t *, xcb_key_symbols_t *,
unsigned int *, unsigned int *, unsigned int *); unsigned int *, unsigned int *, unsigned int *);

20
event.c
View File

@ -35,6 +35,7 @@
#include "lua.h" #include "lua.h"
#include "systray.h" #include "systray.h"
#include "layouts/floating.h" #include "layouts/floating.h"
#include "common/atoms.h"
extern awesome_t globalconf; extern awesome_t globalconf;
@ -530,11 +531,7 @@ event_handle_propertynotify(void *data __attribute__ ((unused)),
else if (ev->atom == WM_HINTS) else if (ev->atom == WM_HINTS)
client_updatewmhints(c); client_updatewmhints(c);
if(ev->atom == WM_NAME if(ev->atom == WM_NAME || ev->atom == _NET_WM_NAME)
|| ev->atom == xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms,
xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"_NET_WM_NAME")))
client_updatetitle(c); client_updatetitle(c);
} }
@ -620,18 +617,9 @@ event_handle_clientmessage(void *data __attribute__ ((unused)),
xcb_connection_t *connection, xcb_connection_t *connection,
xcb_client_message_event_t *ev) xcb_client_message_event_t *ev)
{ {
xutil_intern_atom_request_t atom_xem_q, atom_systray_q; if(ev->type == _XEMBED)
xcb_atom_t atom_xem, atom_systray;
atom_xem_q = xutil_intern_atom(connection, &globalconf.atoms, "_XEMBED");
atom_systray_q = xutil_intern_atom(connection, &globalconf.atoms, "_NET_SYSTEM_TRAY_OPCODE");
atom_xem = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, atom_xem_q);
atom_systray = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, atom_systray_q);
if(ev->type == atom_xem)
return xembed_process_client_message(ev); return xembed_process_client_message(ev);
else if(ev->type == atom_systray) else if(ev->type == _NET_SYSTEM_TRAY_OPCODE)
return systray_process_client_message(ev); return systray_process_client_message(ev);
return ewmh_process_client_message(ev); return ewmh_process_client_message(ev);
} }

128
ewmh.c
View File

@ -48,42 +48,42 @@ ewmh_init(int phys_screen)
xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen); xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen);
xcb_atom_t atom[] = xcb_atom_t atom[] =
{ {
NET_SUPPORTED, _NET_SUPPORTED,
NET_SUPPORTING_WM_CHECK, _NET_SUPPORTING_WM_CHECK,
NET_CLIENT_LIST, _NET_CLIENT_LIST,
NET_CLIENT_LIST_STACKING, _NET_CLIENT_LIST_STACKING,
NET_NUMBER_OF_DESKTOPS, _NET_NUMBER_OF_DESKTOPS,
NET_CURRENT_DESKTOP, _NET_CURRENT_DESKTOP,
NET_DESKTOP_NAMES, _NET_DESKTOP_NAMES,
NET_ACTIVE_WINDOW, _NET_ACTIVE_WINDOW,
NET_WORKAREA, _NET_WORKAREA,
NET_CLOSE_WINDOW, _NET_CLOSE_WINDOW,
NET_WM_NAME, _NET_WM_NAME,
NET_WM_ICON_NAME, _NET_WM_ICON_NAME,
NET_WM_VISIBLE_ICON_NAME, _NET_WM_VISIBLE_ICON_NAME,
NET_WM_DESKTOP, _NET_WM_DESKTOP,
NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE,
NET_WM_WINDOW_TYPE_NORMAL, _NET_WM_WINDOW_TYPE_NORMAL,
NET_WM_WINDOW_TYPE_DESKTOP, _NET_WM_WINDOW_TYPE_DESKTOP,
NET_WM_WINDOW_TYPE_DOCK, _NET_WM_WINDOW_TYPE_DOCK,
NET_WM_WINDOW_TYPE_SPLASH, _NET_WM_WINDOW_TYPE_SPLASH,
NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_WINDOW_TYPE_DIALOG,
NET_WM_ICON, _NET_WM_ICON,
NET_WM_PID, _NET_WM_PID,
NET_WM_STATE, _NET_WM_STATE,
NET_WM_STATE_STICKY, _NET_WM_STATE_STICKY,
NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_SKIP_TASKBAR,
NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FULLSCREEN,
NET_WM_STATE_ABOVE, _NET_WM_STATE_ABOVE,
NET_WM_STATE_BELOW, _NET_WM_STATE_BELOW,
NET_WM_STATE_MODAL, _NET_WM_STATE_MODAL,
NET_WM_STATE_HIDDEN, _NET_WM_STATE_HIDDEN,
NET_WM_STATE_DEMANDS_ATTENTION _NET_WM_STATE_DEMANDS_ATTENTION
}; };
int i; int i;
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xscreen->root, NET_SUPPORTED, ATOM, 32, xscreen->root, _NET_SUPPORTED, ATOM, 32,
countof(atom), atom); countof(atom), atom);
/* create our own window */ /* create our own window */
@ -93,21 +93,21 @@ ewmh_init(int phys_screen)
XCB_COPY_FROM_PARENT, xscreen->root_visual, 0, NULL); XCB_COPY_FROM_PARENT, xscreen->root_visual, 0, NULL);
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xscreen->root, NET_SUPPORTING_WM_CHECK, WINDOW, 32, xscreen->root, _NET_SUPPORTING_WM_CHECK, WINDOW, 32,
1, &father); 1, &father);
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
father, NET_SUPPORTING_WM_CHECK, WINDOW, 32, father, _NET_SUPPORTING_WM_CHECK, WINDOW, 32,
1, &father); 1, &father);
/* set the window manager name */ /* set the window manager name */
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
father, NET_WM_NAME, UTF8_STRING, 8, 7, "awesome"); father, _NET_WM_NAME, UTF8_STRING, 8, 7, "awesome");
/* set the window manager PID */ /* set the window manager PID */
i = getpid(); i = getpid();
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
father, NET_WM_PID, CARDINAL, 32, 1, &i); father, _NET_WM_PID, CARDINAL, 32, 1, &i);
} }
void void
@ -128,7 +128,7 @@ ewmh_update_net_client_list(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_CLIENT_LIST, WINDOW, 32, n, wins); _NET_CLIENT_LIST, WINDOW, 32, n, wins);
p_delete(&wins); p_delete(&wins);
} }
@ -154,7 +154,7 @@ ewmh_update_net_client_list_stacking(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_CLIENT_LIST_STACKING, WINDOW, 32, n, wins); _NET_CLIENT_LIST_STACKING, WINDOW, 32, n, wins);
p_delete(&wins); p_delete(&wins);
} }
@ -166,7 +166,7 @@ ewmh_update_net_numbers_of_desktop(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_NUMBER_OF_DESKTOPS, CARDINAL, 32, 1, &count); _NET_NUMBER_OF_DESKTOPS, CARDINAL, 32, 1, &count);
} }
void void
@ -180,7 +180,7 @@ ewmh_update_net_current_desktop(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_CURRENT_DESKTOP, CARDINAL, 32, 1, &count); _NET_CURRENT_DESKTOP, CARDINAL, 32, 1, &count);
p_delete(&curtags); p_delete(&curtags);
} }
@ -201,7 +201,7 @@ ewmh_update_net_desktop_names(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_DESKTOP_NAMES, UTF8_STRING, 8, buf.len, buf.s); _NET_DESKTOP_NAMES, UTF8_STRING, 8, buf.len, buf.s);
buffer_wipe(&buf); buffer_wipe(&buf);
} }
@ -228,7 +228,7 @@ ewmh_update_workarea(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_WORKAREA, CARDINAL, 32, tags->len * 4, area); _NET_WORKAREA, CARDINAL, 32, tags->len * 4, area);
} }
void void
@ -241,19 +241,19 @@ ewmh_update_net_active_window(int phys_screen)
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
xutil_screen_get(globalconf.connection, phys_screen)->root, xutil_screen_get(globalconf.connection, phys_screen)->root,
NET_ACTIVE_WINDOW, WINDOW, 32, 1, &win); _NET_ACTIVE_WINDOW, WINDOW, 32, 1, &win);
} }
static void static void
ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set) ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
{ {
if(state == NET_WM_STATE_STICKY) if(state == _NET_WM_STATE_STICKY)
{ {
tag_array_t *tags = &globalconf.screens[c->screen].tags; tag_array_t *tags = &globalconf.screens[c->screen].tags;
for(int i = 0; i < tags->len; i++) for(int i = 0; i < tags->len; i++)
tag_client(c, tags->tab[i]); tag_client(c, tags->tab[i]);
} }
else if(state == NET_WM_STATE_SKIP_TASKBAR) else if(state == _NET_WM_STATE_SKIP_TASKBAR)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
{ {
@ -266,7 +266,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
c->skip = true; c->skip = true;
} }
} }
else if(state == NET_WM_STATE_FULLSCREEN) else if(state == _NET_WM_STATE_FULLSCREEN)
{ {
area_t geometry = c->geometry; area_t geometry = c->geometry;
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
@ -305,7 +305,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
client_resize(c, geometry, false); client_resize(c, geometry, false);
} }
else if(state == NET_WM_STATE_ABOVE) else if(state == _NET_WM_STATE_ABOVE)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
client_setlayer(c, c->oldlayer); client_setlayer(c, c->oldlayer);
@ -315,7 +315,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
client_setlayer(c, LAYER_ABOVE); client_setlayer(c, LAYER_ABOVE);
} }
} }
else if(state == NET_WM_STATE_BELOW) else if(state == _NET_WM_STATE_BELOW)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
client_setlayer(c, c->oldlayer); client_setlayer(c, c->oldlayer);
@ -325,7 +325,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
client_setlayer(c, LAYER_BELOW); client_setlayer(c, LAYER_BELOW);
} }
} }
else if(state == NET_WM_STATE_MODAL) else if(state == _NET_WM_STATE_MODAL)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
client_setlayer(c, c->oldlayer); client_setlayer(c, c->oldlayer);
@ -335,7 +335,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
client_setlayer(c, LAYER_MODAL); client_setlayer(c, LAYER_MODAL);
} }
} }
else if(state == NET_WM_STATE_HIDDEN) else if(state == _NET_WM_STATE_HIDDEN)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
c->ishidden = false; c->ishidden = false;
@ -343,7 +343,7 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
c->ishidden = true; c->ishidden = true;
globalconf.screens[c->screen].need_arrange = true; globalconf.screens[c->screen].need_arrange = true;
} }
else if(state == NET_WM_STATE_DEMANDS_ATTENTION) else if(state == _NET_WM_STATE_DEMANDS_ATTENTION)
{ {
if(set == _NET_WM_STATE_REMOVE) if(set == _NET_WM_STATE_REMOVE)
c->isurgent = false; c->isurgent = false;
@ -361,12 +361,12 @@ ewmh_process_state_atom(client_t *c, xcb_atom_t state, int set)
static void static void
ewmh_process_window_type_atom(client_t *c, xcb_atom_t state) ewmh_process_window_type_atom(client_t *c, xcb_atom_t state)
{ {
if(state == NET_WM_WINDOW_TYPE_NORMAL) if(state == _NET_WM_WINDOW_TYPE_NORMAL)
{ {
/* do nothing. this is REALLY IMPORTANT */ /* do nothing. this is REALLY IMPORTANT */
} }
else if(state == NET_WM_WINDOW_TYPE_DOCK else if(state == _NET_WM_WINDOW_TYPE_DOCK
|| state == NET_WM_WINDOW_TYPE_SPLASH) || state == _NET_WM_WINDOW_TYPE_SPLASH)
{ {
c->skip = true; c->skip = true;
c->isfixed = true; c->isfixed = true;
@ -380,12 +380,12 @@ ewmh_process_window_type_atom(client_t *c, xcb_atom_t state)
client_setlayer(c, LAYER_ABOVE); client_setlayer(c, LAYER_ABOVE);
client_setfloating(c, true); client_setfloating(c, true);
} }
else if(state == NET_WM_WINDOW_TYPE_DIALOG) else if(state == _NET_WM_WINDOW_TYPE_DIALOG)
{ {
client_setlayer(c, LAYER_MODAL); client_setlayer(c, LAYER_MODAL);
client_setfloating(c, true); client_setfloating(c, true);
} }
else if(state == NET_WM_WINDOW_TYPE_DESKTOP) else if(state == _NET_WM_WINDOW_TYPE_DESKTOP)
{ {
tag_array_t *tags = &globalconf.screens[c->screen].tags; tag_array_t *tags = &globalconf.screens[c->screen].tags;
c->noborder = true; c->noborder = true;
@ -403,7 +403,7 @@ ewmh_process_client_message(xcb_client_message_event_t *ev)
client_t *c; client_t *c;
int screen; int screen;
if(ev->type == NET_CURRENT_DESKTOP) if(ev->type == _NET_CURRENT_DESKTOP)
for(screen = 0; for(screen = 0;
screen < xcb_setup_roots_length(xcb_get_setup(globalconf.connection)); screen < xcb_setup_roots_length(xcb_get_setup(globalconf.connection));
screen++) screen++)
@ -411,12 +411,12 @@ ewmh_process_client_message(xcb_client_message_event_t *ev)
if(ev->window == xutil_screen_get(globalconf.connection, screen)->root) if(ev->window == xutil_screen_get(globalconf.connection, screen)->root)
tag_view_only_byindex(screen, ev->data.data32[0]); tag_view_only_byindex(screen, ev->data.data32[0]);
} }
else if(ev->type == NET_CLOSE_WINDOW) else if(ev->type == _NET_CLOSE_WINDOW)
{ {
if((c = client_getbywin(ev->window))) if((c = client_getbywin(ev->window)))
client_kill(c); client_kill(c);
} }
else if(ev->type == NET_WM_DESKTOP) else if(ev->type == _NET_WM_DESKTOP)
{ {
if((c = client_getbywin(ev->window))) if((c = client_getbywin(ev->window)))
{ {
@ -433,7 +433,7 @@ ewmh_process_client_message(xcb_client_message_event_t *ev)
untag_client(c, tags->tab[i]); untag_client(c, tags->tab[i]);
} }
} }
else if(ev->type == NET_WM_STATE) else if(ev->type == _NET_WM_STATE)
{ {
if((c = client_getbywin(ev->window))) if((c = client_getbywin(ev->window)))
{ {
@ -458,13 +458,13 @@ ewmh_check_client_hints(client_t *c)
/* Send the GetProperty requests which will be processed later */ /* Send the GetProperty requests which will be processed later */
c0 = xcb_get_property_unchecked(globalconf.connection, false, c->win, c0 = xcb_get_property_unchecked(globalconf.connection, false, c->win,
NET_WM_DESKTOP, XCB_GET_PROPERTY_TYPE_ANY, 0, 1); _NET_WM_DESKTOP, XCB_GET_PROPERTY_TYPE_ANY, 0, 1);
c1 = xcb_get_property_unchecked(globalconf.connection, false, c->win, c1 = xcb_get_property_unchecked(globalconf.connection, false, c->win,
NET_WM_STATE, ATOM, 0, UINT32_MAX); _NET_WM_STATE, ATOM, 0, UINT32_MAX);
c2 = xcb_get_property_unchecked(globalconf.connection, false, c->win, c2 = xcb_get_property_unchecked(globalconf.connection, false, c->win,
NET_WM_WINDOW_TYPE, ATOM, 0, UINT32_MAX); _NET_WM_WINDOW_TYPE, ATOM, 0, UINT32_MAX);
reply = xcb_get_property_reply(globalconf.connection, c0, NULL); reply = xcb_get_property_reply(globalconf.connection, c0, NULL);
if(reply && reply->value_len && (data = xcb_get_property_value(reply))) if(reply && reply->value_len && (data = xcb_get_property_value(reply)))
@ -518,7 +518,7 @@ ewmh_get_window_icon(xcb_window_t w)
r = xcb_get_property_reply(globalconf.connection, r = xcb_get_property_reply(globalconf.connection,
xcb_get_property_unchecked(globalconf.connection, false, w, xcb_get_property_unchecked(globalconf.connection, false, w,
NET_WM_ICON, CARDINAL, 0, UINT32_MAX), _NET_WM_ICON, CARDINAL, 0, UINT32_MAX),
NULL); NULL);
if(!r || r->type != CARDINAL || r->format != 32 || r->length < 2 || if(!r || r->type != CARDINAL || r->format != 32 || r->length < 2 ||
!(data = (uint32_t *) xcb_get_property_value(r))) !(data = (uint32_t *) xcb_get_property_value(r)))

View File

@ -423,8 +423,6 @@ struct awesome_t
char *argv; char *argv;
/** Last XMotionEvent coords */ /** Last XMotionEvent coords */
int pointer_x, pointer_y; int pointer_x, pointer_y;
/** Atoms cache */
xutil_atom_cache_array_t atoms;
/** Lua VM state */ /** Lua VM state */
lua_State *L; lua_State *L;
/** Default colors */ /** Default colors */

View File

@ -26,6 +26,7 @@
#include "systray.h" #include "systray.h"
#include "window.h" #include "window.h"
#include "widget.h" #include "widget.h"
#include "common/atoms.h"
#define SYSTEM_TRAY_REQUEST_DOCK 0 /* Begin icon docking */ #define SYSTEM_TRAY_REQUEST_DOCK 0 /* Begin icon docking */
@ -34,16 +35,17 @@ extern awesome_t globalconf;
void void
systray_init(int phys_screen) systray_init(int phys_screen)
{ {
xutil_intern_atom_request_t atom_systray_q, atom_manager_q;
xcb_atom_t atom_systray;
xcb_client_message_event_t ev; xcb_client_message_event_t ev;
xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen); xcb_screen_t *xscreen = xutil_screen_get(globalconf.connection, phys_screen);
char atom_name[22]; char atom_name[22];
xcb_intern_atom_cookie_t atom_systray_q;
xcb_intern_atom_reply_t *atom_systray_r;
xcb_atom_t atom_systray;
/* Send requests */ /* Send requests */
atom_manager_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "MANAGER");
snprintf(atom_name, sizeof(atom_name), "_NET_SYSTEM_TRAY_S%d", phys_screen); snprintf(atom_name, sizeof(atom_name), "_NET_SYSTEM_TRAY_S%d", phys_screen);
atom_systray_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, atom_name); atom_systray_q = xcb_intern_atom_unchecked(globalconf.connection, false,
a_strlen(atom_name), atom_name);
globalconf.screens[phys_screen].systray.window = xcb_generate_id(globalconf.connection); globalconf.screens[phys_screen].systray.window = xcb_generate_id(globalconf.connection);
xcb_create_window(globalconf.connection, xscreen->root_depth, xcb_create_window(globalconf.connection, xscreen->root_depth,
@ -57,15 +59,20 @@ systray_init(int phys_screen)
ev.response_type = XCB_CLIENT_MESSAGE; ev.response_type = XCB_CLIENT_MESSAGE;
ev.window = xscreen->root; ev.window = xscreen->root;
ev.format = 32; ev.format = 32;
ev.type = MANAGER;
ev.data.data32[0] = XCB_CURRENT_TIME; ev.data.data32[0] = XCB_CURRENT_TIME;
ev.data.data32[2] = globalconf.screens[phys_screen].systray.window; ev.data.data32[2] = globalconf.screens[phys_screen].systray.window;
ev.data.data32[3] = ev.data.data32[4] = 0; ev.data.data32[3] = ev.data.data32[4] = 0;
ev.type = xutil_intern_atom_reply(globalconf.connection,
&globalconf.atoms, atom_manager_q);
ev.data.data32[1] = atom_systray = xutil_intern_atom_reply(globalconf.connection, if(!(atom_systray_r = xcb_intern_atom_reply(globalconf.connection, atom_systray_q, NULL)))
&globalconf.atoms, {
atom_systray_q); warn("error getting systray atom");
return;
}
ev.data.data32[1] = atom_systray = atom_systray_r->atom;
p_delete(&atom_systray_r);
xcb_set_selection_owner(globalconf.connection, xcb_set_selection_owner(globalconf.connection,
globalconf.screens[phys_screen].systray.window, globalconf.screens[phys_screen].systray.window,
@ -171,26 +178,14 @@ systray_process_client_message(xcb_client_message_event_t *ev)
bool bool
systray_iskdedockapp(xcb_window_t w) systray_iskdedockapp(xcb_window_t w)
{ {
xcb_atom_t kde_net_wm_sytem_tray_window_for;
xutil_intern_atom_request_t kde_net_wm_sytem_tray_window_for_q;
xcb_get_property_cookie_t kde_check_q; xcb_get_property_cookie_t kde_check_q;
xcb_get_property_reply_t *kde_check; xcb_get_property_reply_t *kde_check;
bool ret; bool ret;
/* Check if that is a KDE tray because it does not repect fdo standards, /* Check if that is a KDE tray because it does not repect fdo standards,
* thanks KDE. */ * thanks KDE. */
kde_net_wm_sytem_tray_window_for_q =
xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR");
kde_net_wm_sytem_tray_window_for =
xutil_intern_atom_reply(globalconf.connection,
&globalconf.atoms,
kde_net_wm_sytem_tray_window_for_q);
kde_check_q = xcb_get_property_unchecked(globalconf.connection, false, w, kde_check_q = xcb_get_property_unchecked(globalconf.connection, false, w,
kde_net_wm_sytem_tray_window_for, _KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR,
WINDOW, 0, 1); WINDOW, 0, 1);
kde_check = xcb_get_property_reply(globalconf.connection, kde_check_q, NULL); kde_check = xcb_get_property_reply(globalconf.connection, kde_check_q, NULL);

View File

@ -26,6 +26,7 @@
#include "widget.h" #include "widget.h"
#include "titlebar.h" #include "titlebar.h"
#include "common/atoms.h"
extern awesome_t globalconf; extern awesome_t globalconf;
@ -103,12 +104,6 @@ widget_render(widget_node_t *wnode, draw_context_t *ctx, xcb_gcontext_t gc, xcb_
xcb_get_property_reply_t *prop_r; xcb_get_property_reply_t *prop_r;
xcb_get_property_cookie_t prop_c; xcb_get_property_cookie_t prop_c;
area_t rectangle = { 0, 0, 0, 0 }; area_t rectangle = { 0, 0, 0, 0 };
xcb_atom_t rootpix_atom;
xutil_intern_atom_request_t rootpix_atom_req;
/* Send requests needed for transparency */
if(ctx->bg.alpha != 0xffff)
rootpix_atom_req = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "_XROOTPMAP_ID");
rectangle.width = ctx->width; rectangle.width = ctx->width;
rectangle.height = ctx->height; rectangle.height = ctx->height;
@ -116,8 +111,7 @@ widget_render(widget_node_t *wnode, draw_context_t *ctx, xcb_gcontext_t gc, xcb_
if(ctx->bg.alpha != 0xffff) if(ctx->bg.alpha != 0xffff)
{ {
s = xutil_screen_get(globalconf.connection, ctx->phys_screen); s = xutil_screen_get(globalconf.connection, ctx->phys_screen);
rootpix_atom = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, rootpix_atom_req); prop_c = xcb_get_property_unchecked(globalconf.connection, false, s->root, _XROOTPMAP_ID,
prop_c = xcb_get_property_unchecked(globalconf.connection, false, s->root, rootpix_atom,
PIXMAP, 0, 1); PIXMAP, 0, 1);
if((prop_r = xcb_get_property_reply(globalconf.connection, prop_c, NULL))) if((prop_r = xcb_get_property_reply(globalconf.connection, prop_c, NULL)))
{ {

View File

@ -25,6 +25,7 @@
#include "widget.h" #include "widget.h"
#include "screen.h" #include "screen.h"
#include "common/xembed.h" #include "common/xembed.h"
#include "common/atoms.h"
#define _NET_SYSTEM_TRAY_ORIENTATION_HORZ 0 #define _NET_SYSTEM_TRAY_ORIENTATION_HORZ 0
#define _NET_SYSTEM_TRAY_ORIENTATION_VERT 1 #define _NET_SYSTEM_TRAY_ORIENTATION_VERT 1
@ -43,15 +44,9 @@ systray_draw(draw_context_t *ctx,
uint32_t orient, config_win_vals[4]; uint32_t orient, config_win_vals[4];
/* p is always a statusbar, titlebars are forbidden */ /* p is always a statusbar, titlebars are forbidden */
statusbar_t *sb = (statusbar_t *) p; statusbar_t *sb = (statusbar_t *) p;
xutil_intern_atom_request_t net_system_tray_orientation_q;
xcb_atom_t net_system_tray_orientation;
phys_screen = screen_virttophys(screen); phys_screen = screen_virttophys(screen);
net_system_tray_orientation_q = xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"_NET_SYSTEM_TRAY_ORIENTATION");
for(em = globalconf.embedded; em; em = em->next) for(em = globalconf.embedded; em; em = em->next)
if(em->phys_screen == phys_screen) if(em->phys_screen == phys_screen)
i++; i++;
@ -152,13 +147,9 @@ systray_draw(draw_context_t *ctx,
/* set statusbar orientation */ /* set statusbar orientation */
/** \todo stop setting that property on each redraw */ /** \todo stop setting that property on each redraw */
net_system_tray_orientation = xutil_intern_atom_reply(globalconf.connection,
&globalconf.atoms,
net_system_tray_orientation_q);
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE,
globalconf.screens[phys_screen].systray.window, globalconf.screens[phys_screen].systray.window,
net_system_tray_orientation, CARDINAL, 32, 1, &orient); _NET_SYSTEM_TRAY_ORIENTATION, CARDINAL, 32, 1, &orient);
return w->area.width; return w->area.width;
} }

View File

@ -23,6 +23,7 @@
#include <xcb/xcb_atom.h> #include <xcb/xcb_atom.h>
#include "window.h" #include "window.h"
#include "common/atoms.h"
extern awesome_t globalconf; extern awesome_t globalconf;
@ -37,13 +38,8 @@ void
window_setstate(xcb_window_t win, long state) window_setstate(xcb_window_t win, long state)
{ {
long data[] = { state, XCB_NONE }; long data[] = { state, XCB_NONE };
const xcb_atom_t wm_state_atom = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms,
xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"WM_STATE"));
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, win, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, win,
wm_state_atom, wm_state_atom, 32, 2, data); WM_STATE, WM_STATE, 32, 2, data);
} }
/** Get a window state (WM_STATE). /** Get a window state (WM_STATE).
@ -56,14 +52,10 @@ window_getstate(xcb_window_t w)
long result = -1; long result = -1;
unsigned char *p = NULL; unsigned char *p = NULL;
xcb_get_property_cookie_t prop_c; xcb_get_property_cookie_t prop_c;
xcb_atom_t wm_state_atom = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms,
xutil_intern_atom(globalconf.connection,
&globalconf.atoms,
"WM_STATE"));
xcb_get_property_reply_t *prop_r; xcb_get_property_reply_t *prop_r;
prop_c = xcb_get_property_unchecked(globalconf.connection, false, w, prop_c = xcb_get_property_unchecked(globalconf.connection, false, w,
wm_state_atom, wm_state_atom, WM_STATE, WM_STATE,
0L, 2L); 0L, 2L);
if(!(prop_r = xcb_get_property_reply(globalconf.connection, prop_c, NULL))) if(!(prop_r = xcb_get_property_reply(globalconf.connection, prop_c, NULL)))
@ -220,24 +212,15 @@ void
window_settrans(xcb_window_t win, double opacity) window_settrans(xcb_window_t win, double opacity)
{ {
unsigned int real_opacity = 0xffffffff; unsigned int real_opacity = 0xffffffff;
xcb_atom_t wopacity_atom;
xutil_intern_atom_request_t wopacity_atom_q;
wopacity_atom_q = xutil_intern_atom(globalconf.connection, &globalconf.atoms, "_NET_WM_WINDOW_OPACITY");
if(opacity >= 0 && opacity <= 1) if(opacity >= 0 && opacity <= 1)
{ {
real_opacity = opacity * 0xffffffff; real_opacity = opacity * 0xffffffff;
wopacity_atom = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, wopacity_atom_q);
xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, win, xcb_change_property(globalconf.connection, XCB_PROP_MODE_REPLACE, win,
wopacity_atom, CARDINAL, 32, 1L, &real_opacity); _NET_WM_WINDOW_OPACITY, CARDINAL, 32, 1L, &real_opacity);
} }
else else
{ xcb_delete_property(globalconf.connection, win, _NET_WM_WINDOW_OPACITY);
wopacity_atom = xutil_intern_atom_reply(globalconf.connection, &globalconf.atoms, wopacity_atom_q);
xcb_delete_property(globalconf.connection, win,
wopacity_atom);
}
} }
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80