summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--src/core.c15
-rw-r--r--src/core.h3
-rw-r--r--src/display.c143
-rw-r--r--src/display.h15
-rw-r--r--src/keybindings.c159
-rw-r--r--src/menu.c24
-rwxr-xr-xsrc/run-metacity.sh8
-rw-r--r--src/screen.c125
-rw-r--r--src/screen.h13
-rw-r--r--src/session.c2
-rw-r--r--src/window.c64
-rw-r--r--src/workspace.c41
-rw-r--r--src/workspace.h1
14 files changed, 311 insertions, 330 deletions
diff --git a/ChangeLog b/ChangeLog
index 3cdfdbf..de9edbd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2002-10-16 Havoc Pennington <hp@redhat.com>
+
+ * src/workspace.c: workspaces are all per-screen now, fix
+ accordingly
+
+ * src/core.c: fix multihead workspace stuff
+
+ * src/keybindings.c: multihead-rama
+
+ * src/screen.c (meta_screen_show_desktop): new functions to
+ replace display equivalents
+
+ * src/display.c (meta_display_get_workspace_by_screen_index): get
+ rid of this
+ (meta_display_get_workspace_by_index): get rid of this
+ (event_callback): handle _NET_SHOWING_DESKTOP message per-screen
+
+ * src/screen.c (meta_screen_get_workspace_by_index): new function
+
+ * src/screen.h (struct _MetaScreen): move workspace list, and
+ showing_desktop flag, to be per-screen
+
+ * src/window.c (window_query_root_pointer): return whether pointer
+ is on window's screen
+ (meta_window_handle_mouse_grab_op_event): don't use coordinates
+ from other screens when updating a window operation on the current
+ screen. I can't believe no one has reported this...
+
2002-10-16 Havoc Pennington <hp@pobox.com>
* src/window.c (meta_window_client_message): update window layer
diff --git a/src/core.c b/src/core.c
index dd331ad..812f63c 100644
--- a/src/core.c
+++ b/src/core.c
@@ -434,9 +434,8 @@ meta_core_change_workspace (Display *xdisplay,
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
meta_window_change_workspace (window,
- meta_display_get_workspace_by_screen_index (display,
- window->screen,
- new_workspace));
+ meta_screen_get_workspace_by_index (window->screen,
+ new_workspace));
}
int
@@ -456,7 +455,7 @@ meta_core_get_active_workspace (Screen *xscreen)
screen = meta_screen_for_x_screen (xscreen);
- return meta_workspace_screen_index (screen->active_workspace);
+ return meta_workspace_index (screen->active_workspace);
}
int
@@ -624,13 +623,17 @@ meta_core_get_menu_accelerator (MetaMenuOp menu_op,
char *
meta_core_get_workspace_name_with_index (Display *xdisplay,
- int index)
+ Window xroot,
+ int index)
{
MetaDisplay *display;
+ MetaScreen *screen;
MetaWorkspace *workspace;
display = meta_display_for_x_display (xdisplay);
- workspace = meta_display_get_workspace_by_index (display, index);
+ screen = meta_display_screen_for_root (display, xroot);
+ g_assert (screen != NULL);
+ workspace = meta_screen_get_workspace_by_index (screen, index);
return (workspace != NULL) ? workspace->name : NULL;
}
diff --git a/src/core.h b/src/core.h
index aab705c..7d8dea5 100644
--- a/src/core.h
+++ b/src/core.h
@@ -101,7 +101,8 @@ int meta_core_get_active_workspace (Screen *xscreen);
int meta_core_get_frame_workspace (Display *xdisplay,
Window frame_xwindow);
char* meta_core_get_workspace_name_with_index (Display *xdisplay,
- int index);
+ Window xroot,
+ int index);
void meta_core_get_frame_extents (Display *xdisplay,
Window frame_xwindow,
diff --git a/src/display.c b/src/display.c
index e9932a2..a120fdb 100644
--- a/src/display.c
+++ b/src/display.c
@@ -261,7 +261,6 @@ meta_display_open (const char *name)
display->error_traps = 0;
display->error_trap_handler = NULL;
display->server_grab_count = 0;
- display->workspaces = NULL;
display->pending_pings = NULL;
display->autoraise_timeout_id = 0;
@@ -269,8 +268,6 @@ meta_display_open (const char *name)
display->expected_focus_window = NULL;
display->mru_list = NULL;
- display->showing_desktop = FALSE;
-
/* FIXME copy the checks from GDK probably */
display->static_gravity_works = g_getenv ("METACITY_USE_STATIC_GRAVITY") != NULL;
@@ -1539,9 +1536,8 @@ event_callback (XEvent *event,
space);
workspace =
- meta_display_get_workspace_by_screen_index (display,
- screen,
- space);
+ meta_screen_get_workspace_by_index (screen,
+ space);
if (workspace)
meta_workspace_activate (workspace);
@@ -1569,9 +1565,9 @@ event_callback (XEvent *event,
meta_verbose ("Request to %s desktop\n", showing_desktop ? "show" : "hide");
if (showing_desktop)
- meta_display_show_desktop (display);
+ meta_screen_show_desktop (screen);
else
- meta_display_unshow_desktop (display);
+ meta_screen_unshow_desktop (screen);
}
else if (event->xclient.message_type ==
display->atom_metacity_restart_message)
@@ -2145,56 +2141,6 @@ meta_display_unregister_x_window (MetaDisplay *display,
remove_pending_pings_for_window (display, xwindow);
}
-MetaWorkspace*
-meta_display_get_workspace_by_index (MetaDisplay *display,
- int idx)
-{
- GList *tmp;
-
- /* should be robust, index is maybe from an app */
- if (idx < 0)
- return NULL;
-
- tmp = g_list_nth (display->workspaces, idx);
-
- if (tmp == NULL)
- return NULL;
- else
- return tmp->data;
-}
-
-MetaWorkspace*
-meta_display_get_workspace_by_screen_index (MetaDisplay *display,
- MetaScreen *screen,
- int idx)
-{
- GList *tmp;
- int i;
-
- /* should be robust, idx is maybe from an app */
- if (idx < 0)
- return NULL;
-
- i = 0;
- tmp = display->workspaces;
- while (tmp != NULL)
- {
- MetaWorkspace *w = tmp->data;
-
- if (w->screen == screen)
- {
- if (i == idx)
- return w;
- else
- ++i;
- }
-
- tmp = tmp->next;
- }
-
- return NULL;
-}
-
Cursor
meta_display_create_x_cursor (MetaDisplay *display,
MetaCursor cursor)
@@ -2712,31 +2658,6 @@ meta_display_increment_event_serial (MetaDisplay *display)
display->atom_motif_wm_hints);
}
-static void
-meta_display_update_showing_desktop_hint (MetaDisplay *display)
-{
- GSList *tmp;
-
- unsigned long data[1];
-
- data[0] = display->showing_desktop ? 1 : 0;
-
- tmp = display->screens;
- while (tmp != NULL)
- {
- MetaScreen *screen = tmp->data;
-
- meta_error_trap_push (display);
- XChangeProperty (display->xdisplay, screen->xroot,
- display->atom_net_showing_desktop,
- XA_CARDINAL,
- 32, PropModeReplace, (guchar*) data, 1);
- meta_error_trap_pop (display);
-
- tmp = tmp->next;
- }
-}
-
void
meta_display_update_active_window_hint (MetaDisplay *display)
{
@@ -2766,62 +2687,6 @@ meta_display_update_active_window_hint (MetaDisplay *display)
}
}
-static void
-queue_windows_showing (MetaDisplay *display)
-{
- GSList *windows;
- GSList *tmp;
-
- windows = meta_display_list_windows (display);
-
- tmp = windows;
- while (tmp != NULL)
- {
- meta_window_queue_calc_showing (tmp->data);
-
- tmp = tmp->next;
- }
-
- g_slist_free (windows);
-}
-
-void
-meta_display_show_desktop (MetaDisplay *display)
-{
-
- if (display->showing_desktop)
- return;
-
- display->showing_desktop = TRUE;
-
- queue_windows_showing (display);
-
- meta_display_update_showing_desktop_hint (display);
-}
-
-void
-meta_display_unshow_desktop (MetaDisplay *display)
-{
- GSList *tmp;
-
- if (!display->showing_desktop)
- return;
-
- display->showing_desktop = FALSE;
-
- queue_windows_showing (display);
-
- meta_display_update_showing_desktop_hint (display);
-
- tmp = display->screens;
- while (tmp != NULL)
- {
- MetaScreen *screen = tmp->data;
- meta_screen_focus_top_window (screen, NULL);
- tmp = tmp->next;
- }
-}
-
void
meta_display_queue_retheme_all_windows (MetaDisplay *display)
{
diff --git a/src/display.h b/src/display.h
index 3b17d64..f97e0fc 100644
--- a/src/display.h
+++ b/src/display.h
@@ -162,11 +162,8 @@ struct _MetaDisplay
/* Most recently focused list. Always contains all
* live windows.
*/
- GList *mru_list;
-
- GList *workspaces;
+ GList *mru_list;
- guint showing_desktop : 1;
guint static_gravity_works : 1;
/*< private-ish >*/
@@ -288,12 +285,6 @@ GSList* meta_display_list_windows (MetaDisplay *display);
MetaDisplay* meta_display_for_x_display (Display *xdisplay);
GSList* meta_displays_list (void);
-MetaWorkspace* meta_display_get_workspace_by_index (MetaDisplay *display,
- int index);
-MetaWorkspace* meta_display_get_workspace_by_screen_index (MetaDisplay *display,
- MetaScreen *screen,
- int index);
-
Cursor meta_display_create_x_cursor (MetaDisplay *display,
MetaCursor cursor);
@@ -332,10 +323,6 @@ void meta_display_increment_event_serial (MetaDisplay *display);
void meta_display_update_active_window_hint (MetaDisplay *display);
-/* Show/hide the desktop (temporarily hide all windows) */
-void meta_display_show_desktop (MetaDisplay *display);
-void meta_display_unshow_desktop (MetaDisplay *display);
-
guint32 meta_display_get_current_time (MetaDisplay *display);
/* utility goo */
diff --git a/src/keybindings.c b/src/keybindings.c
index 3fee139..5415048 100644
--- a/src/keybindings.c
+++ b/src/keybindings.c
@@ -34,116 +34,143 @@
static gboolean all_bindings_disabled = FALSE;
typedef void (* MetaKeyHandlerFunc) (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_activate_workspace (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_activate_menu (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_tab_forward (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_cycle_forward (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_toggle_fullscreen (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_toggle_desktop (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_toggle_maximize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_maximize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_unmaximize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_toggle_shade (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_close_window (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_minimize_window (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_begin_move (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_begin_resize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_toggle_sticky (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_move_to_workspace (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_workspace_switch (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_raise_or_lower (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_raise (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_lower (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_run_command (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
/* debug */
static void handle_spew_mark (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static gboolean process_keyboard_move_grab (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
KeySym keysym);
static gboolean process_keyboard_resize_grab (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
KeySym keysym);
static gboolean process_tab_grab (MetaDisplay *display,
+ MetaScreen *screen,
XEvent *event,
KeySym keysym);
static gboolean process_workspace_switch_grab (MetaDisplay *display,
+ MetaScreen *screen,
XEvent *event,
KeySym keysym);
@@ -1198,6 +1225,7 @@ process_event (MetaKeyBinding *bindings,
int n_bindings,
const MetaKeyHandler *handlers,
MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
KeySym keysym)
@@ -1233,7 +1261,7 @@ process_event (MetaKeyBinding *bindings,
"Running handler for %s\n",
bindings[i].name);
- (* handler->func) (display, window, event,
+ (* handler->func) (display, screen, window, event,
&bindings[i]);
return;
}
@@ -1262,12 +1290,17 @@ meta_display_process_key_event (MetaDisplay *display,
if (all_bindings_disabled)
return;
- screen = meta_display_screen_for_xwindow (display,
- event->xany.window);
+ /* if key event was on root window, we have a shortcut */
+ screen = meta_display_screen_for_root (display, event->xkey.window);
+
+ /* else round-trip to server */
+ if (screen == NULL)
+ screen = meta_display_screen_for_xwindow (display,
+ event->xany.window);
if (screen == NULL)
return; /* event window is destroyed */
-
+
/* ignore key events on popup menus and such. */
if (window == NULL &&
meta_ui_window_is_widget (screen->ui, event->xany.window))
@@ -1292,13 +1325,13 @@ meta_display_process_key_event (MetaDisplay *display,
process_event (display->screen_bindings,
display->n_screen_bindings,
screen_handlers,
- display, NULL, event, keysym);
+ display, screen, NULL, event, keysym);
if (window)
process_event (display->window_bindings,
display->n_window_bindings,
window_handlers,
- display, window, event, keysym);
+ display, screen, window, event, keysym);
return;
}
@@ -1322,7 +1355,8 @@ meta_display_process_key_event (MetaDisplay *display,
meta_topic (META_DEBUG_KEYBINDINGS,
"Processing event for keyboard move\n");
g_assert (window != NULL);
- handled = process_keyboard_move_grab (display, window, event, keysym);
+ handled = process_keyboard_move_grab (display, screen,
+ window, event, keysym);
break;
case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN:
@@ -1337,7 +1371,8 @@ meta_display_process_key_event (MetaDisplay *display,
meta_topic (META_DEBUG_KEYBINDINGS,
"Processing event for keyboard resize\n");
g_assert (window != NULL);
- handled = process_keyboard_resize_grab (display, window, event, keysym);
+ handled = process_keyboard_resize_grab (display, screen,
+ window, event, keysym);
break;
case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
@@ -1346,13 +1381,13 @@ meta_display_process_key_event (MetaDisplay *display,
case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
meta_topic (META_DEBUG_KEYBINDINGS,
"Processing event for keyboard tabbing/cycling\n");
- handled = process_tab_grab (display, event, keysym);
+ handled = process_tab_grab (display, screen, event, keysym);
break;
case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
meta_topic (META_DEBUG_KEYBINDINGS,
"Processing event for keyboard workspace switching\n");
- handled = process_workspace_switch_grab (display, event, keysym);
+ handled = process_workspace_switch_grab (display, screen, event, keysym);
break;
default:
@@ -1372,6 +1407,7 @@ meta_display_process_key_event (MetaDisplay *display,
static gboolean
process_keyboard_move_grab (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
KeySym keysym)
@@ -1478,6 +1514,7 @@ process_keyboard_move_grab (MetaDisplay *display,
static gboolean
process_keyboard_resize_grab (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
KeySym keysym)
@@ -1860,14 +1897,15 @@ process_keyboard_resize_grab (MetaDisplay *display,
static gboolean
process_tab_grab (MetaDisplay *display,
+ MetaScreen *screen,
XEvent *event,
KeySym keysym)
{
- MetaScreen *screen;
MetaKeyBindingAction action;
gboolean popup_not_showing;
-
- screen = display->grab_screen;
+
+ if (screen != display->grab_screen)
+ return FALSE;
g_return_val_if_fail (screen->tab_popup != NULL, FALSE);
@@ -2010,6 +2048,7 @@ switch_to_workspace (MetaDisplay *display,
static void
handle_activate_workspace (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *event_window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2021,21 +2060,13 @@ handle_activate_workspace (MetaDisplay *display,
workspace = NULL;
if (which < 0)
- {
- MetaScreen *screen;
-
- screen = meta_display_screen_for_root (display,
- event->xkey.root);
-
- if (screen == NULL)
- return;
-
+ {
workspace = meta_workspace_get_neighbor (screen->active_workspace,
which);
}
else
{
- workspace = meta_display_get_workspace_by_index (display, which);
+ workspace = meta_screen_get_workspace_by_index (screen, which);
}
if (workspace)
@@ -2091,6 +2122,7 @@ error_on_command (int command_index,
static void
handle_run_command (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2130,13 +2162,14 @@ handle_run_command (MetaDisplay *display,
static gboolean
process_workspace_switch_grab (MetaDisplay *display,
+ MetaScreen *screen,
XEvent *event,
KeySym keysym)
{
- MetaScreen *screen;
MetaWorkspace *workspace;
- screen = display->grab_screen;
+ if (screen != display->grab_screen)
+ return FALSE;
g_return_val_if_fail (screen->tab_popup != NULL, FALSE);
@@ -2241,18 +2274,20 @@ process_workspace_switch_grab (MetaDisplay *display,
static void
handle_toggle_desktop (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
{
- if (display->showing_desktop)
- meta_display_unshow_desktop (display);
+ if (screen->showing_desktop)
+ meta_screen_unshow_desktop (screen);
else
- meta_display_show_desktop (display);
+ meta_screen_show_desktop (screen);
}
static void
handle_activate_menu (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *event_window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2305,12 +2340,12 @@ cycle_op_from_tab_type (MetaTabList type)
static void
do_choose_window (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *event_window,
XEvent *event,
MetaKeyBinding *binding,
gboolean show_popup)
{
- MetaScreen *screen;
MetaTabList type;
gboolean backward;
MetaWindow *initial_selection;
@@ -2319,18 +2354,7 @@ do_choose_window (MetaDisplay *display,
meta_topic (META_DEBUG_KEYBINDINGS,
"Tab list = %d show_popup = %d\n", type, show_popup);
-
- screen = meta_display_screen_for_root (display,
- event->xkey.root);
-
- if (screen == NULL)
- {
- meta_topic (META_DEBUG_KEYBINDINGS,
- "No screen for root 0x%lx, not doing choose_window\n",
- event->xkey.root);
- return;
- }
-
+
/* backward if shift is down, this isn't configurable */
backward = (event->xkey.state & ShiftMask) != 0;
@@ -2377,24 +2401,29 @@ do_choose_window (MetaDisplay *display,
static void
handle_tab_forward (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *event_window,
XEvent *event,
MetaKeyBinding *binding)
{
- do_choose_window (display, event_window, event, binding, TRUE);
+ do_choose_window (display, screen,
+ event_window, event, binding, TRUE);
}
static void
handle_cycle_forward (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *event_window,
XEvent *event,
MetaKeyBinding *binding)
{
- do_choose_window (display, event_window, event, binding, FALSE);
+ do_choose_window (display, screen,
+ event_window, event, binding, FALSE);
}
static void
handle_toggle_fullscreen (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2410,6 +2439,7 @@ handle_toggle_fullscreen (MetaDisplay *display,
static void
handle_toggle_maximize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2425,6 +2455,7 @@ handle_toggle_maximize (MetaDisplay *display,
static void
handle_maximize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2438,6 +2469,7 @@ handle_maximize (MetaDisplay *display,
static void
handle_unmaximize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2451,6 +2483,7 @@ handle_unmaximize (MetaDisplay *display,
static void
handle_toggle_shade (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2466,6 +2499,7 @@ handle_toggle_shade (MetaDisplay *display,
static void
handle_close_window (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2477,6 +2511,7 @@ handle_close_window (MetaDisplay *display,
static void
handle_minimize_window (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2488,6 +2523,7 @@ handle_minimize_window (MetaDisplay *display,
static void
handle_begin_move (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2502,6 +2538,7 @@ handle_begin_move (MetaDisplay *display,
static void
handle_begin_resize (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2516,6 +2553,7 @@ handle_begin_resize (MetaDisplay *display,
static void
handle_toggle_sticky (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2531,6 +2569,7 @@ handle_toggle_sticky (MetaDisplay *display,
static void
handle_move_to_workspace (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2545,21 +2584,13 @@ handle_move_to_workspace (MetaDisplay *display,
workspace = NULL;
if (which < 0)
- {
- MetaScreen *screen;
-
- screen = meta_display_screen_for_root (display,
- event->xkey.root);
-
- if (screen == NULL)
- return;
-
+ {
workspace = meta_workspace_get_neighbor (screen->active_workspace,
which);
}
else
{
- workspace = meta_display_get_workspace_by_index (display, which);
+ workspace = meta_screen_get_workspace_by_index (screen, which);
}
if (workspace)
@@ -2576,20 +2607,12 @@ handle_move_to_workspace (MetaDisplay *display,
static void
handle_raise_or_lower (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
{
/* Get window at pointer */
-
- MetaScreen *screen;
-
- /* FIXME I'm really not sure why we get the screen here
- * instead of using window->screen
- */
- screen = meta_display_screen_for_root (display, event->xbutton.root);
- if (screen == NULL)
- return;
if (window)
{
@@ -2630,6 +2653,7 @@ handle_raise_or_lower (MetaDisplay *display,
static void
handle_raise (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2642,6 +2666,7 @@ handle_raise (MetaDisplay *display,
static void
handle_lower (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
@@ -2654,21 +2679,16 @@ handle_lower (MetaDisplay *display,
static void
handle_workspace_switch (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
{
int motion;
- MetaScreen *screen;
motion = GPOINTER_TO_INT (binding->handler->data);
- g_assert (motion < 0);
-
- screen = meta_display_screen_for_root (display,
- event->xkey.root);
- if (screen == NULL)
- return;
+ g_assert (motion < 0);
meta_topic (META_DEBUG_KEYBINDINGS,
"Starting tab between workspaces, showing popup\n");
@@ -2703,6 +2723,7 @@ handle_workspace_switch (MetaDisplay *display,
static void
handle_spew_mark (MetaDisplay *display,
+ MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
diff --git a/src/menu.c b/src/menu.c
index 1dc35f5..1d78496 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -133,12 +133,13 @@ activate_cb (GtkWidget *menuitem, gpointer data)
*/
static char *
get_workspace_name_with_accel (Display *display,
- int index)
+ Window xroot,
+ int index)
{
char *name;
unsigned int number;
- name = meta_core_get_workspace_name_with_index (display, index);
+ name = meta_core_get_workspace_name_with_index (display, xroot, index);
/*
* If the name is of the form "Workspace x" where x is an unsigned
@@ -312,9 +313,22 @@ meta_window_menu_new (MetaFrames *frames,
{
GtkWidget *mi;
Display *display;
+ Window xroot;
+
+ display = gdk_x11_drawable_get_xdisplay (GTK_WIDGET (frames)->window);
- display = gdk_x11_drawable_get_xdisplay(GTK_WIDGET(frames)->window);
-
+#ifdef HAVE_GTK_MULTIHEAD
+ {
+ GdkScreen *screen;
+ screen = gdk_drawable_get_screen (GTK_WIDGET (frames)->window);
+ xroot = GDK_DRAWABLE_XID (gdk_screen_get_root_window (screen));
+ }
+#else
+ {
+ xroot = gdk_x11_get_default_root_xwindow ();
+ }
+#endif
+
i = 0;
while (i < n_workspaces)
{
@@ -327,7 +341,7 @@ meta_window_menu_new (MetaFrames *frames,
i + 1,
&key, &mods);
- name = get_workspace_name_with_accel (display, i);
+ name = get_workspace_name_with_accel (display, xroot, i);
if (ops & META_MENU_OP_UNSTICK)
label = g_strdup_printf (_("Only on %s"), name);
else
diff --git a/src/run-metacity.sh b/src/run-metacity.sh
index 4d885df..a1fd82b 100755
--- a/src/run-metacity.sh
+++ b/src/run-metacity.sh
@@ -56,7 +56,9 @@ if test -z "$ONLY_WM"; then
echo "Launching clients"
if test -n "$TEST_CLIENT"; then
- DISPLAY=$CLIENT_DISPLAY $TEST_CLIENT &
+ for I in `seq 0 $SCREENS`; do
+ DISPLAY=$CLIENT_DISPLAY.$I $TEST_CLIENT &
+ done
fi
if test $CLIENTS != 0; then
@@ -79,7 +81,9 @@ if test -z "$ONLY_WM"; then
usleep 50000
- DISPLAY=$CLIENT_DISPLAY xsetroot -solid royalblue3
+ for I in `seq 0 $SCREENS`; do
+ DISPLAY=$CLIENT_DISPLAY.$I xsetroot -solid royalblue3
+ done
fi
if test -z "$ONLY_SETUP"; then
diff --git a/src/screen.c b/src/screen.c
index ca89dec..4e98eed 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -523,15 +523,18 @@ meta_screen_new (MetaDisplay *display,
screen->work_area_idle = 0;
screen->active_workspace = NULL;
+ screen->workspaces = NULL;
screen->rows_of_workspaces = 1;
screen->columns_of_workspaces = -1;
screen->vertical_workspaces = FALSE;
screen->starting_corner = META_SCREEN_TOPLEFT;
+ screen->showing_desktop = FALSE;
+
screen->xinerama_infos = NULL;
screen->n_xinerama_infos = 0;
screen->last_xinerama_index = 0;
-
+
reload_xinerama_infos (screen);
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
@@ -811,22 +814,34 @@ meta_screen_queue_window_resizes (MetaScreen *screen)
int
meta_screen_get_n_workspaces (MetaScreen *screen)
{
+ return g_list_length (screen->workspaces);
+}
+
+MetaWorkspace*
+meta_screen_get_workspace_by_index (MetaScreen *screen,
+ int idx)
+{
GList *tmp;
int i;
+ /* should be robust, idx is maybe from an app */
+ if (idx < 0)
+ return NULL;
+
i = 0;
- tmp = screen->display->workspaces;
+ tmp = screen->workspaces;
while (tmp != NULL)
{
MetaWorkspace *w = tmp->data;
- if (w->screen == screen)
- ++i;
-
+ if (i == idx)
+ return w;
+
+ ++i;
tmp = tmp->next;
}
- return i;
+ return NULL;
}
static int
@@ -867,21 +882,17 @@ update_num_workspaces (MetaScreen *screen)
last_remaining = NULL;
extras = NULL;
i = 0;
- tmp = screen->display->workspaces;
+ tmp = screen->workspaces;
while (tmp != NULL)
{
MetaWorkspace *w = tmp->data;
- if (w->screen == screen)
- {
- ++i;
-
- if (i > new_num)
- extras = g_list_prepend (extras, w);
- else
- last_remaining = w;
- }
-
+ if (i > new_num)
+ extras = g_list_prepend (extras, w);
+ else
+ last_remaining = w;
+
+ ++i;
tmp = tmp->next;
}
@@ -1078,7 +1089,7 @@ meta_screen_ensure_workspace_popup (MetaScreen *screen)
if (k >= len)
break;
- workspace = meta_display_get_workspace_by_index (screen->display, k);
+ workspace = meta_screen_get_workspace_by_index (screen, k);
g_assert (workspace);
entries[iter].key = (MetaTabEntryKey) workspace;
@@ -1096,7 +1107,7 @@ meta_screen_ensure_workspace_popup (MetaScreen *screen)
{
MetaWorkspace *workspace;
- workspace = meta_display_get_workspace_by_index (screen->display, i);
+ workspace = meta_screen_get_workspace_by_index (screen, i);
g_assert (workspace);
@@ -1362,17 +1373,14 @@ meta_screen_update_workspace_names (MetaScreen *screen)
}
i = 0;
- tmp = screen->display->workspaces;
+ tmp = screen->workspaces;
while (tmp != NULL && i < n_names)
{
MetaWorkspace *w = tmp->data;
- if (w->screen == screen)
- {
- meta_workspace_set_name (w, names[i]);
+ meta_workspace_set_name (w, names[i]);
- ++i;
- }
+ ++i;
tmp = tmp->next;
}
@@ -1413,7 +1421,7 @@ set_work_area_hint (MetaScreen *screen)
num_workspaces = meta_screen_get_n_workspaces (screen);
data = g_new (unsigned long, num_workspaces * 4);
- tmp_list = screen->display->workspaces;
+ tmp_list = screen->workspaces;
tmp = data;
while (tmp_list != NULL)
@@ -1543,3 +1551,68 @@ meta_screen_resize (MetaScreen *screen,
/* Queue a resize on all the windows */
meta_screen_foreach_window (screen, meta_screen_resize_func, 0);
}
+
+static void
+update_showing_desktop_hint (MetaScreen *screen)
+{
+ unsigned long data[1];
+
+ data[0] = screen->showing_desktop ? 1 : 0;
+
+ meta_error_trap_push (screen->display);
+ XChangeProperty (screen->display->xdisplay, screen->xroot,
+ screen->display->atom_net_showing_desktop,
+ XA_CARDINAL,
+ 32, PropModeReplace, (guchar*) data, 1);
+ meta_error_trap_pop (screen->display);
+}
+
+static void
+queue_windows_showing (MetaScreen *screen)
+{
+ GSList *windows;
+ GSList *tmp;
+
+ windows = meta_display_list_windows (screen->display);
+
+ tmp = windows;
+ while (tmp != NULL)
+ {
+ MetaWindow *w = tmp->data;
+
+ if (w->screen == screen)
+ meta_window_queue_calc_showing (w);
+
+ tmp = tmp->next;
+ }
+
+ g_slist_free (windows);
+}
+
+void
+meta_screen_show_desktop (MetaScreen *screen)
+{
+ if (screen->showing_desktop)
+ return;
+
+ screen->showing_desktop = TRUE;
+
+ queue_windows_showing (screen);
+
+ update_showing_desktop_hint (screen);
+}
+
+void
+meta_screen_unshow_desktop (MetaScreen *screen)
+{
+ if (!screen->showing_desktop)
+ return;
+
+ screen->showing_desktop = FALSE;
+
+ queue_windows_showing (screen);
+
+ update_showing_desktop_hint (screen);
+
+ meta_screen_focus_top_window (screen, NULL);
+}
diff --git a/src/screen.h b/src/screen.h
index ffcb40f..a5811b6 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -64,6 +64,8 @@ struct _MetaScreen
MetaWorkspace *active_workspace;
+ GList *workspaces;
+
MetaStack *stack;
MetaCursor current_cursor;
@@ -87,7 +89,8 @@ struct _MetaScreen
guint keys_grabbed : 1;
guint all_keys_grabbed : 1;
-
+ guint showing_desktop : 1;
+
int closing;
};
@@ -104,6 +107,9 @@ void meta_screen_queue_window_resizes (MetaScreen *scre
int meta_screen_get_n_workspaces (MetaScreen *screen);
+MetaWorkspace* meta_screen_get_workspace_by_index (MetaScreen *screen,
+ int index);
+
void meta_screen_set_cursor (MetaScreen *screen,
MetaCursor cursor);
@@ -136,4 +142,9 @@ void meta_screen_resize (MetaScreen *screen,
int height);
+/* Show/hide the desktop (temporarily hide all windows) */
+void meta_screen_show_desktop (MetaScreen *screen);
+void meta_screen_unshow_desktop (MetaScreen *screen);
+
+
#endif
diff --git a/src/session.c b/src/session.c
index 44f1235..b3053e4 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1008,7 +1008,7 @@ save_state (void)
while (w != NULL)
{
int n;
- n = meta_workspace_screen_index (w->data);
+ n = meta_workspace_index (w->data);
fprintf (outfile,
" <workspace index=\"%d\"/>\n", n);
diff --git a/src/window.c b/src/window.c
index 9e33e24..f86aa10 100644
--- a/src/window.c
+++ b/src/window.c
@@ -522,9 +522,8 @@ meta_window_new (MetaDisplay *display, Window xwindow,
window->desc, window->initial_workspace);
space =
- meta_display_get_workspace_by_screen_index (window->display,
- window->screen,
- window->initial_workspace);
+ meta_screen_get_workspace_by_index (window->screen,
+ window->initial_workspace);
if (space)
meta_workspace_add_window (space, window);
@@ -640,10 +639,10 @@ meta_window_new (MetaDisplay *display, Window xwindow,
meta_stack_thaw (window->screen->stack);
/* disable show desktop mode unless we're a desktop component */
- if (window->display->showing_desktop &&
+ if (window->screen->showing_desktop &&
window->type != META_WINDOW_DESKTOP &&
window->type != META_WINDOW_DOCK)
- meta_display_unshow_desktop (window->display);
+ meta_screen_unshow_desktop (window->screen);
meta_window_queue_calc_showing (window);
@@ -725,9 +724,8 @@ meta_window_apply_session_info (MetaWindow *window,
MetaWorkspace *space;
space =
- meta_display_get_workspace_by_screen_index (window->display,
- window->screen,
- GPOINTER_TO_INT (tmp->data));
+ meta_screen_get_workspace_by_index (window->screen,
+ GPOINTER_TO_INT (tmp->data));
if (space)
spaces = g_slist_prepend (spaces, space);
@@ -757,7 +755,7 @@ meta_window_apply_session_info (MetaWindow *window,
meta_topic (META_DEBUG_SM,
"Restoring saved window %s to workspace %d\n",
window->desc,
- meta_workspace_screen_index (space));
+ meta_workspace_index (space));
tmp = tmp->next;
}
@@ -1110,7 +1108,7 @@ meta_window_calc_showing (MetaWindow *window)
/* 3. See if we're in "show desktop" mode */
if (showing &&
- window->display->showing_desktop &&
+ window->screen->showing_desktop &&
window->type != META_WINDOW_DESKTOP &&
window->type != META_WINDOW_DOCK)
{
@@ -1609,8 +1607,8 @@ meta_window_minimize (MetaWindow *window)
void
meta_window_unminimize (MetaWindow *window)
{
- if (window->display->showing_desktop)
- meta_display_unshow_desktop (window->display);
+ if (window->screen->showing_desktop)
+ meta_screen_unshow_desktop (window->screen);
if (window->minimized)
{
@@ -1836,10 +1834,10 @@ meta_window_activate (MetaWindow *window,
guint32 timestamp)
{
/* disable show desktop mode unless we're a desktop component */
- if (window->display->showing_desktop &&
+ if (window->screen->showing_desktop &&
window->type != META_WINDOW_DESKTOP &&
window->type != META_WINDOW_DOCK)
- meta_display_unshow_desktop (window->display);
+ meta_screen_unshow_desktop (window->screen);
/* Get window on current workspace */
if (!meta_window_visible_on_workspace (window,
@@ -2957,7 +2955,7 @@ meta_window_get_net_wm_desktop (MetaWindow *window)
g_list_length (window->workspaces) > 1)
return 0xFFFFFFFF;
else
- return meta_workspace_screen_index (window->workspaces->data);
+ return meta_workspace_index (window->workspaces->data);
}
int
@@ -3274,9 +3272,8 @@ meta_window_client_message (MetaWindow *window,
window->desc, space);
workspace =
- meta_display_get_workspace_by_screen_index (display,
- window->screen,
- space);
+ meta_screen_get_workspace_by_index (window->screen,
+ space);
if (workspace)
{
@@ -4984,7 +4981,7 @@ static GList*
meta_window_get_workspaces (MetaWindow *window)
{
if (window->on_all_workspaces)
- return window->display->workspaces;
+ return window->screen->workspaces;
else
return window->workspaces;
}
@@ -5864,9 +5861,8 @@ menu_callback (MetaWindowMenu *menu,
MetaWorkspace *workspace;
workspace =
- meta_display_get_workspace_by_screen_index (window->display,
- window->screen,
- workspace_index);
+ meta_screen_get_workspace_by_index (window->screen,
+ workspace_index);
if (workspace)
{
@@ -5983,7 +5979,7 @@ meta_window_show_menu (MetaWindow *window,
meta_ui_window_menu_popup (menu, root_x, root_y, button, timestamp);
}
-static void
+static gboolean
window_query_root_pointer (MetaWindow *window,
int *x, int *y)
{
@@ -6010,6 +6006,8 @@ window_query_root_pointer (MetaWindow *window,
*x = root_x_return;
if (y)
*y = root_y_return;
+
+ return root_return == window->screen->xroot;
}
static void
@@ -6167,8 +6165,9 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
case META_GRAB_OP_MOVING:
case META_GRAB_OP_KEYBOARD_MOVING:
clear_moveresize_time (window);
- update_move (window, event->xbutton.state,
- event->xbutton.x_root, event->xbutton.y_root);
+ if (event->xbutton.root == window->screen->xroot)
+ update_move (window, event->xbutton.state,
+ event->xbutton.x_root, event->xbutton.y_root);
break;
case META_GRAB_OP_RESIZING_E:
@@ -6188,7 +6187,8 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
case META_GRAB_OP_KEYBOARD_RESIZING_SW:
case META_GRAB_OP_KEYBOARD_RESIZING_NW:
clear_moveresize_time (window);
- update_resize (window, event->xbutton.x_root, event->xbutton.y_root);
+ if (event->xbutton.root == window->screen->xroot)
+ update_resize (window, event->xbutton.x_root, event->xbutton.y_root);
break;
default:
@@ -6205,10 +6205,10 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
case META_GRAB_OP_KEYBOARD_MOVING:
{
int x, y;
- window_query_root_pointer (window, &x, &y);
- update_move (window,
- event->xbutton.state,
- x, y);
+ if (window_query_root_pointer (window, &x, &y))
+ update_move (window,
+ event->xbutton.state,
+ x, y);
}
break;
@@ -6230,8 +6230,8 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window,
case META_GRAB_OP_KEYBOARD_RESIZING_NW:
{
int x, y;
- window_query_root_pointer (window, &x, &y);
- update_resize (window, x, y);
+ if (window_query_root_pointer (window, &x, &y))
+ update_resize (window, x, y);
}
break;
diff --git a/src/workspace.c b/src/workspace.c
index c8f0cc9..6def690 100644
--- a/src/workspace.c
+++ b/src/workspace.c
@@ -37,8 +37,8 @@ meta_workspace_new (MetaScreen *screen)
workspace = g_new (MetaWorkspace, 1);
workspace->screen = screen;
- workspace->screen->display->workspaces =
- g_list_append (workspace->screen->display->workspaces, workspace);
+ workspace->screen->workspaces =
+ g_list_append (workspace->screen->workspaces, workspace);
workspace->windows = NULL;
workspace->work_area.x = 0;
@@ -83,8 +83,8 @@ meta_workspace_free (MetaWorkspace *workspace)
screen = workspace->screen;
- workspace->screen->display->workspaces =
- g_list_remove (workspace->screen->display->workspaces, workspace);
+ workspace->screen->workspaces =
+ g_list_remove (workspace->screen->workspaces, workspace);
g_free (workspace->name);
@@ -234,7 +234,7 @@ meta_workspace_index (MetaWorkspace *workspace)
int i;
i = 0;
- tmp = workspace->screen->display->workspaces;
+ tmp = workspace->screen->workspaces;
while (tmp != NULL)
{
if (tmp->data == workspace)
@@ -249,31 +249,6 @@ meta_workspace_index (MetaWorkspace *workspace)
return -1; /* compiler warnings */
}
-int
-meta_workspace_screen_index (MetaWorkspace *workspace)
-{
- GList *tmp;
- int i;
-
- i = 0;
- tmp = workspace->screen->display->workspaces;
- while (tmp != NULL)
- {
- MetaWorkspace *w = tmp->data;
-
- if (tmp->data == workspace)
- return i;
-
- if (w->screen == workspace->screen)
- ++i;
-
- tmp = tmp->next;
- }
-
- meta_bug ("Workspace does not exist to index!\n");
- return -1; /* compiler warnings */
-}
-
/* get windows contained on workspace, including workspace->windows
* and also sticky windows.
*/
@@ -309,7 +284,7 @@ set_active_space_hint (MetaScreen *screen)
{
unsigned long data[1];
- data[0] = meta_workspace_screen_index (screen->active_workspace);
+ data[0] = meta_workspace_index (screen->active_workspace);
meta_verbose ("Setting _NET_CURRENT_DESKTOP to %ld\n", data[0]);
@@ -541,8 +516,8 @@ meta_workspace_get_neighbor (MetaWorkspace *workspace,
meta_verbose ("Neighbor space is %d\n", i);
- return meta_display_get_workspace_by_index (workspace->screen->display,
- i);
+ return meta_screen_get_workspace_by_index (workspace->screen,
+ i);
}
void
diff --git a/src/workspace.h b/src/workspace.h
index 248c159..67bf509 100644
--- a/src/workspace.h
+++ b/src/workspace.h
@@ -60,7 +60,6 @@ gboolean meta_workspace_contains_window (MetaWorkspace *workspace,
MetaWindow *window);
void meta_workspace_activate (MetaWorkspace *workspace);
int meta_workspace_index (MetaWorkspace *workspace);
-int meta_workspace_screen_index (MetaWorkspace *workspace);
GList* meta_workspace_list_windows (MetaWorkspace *workspace);
void meta_workspace_invalidate_work_area (MetaWorkspace *workspace);