static void client_get_desktop(ObClient *self);
static void client_get_state(ObClient *self);
static void client_get_shaped(ObClient *self);
-static void client_get_mwm_hints(ObClient *self);
static void client_get_colormap(ObClient *self);
static void client_set_desktop_recursive(ObClient *self,
guint target,
gboolean transient = FALSE;
Rect place, *monitor;
Time launch_time, map_time;
+ guint32 user_time;
ob_debug("Managing window: 0x%lx", window);
ob_debug("Window type: %d", self->type);
ob_debug("Window group: 0x%x", self->group?self->group->leader:0);
+ ob_debug("Window name: %s class: %s role: %s", self->name, self->class, self->role);
+
+ /* per-app settings override stuff from client_get_all, and return the
+ settings for other uses too. the returned settings is a shallow copy,
+ that needs to be freed with g_free(). */
+ settings = client_get_settings_state(self);
/* now we have all of the window's information so we can set this up.
do this before creating the frame, so it can tell that we are still
time now */
grab_server(FALSE);
- /* per-app settings override stuff from client_get_all, and return the
- settings for other uses too. the returned settings is a shallow copy,
- that needs to be freed with g_free(). */
- settings = client_get_settings_state(self);
/* the session should get the last say though */
client_restore_session_state(self);
/* tell startup notification that this app started */
launch_time = sn_app_started(self->startup_id, self->class, self->name);
+ if (!OBT_PROP_GET32(self->window, NET_WM_USER_TIME, CARDINAL, &user_time))
+ user_time = map_time;
+
/* do this after we have a frame.. it uses the frame to help determine the
WM_STATE to apply. */
client_change_state(self);
/* this means focus=true for window is same as config_focus_new=true */
((config_focus_new || (settings && settings->focus == 1)) ||
client_search_focus_tree_full(self)) &&
+ /* NET_WM_USER_TIME 0 when mapping means don't focus */
+ (user_time != 0) &&
/* this checks for focus=false for the window */
(!settings || settings->focus != 0) &&
focus_valid_target(self, FALSE, FALSE, TRUE, FALSE, FALSE))
"Current focus_client: %s",
(focus_client ? focus_client->title : "(none)"));
ob_debug_type(OB_DEBUG_FOCUS,
- "parent focuesed: %d relative focused: %d",
+ "parent focused: %d relative focused: %d",
parent_focused, relative_focused);
if (menu_frame_visible || moveresize_in_progress) {
}
}
-static void client_get_mwm_hints(ObClient *self)
+void client_get_mwm_hints(ObClient *self)
{
guint num;
guint32 *hints;
for (it = self->parents; it; it = g_slist_next(it)) {
ObClient *c = it->data;
- if ((c = client_search_focus_tree_full(it->data))) return c;
+ if ((c = client_search_focus_tree_full(c))) return c;
}
return NULL;
return NULL;
}
+static gboolean client_validate_unmap(ObClient *self, int n)
+{
+ XEvent e;
+ gboolean ret = TRUE;
+
+ if (XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e)) {
+ if (n < self->ignore_unmaps) // ignore this one, but look for more
+ ret = client_validate_unmap(self, n+1);
+ else
+ ret = FALSE; // the window is going to become unmanaged
+
+ /* put them back on the event stack so they end up in the same order */
+ XPutBackEvent(obt_display, &e);
+ }
+
+ return ret;
+}
+
gboolean client_validate(ObClient *self)
{
XEvent e;
XSync(obt_display, FALSE); /* get all events on the server */
- if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e) ||
- XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e))
- {
+ if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e)) {
XPutBackEvent(obt_display, &e);
return FALSE;
}
+ if (!client_validate_unmap(self, 0))
+ return FALSE;
+
return TRUE;
}
value = self->demands_attention;
else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED))
value = undecorated;
+ else
+ g_assert_not_reached();
action = value ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
OBT_PROP_ATOM(NET_WM_STATE_ADD);
}
client_focus(self);
}
-/* this function exists to map to the client_activate message in the ewmh,
- the user arg is unused because nobody uses it correctly anyway. */
+/* this function exists to map to the net_active_window message in the ewmh */
void client_activate(ObClient *self, gboolean here, gboolean raise,
gboolean unshade, gboolean user)
{
- client_present(self, here, raise, unshade);
+ if (user || (self->desktop == DESKTOP_ALL ||
+ self->desktop == screen_desktop))
+ client_present(self, here, raise, unshade);
+ else
+ client_hilite(self, TRUE);
}
static void client_bring_windows_recursive(ObClient *self,