summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2006-01-05 23:56:05 +0000
committerElijah Newren <newren@src.gnome.org>2006-01-05 23:56:05 +0000
commit5af843f65b9bc1b3d0e739ce7dc9ee4ddaee6cfc (patch)
treed3f80c4a6004ebcd9366788abdd6a40f44a3f651
parent10f774d2b4104a4fdb6c0abf7b65a4311636274a (diff)
downloadmetacity-5af843f65b9bc1b3d0e739ce7dc9ee4ddaee6cfc.tar.gz
Make the workspace switcher work with dual-head (non-xinerama) setups.
2006-01-05 Elijah Newren <newren@gmail.com> Make the workspace switcher work with dual-head (non-xinerama) setups. Fixes #319423. * src/display.c (meta_display_open, event_callback, meta_display_focus_the_no_focus_window): * src/display.h (struct MetaDisplay, meta_display_focus_the_no_focus_window): * src/keybindings.c (primary_modifier_still_pressed): * src/screen.c (meta_screen_new): * src/screen.h (struct MetaScreen): * src/window.c (meta_window_new_with_attrs, meta_window_show): * src/workspace.c (meta_workspace_focus_default_window): Replace display->no_focus_window with a no_focus_window for each screen. * src/display.[ch] (meta_display_xwindow_is_a_no_focus_window, event_callback): * src/window.c (meta_window_new_with_attrs): New utility function, meta_display_xwindow_is_a_no_focus_window(), for checking if the given xwindow is a no_focus_window for one of the screens.
-rw-r--r--ChangeLog24
-rw-r--r--src/display.c36
-rw-r--r--src/display.h9
-rw-r--r--src/keybindings.c6
-rw-r--r--src/screen.c16
-rw-r--r--src/screen.h5
-rw-r--r--src/window.c4
-rw-r--r--src/workspace.c2
8 files changed, 80 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 510bc676..ac21b952 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+2006-01-05 Elijah Newren <newren@gmail.com>
+
+ Make the workspace switcher work with dual-head (non-xinerama)
+ setups. Fixes #319423.
+
+ * src/display.c (meta_display_open, event_callback,
+ meta_display_focus_the_no_focus_window):
+ * src/display.h (struct MetaDisplay,
+ meta_display_focus_the_no_focus_window):
+ * src/keybindings.c (primary_modifier_still_pressed):
+ * src/screen.c (meta_screen_new):
+ * src/screen.h (struct MetaScreen):
+ * src/window.c (meta_window_new_with_attrs, meta_window_show):
+ * src/workspace.c (meta_workspace_focus_default_window):
+ Replace display->no_focus_window with a no_focus_window for each
+ screen.
+
+ * src/display.[ch] (meta_display_xwindow_is_a_no_focus_window,
+ event_callback):
+ * src/window.c (meta_window_new_with_attrs):
+ New utility function, meta_display_xwindow_is_a_no_focus_window(),
+ for checking if the given xwindow is a no_focus_window for one of
+ the screens.
+
2005-11-28 Elijah Newren <newren@gmail.com>
* configure.in: post-release version bump to 2.12.3
diff --git a/src/display.c b/src/display.c
index 38e22474..70a63cfd 100644
--- a/src/display.c
+++ b/src/display.c
@@ -460,7 +460,6 @@ meta_display_open (const char *name)
* created in screen_new
*/
display->leader_window = None;
- display->no_focus_window = None;
display->xinerama_cache_invalidated = TRUE;
@@ -709,7 +708,10 @@ meta_display_open (const char *name)
* as it is the most recent timestamp.
*/
if (focus == None || focus == PointerRoot)
- meta_display_focus_the_no_focus_window (display, timestamp);
+ /* Just focus the no_focus_window on the first screen */
+ meta_display_focus_the_no_focus_window (display,
+ display->screens->data,
+ timestamp);
else
{
MetaWindow * window;
@@ -717,7 +719,10 @@ meta_display_open (const char *name)
if (window)
meta_display_set_input_focus_window (display, window, FALSE, timestamp);
else
- meta_display_focus_the_no_focus_window (display, timestamp);
+ /* Just focus the no_focus_window on the first screen */
+ meta_display_focus_the_no_focus_window (display,
+ display->screens->data,
+ timestamp);
}
meta_error_trap_pop (display, FALSE);
@@ -1843,6 +1848,7 @@ event_callback (XEvent *event,
"Unsetting focus from %s due to LeaveNotify\n",
window->desc);
meta_display_focus_the_no_focus_window (display,
+ window->screen,
event->xcrossing.time);
}
if (window->type != META_WINDOW_DOCK &&
@@ -1874,7 +1880,8 @@ event_callback (XEvent *event,
{
meta_window_notify_focus (window, event);
}
- else if (event->xany.window == display->no_focus_window)
+ else if (meta_display_xwindow_is_a_no_focus_window (display,
+ event->xany.window))
{
meta_topic (META_DEBUG_FOCUS,
"Focus %s event received on no_focus_window 0x%lx "
@@ -2964,6 +2971,24 @@ meta_display_unregister_x_window (MetaDisplay *display,
remove_pending_pings_for_window (display, xwindow);
}
+gboolean
+meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
+ Window xwindow)
+{
+ gboolean is_a_no_focus_window = FALSE;
+ GSList *temp = display->screens;
+ while (temp != NULL) {
+ MetaScreen *screen = temp->data;
+ if (screen->no_focus_window == xwindow) {
+ is_a_no_focus_window = TRUE;
+ break;
+ }
+ temp = temp->next;
+ }
+
+ return is_a_no_focus_window;
+}
+
Cursor
meta_display_create_x_cursor (MetaDisplay *display,
MetaCursor cursor)
@@ -4819,13 +4844,14 @@ meta_display_set_input_focus_window (MetaDisplay *display,
void
meta_display_focus_the_no_focus_window (MetaDisplay *display,
+ MetaScreen *screen,
Time timestamp)
{
if (timestamp_too_old (display, NULL, &timestamp))
return;
XSetInputFocus (display->xdisplay,
- display->no_focus_window,
+ screen->no_focus_window,
RevertToPointerRoot,
timestamp);
display->expected_focus_window = NULL;
diff --git a/src/display.h b/src/display.h
index fef38d69..a27a0a14 100644
--- a/src/display.h
+++ b/src/display.h
@@ -223,11 +223,6 @@ struct _MetaDisplay
XErrorEvent *error);
int server_grab_count;
- /* This window holds the focus when we don't want to focus
- * any actual clients
- */
- Window no_focus_window;
-
/* for double click */
Time last_button_time;
Window last_button_xwindow;
@@ -418,6 +413,9 @@ void meta_display_register_x_window (MetaDisplay *display,
MetaWindow *window);
void meta_display_unregister_x_window (MetaDisplay *display,
Window xwindow);
+/* Return whether the xwindow is a no focus window for any of the screens */
+gboolean meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
+ Window xwindow);
GSList* meta_display_list_windows (MetaDisplay *display);
@@ -548,6 +546,7 @@ void meta_display_set_input_focus_window (MetaDisplay *display,
* same as meta_display_set_input_focus_window
*/
void meta_display_focus_the_no_focus_window (MetaDisplay *display,
+ MetaScreen *screen,
Time timestamp);
void meta_display_queue_autoraise_callback (MetaDisplay *display,
diff --git a/src/keybindings.c b/src/keybindings.c
index c9af2404..96897377 100644
--- a/src/keybindings.c
+++ b/src/keybindings.c
@@ -1449,11 +1449,15 @@ primary_modifier_still_pressed (MetaDisplay *display,
int x, y, root_x, root_y;
Window root, child;
guint mask;
+ MetaScreen *random_screen;
+ Window random_xwindow;
primary_modifier = get_primary_modifier (display, entire_binding_mask);
+ random_screen = display->screens->data;
+ random_xwindow = random_screen->no_focus_window;
XQueryPointer (display->xdisplay,
- display->no_focus_window, /* some random window */
+ random_xwindow, /* some random window */
&root, &child,
&root_x, &root_y,
&x, &y,
diff --git a/src/screen.c b/src/screen.c
index 890cf620..6b85a557 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -581,16 +581,14 @@ meta_screen_new (MetaDisplay *display,
reload_xinerama_infos (screen);
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
-
- if (display->no_focus_window == None)
- {
- display->no_focus_window = meta_create_offscreen_window (display->xdisplay,
- screen->xroot);
- XSelectInput (display->xdisplay, display->no_focus_window,
- FocusChangeMask | KeyPressMask | KeyReleaseMask);
- XMapWindow (display->xdisplay, display->no_focus_window);
- }
+ /* Handle creating a no_focus_window for this screen */
+ screen->no_focus_window = meta_create_offscreen_window (display->xdisplay,
+ screen->xroot);
+ XSelectInput (display->xdisplay, screen->no_focus_window,
+ FocusChangeMask | KeyPressMask | KeyReleaseMask);
+ XMapWindow (display->xdisplay, screen->no_focus_window);
+ /* Done with no_focus_window stuff */
set_wm_icon_size_hint (screen);
diff --git a/src/screen.h b/src/screen.h
index 9f271d21..6e076667 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -75,6 +75,11 @@ struct _MetaScreen
MetaWorkspace *active_workspace;
+ /* This window holds the focus when we don't want to focus
+ * any actual clients
+ */
+ Window no_focus_window;
+
GList *workspaces;
MetaStack *stack;
diff --git a/src/window.c b/src/window.c
index 8789f3e1..b72b4a76 100644
--- a/src/window.c
+++ b/src/window.c
@@ -233,7 +233,7 @@ meta_window_new_with_attrs (MetaDisplay *display,
meta_verbose ("Attempting to manage 0x%lx\n", xwindow);
- if (xwindow == display->no_focus_window)
+ if (meta_display_xwindow_is_a_no_focus_window (display, xwindow))
{
meta_verbose ("Not managing no_focus_window 0x%lx\n",
xwindow);
@@ -1741,7 +1741,7 @@ meta_window_show (MetaWindow *window)
"ancestor.\n",
window->display->focus_window->desc, window->desc);
- meta_display_focus_the_no_focus_window (window->display, meta_display_get_current_time_roundtrip (window->display));
+ meta_display_focus_the_no_focus_window (window->display, window->screen, meta_display_get_current_time_roundtrip (window->display));
}
else
{
diff --git a/src/workspace.c b/src/workspace.c
index 1769c340..204adbb6 100644
--- a/src/workspace.c
+++ b/src/workspace.c
@@ -847,6 +847,7 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
"Setting focus to no_focus_window, since no valid "
"window to focus found.\n");
meta_display_focus_the_no_focus_window (workspace->screen->display,
+ workspace->screen,
timestamp);
}
}
@@ -936,6 +937,7 @@ focus_ancestor_or_mru_window (MetaWorkspace *workspace,
{
meta_topic (META_DEBUG_FOCUS, "No MRU window to focus found; focusing no_focus_window.\n");
meta_display_focus_the_no_focus_window (workspace->screen->display,
+ workspace->screen,
timestamp);
}
}