summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJess VanDerwalker <washu@sonic.net>2012-08-03 11:30:22 -0700
committerJess VanDerwalker <washu@sonic.net>2012-08-29 09:15:49 -0700
commitc116d11fbc5a48aa3c03f0c2a4a154faeaf9a3dc (patch)
tree1757bf2c44798489893371e8a76102516096e3f1
parent807a5b013a0bf888b5c34b8e8bf3b5f3fa0f698b (diff)
libxcwm: Setting window type based on EWMH _NET_WM_WINDOW_TYPE
ICCCM WM_TRANSIENT_FOR atoms is checked, and if set, window is set to XCWM_WINDOW_TYPE_DIALOG, otherwise XCWM_WINDOW_TYPE_NORMAL. Then the EWMH _NET_WINDOW_TYPE atoms is checked, if set, type is determined from its value - otherwise previous value is used. Signed-off-by: Jess VanDerwalker <washu@sonic.net> Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
-rw-r--r--src/libxcwm/atoms.c104
1 files changed, 82 insertions, 22 deletions
diff --git a/src/libxcwm/atoms.c b/src/libxcwm/atoms.c
index a080436..b1e26f4 100644
--- a/src/libxcwm/atoms.c
+++ b/src/libxcwm/atoms.c
@@ -46,6 +46,10 @@ check_wm_cm_owner(xcwm_context_t *context);
void
create_wm_cm_window(xcwm_context_t *context);
+/* Determine the window type */
+static void
+setup_window_type(xcwm_window_t *window);
+
/* Get and set the size hints for the window */
void
set_window_size_hints(xcwm_window_t *window);
@@ -173,31 +177,10 @@ create_wm_cm_window(xcwm_context_t *context)
void
_xcwm_atoms_init_window(xcwm_window_t *window)
{
- xcb_get_property_cookie_t cookie;
- xcb_window_t transient;
- xcb_generic_error_t *error;
- uint8_t success;
-
_xcwm_atoms_set_window_name(window);
_xcwm_atoms_set_wm_delete(window);
+ setup_window_type(window);
set_window_size_hints(window);
-
- /* Get the window this one is transient for */
- cookie = xcb_icccm_get_wm_transient_for(window->context->conn,
- window->window_id);
- success = xcb_icccm_get_wm_transient_for_reply(window->context->conn,
- cookie,
- &transient,
- &error);
- if (success) {
- window->transient_for = _xcwm_get_window_node_by_window_id(transient);
- /* FIXME: Currently we assume that any window that is
- * transient for another is a dialog. */
- window->type = XCWM_WINDOW_TYPE_DIALOG;
- } else {
- window->transient_for = NULL;
- window->type = XCWM_WINDOW_TYPE_NORMAL;
- }
}
@@ -254,6 +237,83 @@ _xcwm_atoms_set_wm_delete(xcwm_window_t *window)
return;
}
+static void
+setup_window_type(xcwm_window_t *window)
+{
+ xcb_get_property_cookie_t cookie;
+ xcb_window_t transient;
+ xcb_ewmh_get_atoms_reply_t type;
+ xcb_ewmh_connection_t ewmh_conn = window->context->atoms->ewmh_conn;
+ int i;
+
+ /* Get the window this one is transient for */
+ cookie = xcb_icccm_get_wm_transient_for(window->context->conn,
+ window->window_id);
+ if (xcb_icccm_get_wm_transient_for_reply(window->context->conn, cookie,
+ &transient, NULL)) {
+ window->transient_for = _xcwm_get_window_node_by_window_id(transient);
+ window->type = XCWM_WINDOW_TYPE_DIALOG;
+ } else {
+ window->transient_for = NULL;
+ window->type = XCWM_WINDOW_TYPE_NORMAL;
+ }
+
+ /* Check and see if the client has set the _NET_WM_WINDOW_TYPE
+ * atom. Since the "type" is a list of window types, ordered by
+ * preference, we need to loop through to make sure we get a
+ * match. */
+ cookie = xcb_ewmh_get_wm_window_type(&ewmh_conn, window->window_id);
+ if (xcb_ewmh_get_wm_window_type_reply(&ewmh_conn, cookie, &type, NULL)) {
+ /* If we get a reply, but nothing below matches, set the
+ * default to unknown */
+ window->type = XCWM_WINDOW_TYPE_UNKNOWN;
+ for (i = 0; i <= type.atoms_len; i++) {
+ if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_TOOLBAR) {
+ window->type = XCWM_WINDOW_TYPE_TOOLBAR;
+ break;
+ } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_MENU) {
+ window->type = XCWM_WINDOW_TYPE_MENU;
+ break;
+ } else if (type.atoms[i]
+ == ewmh_conn._NET_WM_WINDOW_TYPE_UTILITY) {
+ window->type = XCWM_WINDOW_TYPE_UTILITY;
+ break;
+ } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_SPLASH) {
+ window->type = XCWM_WINDOW_TYPE_SPLASH;
+ break;
+ } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DIALOG) {
+ window->type = XCWM_WINDOW_TYPE_DIALOG;
+ break;
+ } else if (type.atoms[i]
+ == ewmh_conn._NET_WM_WINDOW_TYPE_DROPDOWN_MENU) {
+ window->type = XCWM_WINDOW_TYPE_DROPDOWN_MENU;
+ break;
+ } else if (type.atoms[i]
+ == ewmh_conn._NET_WM_WINDOW_TYPE_POPUP_MENU) {
+ window->type = XCWM_WINDOW_TYPE_POPUP_MENU;
+ break;
+ } else if (type.atoms[i]
+ == ewmh_conn._NET_WM_WINDOW_TYPE_TOOLTIP) {
+ window->type = XCWM_WINDOW_TYPE_TOOLTIP;
+ break;
+ } else if (type.atoms[i]
+ == ewmh_conn._NET_WM_WINDOW_TYPE_NOTIFICATION) {
+ window->type = XCWM_WINDOW_TYPE_NOTIFICATION;
+ break;
+ } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_COMBO) {
+ window->type = XCWM_WINDOW_TYPE_COMBO;
+ break;
+ } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_DND) {
+ window->type = XCWM_WINDOW_TYPE_DND;
+ break;
+ } else if (type.atoms[i] == ewmh_conn._NET_WM_WINDOW_TYPE_NORMAL) {
+ window->type = XCWM_WINDOW_TYPE_NORMAL;
+ break;
+ }
+ }
+ }
+}
+
void
set_window_size_hints(xcwm_window_t *window)
{