projects
/
mikachu
/
openbox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'backport' into work
[mikachu/openbox.git]
/
openbox
/
client.c
diff --git
a/openbox/client.c
b/openbox/client.c
index
e9443d4
..
a055e63
100644
(file)
--- a/
openbox/client.c
+++ b/
openbox/client.c
@@
-414,12
+414,14
@@
void client_manage(Window window, ObPrompt *prompt)
activate ? "yes" : "no");
if (activate) {
gboolean raise = FALSE;
activate ? "yes" : "no");
if (activate) {
gboolean raise = FALSE;
- gboolean relative_focused = FALSE;
+ gboolean relative_focused;
+ gboolean parent_focused;
+ parent_focused = (focus_client != NULL &&
+ client_search_focus_parent(self));
relative_focused = (focus_client != NULL &&
relative_focused = (focus_client != NULL &&
- client_search_focus_tree_full(self) != NULL &&
- client_search_focus_group_full(self) != NULL);
-
+ (client_search_focus_tree_full(self) != NULL ||
+ client_search_focus_group_full(self) != NULL));
/* This is focus stealing prevention */
ob_debug_type(OB_DEBUG_FOCUS,
/* This is focus stealing prevention */
ob_debug_type(OB_DEBUG_FOCUS,
@@
-427,6
+429,12
@@
void client_manage(Window window, ObPrompt *prompt)
"launched at %u (last user interaction time %u)",
self->window, map_time, launch_time,
event_last_user_time);
"launched at %u (last user interaction time %u)",
self->window, map_time, launch_time,
event_last_user_time);
+ ob_debug_type(OB_DEBUG_FOCUS,
+ "Current focus_client: %s",
+ (focus_client ? focus_client->title : "(none)"));
+ ob_debug_type(OB_DEBUG_FOCUS,
+ "parent focuesed: %d relative focused: %d",
+ parent_focused, relative_focused);
if (menu_frame_visible || moveresize_in_progress) {
activate = FALSE;
if (menu_frame_visible || moveresize_in_progress) {
activate = FALSE;
@@
-454,7
+462,8
@@
void client_manage(Window window, ObPrompt *prompt)
else if (focus_client) {
/* If the user is working in another window right now, then don't
steal focus */
else if (focus_client) {
/* If the user is working in another window right now, then don't
steal focus */
- if (event_last_user_time && launch_time &&
+ if (!parent_focused &&
+ event_last_user_time && launch_time &&
event_time_after(event_last_user_time, launch_time) &&
event_last_user_time != launch_time &&
event_time_after(event_last_user_time,
event_time_after(event_last_user_time, launch_time) &&
event_last_user_time != launch_time &&
event_time_after(event_last_user_time,
@@
-463,7
+472,8
@@
void client_manage(Window window, ObPrompt *prompt)
activate = FALSE;
ob_debug_type(OB_DEBUG_FOCUS,
"Not focusing the window because the user is "
activate = FALSE;
ob_debug_type(OB_DEBUG_FOCUS,
"Not focusing the window because the user is "
- "working in another window");
+ "working in another window that is not "
+ "its parent");
}
/* If the new window is a transient (and its relatives aren't
focused) */
}
/* If the new window is a transient (and its relatives aren't
focused) */
@@
-3958,6
+3968,21
@@
ObClient *client_search_focus_parent(ObClient *self)
return NULL;
}
return NULL;
}
+ObClient *client_search_focus_parent_full(ObClient *self)
+{
+ GSList *it;
+ ObClient *ret = NULL;
+
+ for (it = self->parents; it; it = g_slist_next(it)) {
+ if (client_focused(it->data))
+ ret = it->data;
+ else
+ ret = client_search_focus_parent_full(it->data);
+ if (ret) break;
+ }
+ return ret;
+}
+
ObClient *client_search_parent(ObClient *self, ObClient *search)
{
GSList *it;
ObClient *client_search_parent(ObClient *self, ObClient *search)
{
GSList *it;