X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=f5335c79a105e042584ff8c05b753b422db1a13f;hb=5316bc6c3e3329dc620cfd15d472ed5d376100f8;hp=a65e7400313367609d03a8f92eab07494350423c;hpb=037654f3f89dcf07aba1b49b9f03a8187adeaa73;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index a65e7400..f5335c79 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -41,6 +41,10 @@ #include "mouse.h" #include "render/render.h" +#ifdef HAVE_UNISTD_H +# include +#endif + #include #include @@ -70,6 +74,7 @@ static void client_get_layer(ObClient *self); static void client_get_shaped(ObClient *self); static void client_get_mwm_hints(ObClient *self); static void client_get_gravity(ObClient *self); +static void client_get_client_machine(ObClient *self); static void client_change_allowed_actions(ObClient *self); static void client_change_state(ObClient *self); static void client_change_wm_state(ObClient *self); @@ -506,10 +511,13 @@ void client_unmanage(ObClient *self) g_assert(self != NULL); + /* we dont want events no more. do this before hiding the frame so we + don't generate more events */ + XSelectInput(ob_display, self->window, NoEventMask); + frame_hide(self->frame); - /* sync to send the hide to the server quickly, and to get back the enter - events */ - XSync(ob_display, FALSE); + /* flush to send the hide to the server quickly */ + XFlush(ob_display); if (focus_client == self) { /* ignore enter events from the unmap so it doesnt mess with the focus @@ -517,16 +525,12 @@ void client_unmanage(ObClient *self) event_ignore_queued_enters(); } - keyboard_grab_for_client(self, FALSE); mouse_grab_for_client(self, FALSE); /* remove the window from our save set */ XChangeSaveSet(ob_display, self->window, SetModeDelete); - /* we dont want events no more */ - XSelectInput(ob_display, self->window, NoEventMask); - /* update the focus lists */ focus_order_remove(self); @@ -624,6 +628,7 @@ void client_unmanage(ObClient *self) g_free(self->name); g_free(self->class); g_free(self->role); + g_free(self->client_machine); g_free(self->sm_client_id); g_free(self); @@ -933,6 +938,7 @@ static void client_get_all(ObClient *self) (min/max sizes), so we're ready to set up the decorations/functions */ client_setup_decor_and_functions(self); + client_get_client_machine(self); client_update_title(self); client_update_class(self); client_update_sm_client_id(self); @@ -1641,6 +1647,7 @@ void client_update_wmhints(ObClient *self) void client_update_title(ObClient *self) { gchar *data = NULL; + gchar *visible = NULL; g_free(self->title); @@ -1660,8 +1667,14 @@ void client_update_title(ObClient *self) } } - PROP_SETS(self->window, net_wm_visible_name, data); - self->title = data; + if (self->client_machine) { + visible = g_strdup_printf("%s (%s)", data, self->client_machine); + g_free(data); + } else + visible = data; + + PROP_SETS(self->window, net_wm_visible_name, visible); + self->title = visible; if (self->frame) frame_adjust_title(self->frame); @@ -1860,6 +1873,21 @@ void client_update_user_time(ObClient *self) } } +static void client_get_client_machine(ObClient *self) +{ + gchar *data = NULL; + gchar localhost[128]; + + g_free(self->client_machine); + + if (PROP_GETS(self->window, wm_client_machine, locale, &data)) { + gethostname(localhost, 127); + localhost[127] = '\0'; + if (strcmp(localhost, data)) + self->client_machine = data; + } +} + static void client_change_wm_state(ObClient *self) { gulong state[2]; @@ -2370,8 +2398,10 @@ void client_configure_full(ObClient *self, ObCorner anchor, (resized && config_resize_redraw)))); /* if the client is enlarging, then resize the client before the frame */ - if (send_resize_client && user && (w > oldw || h > oldh)) + if (send_resize_client && user && (w > oldw || h > oldh)) { XResizeWindow(ob_display, self->window, MAX(w, oldw), MAX(h, oldh)); + frame_adjust_client_area(self->frame); + } /* find the frame's dimensions and move/resize it */ if (self->decorations != fdecor || self->max_horz != fhorz) @@ -2417,8 +2447,10 @@ void client_configure_full(ObClient *self, ObCorner anchor, } /* if the client is shrinking, then resize the frame before the client */ - if (send_resize_client && (!user || (w <= oldw || h <= oldh))) + if (send_resize_client && (!user || (w <= oldw || h <= oldh))) { XResizeWindow(ob_display, self->window, w, h); + frame_adjust_client_area(self->frame); + } XFlush(ob_display); } @@ -3159,107 +3191,6 @@ const ObClientIcon* client_icon(ObClient *self, gint w, gint h) return ret; } -/* this be mostly ripped from fvwm */ -ObClient *client_find_directional(ObClient *c, ObDirection dir) -{ - gint my_cx, my_cy, his_cx, his_cy; - gint offset = 0; - gint distance = 0; - gint score, best_score; - ObClient *best_client, *cur; - GList *it; - - if(!client_list) - return NULL; - - /* first, find the centre coords of the currently focused window */ - my_cx = c->frame->area.x + c->frame->area.width / 2; - my_cy = c->frame->area.y + c->frame->area.height / 2; - - best_score = -1; - best_client = NULL; - - for(it = g_list_first(client_list); it; it = g_list_next(it)) { - cur = it->data; - - /* the currently selected window isn't interesting */ - if(cur == c) - continue; - if (!client_normal(cur)) - continue; - /* using c->desktop instead of screen_desktop doesn't work if the - * current window was omnipresent, hope this doesn't have any other - * side effects */ - if(screen_desktop != cur->desktop && cur->desktop != DESKTOP_ALL) - continue; - if(cur->iconic) - continue; - if(!(client_focus_target(cur) == cur && - client_can_focus(cur))) - continue; - - /* find the centre coords of this window, from the - * currently focused window's point of view */ - his_cx = (cur->frame->area.x - my_cx) - + cur->frame->area.width / 2; - his_cy = (cur->frame->area.y - my_cy) - + cur->frame->area.height / 2; - - if(dir == OB_DIRECTION_NORTHEAST || dir == OB_DIRECTION_SOUTHEAST || - dir == OB_DIRECTION_SOUTHWEST || dir == OB_DIRECTION_NORTHWEST) { - gint tx; - /* Rotate the diagonals 45 degrees counterclockwise. - * To do this, multiply the matrix /+h +h\ with the - * vector (x y). \-h +h/ - * h = sqrt(0.5). We can set h := 1 since absolute - * distance doesn't matter here. */ - tx = his_cx + his_cy; - his_cy = -his_cx + his_cy; - his_cx = tx; - } - - switch(dir) { - case OB_DIRECTION_NORTH: - case OB_DIRECTION_SOUTH: - case OB_DIRECTION_NORTHEAST: - case OB_DIRECTION_SOUTHWEST: - offset = (his_cx < 0) ? -his_cx : his_cx; - distance = ((dir == OB_DIRECTION_NORTH || - dir == OB_DIRECTION_NORTHEAST) ? - -his_cy : his_cy); - break; - case OB_DIRECTION_EAST: - case OB_DIRECTION_WEST: - case OB_DIRECTION_SOUTHEAST: - case OB_DIRECTION_NORTHWEST: - offset = (his_cy < 0) ? -his_cy : his_cy; - distance = ((dir == OB_DIRECTION_WEST || - dir == OB_DIRECTION_NORTHWEST) ? - -his_cx : his_cx); - break; - } - - /* the target must be in the requested direction */ - if(distance <= 0) - continue; - - /* Calculate score for this window. The smaller the better. */ - score = distance + offset; - - /* windows more than 45 degrees off the direction are - * heavily penalized and will only be chosen if nothing - * else within a million pixels */ - if(offset > distance) - score += 1000000; - - if(best_score == -1 || score < best_score) - best_client = cur, - best_score = score; - } - - return best_client; -} - void client_set_layer(ObClient *self, gint layer) { if (layer < 0) { @@ -3298,7 +3229,8 @@ guint client_monitor(ObClient *self) ObClient *client_search_top_parent(ObClient *self) { - while (self->transient_for && self->transient_for != OB_TRAN_GROUP) + while (self->transient_for && self->transient_for != OB_TRAN_GROUP && + client_normal(self)) self = self->transient_for; return self; }