summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJess VanDerwalker <washu@sonic.net>2012-07-31 14:00:49 -0700
committerJess VanDerwalker <washu@sonic.net>2012-08-29 09:15:24 -0700
commit2a0823151ae237a1d6866985bdaa1a56428abded (patch)
tree01e5e88f63662c15e5331307f5173669e5fc396d
parenta7500cc39177ee595c67cc1fa4fc29375562ff78 (diff)
libxcwm: Initializing and setting supported EWMH atoms for connection.
Initializing of EWMH atoms done through xcb_ewmh_init_atoms() and xcb_ewmh_init_atoms_replies(). This populates a structure, xcb_ewmh_connection_t with the values for all EWMH atoms and the WM_PROTOCOLS atom. xcb_ewmh_connection_t added to xcwm_wm_atoms_t, and wm_protocols_atom removed. Value for the connection's screen added to xcwm_context_t, as it is used in initializing xcb_ewmh_connection_t. Added _xcwm_atoms_release() to handle cleaning up the xcb_ewmh_connection_t in context. Signed-off-by: Jess VanDerwalker <washu@sonic.net> Reviewed-by: Jeremy Huddlestone Seqouia <jeremyhu@apple.com>
-rw-r--r--include/xcwm/context.h1
-rw-r--r--src/libxcwm/atoms.c72
-rw-r--r--src/libxcwm/context.c3
-rw-r--r--src/libxcwm/event_loop.c2
-rw-r--r--src/libxcwm/window.c2
-rw-r--r--src/libxcwm/xcwm_internal.h10
6 files changed, 70 insertions, 20 deletions
diff --git a/include/xcwm/context.h b/include/xcwm/context.h
index 2385875..3d28131 100644
--- a/include/xcwm/context.h
+++ b/include/xcwm/context.h
@@ -47,6 +47,7 @@ typedef struct xcwm_wm_atoms_t xcwm_wm_atoms_t;
/* Structure to hold connection data */
struct xcwm_context_t {
xcb_connection_t *conn;
+ int conn_screen;
xcwm_window_t *root_window;
int damage_event_mask;
xcwm_wm_atoms_t *atoms;
diff --git a/src/libxcwm/atoms.c b/src/libxcwm/atoms.c
index 76c78ef..b1ba149 100644
--- a/src/libxcwm/atoms.c
+++ b/src/libxcwm/atoms.c
@@ -47,22 +47,52 @@ _xcwm_atoms_init(xcwm_context_t *context)
{
xcb_intern_atom_reply_t *atom_reply;
xcb_intern_atom_cookie_t atom_cookie;
-
- /* WM_PROTOCOLS */
- atom_cookie = xcb_intern_atom(context->conn,
- 0,
- strlen("WM_PROTOCOLS"),
- "WM_PROTOCOLS");
- atom_reply = xcb_intern_atom_reply(context->conn,
- atom_cookie,
- NULL);
- if (!atom_reply) {
- context->atoms->wm_protocols_atom = 0;
- }
- else {
- context->atoms->wm_protocols_atom = atom_reply->atom;
- free(atom_reply);
- }
+ xcb_intern_atom_cookie_t *atom_cookies;
+
+ /* Initialization for the xcb_ewmh connection and EWMH atoms */
+ atom_cookies = xcb_ewmh_init_atoms(context->conn,
+ &context->atoms->ewmh_conn);
+ xcb_ewmh_init_atoms_replies(&context->atoms->ewmh_conn,
+ atom_cookies,
+ NULL);
+
+ /* Set the _NET_SUPPORTED atom for this context
+ * Most of these are defined ast MUSTs in the
+ * EWMH standards for window managers.
+ * NOTE: Starting with only a limited set of _NET_WM_STATE. This
+ * may be expanded. */
+ xcb_atom_t supported[] =
+ {
+ context->atoms->ewmh_conn.WM_PROTOCOLS,
+ context->atoms->ewmh_conn._NET_SUPPORTED,
+ context->atoms->ewmh_conn._NET_SUPPORTING_WM_CHECK,
+ context->atoms->ewmh_conn._NET_CLOSE_WINDOW,
+ context->atoms->ewmh_conn._NET_WM_NAME,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_TOOLBAR,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_MENU,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_UTILITY,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_SPLASH,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_DIALOG,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_POPUP_MENU,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_TOOLTIP,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_NOTIFICATION,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_COMBO,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_DND,
+ context->atoms->ewmh_conn._NET_WM_WINDOW_TYPE_NORMAL,
+ context->atoms->ewmh_conn._NET_WM_STATE,
+ context->atoms->ewmh_conn._NET_WM_STATE_MODAL,
+ context->atoms->ewmh_conn._NET_WM_STATE_HIDDEN
+ };
+
+ xcb_ewmh_set_supported(&context->atoms->ewmh_conn,
+ context->conn_screen,
+ 21, /* Length of supported[] */
+ supported);
+
+ /* Get the ICCCM atoms we need that are not included in the
+ * xcb_ewmh_connetion_t. */
/* WM_DELETE_WINDOW atom */
atom_cookie = xcb_intern_atom(context->conn,
@@ -146,7 +176,7 @@ _xcwm_atoms_set_wm_delete(xcwm_window_t *window)
/* Get the WM_PROTOCOLS */
cookie = xcb_icccm_get_wm_protocols(window->context->conn,
window->window_id,
- window->context->atoms->wm_protocols_atom);
+ window->context->atoms->ewmh_conn.WM_PROTOCOLS);
if (xcb_icccm_get_wm_protocols_reply(window->context->conn,
cookie, &reply, &error) == 1) {
@@ -186,3 +216,11 @@ set_window_size_hints(xcwm_window_t *window)
window->sizing->width_inc = hints.width_inc;
window->sizing->height_inc = hints.height_inc;
}
+
+void
+_xcwm_atoms_release(xcwm_context_t *context)
+{
+
+ /* Free the xcb_ewmh_connection_t */
+ xcb_ewmh_connection_wipe(&context->atoms->ewmh_conn);
+}
diff --git a/src/libxcwm/context.c b/src/libxcwm/context.c
index 05a09c2..c04c02d 100644
--- a/src/libxcwm/context.c
+++ b/src/libxcwm/context.c
@@ -96,6 +96,7 @@ xcwm_context_open(char *display)
assert(root_context->atoms);
root_context->conn = conn;
+ root_context->conn_screen = conn_screen;
root_context->root_window->parent = 0;
root_context->root_window->window_id = root_window_id;
/* FIXME: Should we have a circular assignment like this? */
@@ -141,6 +142,8 @@ xcwm_context_close(xcwm_context_t *context)
head = _xcwm_window_list_head;
}
+ /* Free atom related stuff */
+ _xcwm_atoms_release(context);
free(context->atoms);
// Terminate the event loop
diff --git a/src/libxcwm/event_loop.c b/src/libxcwm/event_loop.c
index 8bc1bb7..6684221 100644
--- a/src/libxcwm/event_loop.c
+++ b/src/libxcwm/event_loop.c
@@ -366,7 +366,7 @@ run_event_loop(void *thread_arg_struct)
/* If this is WM_PROTOCOLS, do not send event, just
* handle internally */
- if (notify->atom == window->context->atoms->wm_protocols_atom) {
+ if (notify->atom == window->context->atoms->ewmh_conn.WM_PROTOCOLS) {
_xcwm_atoms_set_wm_delete(window);
}
break;
diff --git a/src/libxcwm/window.c b/src/libxcwm/window.c
index cfc12f9..3aa7d94 100644
--- a/src/libxcwm/window.c
+++ b/src/libxcwm/window.c
@@ -260,7 +260,7 @@ xcwm_window_request_close(xcwm_window_t *window)
event.response_type = XCB_CLIENT_MESSAGE;
event.window = window->window_id;
- event.type = window->context->atoms->wm_protocols_atom;
+ event.type = window->context->atoms->ewmh_conn.WM_PROTOCOLS;
event.format = 32;
event.data.data32[0] = window->context->atoms->wm_delete_window_atom;
event.data.data32[1] = XCB_CURRENT_TIME;
diff --git a/src/libxcwm/xcwm_internal.h b/src/libxcwm/xcwm_internal.h
index 1b6d414..5e083f7 100644
--- a/src/libxcwm/xcwm_internal.h
+++ b/src/libxcwm/xcwm_internal.h
@@ -35,6 +35,7 @@
#include <xcb/xcb.h>
#include <xcb/xcb_image.h>
#include <xcb/xcb_icccm.h>
+#include <xcb/xcb_ewmh.h>
#include <xcb/xcb_atom.h>
#include <xcwm/xcwm.h>
@@ -50,9 +51,9 @@ typedef struct xcwm_event_connetion {
* Structure to hold WM_* atoms that we care about
*/
struct xcwm_wm_atoms_t {
- xcb_atom_t wm_protocols_atom;
xcb_atom_t wm_delete_window_atom;
xcb_atom_t wm_transient_for_atom;
+ xcb_ewmh_connection_t ewmh_conn;
};
/**
@@ -309,4 +310,11 @@ _xcwm_atoms_set_window_name(xcwm_window_t *window);
void
_xcwm_atoms_set_wm_delete(xcwm_window_t *window);
+/**
+ * Clean up any atom data necessary.
+ * @param context The context to clean up.
+ */
+void
+_xcwm_atoms_release(xcwm_context_t *context);
+
#endif /* _XTOQ_INTERNAL_H_ */