X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=eb00e6d60b4a308e9a34d759ce1ea44df4a3ca9e;hb=7059cde13b2da3eb3ec07b48fd643de76425fb21;hp=e7c7f62acdd91d477673f1af534d9585f7e59b3d;hpb=768ce7b456fb7455c39bc275b71af381d635ac0a;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index e7c7f62a..eb00e6d6 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -78,6 +78,7 @@ static void client_apply_startup_state(ObClient *self, gint x, gint y); static void client_restore_session_state(ObClient *self); static void client_restore_session_stacking(ObClient *self); static ObAppSettings *client_get_settings_state(ObClient *self); +static void client_unfocus(ObClient *self); void client_startup(gboolean reconfig) { @@ -219,13 +220,14 @@ void client_manage(Window window) grab_server(TRUE); - /* check if it has already been unmapped by the time we started mapping + /* check if it has already been unmapped by the time we started mapping. the grab does a sync so we don't have to here */ if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) || XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e)) { XPutBackEvent(ob_display, &e); + ob_debug("Trying to manage unmapped window. Aborting that.\n"); grab_server(FALSE); return; /* don't manage it */ } @@ -267,11 +269,10 @@ void client_manage(Window window) self->window = window; /* non-zero defaults */ - self->title_count = 1; self->wmstate = WithdrawnState; /* make sure it gets updated first time */ self->layer = -1; self->desktop = screen_num_desktops; /* always an invalid value */ - self->user_time = ~0; /* maximum value, always newer than the real time */ + self->user_time = client_last_user_time; client_get_all(self); client_restore_session_state(self); @@ -393,6 +394,8 @@ void client_manage(Window window) won't be all wacko!! also, this moves the window to the position where it has been placed */ + ob_debug("placing window 0x%x at %d, %d with size %d x %d\n", + self->window, newx, newy, self->area.width, self->area.height); client_apply_startup_state(self, newx, newy); keyboard_grab_for_client(self, TRUE); @@ -411,12 +414,15 @@ void client_manage(Window window) else { /* If time stamp is old, don't steal focus */ - if (self->user_time && self->user_time < client_last_user_time) + if (self->user_time && + !event_time_after(self->user_time, client_last_user_time)) + { activate = FALSE; + } /* Don't steal focus from globally active clients. I stole this idea from KWin. It seems nice. */ - if (!focus_client->can_focus && focus_client->focus_notify) + if (!(focus_client->can_focus || focus_client->focus_notify)) activate = FALSE; } @@ -1643,108 +1649,44 @@ void client_update_wmhints(ObClient *self) void client_update_title(ObClient *self) { - GList *it; - guint32 nums; - guint i; gchar *data = NULL; - gboolean read_title; - gchar *old_title; - old_title = self->title; + g_free(self->title); /* try netwm */ if (!PROP_GETS(self->window, net_wm_name, utf8, &data)) { /* try old x stuff */ if (!(PROP_GETS(self->window, wm_name, locale, &data) || PROP_GETS(self->window, wm_name, utf8, &data))) { - // http://developer.gnome.org/projects/gup/hig/draft_hig_new/windows-alert.html if (self->transient) { + /* + GNOME alert windows are not given titles: + http://developer.gnome.org/projects/gup/hig/draft_hig_new/windows-alert.html + */ data = g_strdup(""); - goto no_number; } else data = g_strdup("Unnamed Window"); } } - if (config_title_number) { - - /* did the title change? then reset the title_count */ - if (old_title && 0 != strncmp(old_title, data, strlen(data))) - self->title_count = 1; - - /* look for duplicates and append a number */ - nums = 0; - for (it = client_list; it; it = g_list_next(it)) - if (it->data != self) { - ObClient *c = it->data; - - if (c->title_count == 1) { - if (!strcmp(c->title, data)) - nums |= 1 << c->title_count; - } else { - size_t len; - gchar *end; - - /* find the beginning of our " - [%u]", this relies on - that syntax being used */ - end = strrchr(c->title, '-') - 1; - len = end - c->title; - if (!strncmp(c->title, data, len)) - nums |= 1 << c->title_count; - } - } - /* find first free number */ - for (i = 1; i <= 32; ++i) - if (!(nums & (1 << i))) { - if (self->title_count == 1 || i == 1) - self->title_count = i; - break; - } - /* dont display the number for the first window */ - if (self->title_count > 1) { - gchar *ndata; - ndata = g_strdup_printf("%s - [%u]", data, self->title_count); - g_free(data); - data = ndata; - } - } else - self->title_count = 1; - -no_number: PROP_SETS(self->window, net_wm_visible_name, data); self->title = data; if (self->frame) frame_adjust_title(self->frame); - g_free(old_title); - /* update the icon title */ data = NULL; g_free(self->icon_title); - read_title = TRUE; /* try netwm */ if (!PROP_GETS(self->window, net_wm_icon_name, utf8, &data)) /* try old x stuff */ - if (!(PROP_GETS(self->window, wm_icon_name, locale, &data) - || PROP_GETS(self->window, wm_icon_name, utf8, &data))) { + if (!(PROP_GETS(self->window, wm_icon_name, locale, &data) || + PROP_GETS(self->window, wm_icon_name, utf8, &data))) data = g_strdup(self->title); - read_title = FALSE; - } - - /* append the title count, dont display the number for the first window. - * We don't need to check for config_title_number here since title_count - * is not set above 1 then. */ - if (read_title && self->title_count > 1) { - gchar *newdata; - newdata = g_strdup_printf("%s - [%u]", data, self->title_count); - g_free(data); - data = newdata; - } PROP_SETS(self->window, net_wm_visible_icon_name, data); - self->icon_title = data; } @@ -1926,7 +1868,10 @@ void client_update_user_time(ObClient *self, gboolean new_event) if (new_event) client_last_user_time = time; - /*ob_debug("window 0x%x user time %u\n", self->window, time);*/ + /* + ob_debug("window %s user time %u\n", self->title, time); + ob_debug("last user time %u\n", client_last_user_time); + */ } } @@ -2189,8 +2134,12 @@ static void client_apply_startup_state(ObClient *self, gint x, gint y) pos = TRUE; } - /* if the client didn't get positioned yet, then do so now */ - if (!pos && (ox != x || oy != y)) { + /* if the client didn't get positioned yet, then do so now + call client_move even if the window is not being moved anywhere, because + when we reparent it and decorate it, it is getting moved and we need to + be telling it so with a ConfigureNotify event. + */ + if (!pos) { /* use the saved position */ self->area.x = ox; self->area.y = oy; @@ -2218,58 +2167,7 @@ void client_try_configure(ObClient *self, ObCorner anchor, the updated frame dimensions. */ frame_adjust_area(self->frame, TRUE, TRUE, TRUE); - /* gets the frame's position */ - frame_client_gravity(self->frame, x, y); - - /* these positions are frame positions, not client positions */ - - /* set the size and position if fullscreen */ - if (self->fullscreen) { - Rect *a; - guint i; - - i = screen_find_monitor(&desired_area); - a = screen_physical_area_monitor(i); - - *x = a->x; - *y = a->y; - *w = a->width; - *h = a->height; - - user = FALSE; /* ignore that increment etc shit when in fullscreen */ - } else { - Rect *a; - guint i; - - i = screen_find_monitor(&desired_area); - a = screen_area_monitor(self->desktop, i); - - /* set the size and position if maximized */ - if (self->max_horz) { - *x = a->x; - *w = a->width - self->frame->size.left - self->frame->size.right; - } - if (self->max_vert) { - *y = a->y; - *h = a->height - self->frame->size.top - self->frame->size.bottom; - } - } - - /* gets the client's position */ - frame_frame_gravity(self->frame, x, y); - - /* these override the above states! if you cant move you can't move! */ - if (user) { - if (!(self->functions & OB_CLIENT_FUNC_MOVE)) { - *x = self->area.x; - *y = self->area.y; - } - if (!(self->functions & OB_CLIENT_FUNC_RESIZE)) { - *w = self->area.width; - *h = self->area.height; - } - } - + /* work within the prefered sizes given by the window */ if (!(*w == self->area.width && *h == self->area.height)) { gint basew, baseh, minw, minh; @@ -2352,6 +2250,62 @@ void client_try_configure(ObClient *self, ObCorner anchor, *h += self->base_size.height; } + /* gets the frame's position */ + frame_client_gravity(self->frame, x, y); + + /* these positions are frame positions, not client positions */ + + /* set the size and position if fullscreen */ + if (self->fullscreen) { + Rect *a; + guint i; + + i = screen_find_monitor(&desired_area); + a = screen_physical_area_monitor(i); + + *x = a->x; + *y = a->y; + *w = a->width; + *h = a->height; + + user = FALSE; /* ignore if the client can't be moved/resized when it + is entering fullscreen */ + } else if (self->max_horz || self->max_vert) { + Rect *a; + guint i; + + i = screen_find_monitor(&desired_area); + a = screen_area_monitor(self->desktop, i); + + /* set the size and position if maximized */ + if (self->max_horz) { + *x = a->x; + *w = a->width - self->frame->size.left - self->frame->size.right; + } + if (self->max_vert) { + *y = a->y; + *h = a->height - self->frame->size.top - self->frame->size.bottom; + } + + /* maximizing is not allowed if the user can't move+resize the window + */ + } + + /* gets the client's position */ + frame_frame_gravity(self->frame, x, y); + + /* these override the above states! if you cant move you can't move! */ + if (user) { + if (!(self->functions & OB_CLIENT_FUNC_MOVE)) { + *x = self->area.x; + *y = self->area.y; + } + if (!(self->functions & OB_CLIENT_FUNC_RESIZE)) { + *w = self->area.width; + *h = self->area.height; + } + } + g_assert(*w > 0); g_assert(*h > 0); @@ -2388,8 +2342,9 @@ void client_configure_full(ObClient *self, ObCorner anchor, client_try_configure(self, anchor, &x, &y, &w, &h, &logicalw, &logicalh, user); - /* set the logical size */ - SIZE_SET(self->logical_size, logicalw, logicalh); + /* set the logical size if things changed */ + if (!(w == self->area.width && h == self->area.height)) + SIZE_SET(self->logical_size, logicalw, logicalh); /* figure out if we moved or resized or what */ moved = x != self->area.x || y != self->area.y; @@ -2515,10 +2470,10 @@ static void client_iconify_recursive(ObClient *self, ob_debug("%sconifying window: 0x%lx\n", (iconic ? "I" : "Uni"), self->window); - self->iconic = iconic; - if (iconic) { if (self->functions & OB_CLIENT_FUNC_ICONIFY) { + self->iconic = iconic; + /* update the focus lists.. iconic windows go to the bottom of the list, put the new iconic window at the 'top of the bottom'. */ @@ -2527,6 +2482,8 @@ static void client_iconify_recursive(ObClient *self, changed = TRUE; } } else { + self->iconic = iconic; + if (curdesk) client_set_desktop(self, screen_desktop, FALSE); @@ -3015,11 +2972,6 @@ gboolean client_focus(ObClient *self) /* choose the correct target */ self = client_focus_target(self); -#if 0 - if (!client_validate(self)) - return FALSE; -#endif - if (!client_can_focus(self)) { if (!self->frame->visible) { /* update the focus lists */ @@ -3031,14 +2983,7 @@ gboolean client_focus(ObClient *self) ob_debug("Focusing client \"%s\" at time %u\n", self->title, event_curtime); if (self->can_focus) { - /* RevertToPointerRoot causes much more headache than RevertToNone, so - I choose to use it always, hopefully to find errors quicker, if any - are left. (I hate X. I hate focus events.) - - Update: Changing this to RevertToNone fixed a bug with mozilla (bug - #799. So now it is RevertToNone again. - */ - XSetInputFocus(ob_display, self->window, RevertToNone, + XSetInputFocus(ob_display, self->window, RevertToPointerRoot, event_curtime); } @@ -3073,17 +3018,17 @@ gboolean client_focus(ObClient *self) /* Used when the current client is closed or otherwise hidden, focus_last will then prevent focus from going to the mouse pointer */ -void client_unfocus(ObClient *self) +static void client_unfocus(ObClient *self) { if (focus_client == self) { #ifdef DEBUG_FOCUS ob_debug("client_unfocus for %lx\n", self->window); #endif - focus_fallback(OB_FOCUS_FALLBACK_CLOSED); + focus_fallback(FALSE); } } -void client_activate(ObClient *self, gboolean here, gboolean user, Time time) +void client_activate(ObClient *self, gboolean here, gboolean user) { /* XXX do some stuff here if user is false to determine if we really want to activate it or not (a parent or group member is currently @@ -3091,11 +3036,13 @@ void client_activate(ObClient *self, gboolean here, gboolean user, Time time) */ ob_debug("Want to activate window 0x%x with time %u (last time %u), " "source=%s\n", - self->window, time, client_last_user_time, + self->window, event_curtime, client_last_user_time, (user ? "user" : "application")); - if (!user && time && time < client_last_user_time) + if (!user && event_curtime && + !event_time_after(event_curtime, client_last_user_time)) + { client_hilite(self, TRUE); - else { + } else { if (client_normal(self) && screen_showing_desktop) screen_show_desktop(FALSE); if (self->iconic)