diff options
author | Jess VanDerwalker <washu@sonic.net> | 2012-08-08 10:46:08 -0700 |
---|---|---|
committer | Jess VanDerwalker <washu@sonic.net> | 2012-08-29 09:15:52 -0700 |
commit | df5dfe47076140f5f31e3e1d73b4804a16071ba3 (patch) | |
tree | a7292b9e73c0e46e3358b8ef8f8eaaafd9832dbc | |
parent | c116d11fbc5a48aa3c03f0c2a4a154faeaf9a3dc (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.h | 3 | ||||
-rw-r--r-- | src/libxcwm/atoms.c | 34 | ||||
-rw-r--r-- | src/libxcwm/event_loop.c | 14 | ||||
-rw-r--r-- | src/libxcwm/xcwm_internal.h | 1 | ||||
-rw-r--r-- | src/xtoq/XtoqController.h | 6 | ||||
-rw-r--r-- | src/xtoq/XtoqController.m | 22 |
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."); } |