XFree(wmhint);
}
- ob_debug("Managing window: %lx\n", window);
+ ob_debug("Managing window: 0x%lx\n", window);
/* choose the events we want to receive on the CLIENT window */
attrib_set.event_mask = CLIENT_EVENTMASK;
client_restore_session_state(self);
/* now we have all of the window's information so we can set this up */
- client_setup_decor_and_functions(self);
+ client_setup_decor_and_functions(self, FALSE);
{
Time t = sn_app_started(self->startup_id, self->class);
it is up to the placement routines to avoid
the xinerama divides) */
transient ||
- (((self->positioned & PPosition) &&
- !(self->positioned & USPosition)) &&
+ (!(self->positioned & USPosition) &&
client_normal(self) &&
!self->session));
}
/* do this after the window is placed, so the premax/prefullscreen numbers
won't be all wacko!!
- also, this moves the window to the position where it has been placed
*/
client_apply_startup_state(self);
is ambiguous (either the current focus target doesn't have
a timestamp, or they are the same (we probably inherited it
from them) */
- else if (self->transient_for != NULL &&
+ else if (client_has_parent(self) &&
(!last_time || self->user_time == last_time))
{
activate = FALSE;
POINT_SET(self->root_pos, wattrib.x, wattrib.y);
self->border_width = wattrib.border_width;
- ob_debug("client area: %d %d %d %d\n", wattrib.x, wattrib.y,
- wattrib.width, wattrib.height);
+ ob_debug("client area: %d %d %d %d bw %d\n", wattrib.x, wattrib.y,
+ wattrib.width, wattrib.height, wattrib.border_width);
}
static void client_get_desktop(ObClient *self)
self->desktop = screen_num_desktops - 1;
else
self->desktop = d;
+ ob_debug("client requested desktop 0x%x\n", self->desktop);
} else {
gboolean trdesk = FALSE;
if (self->transient_for) {
if (self->transient_for != OB_TRAN_GROUP) {
- self->desktop = self->transient_for->desktop;
- trdesk = TRUE;
+ if (self->transient_for->desktop != DESKTOP_ALL) {
+ self->desktop = self->transient_for->desktop;
+ trdesk = TRUE;
+ }
} else {
/* if all the group is on one desktop, then open it on the
same desktop */
void client_update_colormap(ObClient *self, Colormap colormap)
{
- self->colormap = colormap;
+ if (colormap == self->colormap) return;
+
+ ob_debug("Setting client %s colormap: 0x%x\n", self->title, colormap);
+
+ if (client_focused(self)) {
+ screen_install_colormap(self, FALSE); /* uninstall old one */
+ self->colormap = colormap;
+ screen_install_colormap(self, FALSE); /* install new one */
+ } else
+ self->colormap = colormap;
}
void client_update_normal_hints(ObClient *self)
}
}
-/*! This needs to be followed by a call to client_configure to make
- the changes show */
-void client_setup_decor_and_functions(ObClient *self)
+void client_setup_decor_and_functions(ObClient *self, gboolean reconfig)
{
/* start with everything (cept fullscreen) */
self->decorations =
}
client_change_allowed_actions(self);
+
+ if (reconfig)
+ client_reconfigure(self);
}
static void client_change_allowed_actions(ObClient *self)
return client_search_focus_tree_full(self->transient_for);
} else {
GSList *it;
- gboolean recursed = FALSE;
- for (it = self->group->members; it; it = g_slist_next(it))
- if (!((ObClient*)it->data)->transient_for) {
- ObClient *c;
- if ((c = client_search_focus_tree_full(it->data)))
- return c;
- recursed = TRUE;
+ for (it = self->group->members; it; it = g_slist_next(it)) {
+ if (it->data != self) {
+ ObClient *c = it->data;
+
+ if (client_focused(c)) return c;
+ if ((c = client_search_focus_tree(it->data))) return c;
}
- if (recursed)
- return NULL;
+ }
}
}
- /* this function checks the whole tree, the client_search_focus_tree~
+ /* this function checks the whole tree, the client_search_focus_tree
does not, so we need to check this window */
if (client_focused(self))
return self;
return client_search_focus_tree(self);
}
+gboolean client_has_parent(ObClient *self)
+{
+ if (self->transient_for) {
+ if (self->transient_for != OB_TRAN_GROUP) {
+ if (client_normal(self->transient_for))
+ return TRUE;
+ }
+ else if (self->group) {
+ GSList *it;
+
+ for (it = self->group->members; it; it = g_slist_next(it)) {
+ if (it->data != self && client_normal(it->data))
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
static ObStackingLayer calc_layer(ObClient *self)
{
ObStackingLayer l;
gboolean client_focus(ObClient *self)
{
+ /* we might not focus this window, so if we have modal children which would
+ be focused instead, bring them to this desktop */
+ client_bring_modal_windows(self);
+
/* choose the correct target */
self = client_focus_target(self);
}
ob_debug_type(OB_DEBUG_FOCUS,
- "Focusing client \"%s\" at time %u\n",
- self->title, event_curtime);
+ "Focusing client \"%s\" (0x%x) at time %u\n",
+ self->title, self->window, event_curtime);
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events
xerror_set_ignore(FALSE);
+ ob_debug_type(OB_DEBUG_FOCUS, "Error focusing? %d\n", xerror_occured);
return !xerror_occured;
}
client_hilite(self, TRUE);
}
-static void client_bring_helper_windows_recursive(ObClient *self,
- guint desktop)
+static void client_bring_windows_recursive(ObClient *self,
+ guint desktop,
+ gboolean helpers,
+ gboolean modals)
{
GSList *it;
for (it = self->transients; it; it = g_slist_next(it))
- client_bring_helper_windows_recursive(it->data, desktop);
+ client_bring_windows_recursive(it->data, desktop, helpers, modals);
- if (client_helper(self) &&
+ if (((helpers && client_helper(self)) ||
+ (modals && self->modal))&&
self->desktop != desktop && self->desktop != DESKTOP_ALL)
{
client_set_desktop(self, desktop, FALSE);
void client_bring_helper_windows(ObClient *self)
{
- client_bring_helper_windows_recursive(self, self->desktop);
+ client_bring_windows_recursive(self, self->desktop, TRUE, FALSE);
+}
+
+void client_bring_modal_windows(ObClient *self)
+{
+ client_bring_windows_recursive(self, self->desktop, FALSE, TRUE);
}
gboolean client_focused(ObClient *self)
(self->functions & OB_CLIENT_FUNC_UNDECORATE || !undecorated))
{
self->undecorated = undecorated;
- client_setup_decor_and_functions(self);
- client_reconfigure(self); /* show the lack of decorations */
+ client_setup_decor_and_functions(self, TRUE);
client_change_state(self); /* reflect this in the state hints */
}
}