summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJess VanDerwalker <washu@sonic.net>2012-08-08 10:46:08 -0700
committerJess VanDerwalker <washu@sonic.net>2012-08-29 09:15:52 -0700
commitdf5dfe47076140f5f31e3e1d73b4804a16071ba3 (patch)
treea7292b9e73c0e46e3358b8ef8f8eaaafd9832dbc
parentc116d11fbc5a48aa3c03f0c2a4a154faeaf9a3dc (diff)
libxcwm, xtoq: Handlers for window name change event.
In libxcwm, WM_NAME atom retrieved and added to the xcwm_atoms_t structure for context. _xcwm_atoms_set_window_name() now checks _NET_WM_NAME first, before WM_NAME. XCWM_EVENT_WINDOW_NAME event added to enum. In event loop, event of type XCB_PROPERTY_NOTIFY is checked to see if atom matches _NET_WM_NAME or WM_NAME. If so, event sent to xtoq. Function to handle update to window name added to XtoqController.m and case for XCWM_EVENT_WINDOW_NAME added to eventHandler(). Signed-off-by: Jess VanDerwalker <washu@sonic.net> Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
-rw-r--r--include/xcwm/event.h3
-rw-r--r--src/libxcwm/atoms.c34
-rw-r--r--src/libxcwm/event_loop.c14
-rw-r--r--src/libxcwm/xcwm_internal.h1
-rw-r--r--src/xtoq/XtoqController.h6
-rw-r--r--src/xtoq/XtoqController.m22
6 files changed, 68 insertions, 12 deletions
diff --git a/include/xcwm/event.h b/include/xcwm/event.h
index 22255f2..94ea622 100644
--- a/include/xcwm/event.h
+++ b/include/xcwm/event.h
@@ -41,7 +41,8 @@ typedef enum xcwm_event_type_t {
XCWM_EVENT_WINDOW_DAMAGE = 0,
XCWM_EVENT_WINDOW_EXPOSE,
XCWM_EVENT_WINDOW_CREATE,
- XCWM_EVENT_WINDOW_DESTROY
+ XCWM_EVENT_WINDOW_DESTROY,
+ XCWM_EVENT_WINDOW_NAME
} xcwm_event_type_t;
/**
diff --git a/src/libxcwm/atoms.c b/src/libxcwm/atoms.c
index b1e26f4..da7c637 100644
--- a/src/libxcwm/atoms.c
+++ b/src/libxcwm/atoms.c
@@ -125,6 +125,22 @@ _xcwm_atoms_init(xcwm_context_t *context)
free(atom_reply);
}
+ /* WM_NAME */
+ atom_cookie = xcb_intern_atom(context->conn,
+ 0,
+ strlen("WM_NAME"),
+ "WM_NAME");
+ atom_reply = xcb_intern_atom_reply(context->conn,
+ atom_cookie,
+ NULL);
+ if (!atom_reply) {
+ context->atoms->wm_name_atom = 0;
+ }
+ else {
+ context->atoms->wm_name_atom = atom_reply->atom;
+ free(atom_reply);
+ }
+
if (!check_wm_cm_owner(context)) {
return XCB_WINDOW;
}
@@ -189,19 +205,27 @@ _xcwm_atoms_set_window_name(xcwm_window_t *window)
{
xcb_get_property_cookie_t cookie;
xcb_icccm_get_text_property_reply_t reply;
- xcb_generic_error_t *error;
+ xcb_ewmh_get_utf8_strings_reply_t data;
+
+ /* Check _NET_WM_NAME first */
+ cookie = xcb_ewmh_get_wm_name(&window->context->atoms->ewmh_conn,
+ window->window_id);
+ if (xcb_ewmh_get_wm_name_reply(&window->context->atoms->ewmh_conn,
+ cookie, &data, NULL)) {
+ window->name = strndup(data.strings, data.strings_len);
+ xcb_ewmh_get_utf8_strings_reply_wipe(&data);
+ return;
+ }
cookie = xcb_icccm_get_wm_name(window->context->conn, window->window_id);
if (!xcb_icccm_get_wm_name_reply(window->context->conn,
- cookie, &reply, &error)) {
+ cookie, &reply, NULL)) {
window->name = malloc(sizeof(char));
window->name[0] = '\0';
return;
}
- window->name = malloc(sizeof(char) * (reply.name_len + 1));
- strncpy(window->name, reply.name, reply.name_len);
- window->name[reply.name_len] = '\0';
+ window->name = strndup(reply.name, reply.name_len);
xcb_icccm_get_text_property_reply_wipe(&reply);
}
diff --git a/src/libxcwm/event_loop.c b/src/libxcwm/event_loop.c
index 6684221..27747d3 100644
--- a/src/libxcwm/event_loop.c
+++ b/src/libxcwm/event_loop.c
@@ -368,7 +368,21 @@ run_event_loop(void *thread_arg_struct)
* handle internally */
if (notify->atom == window->context->atoms->ewmh_conn.WM_PROTOCOLS) {
_xcwm_atoms_set_wm_delete(window);
+ break;
}
+
+ /* Change to window name */
+ if (notify->atom == window->context->atoms->ewmh_conn._NET_WM_NAME
+ || notify->atom == window->context->atoms->wm_name_atom) {
+ _xcwm_atoms_set_window_name(window);
+ return_evt = malloc(sizeof(xcwm_event_t));
+ return_evt->event_type = XCWM_EVENT_WINDOW_NAME;
+ return_evt->window = window;
+
+ callback_ptr(return_evt);
+ break;
+ }
+
break;
}
diff --git a/src/libxcwm/xcwm_internal.h b/src/libxcwm/xcwm_internal.h
index eba10e1..f49226b 100644
--- a/src/libxcwm/xcwm_internal.h
+++ b/src/libxcwm/xcwm_internal.h
@@ -53,6 +53,7 @@ typedef struct xcwm_event_connetion {
struct xcwm_wm_atoms_t {
xcb_atom_t wm_delete_window_atom;
xcb_atom_t wm_transient_for_atom;
+ xcb_atom_t wm_name_atom;
xcb_ewmh_connection_t ewmh_conn;
};
diff --git a/src/xtoq/XtoqController.h b/src/xtoq/XtoqController.h
index c9bb6f2..b8c5a93 100644
--- a/src/xtoq/XtoqController.h
+++ b/src/xtoq/XtoqController.h
@@ -259,6 +259,12 @@ id referenceToSelf;
*/
- (int)osxToXserver:(int)yValue windowHeight:(int)windowH;
+/**
+ * Handler for XCWM_WINDOW_NAME event. Updates the name of the window.
+ * @param window The window whose name needs updating.
+ */
+- (void)updateWindowName:(xcwm_window_t *)window;
+
@end
/**
diff --git a/src/xtoq/XtoqController.m b/src/xtoq/XtoqController.m
index 8965a8c..2e9930c 100644
--- a/src/xtoq/XtoqController.m
+++ b/src/xtoq/XtoqController.m
@@ -487,12 +487,7 @@
[newWindow setContentView: newView];
// set title
- char *name = xcwm_window_copy_name(window);
- NSString *winTitle;
- winTitle = [NSString stringWithCString: name
- encoding: NSUTF8StringEncoding];
- [newWindow setTitle: winTitle];
- free(name);
+ [self updateWindowName: window];
// Set the sizing for the window, if we have values.
xcwm_window_sizing_t const *sizing = xcwm_window_get_sizing(window);
@@ -585,6 +580,17 @@
}
}
+- (void)updateWindowName:(xcwm_window_t *)window
+{
+ XtoqWindow *nameWindow = xcwm_window_get_local_data(window);
+ char *name = xcwm_window_copy_name(window);
+ NSString *winTitle;
+ winTitle = [NSString stringWithCString: name
+ encoding: NSUTF8StringEncoding];
+ [nameWindow setTitle: winTitle];
+ free(name);
+}
+
@end
void
@@ -602,6 +608,10 @@ eventHandler(xcwm_event_t *event)
NSLog(@"Window was destroyed");
[referenceToSelf destroyWindow: window];
}
+ else if (xcwm_event_get_type(event) == XCWM_EVENT_WINDOW_NAME) {
+ NSLog(@"Window name changed");
+ [referenceToSelf updateWindowName: window];
+ }
else {
NSLog(@"Unknown event type received.");
}