Compare commits
	
		
			32 Commits
		
	
	
		
			benzea/ign
			...
			wip/xwayla
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 25fd9e005b | ||
|   | 114bfc04ef | ||
|   | 26dde9dfe0 | ||
|   | 25c9ce2dad | ||
|   | 7d2ef2d821 | ||
|   | 1838ec08a2 | ||
|   | 9a405fb943 | ||
|   | 7515c80d7a | ||
|   | 6ff46b5f64 | ||
|   | 703f05f6e3 | ||
|   | d2c2fe6e09 | ||
|   | e2c02c6014 | ||
|   | c0e6128182 | ||
|   | 4c40b7591d | ||
|   | 6c0e889a85 | ||
|   | 046712a28b | ||
|   | 91c9d5182d | ||
|   | e0105ee425 | ||
|   | 773aab96bf | ||
|   | f53a605c4f | ||
|   | 383f2ed815 | ||
|   | 38a8559fbe | ||
|   | b24136d0d5 | ||
|   | 90826dd660 | ||
|   | 467a6fa8fc | ||
|   | 3974925819 | ||
|   | b157d34417 | ||
|   | a2d13e76cc | ||
|   | a72a2381de | ||
|   | 2d0a1b8179 | ||
|   | 1d97da1631 | ||
|   | 88b5580af7 | 
| @@ -13,18 +13,18 @@ src/compositor/meta-background.c | ||||
| src/core/bell.c | ||||
| src/core/core.c | ||||
| src/core/display.c | ||||
| src/core/errors.c | ||||
| src/core/keybindings.c | ||||
| src/core/main.c | ||||
| src/core/meta-close-dialog-default.c | ||||
| src/core/mutter.c | ||||
| src/core/prefs.c | ||||
| src/core/screen.c | ||||
| src/core/util.c | ||||
| src/core/window.c | ||||
| src/ui/frames.c | ||||
| src/ui/theme.c | ||||
| src/wayland/meta-wayland-tablet-pad.c | ||||
| src/x11/meta-x11-display.c | ||||
| src/x11/meta-x11-errors.c | ||||
| src/x11/session.c | ||||
| src/x11/window-props.c | ||||
| src/x11/xprops.c | ||||
|   | ||||
| @@ -247,12 +247,13 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\ | ||||
| 	core/edge-resistance.h			\ | ||||
| 	core/events.c				\ | ||||
| 	core/events.h				\ | ||||
| 	core/errors.c				\ | ||||
| 	meta/errors.h				\ | ||||
| 	core/frame.c				\ | ||||
| 	core/frame.h				\ | ||||
| 	core/meta-gesture-tracker.c		\ | ||||
| 	core/meta-gesture-tracker-private.h	\ | ||||
| 	core/meta-workspace-manager.c		\ | ||||
| 	core/meta-workspace-manager-private.h	\ | ||||
| 	meta/meta-workspace-manager.h		\ | ||||
| 	core/keybindings.c			\ | ||||
| 	core/keybindings-private.h		\ | ||||
| 	core/main-private.h			\ | ||||
| @@ -261,9 +262,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\ | ||||
| 	core/place.h				\ | ||||
| 	core/prefs.c				\ | ||||
| 	meta/prefs.h				\ | ||||
| 	core/screen.c				\ | ||||
| 	core/screen-private.h			\ | ||||
| 	meta/screen.h				\ | ||||
| 	core/startup-notification.c		\ | ||||
| 	core/startup-notification-private.h	\ | ||||
| 	meta/types.h				\ | ||||
| @@ -290,6 +288,11 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\ | ||||
| 	ui/theme-private.h			\ | ||||
| 	ui/ui.c					\ | ||||
| 	x11/atomnames.h				\ | ||||
| 	x11/meta-x11-display.c			\ | ||||
| 	x11/meta-x11-display-private.h		\ | ||||
| 	meta/meta-x11-display.h			\ | ||||
| 	x11/meta-x11-errors.c			\ | ||||
| 	meta/meta-x11-errors.h			\ | ||||
| 	x11/events.c				\ | ||||
| 	x11/events.h				\ | ||||
| 	x11/group-private.h			\ | ||||
| @@ -449,7 +452,6 @@ libmutterinclude_headers =			\ | ||||
| 	meta/compositor-mutter.h		\ | ||||
| 	meta/compositor.h			\ | ||||
| 	meta/display.h				\ | ||||
| 	meta/errors.h				\ | ||||
| 	meta/group.h				\ | ||||
| 	meta/keybindings.h			\ | ||||
| 	meta/main.h				\ | ||||
| @@ -470,8 +472,10 @@ libmutterinclude_headers =			\ | ||||
| 	meta/meta-shadow-factory.h		\ | ||||
| 	meta/meta-window-actor.h		\ | ||||
| 	meta/meta-window-shape.h		\ | ||||
| 	meta/meta-workspace-manager.h		\ | ||||
| 	meta/meta-x11-display.h			\ | ||||
| 	meta/meta-x11-errors.h			\ | ||||
| 	meta/prefs.h				\ | ||||
| 	meta/screen.h				\ | ||||
| 	meta/theme.h				\ | ||||
| 	meta/types.h				\ | ||||
| 	meta/util.h				\ | ||||
|   | ||||
| @@ -31,7 +31,6 @@ | ||||
| #include <wayland-server.h> | ||||
| #endif | ||||
|  | ||||
| #include <meta/screen.h> | ||||
| #include "meta-cursor.h" | ||||
|  | ||||
| #define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ()) | ||||
|   | ||||
| @@ -31,9 +31,10 @@ | ||||
| #include "meta-cursor-tracker-private.h" | ||||
|  | ||||
| #include <string.h> | ||||
| #include <meta/meta-x11-display.h> | ||||
| #include <meta/main.h> | ||||
| #include <meta/util.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
|  | ||||
| #include <cogl/cogl.h> | ||||
| #include <clutter/clutter.h> | ||||
| @@ -43,6 +44,7 @@ | ||||
| #include <X11/extensions/Xfixes.h> | ||||
|  | ||||
| #include "meta-backend-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT); | ||||
|  | ||||
| @@ -131,15 +133,15 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_cursor_tracker_get_for_screen: | ||||
|  * @screen: the #MetaScreen | ||||
|  * meta_cursor_tracker_get_for_display: | ||||
|  * @display: the #MetaDisplay | ||||
|  * | ||||
|  * Retrieves the cursor tracker object for @screen. | ||||
|  * Retrieves the cursor tracker object for @display. | ||||
|  * | ||||
|  * Returns: (transfer none): | ||||
|  */ | ||||
| MetaCursorTracker * | ||||
| meta_cursor_tracker_get_for_screen (MetaScreen *screen) | ||||
| meta_cursor_tracker_get_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   MetaCursorTracker *tracker = meta_backend_get_cursor_tracker (backend); | ||||
| @@ -165,13 +167,13 @@ gboolean | ||||
| meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker, | ||||
|                                    XEvent            *xevent) | ||||
| { | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   MetaX11Display *x11_display = meta_get_display ()->x11_display; | ||||
|   XFixesCursorNotifyEvent *notify_event; | ||||
|  | ||||
|   if (meta_is_wayland_compositor ()) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (xevent->xany.type != display->xfixes_event_base + XFixesCursorNotify) | ||||
|   if (xevent->xany.type != x11_display->xfixes_event_base + XFixesCursorNotify) | ||||
|     return FALSE; | ||||
|  | ||||
|   notify_event = (XFixesCursorNotifyEvent *)xevent; | ||||
| @@ -188,6 +190,7 @@ static void | ||||
| ensure_xfixes_cursor (MetaCursorTracker *tracker) | ||||
| { | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|   XFixesCursorImage *cursor_image; | ||||
|   CoglTexture2D *sprite; | ||||
|   guint8 *cursor_data; | ||||
| @@ -198,7 +201,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker) | ||||
|   if (tracker->xfixes_cursor) | ||||
|     return; | ||||
|  | ||||
|   cursor_image = XFixesGetCursorImage (display->xdisplay); | ||||
|   cursor_image = XFixesGetCursorImage (xdisplay); | ||||
|   if (!cursor_image) | ||||
|     return; | ||||
|  | ||||
|   | ||||
| @@ -23,10 +23,9 @@ | ||||
|  | ||||
| #include "meta-cursor.h" | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
|  | ||||
| #include "display-private.h" | ||||
| #include "screen-private.h" | ||||
| #include "meta-backend-private.h" | ||||
|  | ||||
| #include <string.h> | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
|  | ||||
| gboolean meta_dnd_handle_xdnd_event (MetaBackend    *backend, | ||||
|                                      MetaCompositor *compositor, | ||||
|                                      MetaDisplay    *display, | ||||
|                                      Display        *xdisplay, | ||||
|                                      XEvent         *xev); | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   | ||||
| @@ -210,34 +210,34 @@ meta_logical_monitor_class_init (MetaLogicalMonitorClass *klass) | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_logical_monitor_has_neighbor (MetaLogicalMonitor  *logical_monitor, | ||||
|                                    MetaLogicalMonitor  *neighbor, | ||||
|                                    MetaScreenDirection  neighbor_direction) | ||||
| meta_logical_monitor_has_neighbor (MetaLogicalMonitor   *logical_monitor, | ||||
|                                    MetaLogicalMonitor   *neighbor, | ||||
|                                    MetaDisplayDirection  neighbor_direction) | ||||
| { | ||||
|   switch (neighbor_direction) | ||||
|     { | ||||
|     case META_SCREEN_RIGHT: | ||||
|     case META_DISPLAY_RIGHT: | ||||
|       if (neighbor->rect.x == (logical_monitor->rect.x + | ||||
|                                logical_monitor->rect.width) && | ||||
|           meta_rectangle_vert_overlap (&neighbor->rect, | ||||
|                                        &logical_monitor->rect)) | ||||
|         return TRUE; | ||||
|       break; | ||||
|     case META_SCREEN_LEFT: | ||||
|     case META_DISPLAY_LEFT: | ||||
|       if (logical_monitor->rect.x == (neighbor->rect.x + | ||||
|                                       neighbor->rect.width) && | ||||
|           meta_rectangle_vert_overlap (&neighbor->rect, | ||||
|                                        &logical_monitor->rect)) | ||||
|         return TRUE; | ||||
|       break; | ||||
|     case META_SCREEN_UP: | ||||
|     case META_DISPLAY_UP: | ||||
|       if (logical_monitor->rect.y == (neighbor->rect.y + | ||||
|                                       neighbor->rect.height) && | ||||
|           meta_rectangle_horiz_overlap (&neighbor->rect, | ||||
|                                         &logical_monitor->rect)) | ||||
|         return TRUE; | ||||
|       break; | ||||
|     case META_SCREEN_DOWN: | ||||
|     case META_DISPLAY_DOWN: | ||||
|       if (neighbor->rect.y == (logical_monitor->rect.y + | ||||
|                                logical_monitor->rect.height) && | ||||
|           meta_rectangle_horiz_overlap (&neighbor->rect, | ||||
|   | ||||
| @@ -86,8 +86,8 @@ MetaRectangle meta_logical_monitor_get_layout (MetaLogicalMonitor *logical_monit | ||||
|  | ||||
| GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor); | ||||
|  | ||||
| gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor  *logical_monitor, | ||||
|                                             MetaLogicalMonitor  *neighbor, | ||||
|                                             MetaScreenDirection  neighbor_dir); | ||||
| gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor   *logical_monitor, | ||||
|                                             MetaLogicalMonitor   *neighbor, | ||||
|                                             MetaDisplayDirection  neighbor_dir); | ||||
|  | ||||
| #endif /* META_LOGICAL_MONITOR_H */ | ||||
|   | ||||
| @@ -40,7 +40,6 @@ | ||||
| #include <libupower-glib/upower.h> | ||||
|  | ||||
| #include "display-private.h" | ||||
| #include <meta/screen.h> | ||||
| #include "stack-tracker.h" | ||||
| #include <meta/meta-monitor-manager.h> | ||||
|  | ||||
| @@ -438,9 +437,9 @@ MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_at (MetaMonitorMana | ||||
| MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_from_rect (MetaMonitorManager *manager, | ||||
|                                                                         MetaRectangle      *rect); | ||||
|  | ||||
| MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager *manager, | ||||
|                                                                        MetaLogicalMonitor *logical_monitor, | ||||
|                                                                        MetaScreenDirection direction); | ||||
| MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager  *manager, | ||||
|                                                                        MetaLogicalMonitor  *logical_monitor, | ||||
|                                                                        MetaDisplayDirection direction); | ||||
|  | ||||
| MetaMonitor *       meta_monitor_manager_get_primary_monitor (MetaMonitorManager *manager); | ||||
|  | ||||
|   | ||||
| @@ -34,7 +34,7 @@ | ||||
|  | ||||
| #include <meta/main.h> | ||||
| #include "util-private.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "edid.h" | ||||
| #include "backends/meta-logical-monitor.h" | ||||
| #include "backends/meta-monitor.h" | ||||
| @@ -2391,9 +2391,9 @@ meta_monitor_manager_get_logical_monitor_from_rect (MetaMonitorManager *manager, | ||||
| } | ||||
|  | ||||
| MetaLogicalMonitor * | ||||
| meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager *manager, | ||||
|                                                    MetaLogicalMonitor *logical_monitor, | ||||
|                                                    MetaScreenDirection direction) | ||||
| meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager  *manager, | ||||
|                                                    MetaLogicalMonitor  *logical_monitor, | ||||
|                                                    MetaDisplayDirection direction) | ||||
| { | ||||
|   GList *l; | ||||
|  | ||||
|   | ||||
| @@ -268,7 +268,7 @@ relative_motion_across_outputs (MetaMonitorManager *monitor_manager, | ||||
|   MetaLogicalMonitor *cur = current; | ||||
|   float x = cur_x, y = cur_y; | ||||
|   float dx = *dx_inout, dy = *dy_inout; | ||||
|   MetaScreenDirection direction = -1; | ||||
|   MetaDisplayDirection direction = -1; | ||||
|  | ||||
|   while (cur) | ||||
|     { | ||||
| @@ -296,18 +296,18 @@ relative_motion_across_outputs (MetaMonitorManager *monitor_manager, | ||||
|         { cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height } | ||||
|       }; | ||||
|  | ||||
|       if (direction != META_SCREEN_RIGHT && | ||||
|       if (direction != META_DISPLAY_RIGHT && | ||||
|           meta_line2_intersects_with (&motion, &left, &intersection)) | ||||
|         direction = META_SCREEN_LEFT; | ||||
|       else if (direction != META_SCREEN_LEFT && | ||||
|         direction = META_DISPLAY_LEFT; | ||||
|       else if (direction != META_DISPLAY_LEFT && | ||||
|                meta_line2_intersects_with (&motion, &right, &intersection)) | ||||
|         direction = META_SCREEN_RIGHT; | ||||
|       else if (direction != META_SCREEN_DOWN && | ||||
|         direction = META_DISPLAY_RIGHT; | ||||
|       else if (direction != META_DISPLAY_DOWN && | ||||
|                meta_line2_intersects_with (&motion, &top, &intersection)) | ||||
|         direction = META_SCREEN_UP; | ||||
|       else if (direction != META_SCREEN_UP && | ||||
|         direction = META_DISPLAY_UP; | ||||
|       else if (direction != META_DISPLAY_UP && | ||||
|                meta_line2_intersects_with (&motion, &bottom, &intersection)) | ||||
|         direction = META_SCREEN_DOWN; | ||||
|         direction = META_DISPLAY_DOWN; | ||||
|       else | ||||
|         { | ||||
|           /* We reached the dest logical monitor */ | ||||
|   | ||||
| @@ -41,7 +41,7 @@ | ||||
| #include <xf86drmMode.h> | ||||
|  | ||||
| #include <meta/main.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
|  | ||||
| #include <gudev/gudev.h> | ||||
|  | ||||
|   | ||||
| @@ -110,7 +110,7 @@ translate_device_event (MetaBackendX11 *x11, | ||||
|  | ||||
|   meta_backend_x11_translate_device_event (x11, device_event); | ||||
|  | ||||
|   if (!device_event->send_event && device_event->time != CurrentTime) | ||||
|   if (!device_event->send_event && device_event->time != META_CURRENT_TIME) | ||||
|     { | ||||
|       if (device_event->time < priv->latest_evtime) | ||||
|         { | ||||
| @@ -266,7 +266,7 @@ handle_host_xevent (MetaBackend *backend, | ||||
|         if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event)) | ||||
|           bypass_clutter = TRUE; | ||||
|  | ||||
|         if (meta_dnd_handle_xdnd_event (backend, compositor, display, event)) | ||||
|         if (meta_dnd_handle_xdnd_event (backend, compositor, priv->xdisplay, event)) | ||||
|           bypass_clutter = TRUE; | ||||
|       } | ||||
|   } | ||||
| @@ -484,7 +484,7 @@ meta_backend_x11_grab_device (MetaBackend *backend, | ||||
|   XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; | ||||
|   int ret; | ||||
|  | ||||
|   if (timestamp != CurrentTime) | ||||
|   if (timestamp != META_CURRENT_TIME) | ||||
|     timestamp = MAX (timestamp, priv->latest_evtime); | ||||
|  | ||||
|   XISetMask (mask.mask, XI_ButtonPress); | ||||
|   | ||||
| @@ -40,6 +40,7 @@ | ||||
| #include <meta/barrier.h> | ||||
| #include "backends/x11/meta-barrier-x11.h" | ||||
| #include "display-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| struct _MetaBarrierImplX11Private | ||||
| { | ||||
| @@ -68,10 +69,11 @@ _meta_barrier_impl_x11_release (MetaBarrierImpl  *impl, | ||||
|   MetaBarrierImplX11Private *priv = | ||||
|     meta_barrier_impl_x11_get_instance_private (self); | ||||
|   MetaDisplay *display = priv->barrier->priv->display; | ||||
|   Display *dpy = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   if (META_DISPLAY_HAS_XINPUT_23 (display)) | ||||
|   if (META_X11_DISPLAY_HAS_XINPUT_23 (display->x11_display)) | ||||
|     { | ||||
|       XIBarrierReleasePointer (display->xdisplay, | ||||
|       XIBarrierReleasePointer (dpy, | ||||
|                                META_VIRTUAL_CORE_POINTER_ID, | ||||
|                                priv->xbarrier, event->event_id); | ||||
|     } | ||||
| @@ -89,13 +91,13 @@ _meta_barrier_impl_x11_destroy (MetaBarrierImpl *impl) | ||||
|   if (display == NULL) | ||||
|     return; | ||||
|  | ||||
|   dpy = display->xdisplay; | ||||
|   dpy = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   if (!meta_barrier_is_active (priv->barrier)) | ||||
|     return; | ||||
|  | ||||
|   XFixesDestroyPointerBarrier (dpy, priv->xbarrier); | ||||
|   g_hash_table_remove (display->xids, &priv->xbarrier); | ||||
|   g_hash_table_remove (display->x11_display->xids, &priv->xbarrier); | ||||
|   priv->xbarrier = 0; | ||||
| } | ||||
|  | ||||
| @@ -119,7 +121,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier) | ||||
|   priv = meta_barrier_impl_x11_get_instance_private (self); | ||||
|   priv->barrier = barrier; | ||||
|  | ||||
|   dpy = display->xdisplay; | ||||
|   dpy = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|   root = DefaultRootWindow (dpy); | ||||
|  | ||||
|   allowed_motion_dirs = | ||||
| @@ -132,7 +134,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier) | ||||
|                                                allowed_motion_dirs, | ||||
|                                                0, NULL); | ||||
|  | ||||
|   g_hash_table_insert (display->xids, &priv->xbarrier, barrier); | ||||
|   g_hash_table_insert (display->x11_display->xids, &priv->xbarrier, barrier); | ||||
|  | ||||
|   return META_BARRIER_IMPL (self); | ||||
| } | ||||
| @@ -172,8 +174,8 @@ meta_barrier_fire_xevent (MetaBarrier    *barrier, | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_display_process_barrier_xevent (MetaDisplay *display, | ||||
|                                      XIEvent     *event) | ||||
| meta_x11_display_process_barrier_xevent (MetaX11Display *x11_display, | ||||
|                                          XIEvent        *event) | ||||
| { | ||||
|   MetaBarrier *barrier; | ||||
|   XIBarrierEvent *xev; | ||||
| @@ -191,7 +193,7 @@ meta_display_process_barrier_xevent (MetaDisplay *display, | ||||
|     } | ||||
|  | ||||
|   xev = (XIBarrierEvent *) event; | ||||
|   barrier = g_hash_table_lookup (display->xids, &xev->barrier); | ||||
|   barrier = g_hash_table_lookup (x11_display->xids, &xev->barrier); | ||||
|   if (barrier != NULL) | ||||
|     { | ||||
|       meta_barrier_fire_xevent (barrier, xev); | ||||
|   | ||||
| @@ -35,7 +35,7 @@ | ||||
| #include <gudev/gudev.h> | ||||
| #endif | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "backends/meta-logical-monitor.h" | ||||
|  | ||||
| typedef struct _MetaInputSettingsX11Private | ||||
| @@ -547,7 +547,7 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings     *settings, | ||||
|     return; | ||||
|  | ||||
|   /* Grab the puke bucket! */ | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|   xdev = XOpenDevice (xdisplay, device_id); | ||||
|   if (xdev) | ||||
|     { | ||||
| @@ -557,7 +557,7 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings     *settings, | ||||
|       XCloseDevice (xdisplay, xdev); | ||||
|     } | ||||
|  | ||||
|   if (meta_error_trap_pop_with_return (display)) | ||||
|   if (meta_x11_error_trap_pop_with_return (display->x11_display)) | ||||
|     { | ||||
|       g_warning ("Could not set tablet mapping for %s", | ||||
|                  clutter_input_device_get_device_name (device)); | ||||
| @@ -744,7 +744,7 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings          *setti | ||||
|     return; | ||||
|  | ||||
|   /* Grab the puke bucket! */ | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|   xdev = XOpenDevice (xdisplay, device_id); | ||||
|   if (xdev) | ||||
|     { | ||||
| @@ -758,7 +758,7 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings          *setti | ||||
|       XCloseDevice (xdisplay, xdev); | ||||
|     } | ||||
|  | ||||
|   if (meta_error_trap_pop_with_return (display)) | ||||
|   if (meta_x11_error_trap_pop_with_return (display->x11_display)) | ||||
|     { | ||||
|       g_warning ("Could not set stylus button map for %s", | ||||
|                  clutter_input_device_get_device_name (device)); | ||||
|   | ||||
| @@ -42,7 +42,7 @@ | ||||
|  | ||||
| #include "meta-backend-x11.h" | ||||
| #include <meta/main.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "backends/meta-monitor-config-manager.h" | ||||
| #include "backends/meta-logical-monitor.h" | ||||
|  | ||||
|   | ||||
| @@ -42,8 +42,8 @@ | ||||
|  * There's two containers in the stage that are used to place window actors, here | ||||
|  * are listed in the order in which they are painted: | ||||
|  * | ||||
|  * - window group, accessible with meta_get_window_group_for_screen() | ||||
|  * - top window group, accessible with meta_get_top_window_group_for_screen() | ||||
|  * - window group, accessible with meta_get_window_group_for_display() | ||||
|  * - top window group, accessible with meta_get_top_window_group_for_display() | ||||
|  * | ||||
|  * Mutter will place actors representing windows in the window group, except for | ||||
|  * override-redirect windows (ie. popups and menus) which will be placed in the | ||||
| @@ -55,8 +55,7 @@ | ||||
| #include <clutter/x11/clutter-x11.h> | ||||
|  | ||||
| #include "core.h" | ||||
| #include <meta/screen.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <meta/window.h> | ||||
| #include "compositor-private.h" | ||||
| #include <meta/compositor-mutter.h> | ||||
| @@ -80,6 +79,8 @@ | ||||
| #include "backends/x11/meta-backend-x11.h" | ||||
| #include "clutter/clutter-mutter.h" | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
| #include "wayland/meta-wayland-private.h" | ||||
| #endif | ||||
| @@ -149,78 +150,78 @@ process_damage (MetaCompositor     *compositor, | ||||
|  | ||||
| /* compat helper */ | ||||
| static MetaCompositor * | ||||
| get_compositor_for_screen (MetaScreen *screen) | ||||
| get_compositor_for_display (MetaDisplay *display) | ||||
| { | ||||
|   return screen->display->compositor; | ||||
|   return display->compositor; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_get_stage_for_screen: | ||||
|  * @screen: a #MetaScreen | ||||
|  * meta_get_stage_for_display: | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Returns: (transfer none): The #ClutterStage for the screen | ||||
|  * Returns: (transfer none): The #ClutterStage for the display | ||||
|  */ | ||||
| ClutterActor * | ||||
| meta_get_stage_for_screen (MetaScreen *screen) | ||||
| meta_get_stage_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   return compositor->stage; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_get_window_group_for_screen: | ||||
|  * @screen: a #MetaScreen | ||||
|  * meta_get_window_group_for_display: | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Returns: (transfer none): The window group corresponding to @screen | ||||
|  * Returns: (transfer none): The window group corresponding to @display | ||||
|  */ | ||||
| ClutterActor * | ||||
| meta_get_window_group_for_screen (MetaScreen *screen) | ||||
| meta_get_window_group_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   return compositor->window_group; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_get_top_window_group_for_screen: | ||||
|  * @screen: a #MetaScreen | ||||
|  * meta_get_top_window_group_for_display: | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Returns: (transfer none): The top window group corresponding to @screen | ||||
|  * Returns: (transfer none): The top window group corresponding to @display | ||||
|  */ | ||||
| ClutterActor * | ||||
| meta_get_top_window_group_for_screen (MetaScreen *screen) | ||||
| meta_get_top_window_group_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   return compositor->top_window_group; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_get_feedback_group_for_screen: | ||||
|  * @screen: a #MetaScreen | ||||
|  * meta_get_feedback_group_for_display: | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Returns: (transfer none): The feedback group corresponding to @screen | ||||
|  * Returns: (transfer none): The feedback group corresponding to @display | ||||
|  */ | ||||
| ClutterActor * | ||||
| meta_get_feedback_group_for_screen (MetaScreen *screen) | ||||
| meta_get_feedback_group_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   return compositor->feedback_group; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_get_window_actors: | ||||
|  * @screen: a #MetaScreen | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Returns: (transfer none) (element-type Clutter.Actor): The set of #MetaWindowActor on @screen | ||||
|  * Returns: (transfer none) (element-type Clutter.Actor): The set of #MetaWindowActor on @display | ||||
|  */ | ||||
| GList * | ||||
| meta_get_window_actors (MetaScreen *screen) | ||||
| meta_get_window_actors (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   return compositor->windows; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_set_stage_input_region (MetaScreen   *screen, | ||||
| meta_set_stage_input_region (MetaDisplay  *display, | ||||
|                              XserverRegion region) | ||||
| { | ||||
|   /* As a wayland compositor we can simply ignore all this trickery | ||||
| @@ -230,9 +231,8 @@ meta_set_stage_input_region (MetaScreen   *screen, | ||||
|    */ | ||||
|   if (!meta_is_wayland_compositor ()) | ||||
|     { | ||||
|       MetaDisplay *display = screen->display; | ||||
|       MetaCompositor *compositor = display->compositor; | ||||
|       Display *xdpy = meta_display_get_xdisplay (display); | ||||
|       Display *xdpy = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|       Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage)); | ||||
|  | ||||
|       XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region); | ||||
| @@ -247,7 +247,7 @@ meta_set_stage_input_region (MetaScreen   *screen, | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_empty_stage_input_region (MetaScreen *screen) | ||||
| meta_empty_stage_input_region (MetaDisplay *display) | ||||
| { | ||||
|   /* Using a static region here is a bit hacky, but Metacity never opens more than | ||||
|    * one XDisplay, so it works fine. */ | ||||
| @@ -255,22 +255,21 @@ meta_empty_stage_input_region (MetaScreen *screen) | ||||
|  | ||||
|   if (region == None) | ||||
|     { | ||||
|       MetaDisplay  *display = meta_screen_get_display (screen); | ||||
|       Display      *xdpy    = meta_display_get_xdisplay (display); | ||||
|       Display *xdpy = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|       region = XFixesCreateRegion (xdpy, NULL, 0); | ||||
|     } | ||||
|  | ||||
|   meta_set_stage_input_region (screen, region); | ||||
|   meta_set_stage_input_region (display, region); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_focus_stage_window (MetaScreen *screen, | ||||
|                          guint32     timestamp) | ||||
| meta_focus_stage_window (MetaDisplay *display, | ||||
|                          guint32      timestamp) | ||||
| { | ||||
|   ClutterStage *stage; | ||||
|   Window window; | ||||
|  | ||||
|   stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen)); | ||||
|   stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); | ||||
|   if (!stage) | ||||
|     return; | ||||
|  | ||||
| @@ -279,14 +278,13 @@ meta_focus_stage_window (MetaScreen *screen, | ||||
|   if (window == None) | ||||
|     return; | ||||
|  | ||||
|   meta_display_set_input_focus_xwindow (screen->display, | ||||
|                                         screen, | ||||
|                                         window, | ||||
|                                         timestamp); | ||||
|   meta_x11_display_set_input_focus_xwindow (display->x11_display, | ||||
|                                             window, | ||||
|                                             timestamp); | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_stage_is_focused (MetaScreen *screen) | ||||
| meta_stage_is_focused (MetaDisplay *display) | ||||
| { | ||||
|   ClutterStage *stage; | ||||
|   Window window; | ||||
| @@ -294,7 +292,7 @@ meta_stage_is_focused (MetaScreen *screen) | ||||
|   if (meta_is_wayland_compositor ()) | ||||
|     return TRUE; | ||||
|  | ||||
|   stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen)); | ||||
|   stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); | ||||
|   if (!stage) | ||||
|     return FALSE; | ||||
|  | ||||
| @@ -303,7 +301,7 @@ meta_stage_is_focused (MetaScreen *screen) | ||||
|   if (window == None) | ||||
|     return FALSE; | ||||
|  | ||||
|   return (screen->display->focus_xwindow == window); | ||||
|   return (display->x11_display->focus_xwindow == window); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| @@ -364,11 +362,14 @@ meta_begin_modal_for_plugin (MetaCompositor   *compositor, | ||||
|   if (is_modal (display) || display->grab_op != META_GRAB_OP_NONE) | ||||
|     return FALSE; | ||||
|  | ||||
|   /* XXX: why is this needed? */ | ||||
|   XIUngrabDevice (display->xdisplay, | ||||
|                   META_VIRTUAL_CORE_POINTER_ID, | ||||
|                   timestamp); | ||||
|   XSync (display->xdisplay, False); | ||||
|   if (display->x11_display) | ||||
|     { | ||||
|       /* XXX: why is this needed? */ | ||||
|       XIUngrabDevice (display->x11_display->xdisplay, | ||||
|                       META_VIRTUAL_CORE_POINTER_ID, | ||||
|                       timestamp); | ||||
|       XSync (display->x11_display->xdisplay, False); | ||||
|     } | ||||
|  | ||||
|   if (!grab_devices (options, timestamp)) | ||||
|     return FALSE; | ||||
| @@ -380,7 +381,7 @@ meta_begin_modal_for_plugin (MetaCompositor   *compositor, | ||||
|   display->grab_have_keyboard = TRUE; | ||||
|  | ||||
|   g_signal_emit_by_name (display, "grab-op-begin", | ||||
|                          meta_plugin_get_screen (plugin), | ||||
|                          meta_plugin_get_display (plugin), | ||||
|                          display->grab_window, display->grab_op); | ||||
|  | ||||
|   if (meta_is_wayland_compositor ()) | ||||
| @@ -407,7 +408,7 @@ meta_end_modal_for_plugin (MetaCompositor *compositor, | ||||
|   g_return_if_fail (is_modal (display)); | ||||
|  | ||||
|   g_signal_emit_by_name (display, "grab-op-end", | ||||
|                          meta_plugin_get_screen (plugin), | ||||
|                          meta_plugin_get_display (plugin), | ||||
|                          display->grab_window, display->grab_op); | ||||
|  | ||||
|   display->grab_op = META_GRAB_OP_NONE; | ||||
| @@ -440,14 +441,13 @@ after_stage_paint (ClutterStage *stage, | ||||
| } | ||||
|  | ||||
| static void | ||||
| redirect_windows (MetaScreen *screen) | ||||
| redirect_windows (MetaX11Display *x11_display) | ||||
| { | ||||
|   MetaDisplay *display       = meta_screen_get_display (screen); | ||||
|   Display     *xdisplay      = meta_display_get_xdisplay (display); | ||||
|   Window       xroot         = meta_screen_get_xroot (screen); | ||||
|   int          screen_number = meta_screen_get_screen_number (screen); | ||||
|   guint        n_retries; | ||||
|   guint        max_retries; | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (x11_display); | ||||
|   Window xroot = meta_x11_display_get_xroot (x11_display); | ||||
|   int screen_number = meta_x11_display_get_screen_number (x11_display); | ||||
|   guint n_retries; | ||||
|   guint max_retries; | ||||
|  | ||||
|   if (meta_get_replace_current_wm ()) | ||||
|     max_retries = 5; | ||||
| @@ -462,11 +462,11 @@ redirect_windows (MetaScreen *screen) | ||||
|    */ | ||||
|   while (TRUE) | ||||
|     { | ||||
|       meta_error_trap_push (display); | ||||
|       meta_x11_error_trap_push (x11_display); | ||||
|       XCompositeRedirectSubwindows (xdisplay, xroot, CompositeRedirectManual); | ||||
|       XSync (xdisplay, FALSE); | ||||
|  | ||||
|       if (!meta_error_trap_pop_with_return (display)) | ||||
|       if (!meta_x11_error_trap_pop_with_return (x11_display)) | ||||
|         break; | ||||
|  | ||||
|       if (n_retries == max_retries) | ||||
| @@ -474,7 +474,7 @@ redirect_windows (MetaScreen *screen) | ||||
|           /* This probably means that a non-WM compositor like xcompmgr is running; | ||||
|            * we have no way to get it to exit */ | ||||
|           meta_fatal (_("Another compositing manager is already running on screen %i on display “%s”."), | ||||
|                       screen_number, display->name); | ||||
|                       screen_number, x11_display->name); | ||||
|         } | ||||
|  | ||||
|       n_retries++; | ||||
| @@ -486,11 +486,14 @@ void | ||||
| meta_compositor_manage (MetaCompositor *compositor) | ||||
| { | ||||
|   MetaDisplay *display = compositor->display; | ||||
|   Display *xdisplay = display->xdisplay; | ||||
|   MetaScreen *screen = display->screen; | ||||
|   Display *xdisplay = NULL; | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|  | ||||
|   meta_screen_set_cm_selection (display->screen); | ||||
|   if (display->x11_display) | ||||
|     { | ||||
|       xdisplay = display->x11_display->xdisplay; | ||||
|       meta_x11_display_set_cm_selection (display->x11_display); | ||||
|     } | ||||
|  | ||||
|   compositor->stage = meta_backend_get_stage (backend); | ||||
|  | ||||
| @@ -511,9 +514,9 @@ meta_compositor_manage (MetaCompositor *compositor) | ||||
|  | ||||
|   clutter_stage_set_sync_delay (CLUTTER_STAGE (compositor->stage), META_SYNC_DELAY); | ||||
|  | ||||
|   compositor->window_group = meta_window_group_new (screen); | ||||
|   compositor->top_window_group = meta_window_group_new (screen); | ||||
|   compositor->feedback_group = meta_window_group_new (screen); | ||||
|   compositor->window_group = meta_window_group_new (display); | ||||
|   compositor->top_window_group = meta_window_group_new (display); | ||||
|   compositor->feedback_group = meta_window_group_new (display); | ||||
|  | ||||
|   clutter_actor_add_child (compositor->stage, compositor->window_group); | ||||
|   clutter_actor_add_child (compositor->stage, compositor->top_window_group); | ||||
| @@ -530,13 +533,13 @@ meta_compositor_manage (MetaCompositor *compositor) | ||||
|     { | ||||
|       Window xwin; | ||||
|  | ||||
|       compositor->output = screen->composite_overlay_window; | ||||
|       compositor->output = display->x11_display->composite_overlay_window; | ||||
|  | ||||
|       xwin = meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend)); | ||||
|  | ||||
|       XReparentWindow (xdisplay, xwin, compositor->output, 0, 0); | ||||
|  | ||||
|       meta_empty_stage_input_region (screen); | ||||
|       meta_empty_stage_input_region (display); | ||||
|  | ||||
|       /* Make sure there isn't any left-over output shape on the | ||||
|        * overlay window by setting the whole screen to be an | ||||
| @@ -556,7 +559,8 @@ meta_compositor_manage (MetaCompositor *compositor) | ||||
|       compositor->have_x11_sync_object = meta_sync_ring_init (xdisplay); | ||||
|     } | ||||
|  | ||||
|   redirect_windows (display->screen); | ||||
|   if (display->x11_display) | ||||
|     redirect_windows (display->x11_display); | ||||
|  | ||||
|   compositor->plugin_mgr = meta_plugin_manager_new (compositor); | ||||
| } | ||||
| @@ -566,9 +570,9 @@ meta_compositor_unmanage (MetaCompositor *compositor) | ||||
| { | ||||
|   if (!meta_is_wayland_compositor ()) | ||||
|     { | ||||
|       MetaDisplay *display = compositor->display; | ||||
|       Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|       Window xroot = display->screen->xroot; | ||||
|       MetaX11Display *display = compositor->display->x11_display; | ||||
|       Display *xdisplay = display->xdisplay; | ||||
|       Window xroot = display->xroot; | ||||
|  | ||||
|       /* This is the most important part of cleanup - we have to do this | ||||
|        * before giving up the window manager selection or the next | ||||
| @@ -593,7 +597,7 @@ meta_shape_cow_for_window (MetaCompositor *compositor, | ||||
|                            MetaWindow *window) | ||||
| { | ||||
|   MetaDisplay *display = compositor->display; | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   if (window == NULL) | ||||
|     XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding, 0, 0, None); | ||||
| @@ -611,7 +615,7 @@ meta_shape_cow_for_window (MetaCompositor *compositor, | ||||
|       window_bounds.width = rect.width; | ||||
|       window_bounds.height = rect.height; | ||||
|  | ||||
|       meta_screen_get_size (display->screen, &width, &height); | ||||
|       meta_display_get_size (display, &width, &height); | ||||
|       screen_rect.x = 0; | ||||
|       screen_rect.y = 0; | ||||
|       screen_rect.width = width; | ||||
| @@ -654,12 +658,12 @@ meta_compositor_add_window (MetaCompositor    *compositor, | ||||
| { | ||||
|   MetaDisplay *display = compositor->display; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|  | ||||
|   meta_window_actor_new (window); | ||||
|   sync_actor_stacking (compositor); | ||||
|  | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (display->x11_display); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -739,8 +743,10 @@ meta_compositor_process_event (MetaCompositor *compositor, | ||||
|                                XEvent         *event, | ||||
|                                MetaWindow     *window) | ||||
| { | ||||
|   MetaX11Display *x11_display = compositor->display->x11_display; | ||||
|  | ||||
|   if (!meta_is_wayland_compositor () && | ||||
|       event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify) | ||||
|       event->type == meta_x11_display_get_damage_event_base (x11_display) + XDamageNotify) | ||||
|     { | ||||
|       /* Core code doesn't handle damage events, so we need to extract the MetaWindow | ||||
|        * ourselves | ||||
| @@ -748,7 +754,7 @@ meta_compositor_process_event (MetaCompositor *compositor, | ||||
|       if (window == NULL) | ||||
|         { | ||||
|           Window xwin = ((XDamageNotifyEvent *) event)->drawable; | ||||
|           window = meta_display_lookup_x_window (compositor->display, xwin); | ||||
|           window = meta_x11_display_lookup_x_window (x11_display, xwin); | ||||
|         } | ||||
|  | ||||
|       if (window) | ||||
| @@ -1109,7 +1115,7 @@ meta_pre_paint_func (gpointer data) | ||||
|       if (compositor->have_x11_sync_object) | ||||
|         compositor->have_x11_sync_object = meta_sync_ring_insert_wait (); | ||||
|       else | ||||
|         XSync (compositor->display->xdisplay, False); | ||||
|         XSync (compositor->display->x11_display->xdisplay, False); | ||||
|     } | ||||
|  | ||||
|   return TRUE; | ||||
| @@ -1204,44 +1210,44 @@ meta_compositor_new (MetaDisplay *display) | ||||
|  | ||||
| /** | ||||
|  * meta_get_overlay_window: (skip) | ||||
|  * @screen: a #MetaScreen | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  */ | ||||
| Window | ||||
| meta_get_overlay_window (MetaScreen *screen) | ||||
| meta_get_overlay_window (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   return compositor->output; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_disable_unredirect_for_screen: | ||||
|  * @screen: a #MetaScreen | ||||
|  * meta_disable_unredirect_for_display: | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Disables unredirection, can be usefull in situations where having | ||||
|  * unredirected windows is undesireable like when recording a video. | ||||
|  * | ||||
|  */ | ||||
| void | ||||
| meta_disable_unredirect_for_screen (MetaScreen *screen) | ||||
| meta_disable_unredirect_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   compositor->disable_unredirect_count++; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_enable_unredirect_for_screen: | ||||
|  * @screen: a #MetaScreen | ||||
|  * meta_enable_unredirect_for_display: | ||||
|  * @display: a #MetaDisplay | ||||
|  * | ||||
|  * Enables unredirection which reduces the overhead for apps like games. | ||||
|  * | ||||
|  */ | ||||
| void | ||||
| meta_enable_unredirect_for_screen (MetaScreen *screen) | ||||
| meta_enable_unredirect_for_display (MetaDisplay *display) | ||||
| { | ||||
|   MetaCompositor *compositor = get_compositor_for_screen (screen); | ||||
|   MetaCompositor *compositor = get_compositor_for_display (display); | ||||
|   if (compositor->disable_unredirect_count == 0) | ||||
|     g_warning ("Called enable_unredirect_for_screen while unredirection is enabled."); | ||||
|     g_warning ("Called enable_unredirect_for_display while unredirection is enabled."); | ||||
|   if (compositor->disable_unredirect_count > 0) | ||||
|     compositor->disable_unredirect_count--; | ||||
| } | ||||
| @@ -1258,15 +1264,15 @@ flash_out_completed (ClutterTimeline *timeline, | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_compositor_flash_screen (MetaCompositor *compositor, | ||||
|                               MetaScreen     *screen) | ||||
| meta_compositor_flash_display (MetaCompositor *compositor, | ||||
|                                MetaDisplay    *display) | ||||
| { | ||||
|   ClutterActor *stage; | ||||
|   ClutterActor *flash; | ||||
|   ClutterTransition *transition; | ||||
|   gfloat width, height; | ||||
|  | ||||
|   stage = meta_get_stage_for_screen (screen); | ||||
|   stage = meta_get_stage_for_display (display); | ||||
|   clutter_actor_get_size (stage, &width, &height); | ||||
|  | ||||
|   flash = clutter_actor_new (); | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
| #ifndef META_BACKGROUND_ACTOR_PRIVATE_H | ||||
| #define META_BACKGROUND_ACTOR_PRIVATE_H | ||||
|  | ||||
| #include <meta/screen.h> | ||||
| #include <meta/meta-background-actor.h> | ||||
|  | ||||
| cairo_region_t *meta_background_actor_get_clip_region (MetaBackgroundActor *self); | ||||
|   | ||||
| @@ -78,14 +78,15 @@ | ||||
|  | ||||
| #include "cogl-utils.h" | ||||
| #include "clutter-utils.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "meta-background-actor-private.h" | ||||
| #include "meta-background-private.h" | ||||
| #include "meta-cullable.h" | ||||
| #include "meta/display.h" | ||||
|  | ||||
| enum | ||||
| { | ||||
|   PROP_META_SCREEN = 1, | ||||
|   PROP_META_DISPLAY = 1, | ||||
|   PROP_MONITOR, | ||||
|   PROP_BACKGROUND, | ||||
|   PROP_VIGNETTE, | ||||
| @@ -127,7 +128,7 @@ typedef enum { | ||||
|  | ||||
| struct _MetaBackgroundActorPrivate | ||||
| { | ||||
|   MetaScreen *screen; | ||||
|   MetaDisplay *display; | ||||
|   int monitor; | ||||
|  | ||||
|   MetaBackground *background; | ||||
| @@ -186,7 +187,9 @@ get_preferred_size (MetaBackgroundActor *self, | ||||
|   MetaBackgroundActorPrivate *priv = META_BACKGROUND_ACTOR (self)->priv; | ||||
|   MetaRectangle monitor_geometry; | ||||
|  | ||||
|   meta_screen_get_monitor_geometry (priv->screen, priv->monitor, &monitor_geometry); | ||||
|   meta_display_get_monitor_geometry (priv->display, | ||||
|                                      priv->monitor, | ||||
|                                      &monitor_geometry); | ||||
|  | ||||
|   if (width != NULL) | ||||
|     *width = monitor_geometry.width; | ||||
| @@ -478,8 +481,8 @@ meta_background_actor_set_property (GObject      *object, | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_META_SCREEN: | ||||
|       priv->screen = g_value_get_object (value); | ||||
|     case PROP_META_DISPLAY: | ||||
|       priv->display = g_value_get_object (value); | ||||
|       break; | ||||
|     case PROP_MONITOR: | ||||
|       priv->monitor = g_value_get_int (value); | ||||
| @@ -521,8 +524,8 @@ meta_background_actor_get_property (GObject      *object, | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_META_SCREEN: | ||||
|       g_value_set_object (value, priv->screen); | ||||
|     case PROP_META_DISPLAY: | ||||
|       g_value_set_object (value, priv->display); | ||||
|       break; | ||||
|     case PROP_MONITOR: | ||||
|       g_value_set_int (value, priv->monitor); | ||||
| @@ -563,14 +566,14 @@ meta_background_actor_class_init (MetaBackgroundActorClass *klass) | ||||
|   actor_class->get_paint_volume = meta_background_actor_get_paint_volume; | ||||
|   actor_class->paint = meta_background_actor_paint; | ||||
|  | ||||
|   param_spec = g_param_spec_object ("meta-screen", | ||||
|                                     "MetaScreen", | ||||
|                                     "MetaScreen", | ||||
|                                     META_TYPE_SCREEN, | ||||
|   param_spec = g_param_spec_object ("meta-display", | ||||
|                                     "MetaDisplay", | ||||
|                                     "MetaDisplay", | ||||
|                                     META_TYPE_DISPLAY, | ||||
|                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); | ||||
|  | ||||
|   g_object_class_install_property (object_class, | ||||
|                                    PROP_META_SCREEN, | ||||
|                                    PROP_META_DISPLAY, | ||||
|                                    param_spec); | ||||
|  | ||||
|   param_spec = g_param_spec_int ("monitor", | ||||
| @@ -647,13 +650,13 @@ meta_background_actor_init (MetaBackgroundActor *self) | ||||
|  * Return value: the newly created background actor | ||||
|  */ | ||||
| ClutterActor * | ||||
| meta_background_actor_new (MetaScreen *screen, | ||||
|                            int         monitor) | ||||
| meta_background_actor_new (MetaDisplay *display, | ||||
|                            int          monitor) | ||||
| { | ||||
|   MetaBackgroundActor *self; | ||||
|  | ||||
|   self = g_object_new (META_TYPE_BACKGROUND_ACTOR, | ||||
|                        "meta-screen", screen, | ||||
|                        "meta-display", display, | ||||
|                        "monitor", monitor, | ||||
|                        NULL); | ||||
|  | ||||
|   | ||||
| @@ -17,9 +17,11 @@ | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <meta/display.h> | ||||
| #include <meta/util.h> | ||||
| #include <meta/meta-background.h> | ||||
| #include <meta/meta-background-image.h> | ||||
| #include <meta/meta-monitor-manager.h> | ||||
| #include "meta-background-private.h" | ||||
| #include "cogl-utils.h" | ||||
|  | ||||
| @@ -44,7 +46,7 @@ struct _MetaBackgroundMonitor | ||||
|  | ||||
| struct _MetaBackgroundPrivate | ||||
| { | ||||
|   MetaScreen *screen; | ||||
|   MetaDisplay *display; | ||||
|   MetaBackgroundMonitor *monitors; | ||||
|   int n_monitors; | ||||
|  | ||||
| @@ -68,7 +70,7 @@ struct _MetaBackgroundPrivate | ||||
|  | ||||
| enum | ||||
| { | ||||
|   PROP_META_SCREEN = 1, | ||||
|   PROP_META_DISPLAY = 1, | ||||
|   PROP_MONITOR, | ||||
| }; | ||||
|  | ||||
| @@ -128,8 +130,7 @@ free_wallpaper_texture (MetaBackground *self) | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_monitors_changed (MetaScreen     *screen, | ||||
|                      MetaBackground *self) | ||||
| on_monitors_changed (MetaBackground *self) | ||||
| { | ||||
|   MetaBackgroundPrivate *priv = self->priv; | ||||
|  | ||||
| @@ -138,11 +139,11 @@ on_monitors_changed (MetaScreen     *screen, | ||||
|   priv->monitors = NULL; | ||||
|   priv->n_monitors = 0; | ||||
|  | ||||
|   if (priv->screen) | ||||
|   if (priv->display) | ||||
|     { | ||||
|       int i; | ||||
|  | ||||
|       priv->n_monitors = meta_screen_get_n_monitors (screen); | ||||
|       priv->n_monitors = meta_display_get_n_monitors (priv->display); | ||||
|       priv->monitors = g_new0 (MetaBackgroundMonitor, priv->n_monitors); | ||||
|  | ||||
|       for (i = 0; i < priv->n_monitors; i++) | ||||
| @@ -151,27 +152,14 @@ on_monitors_changed (MetaScreen     *screen, | ||||
| } | ||||
|  | ||||
| static void | ||||
| set_screen (MetaBackground *self, | ||||
|             MetaScreen     *screen) | ||||
| set_display (MetaBackground *self, | ||||
|              MetaDisplay    *display) | ||||
| { | ||||
|   MetaBackgroundPrivate *priv = self->priv; | ||||
|  | ||||
|   if (priv->screen != NULL) | ||||
|     { | ||||
|       g_signal_handlers_disconnect_by_func (priv->screen, | ||||
|                                             (gpointer)on_monitors_changed, | ||||
|                                             self); | ||||
|     } | ||||
|   priv->display = display; | ||||
|  | ||||
|   priv->screen = screen; | ||||
|  | ||||
|   if (priv->screen != NULL) | ||||
|     { | ||||
|       g_signal_connect (priv->screen, "monitors-changed", | ||||
|                         G_CALLBACK (on_monitors_changed), self); | ||||
|     } | ||||
|  | ||||
|   on_monitors_changed (priv->screen, self); | ||||
|   on_monitors_changed (self); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -182,8 +170,8 @@ meta_background_set_property (GObject      *object, | ||||
| { | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_META_SCREEN: | ||||
|       set_screen (META_BACKGROUND (object), g_value_get_object (value)); | ||||
|     case PROP_META_DISPLAY: | ||||
|       set_display (META_BACKGROUND (object), g_value_get_object (value)); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
| @@ -201,8 +189,8 @@ meta_background_get_property (GObject      *object, | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_META_SCREEN: | ||||
|       g_value_set_object (value, priv->screen); | ||||
|     case PROP_META_DISPLAY: | ||||
|       g_value_set_object (value, priv->display); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
| @@ -304,7 +292,7 @@ meta_background_dispose (GObject *object) | ||||
|   set_file (self, &priv->file1, &priv->background_image1, NULL); | ||||
|   set_file (self, &priv->file2, &priv->background_image2, NULL); | ||||
|  | ||||
|   set_screen (self, NULL); | ||||
|   set_display (self, NULL); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_background_parent_class)->dispose (object); | ||||
| } | ||||
| @@ -322,11 +310,15 @@ meta_background_constructed (GObject *object) | ||||
| { | ||||
|   MetaBackground        *self = META_BACKGROUND (object); | ||||
|   MetaBackgroundPrivate *priv = self->priv; | ||||
|   MetaMonitorManager *monitor_manager = meta_monitor_manager_get (); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_background_parent_class)->constructed (object); | ||||
|  | ||||
|   g_signal_connect_object (meta_screen_get_display (priv->screen), "gl-video-memory-purged", | ||||
|   g_signal_connect_object (priv->display, "gl-video-memory-purged", | ||||
|                            G_CALLBACK (mark_changed), object, G_CONNECT_SWAPPED); | ||||
|  | ||||
|   g_signal_connect_object (monitor_manager, "monitors-changed", | ||||
|                            G_CALLBACK (on_monitors_changed), self, G_CONNECT_SWAPPED); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -351,14 +343,14 @@ meta_background_class_init (MetaBackgroundClass *klass) | ||||
|                   NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, 0); | ||||
|  | ||||
|   param_spec = g_param_spec_object ("meta-screen", | ||||
|                                     "MetaScreen", | ||||
|                                     "MetaScreen", | ||||
|                                     META_TYPE_SCREEN, | ||||
|   param_spec = g_param_spec_object ("meta-display", | ||||
|                                     "MetaDisplay", | ||||
|                                     "MetaDisplay", | ||||
|                                     META_TYPE_DISPLAY, | ||||
|                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); | ||||
|  | ||||
|   g_object_class_install_property (object_class, | ||||
|                                    PROP_META_SCREEN, | ||||
|                                    PROP_META_DISPLAY, | ||||
|                                    param_spec); | ||||
|  | ||||
| } | ||||
| @@ -407,7 +399,7 @@ get_texture_area (MetaBackground          *self, | ||||
|       set_texture_area_from_monitor_area (monitor_rect, texture_area); | ||||
|       break; | ||||
|     case G_DESKTOP_BACKGROUND_STYLE_WALLPAPER: | ||||
|       meta_screen_get_size (priv->screen, &screen_width, &screen_height); | ||||
|       meta_display_get_size (priv->display, &screen_width, &screen_height); | ||||
|  | ||||
|       /* Start off by centering a tile in the middle of the | ||||
|        * total screen area. | ||||
| @@ -476,7 +468,7 @@ get_texture_area (MetaBackground          *self, | ||||
|         /* paint region is the union of all monitors, with the origin | ||||
|          * of the region set to align with monitor associated with the background. | ||||
|          */ | ||||
|         meta_screen_get_size (priv->screen, &screen_width, &screen_height); | ||||
|         meta_display_get_size (priv->display, &screen_width, &screen_height); | ||||
|  | ||||
|         /* unclipped texture area is whole screen */ | ||||
|         image_area.width = screen_width; | ||||
| @@ -750,7 +742,9 @@ meta_background_get_texture (MetaBackground         *self, | ||||
|  | ||||
|   monitor = &priv->monitors[monitor_index]; | ||||
|  | ||||
|   meta_screen_get_monitor_geometry (priv->screen, monitor_index, &geometry); | ||||
|   meta_display_get_monitor_geometry (priv->display, | ||||
|                                      monitor_index, | ||||
|                                      &geometry); | ||||
|   monitor_area.x = geometry.x; | ||||
|   monitor_area.y = geometry.y; | ||||
|   monitor_area.width = geometry.width; | ||||
| @@ -879,10 +873,10 @@ meta_background_get_texture (MetaBackground         *self, | ||||
| } | ||||
|  | ||||
| MetaBackground * | ||||
| meta_background_new  (MetaScreen *screen) | ||||
| meta_background_new (MetaDisplay *display) | ||||
| { | ||||
|   return g_object_new (META_TYPE_BACKGROUND, | ||||
|                        "meta-screen", screen, | ||||
|                        "meta-display", display, | ||||
|                        NULL); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -27,6 +27,7 @@ | ||||
| #include "core/display-private.h" | ||||
| #include "backends/meta-dnd-private.h" | ||||
| #include "meta/meta-dnd.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| struct _MetaDndClass | ||||
| { | ||||
| @@ -139,7 +140,7 @@ meta_dnd_notify_dnd_leave (MetaDnd *dnd) | ||||
| gboolean | ||||
| meta_dnd_handle_xdnd_event (MetaBackend    *backend, | ||||
|                             MetaCompositor *compositor, | ||||
|                             MetaDisplay    *display, | ||||
|                             Display        *xdisplay, | ||||
|                             XEvent         *xev) | ||||
| { | ||||
|   MetaDnd *dnd = meta_backend_get_dnd (backend); | ||||
| @@ -152,23 +153,23 @@ meta_dnd_handle_xdnd_event (MetaBackend    *backend, | ||||
|       xev->xany.window != clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage))) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (xev->xclient.message_type == gdk_x11_get_xatom_by_name ("XdndPosition")) | ||||
|   if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndPosition", TRUE)) | ||||
|     { | ||||
|       XEvent xevent; | ||||
|       Window src = xev->xclient.data.l[0]; | ||||
|  | ||||
|       memset (&xevent, 0, sizeof(xevent)); | ||||
|       xevent.xany.type = ClientMessage; | ||||
|       xevent.xany.display = display->xdisplay; | ||||
|       xevent.xany.display = xdisplay; | ||||
|       xevent.xclient.window = src; | ||||
|       xevent.xclient.message_type = gdk_x11_get_xatom_by_name ("XdndStatus"); | ||||
|       xevent.xclient.message_type = XInternAtom (xdisplay, "XdndStatus", TRUE); | ||||
|       xevent.xclient.format = 32; | ||||
|       xevent.xclient.data.l[0] = output_window; | ||||
|       /* flags: bit 0: will we accept the drop? bit 1: do we want more position messages */ | ||||
|       xevent.xclient.data.l[1] = 2; | ||||
|       xevent.xclient.data.l[4] = None; | ||||
|  | ||||
|       XSendEvent (display->xdisplay, src, False, 0, &xevent); | ||||
|       XSendEvent (xdisplay, src, False, 0, &xevent); | ||||
|  | ||||
|       meta_dnd_notify_dnd_position_change (dnd, | ||||
|                                             (int)(xev->xclient.data.l[2] >> 16), | ||||
| @@ -176,13 +177,13 @@ meta_dnd_handle_xdnd_event (MetaBackend    *backend, | ||||
|  | ||||
|       return TRUE; | ||||
|     } | ||||
|   else if (xev->xclient.message_type == gdk_x11_get_xatom_by_name ("XdndLeave")) | ||||
|   else if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndLeave", TRUE)) | ||||
|     { | ||||
|       meta_dnd_notify_dnd_leave (dnd); | ||||
|  | ||||
|       return TRUE; | ||||
|     } | ||||
|   else if (xev->xclient.message_type == gdk_x11_get_xatom_by_name ("XdndEnter")) | ||||
|   else if (xev->xclient.message_type == XInternAtom (xdisplay, "XdndEnter", TRUE)) | ||||
|     { | ||||
|       meta_dnd_notify_dnd_enter (dnd); | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| #include "compositor-private.h" | ||||
| #include "meta-plugin-manager.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <meta/workspace.h> | ||||
| #include "meta-module.h" | ||||
| #include "window-private.h" | ||||
|   | ||||
| @@ -23,7 +23,6 @@ | ||||
| #define META_PLUGIN_MANAGER_H_ | ||||
|  | ||||
| #include <meta/types.h> | ||||
| #include <meta/screen.h> | ||||
| #include <meta/meta-plugin.h> | ||||
|  | ||||
| typedef enum { | ||||
|   | ||||
| @@ -28,7 +28,6 @@ | ||||
|  | ||||
| #include <meta/meta-plugin.h> | ||||
| #include "meta-plugin-manager.h" | ||||
| #include <meta/screen.h> | ||||
| #include <meta/display.h> | ||||
| #include <meta/util.h> | ||||
|  | ||||
| @@ -191,19 +190,19 @@ meta_plugin_end_modal (MetaPlugin *plugin, | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_plugin_get_screen: | ||||
|  * meta_plugin_get_display: | ||||
|  * @plugin: a #MetaPlugin | ||||
|  * | ||||
|  * Gets the #MetaScreen corresponding to a plugin. | ||||
|  * Gets the #MetaDisplay corresponding to a plugin. | ||||
|  * | ||||
|  * Return value: (transfer none): the #MetaScreen for the plugin | ||||
|  * Return value: (transfer none): the #MetaDisplay for the plugin | ||||
|  */ | ||||
| MetaScreen * | ||||
| meta_plugin_get_screen (MetaPlugin *plugin) | ||||
| MetaDisplay * | ||||
| meta_plugin_get_display (MetaPlugin *plugin) | ||||
| { | ||||
|   MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv; | ||||
|  | ||||
|   return priv->compositor->display->screen; | ||||
|   return priv->compositor->display; | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
| @@ -30,11 +30,12 @@ | ||||
| #include <X11/extensions/Xcomposite.h> | ||||
| #include <cogl/winsys/cogl-texture-pixmap-x11.h> | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "window-private.h" | ||||
| #include "meta-shaped-texture-private.h" | ||||
| #include "meta-cullable.h" | ||||
| #include "x11/window-x11.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| struct _MetaSurfaceActorX11Private | ||||
| { | ||||
| @@ -68,15 +69,15 @@ free_damage (MetaSurfaceActorX11 *self) | ||||
| { | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|   MetaDisplay *display = priv->display; | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   if (priv->damage == None) | ||||
|     return; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|   XDamageDestroy (xdisplay, priv->damage); | ||||
|   priv->damage = None; | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (display->x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -84,7 +85,7 @@ detach_pixmap (MetaSurfaceActorX11 *self) | ||||
| { | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|   MetaDisplay *display = priv->display; | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|   MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); | ||||
|  | ||||
|   if (priv->pixmap == None) | ||||
| @@ -97,10 +98,10 @@ detach_pixmap (MetaSurfaceActorX11 *self) | ||||
|   meta_shaped_texture_set_texture (stex, NULL); | ||||
|   cogl_flush (); | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|   XFreePixmap (xdisplay, priv->pixmap); | ||||
|   priv->pixmap = None; | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (display->x11_display); | ||||
|  | ||||
|   g_clear_pointer (&priv->texture, cogl_object_unref); | ||||
| } | ||||
| @@ -138,7 +139,7 @@ update_pixmap (MetaSurfaceActorX11 *self) | ||||
| { | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|   MetaDisplay *display = priv->display; | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   if (priv->size_changed) | ||||
|     { | ||||
| @@ -151,10 +152,10 @@ update_pixmap (MetaSurfaceActorX11 *self) | ||||
|       Pixmap new_pixmap; | ||||
|       Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window); | ||||
|  | ||||
|       meta_error_trap_push (display); | ||||
|       meta_x11_error_trap_push (display->x11_display); | ||||
|       new_pixmap = XCompositeNameWindowPixmap (xdisplay, xwindow); | ||||
|  | ||||
|       if (meta_error_trap_pop_with_return (display) != Success) | ||||
|       if (meta_x11_error_trap_pop_with_return (display->x11_display) != Success) | ||||
|         { | ||||
|           /* Probably a BadMatch if the window isn't viewable; we could | ||||
|            * GrabServer/GetWindowAttributes/NameWindowPixmap/UngrabServer/Sync | ||||
| @@ -223,13 +224,13 @@ meta_surface_actor_x11_pre_paint (MetaSurfaceActor *actor) | ||||
|   MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|   MetaDisplay *display = priv->display; | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   if (priv->received_damage) | ||||
|     { | ||||
|       meta_error_trap_push (display); | ||||
|       meta_x11_error_trap_push (display->x11_display); | ||||
|       XDamageSubtract (xdisplay, priv->damage, None, None); | ||||
|       meta_error_trap_pop (display); | ||||
|       meta_x11_error_trap_pop (display->x11_display); | ||||
|  | ||||
|       priv->received_damage = FALSE; | ||||
|     } | ||||
| @@ -311,10 +312,10 @@ sync_unredirected (MetaSurfaceActorX11 *self) | ||||
| { | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|   MetaDisplay *display = priv->display; | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|   Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window); | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|  | ||||
|   if (priv->unredirected) | ||||
|     { | ||||
| @@ -326,7 +327,7 @@ sync_unredirected (MetaSurfaceActorX11 *self) | ||||
|       XCompositeRedirectWindow (xdisplay, xwindow, CompositeRedirectManual); | ||||
|     } | ||||
|  | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (display->x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -403,7 +404,7 @@ static void | ||||
| create_damage (MetaSurfaceActorX11 *self) | ||||
| { | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|   Display *xdisplay = meta_display_get_xdisplay (priv->display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (priv->display->x11_display); | ||||
|   Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window); | ||||
|  | ||||
|   priv->damage = XDamageCreate (xdisplay, xwindow, XDamageReportBoundingBox); | ||||
|   | ||||
| @@ -16,7 +16,7 @@ | ||||
| #include <string.h> | ||||
|  | ||||
| #include <meta/display.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "frame.h" | ||||
| #include <meta/window.h> | ||||
| #include <meta/meta-shaped-texture.h> | ||||
| @@ -36,6 +36,8 @@ | ||||
| #include "meta-surface-actor.h" | ||||
| #include "meta-surface-actor-x11.h" | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
| #include "meta-surface-actor-wayland.h" | ||||
| #include "wayland/meta-wayland-surface.h" | ||||
| @@ -1944,7 +1946,7 @@ do_send_frame_drawn (MetaWindowActor *self, FrameData *frame) | ||||
| { | ||||
|   MetaWindowActorPrivate *priv = self->priv; | ||||
|   MetaDisplay *display = meta_window_get_display (priv->window); | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   XClientMessageEvent ev = { 0, }; | ||||
|  | ||||
| @@ -1954,17 +1956,17 @@ do_send_frame_drawn (MetaWindowActor *self, FrameData *frame) | ||||
|  | ||||
|   ev.type = ClientMessage; | ||||
|   ev.window = meta_window_get_xwindow (priv->window); | ||||
|   ev.message_type = display->atom__NET_WM_FRAME_DRAWN; | ||||
|   ev.message_type = display->x11_display->atom__NET_WM_FRAME_DRAWN; | ||||
|   ev.format = 32; | ||||
|   ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT(0xffffffff); | ||||
|   ev.data.l[1] = frame->sync_request_serial >> 32; | ||||
|   ev.data.l[2] = frame->frame_drawn_time & G_GUINT64_CONSTANT(0xffffffff); | ||||
|   ev.data.l[3] = frame->frame_drawn_time >> 32; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|   XSendEvent (xdisplay, ev.window, False, 0, (XEvent*) &ev); | ||||
|   XFlush (xdisplay); | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (display->x11_display); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -2012,13 +2014,13 @@ do_send_frame_timings (MetaWindowActor  *self, | ||||
| { | ||||
|   MetaWindowActorPrivate *priv = self->priv; | ||||
|   MetaDisplay *display = meta_window_get_display (priv->window); | ||||
|   Display *xdisplay = meta_display_get_xdisplay (display); | ||||
|   Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display); | ||||
|  | ||||
|   XClientMessageEvent ev = { 0, }; | ||||
|  | ||||
|   ev.type = ClientMessage; | ||||
|   ev.window = meta_window_get_xwindow (priv->window); | ||||
|   ev.message_type = display->atom__NET_WM_FRAME_TIMINGS; | ||||
|   ev.message_type = display->x11_display->atom__NET_WM_FRAME_TIMINGS; | ||||
|   ev.format = 32; | ||||
|   ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT(0xffffffff); | ||||
|   ev.data.l[1] = frame->sync_request_serial >> 32; | ||||
| @@ -2038,10 +2040,10 @@ do_send_frame_timings (MetaWindowActor  *self, | ||||
|   ev.data.l[3] = refresh_interval; | ||||
|   ev.data.l[4] = 1000 * META_SYNC_DELAY; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|   XSendEvent (xdisplay, ev.window, False, 0, (XEvent*) &ev); | ||||
|   XFlush (xdisplay); | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (display->x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
| #include "meta-window-group.h" | ||||
| #include "window-private.h" | ||||
| #include "meta-cullable.h" | ||||
| #include "display-private.h" | ||||
|  | ||||
| struct _MetaWindowGroupClass | ||||
| { | ||||
| @@ -23,7 +24,7 @@ struct _MetaWindowGroup | ||||
| { | ||||
|   ClutterActor parent; | ||||
|  | ||||
|   MetaScreen *screen; | ||||
|   MetaDisplay *display; | ||||
| }; | ||||
|  | ||||
| static void cullable_iface_init (MetaCullableInterface *iface); | ||||
| @@ -64,7 +65,7 @@ meta_window_group_paint (ClutterActor *actor) | ||||
|   MetaWindowGroup *window_group = META_WINDOW_GROUP (actor); | ||||
|   ClutterActor *stage = clutter_actor_get_stage (actor); | ||||
|  | ||||
|   meta_screen_get_size (window_group->screen, &screen_width, &screen_height); | ||||
|   meta_display_get_size (window_group->display, &screen_width, &screen_height); | ||||
|  | ||||
|   /* Normally we expect an actor to be drawn at it's position on the screen. | ||||
|    * However, if we're inside the paint of a ClutterClone, that won't be the | ||||
| @@ -199,13 +200,13 @@ meta_window_group_init (MetaWindowGroup *window_group) | ||||
| } | ||||
|  | ||||
| ClutterActor * | ||||
| meta_window_group_new (MetaScreen *screen) | ||||
| meta_window_group_new (MetaDisplay *display) | ||||
| { | ||||
|   MetaWindowGroup *window_group; | ||||
|  | ||||
|   window_group = g_object_new (META_TYPE_WINDOW_GROUP, NULL); | ||||
|  | ||||
|   window_group->screen = screen; | ||||
|   window_group->display = display; | ||||
|  | ||||
|   return CLUTTER_ACTOR (window_group); | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| #include <clutter/clutter.h> | ||||
|  | ||||
| #include <meta/screen.h> | ||||
| #include <meta/display.h> | ||||
|  | ||||
| /** | ||||
|  * MetaWindowGroup: | ||||
| @@ -29,7 +29,7 @@ typedef struct _MetaWindowGroupPrivate MetaWindowGroupPrivate; | ||||
|  | ||||
| GType meta_window_group_get_type (void); | ||||
|  | ||||
| ClutterActor *meta_window_group_new (MetaScreen *screen); | ||||
| ClutterActor *meta_window_group_new (MetaDisplay *display); | ||||
|  | ||||
| gboolean meta_window_group_actor_is_untransformed (ClutterActor *actor, | ||||
|                                                    int          *x_origin, | ||||
|   | ||||
| @@ -21,10 +21,12 @@ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include <meta/display.h> | ||||
| #include <meta/meta-plugin.h> | ||||
| #include <meta/window.h> | ||||
| #include <meta/meta-background-group.h> | ||||
| #include <meta/meta-background-actor.h> | ||||
| #include <meta/meta-monitor-manager.h> | ||||
| #include <meta/util.h> | ||||
| #include <glib/gi18n-lib.h> | ||||
|  | ||||
| @@ -38,7 +40,7 @@ | ||||
| #define SWITCH_TIMEOUT    500 | ||||
|  | ||||
| #define ACTOR_DATA_KEY "MCCP-Default-actor-data" | ||||
| #define SCREEN_TILE_PREVIEW_DATA_KEY "MCCP-Default-screen-tile-preview-data" | ||||
| #define DISPLAY_TILE_PREVIEW_DATA_KEY "MCCP-Default-display-tile-preview-data" | ||||
|  | ||||
| #define META_TYPE_DEFAULT_PLUGIN            (meta_default_plugin_get_type ()) | ||||
| #define META_DEFAULT_PLUGIN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPlugin)) | ||||
| @@ -67,7 +69,7 @@ struct _MetaDefaultPluginClass | ||||
| }; | ||||
|  | ||||
| static GQuark actor_data_quark = 0; | ||||
| static GQuark screen_tile_preview_data_quark = 0; | ||||
| static GQuark display_tile_preview_data_quark = 0; | ||||
|  | ||||
| static void start      (MetaPlugin      *plugin); | ||||
| static void minimize   (MetaPlugin      *plugin, | ||||
| @@ -134,14 +136,14 @@ typedef struct | ||||
| } EffectCompleteData; | ||||
|  | ||||
|  | ||||
| typedef struct _ScreenTilePreview | ||||
| typedef struct _DisplayTilePreview | ||||
| { | ||||
|   ClutterActor   *actor; | ||||
|  | ||||
|   GdkRGBA        *preview_color; | ||||
|  | ||||
|   MetaRectangle   tile_rect; | ||||
| } ScreenTilePreview; | ||||
| } DisplayTilePreview; | ||||
|  | ||||
| static void | ||||
| meta_default_plugin_dispose (GObject *object) | ||||
| @@ -285,8 +287,8 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data) | ||||
| { | ||||
|   MetaPlugin               *plugin  = META_PLUGIN (data); | ||||
|   MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv; | ||||
|   MetaScreen *screen = meta_plugin_get_screen (plugin); | ||||
|   GList *l = meta_get_window_actors (screen); | ||||
|   MetaDisplay *display = meta_plugin_get_display (plugin); | ||||
|   GList *l = meta_get_window_actors (display); | ||||
|  | ||||
|   while (l) | ||||
|     { | ||||
| @@ -318,16 +320,18 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data) | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_monitors_changed (MetaScreen *screen, | ||||
|                      MetaPlugin *plugin) | ||||
| on_monitors_changed (MetaMonitorManager *monitor_manager, | ||||
|                      MetaPlugin         *plugin) | ||||
| { | ||||
|   MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin); | ||||
|   MetaDisplay *display = meta_plugin_get_display (plugin); | ||||
|  | ||||
|   int i, n; | ||||
|   GRand *rand = g_rand_new_with_seed (123456); | ||||
|  | ||||
|   clutter_actor_destroy_all_children (self->priv->background_group); | ||||
|  | ||||
|   n = meta_screen_get_n_monitors (screen); | ||||
|   n = meta_display_get_n_monitors (display); | ||||
|   for (i = 0; i < n; i++) | ||||
|     { | ||||
|       MetaRectangle rect; | ||||
| @@ -335,9 +339,9 @@ on_monitors_changed (MetaScreen *screen, | ||||
|       MetaBackground *background; | ||||
|       ClutterColor color; | ||||
|  | ||||
|       meta_screen_get_monitor_geometry (screen, i, &rect); | ||||
|       meta_display_get_monitor_geometry (display, i, &rect); | ||||
|  | ||||
|       background_actor = meta_background_actor_new (screen, i); | ||||
|       background_actor = meta_background_actor_new (display, i); | ||||
|  | ||||
|       clutter_actor_set_position (background_actor, rect.x, rect.y); | ||||
|       clutter_actor_set_size (background_actor, rect.width, rect.height); | ||||
| @@ -352,7 +356,7 @@ on_monitors_changed (MetaScreen *screen, | ||||
|                           g_rand_int_range (rand, 0, 255), | ||||
|                           255); | ||||
|  | ||||
|       background = meta_background_new (screen); | ||||
|       background = meta_background_new (display); | ||||
|       meta_background_set_color (background, &color); | ||||
|       meta_background_actor_set_background (META_BACKGROUND_ACTOR (background_actor), background); | ||||
|       g_object_unref (background); | ||||
| @@ -372,17 +376,19 @@ static void | ||||
| start (MetaPlugin *plugin) | ||||
| { | ||||
|   MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin); | ||||
|   MetaScreen *screen = meta_plugin_get_screen (plugin); | ||||
|   MetaDisplay *display = meta_plugin_get_display (plugin); | ||||
|   MetaMonitorManager *monitor_manager = meta_monitor_manager_get (); | ||||
|  | ||||
|   self->priv->background_group = meta_background_group_new (); | ||||
|   clutter_actor_insert_child_below (meta_get_window_group_for_screen (screen), | ||||
|   clutter_actor_insert_child_below (meta_get_window_group_for_display (display), | ||||
|                                     self->priv->background_group, NULL); | ||||
|  | ||||
|   g_signal_connect (screen, "monitors-changed", | ||||
|   g_signal_connect (monitor_manager, "monitors-changed", | ||||
|                     G_CALLBACK (on_monitors_changed), plugin); | ||||
|   on_monitors_changed (screen, plugin); | ||||
|  | ||||
|   clutter_actor_show (meta_get_stage_for_screen (screen)); | ||||
|   on_monitors_changed (monitor_manager, plugin); | ||||
|  | ||||
|   clutter_actor_show (meta_get_stage_for_display (display)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -390,7 +396,7 @@ switch_workspace (MetaPlugin *plugin, | ||||
|                   gint from, gint to, | ||||
|                   MetaMotionDirection direction) | ||||
| { | ||||
|   MetaScreen *screen; | ||||
|   MetaDisplay *display; | ||||
|   MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv; | ||||
|   GList        *l; | ||||
|   ClutterActor *workspace0  = clutter_actor_new (); | ||||
| @@ -398,12 +404,12 @@ switch_workspace (MetaPlugin *plugin, | ||||
|   ClutterActor *stage; | ||||
|   int           screen_width, screen_height; | ||||
|  | ||||
|   screen = meta_plugin_get_screen (plugin); | ||||
|   stage = meta_get_stage_for_screen (screen); | ||||
|   display = meta_plugin_get_display (plugin); | ||||
|   stage = meta_get_stage_for_display (display); | ||||
|  | ||||
|   meta_screen_get_size (screen, | ||||
|                         &screen_width, | ||||
|                         &screen_height); | ||||
|   meta_display_get_size (display, | ||||
|                          &screen_width, | ||||
|                          &screen_height); | ||||
|  | ||||
|   clutter_actor_set_pivot_point (workspace1, 1.0, 1.0); | ||||
|   clutter_actor_set_position (workspace1, | ||||
| @@ -421,7 +427,7 @@ switch_workspace (MetaPlugin *plugin, | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   l = g_list_last (meta_get_window_actors (screen)); | ||||
|   l = g_list_last (meta_get_window_actors (display)); | ||||
|  | ||||
|   while (l) | ||||
|     { | ||||
| @@ -669,36 +675,36 @@ destroy (MetaPlugin *plugin, MetaWindowActor *window_actor) | ||||
|  * Tile preview private data accessor | ||||
|  */ | ||||
| static void | ||||
| free_screen_tile_preview (gpointer data) | ||||
| free_display_tile_preview (gpointer data) | ||||
| { | ||||
|   ScreenTilePreview *preview = data; | ||||
|   DisplayTilePreview *preview = data; | ||||
|  | ||||
|   if (G_LIKELY (preview != NULL)) { | ||||
|     clutter_actor_destroy (preview->actor); | ||||
|     g_slice_free (ScreenTilePreview, preview); | ||||
|     g_slice_free (DisplayTilePreview, preview); | ||||
|   } | ||||
| } | ||||
|  | ||||
| static ScreenTilePreview * | ||||
| get_screen_tile_preview (MetaScreen *screen) | ||||
| static DisplayTilePreview * | ||||
| get_display_tile_preview (MetaDisplay *display) | ||||
| { | ||||
|   ScreenTilePreview *preview = g_object_get_qdata (G_OBJECT (screen), screen_tile_preview_data_quark); | ||||
|   DisplayTilePreview *preview = g_object_get_qdata (G_OBJECT (display), display_tile_preview_data_quark); | ||||
|  | ||||
|   if (G_UNLIKELY (screen_tile_preview_data_quark == 0)) | ||||
|     screen_tile_preview_data_quark = g_quark_from_static_string (SCREEN_TILE_PREVIEW_DATA_KEY); | ||||
|   if (G_UNLIKELY (display_tile_preview_data_quark == 0)) | ||||
|     display_tile_preview_data_quark = g_quark_from_static_string (DISPLAY_TILE_PREVIEW_DATA_KEY); | ||||
|  | ||||
|   if (G_UNLIKELY (!preview)) | ||||
|     { | ||||
|       preview = g_slice_new0 (ScreenTilePreview); | ||||
|       preview = g_slice_new0 (DisplayTilePreview); | ||||
|  | ||||
|       preview->actor = clutter_actor_new (); | ||||
|       clutter_actor_set_background_color (preview->actor, CLUTTER_COLOR_Blue); | ||||
|       clutter_actor_set_opacity (preview->actor, 100); | ||||
|  | ||||
|       clutter_actor_add_child (meta_get_window_group_for_screen (screen), preview->actor); | ||||
|       g_object_set_qdata_full (G_OBJECT (screen), | ||||
|                                screen_tile_preview_data_quark, preview, | ||||
|                                free_screen_tile_preview); | ||||
|       clutter_actor_add_child (meta_get_window_group_for_display (display), preview->actor); | ||||
|       g_object_set_qdata_full (G_OBJECT (display), | ||||
|                                display_tile_preview_data_quark, preview, | ||||
|                                free_display_tile_preview); | ||||
|     } | ||||
|  | ||||
|   return preview; | ||||
| @@ -710,8 +716,8 @@ show_tile_preview (MetaPlugin    *plugin, | ||||
|                    MetaRectangle *tile_rect, | ||||
|                    int            tile_monitor_number) | ||||
| { | ||||
|   MetaScreen *screen = meta_plugin_get_screen (plugin); | ||||
|   ScreenTilePreview *preview = get_screen_tile_preview (screen); | ||||
|   MetaDisplay *display = meta_plugin_get_display (plugin); | ||||
|   DisplayTilePreview *preview = get_display_tile_preview (display); | ||||
|   ClutterActor *window_actor; | ||||
|  | ||||
|   if (clutter_actor_is_visible (preview->actor) | ||||
| @@ -737,8 +743,8 @@ show_tile_preview (MetaPlugin    *plugin, | ||||
| static void | ||||
| hide_tile_preview (MetaPlugin *plugin) | ||||
| { | ||||
|   MetaScreen *screen = meta_plugin_get_screen (plugin); | ||||
|   ScreenTilePreview *preview = get_screen_tile_preview (screen); | ||||
|   MetaDisplay *display = meta_plugin_get_display (plugin); | ||||
|   DisplayTilePreview *preview = get_display_tile_preview (display); | ||||
|  | ||||
|   clutter_actor_hide (preview->actor); | ||||
| } | ||||
|   | ||||
							
								
								
									
										132
									
								
								src/core/bell.c
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								src/core/bell.c
									
									
									
									
									
								
							| @@ -49,16 +49,80 @@ | ||||
|  | ||||
| #include <config.h> | ||||
| #include "bell.h" | ||||
| #include "screen-private.h" | ||||
| #include "window-private.h" | ||||
| #include "util-private.h" | ||||
| #include "compositor/compositor-private.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/compositor.h> | ||||
| #ifdef HAVE_LIBCANBERRA | ||||
| #include <canberra-gtk.h> | ||||
| #endif | ||||
|  | ||||
| G_DEFINE_TYPE (MetaBell, meta_bell, G_TYPE_OBJECT) | ||||
|  | ||||
| enum | ||||
| { | ||||
|   IS_AUDIBLE_CHANGED, | ||||
|   LAST_SIGNAL | ||||
| }; | ||||
|  | ||||
| static guint bell_signals [LAST_SIGNAL] = { 0 }; | ||||
|  | ||||
| static void | ||||
| prefs_changed_callback (MetaPreference pref, | ||||
|                         void          *data) | ||||
| { | ||||
|   MetaBell *bell = data; | ||||
|  | ||||
|   if (pref == META_PREF_AUDIBLE_BELL) | ||||
|     { | ||||
|       g_signal_emit (bell, bell_signals[IS_AUDIBLE_CHANGED], 0, | ||||
|                      meta_prefs_bell_is_audible ()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_bell_finalize (GObject *object) | ||||
| { | ||||
|   MetaBell *bell = META_BELL (object); | ||||
|  | ||||
|   meta_prefs_remove_listener (prefs_changed_callback, bell); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_bell_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_bell_class_init (MetaBellClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->finalize = meta_bell_finalize; | ||||
|  | ||||
|   bell_signals[IS_AUDIBLE_CHANGED] = | ||||
|     g_signal_new ("is-audible-changed", | ||||
|                   G_TYPE_FROM_CLASS (klass), | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, | ||||
|                   NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, 1, | ||||
|                   G_TYPE_BOOLEAN); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_bell_init (MetaBell *bell) | ||||
| { | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_bell_new (MetaDisplay *display) | ||||
| { | ||||
|   if (display->bell) | ||||
|     return; | ||||
|  | ||||
|   display->bell = g_object_new (META_TYPE_BELL, NULL); | ||||
|  | ||||
|   meta_prefs_add_listener (prefs_changed_callback, display->bell); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * bell_flash_fullscreen: | ||||
|  * @display: The display the event came in on | ||||
| @@ -73,7 +137,7 @@ | ||||
| static void | ||||
| bell_flash_fullscreen (MetaDisplay *display) | ||||
| { | ||||
|   meta_compositor_flash_screen (display->compositor, display->screen); | ||||
|   meta_compositor_flash_display (display->compositor, display); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -226,68 +290,6 @@ meta_bell_notify (MetaDisplay *display, | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_bell_set_audible (MetaDisplay *display, gboolean audible) | ||||
| { | ||||
| #ifdef HAVE_LIBCANBERRA | ||||
|   /* When we are playing sounds using libcanberra support, we handle the | ||||
|    * bell whether its an audible bell or a visible bell */ | ||||
|   gboolean enable_system_bell = FALSE; | ||||
| #else | ||||
|   gboolean enable_system_bell = audible; | ||||
| #endif /* HAVE_LIBCANBERRA */ | ||||
|  | ||||
|   XkbChangeEnabledControls (display->xdisplay, | ||||
|                             XkbUseCoreKbd, | ||||
|                             XkbAudibleBellMask, | ||||
|                             enable_system_bell ? XkbAudibleBellMask : 0); | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_bell_init (MetaDisplay *display) | ||||
| { | ||||
|   int xkb_base_error_type, xkb_opcode; | ||||
|  | ||||
|   if (!XkbQueryExtension (display->xdisplay, &xkb_opcode, | ||||
| 			  &display->xkb_base_event_type, | ||||
| 			  &xkb_base_error_type, | ||||
| 			  NULL, NULL)) | ||||
|     { | ||||
|       display->xkb_base_event_type = -1; | ||||
|       g_message ("could not find XKB extension."); | ||||
|       return FALSE; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       unsigned int mask = XkbBellNotifyMask; | ||||
|       gboolean visual_bell_auto_reset = FALSE; | ||||
|       /* TRUE if and when non-broken version is available */ | ||||
|       XkbSelectEvents (display->xdisplay, | ||||
| 		       XkbUseCoreKbd, | ||||
| 		       XkbBellNotifyMask, | ||||
| 		       XkbBellNotifyMask); | ||||
|       meta_bell_set_audible (display, meta_prefs_bell_is_audible ()); | ||||
|       if (visual_bell_auto_reset) { | ||||
| 	XkbSetAutoResetControls (display->xdisplay, | ||||
| 				 XkbAudibleBellMask, | ||||
| 				 &mask, | ||||
| 				 &mask); | ||||
|       } | ||||
|       return TRUE; | ||||
|     } | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_bell_shutdown (MetaDisplay *display) | ||||
| { | ||||
|   /* TODO: persist initial bell state in display, reset here */ | ||||
|   XkbChangeEnabledControls (display->xdisplay, | ||||
| 			    XkbUseCoreKbd, | ||||
| 			    XkbAudibleBellMask, | ||||
| 			    XkbAudibleBellMask); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_bell_notify_frame_destroy: | ||||
|  * @frame: The frame which is being destroyed | ||||
|   | ||||
| @@ -17,11 +17,19 @@ | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include <X11/Xlib.h> | ||||
| #include <X11/XKBlib.h> | ||||
| #include "display-private.h" | ||||
| #include "frame.h" | ||||
|  | ||||
| struct _MetaBell | ||||
| { | ||||
|   GObject parent; | ||||
| }; | ||||
|  | ||||
| #define META_TYPE_BELL (meta_bell_get_type ()) | ||||
| G_DECLARE_FINAL_TYPE (MetaBell, meta_bell, META, BELL, GObject) | ||||
|  | ||||
| void meta_bell_new (MetaDisplay *display); | ||||
|  | ||||
| /** | ||||
|  * meta_bell_notify: | ||||
|  * @display: The display the bell event came in on | ||||
| @@ -34,48 +42,6 @@ | ||||
| gboolean meta_bell_notify (MetaDisplay *display, | ||||
|                            MetaWindow  *window); | ||||
|  | ||||
| /** | ||||
|  * meta_bell_set_audible: | ||||
|  * @display: The display we're configuring | ||||
|  * @audible: True for an audible bell, false for a visual bell | ||||
|  * | ||||
|  * Turns the bell to audible or visual. This tells X what to do, but | ||||
|  * not Mutter; you will need to set the "visual bell" pref for that. | ||||
|  * | ||||
|  * If the configure script found we had no XKB, this is a no-op. | ||||
|  */ | ||||
| void meta_bell_set_audible (MetaDisplay *display, gboolean audible); | ||||
|  | ||||
| /** | ||||
|  * meta_bell_init: | ||||
|  * @display: The display which is opening | ||||
|  * | ||||
|  * Initialises the bell subsystem. This involves intialising | ||||
|  * XKB (which, despite being a keyboard extension, is the | ||||
|  * place to look for bell notifications), then asking it | ||||
|  * to send us bell notifications, and then also switching | ||||
|  * off the audible bell if we're using a visual one ourselves. | ||||
|  * | ||||
|  * \bug There is a line of code that's never run that tells | ||||
|  * XKB to reset the bell status after we quit. Bill H said | ||||
|  * (<http://bugzilla.gnome.org/show_bug.cgi?id=99886#c12>) | ||||
|  * that XFree86's implementation is broken so we shouldn't | ||||
|  * call it, but that was in 2002. Is it working now? | ||||
|  */ | ||||
| gboolean meta_bell_init (MetaDisplay *display); | ||||
|  | ||||
| /** | ||||
|  * meta_bell_shutdown: | ||||
|  * @display: The display which is closing | ||||
|  * | ||||
|  * Shuts down the bell subsystem. | ||||
|  * | ||||
|  * \bug This is never called! If we had XkbSetAutoResetControls | ||||
|  * enabled in meta_bell_init(), this wouldn't be a problem, but | ||||
|  * we don't. | ||||
|  */ | ||||
| void meta_bell_shutdown (MetaDisplay *display); | ||||
|  | ||||
| /** | ||||
|  * meta_bell_notify_frame_destroy: | ||||
|  * @frame: The frame which is being destroyed | ||||
|   | ||||
| @@ -24,6 +24,7 @@ | ||||
| #include <config.h> | ||||
| #include "boxes-private.h" | ||||
| #include "constraints.h" | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "workspace-private.h" | ||||
| #include "place.h" | ||||
| #include <meta/prefs.h> | ||||
| @@ -412,7 +413,7 @@ setup_constraint_info (ConstraintInfo      *info, | ||||
|                             &info->entire_monitor); | ||||
|     } | ||||
|  | ||||
|   cur_workspace = window->screen->active_workspace; | ||||
|   cur_workspace = window->display->workspace_manager->active_workspace; | ||||
|   info->usable_screen_region   = | ||||
|     meta_workspace_get_onscreen_region (cur_workspace); | ||||
|   info->usable_monitor_region = | ||||
| @@ -499,7 +500,7 @@ place_window_if_needed(MetaWindow     *window, | ||||
|       meta_window_get_work_area_for_logical_monitor (window, | ||||
|                                                      logical_monitor, | ||||
|                                                      &info->work_area_monitor); | ||||
|       cur_workspace = window->screen->active_workspace; | ||||
|       cur_workspace = window->display->workspace_manager->active_workspace; | ||||
|       info->usable_monitor_region = | ||||
|         meta_workspace_get_onmonitor_region (cur_workspace, logical_monitor); | ||||
|  | ||||
| @@ -926,6 +927,7 @@ constrain_maximization (MetaWindow         *window, | ||||
|                         ConstraintPriority  priority, | ||||
|                         gboolean            check_only) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   MetaRectangle target_size; | ||||
|   MetaRectangle min_size, max_size; | ||||
|   gboolean hminbad, vminbad; | ||||
| @@ -965,7 +967,7 @@ constrain_maximization (MetaWindow         *window, | ||||
|         direction = META_DIRECTION_HORIZONTAL; | ||||
|       else | ||||
|         direction = META_DIRECTION_VERTICAL; | ||||
|       active_workspace_struts = window->screen->active_workspace->all_struts; | ||||
|       active_workspace_struts = workspace_manager->active_workspace->all_struts; | ||||
|  | ||||
|       target_size = info->current; | ||||
|       meta_rectangle_expand_to_avoiding_struts (&target_size, | ||||
|   | ||||
| @@ -24,11 +24,13 @@ | ||||
| #include <config.h> | ||||
| #include "core.h" | ||||
| #include "frame.h" | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "workspace-private.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "util-private.h" | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include "x11/window-x11.h" | ||||
| #include "x11/window-x11-private.h" | ||||
|  | ||||
| @@ -51,7 +53,7 @@ get_window (Display *xdisplay, | ||||
|   MetaWindow *window; | ||||
|  | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   window = meta_display_lookup_x_window (display, frame_xwindow); | ||||
|   window = meta_x11_display_lookup_x_window (display->x11_display, frame_xwindow); | ||||
|  | ||||
|   if (window == NULL || window->frame == NULL) | ||||
|     { | ||||
| @@ -76,6 +78,8 @@ static gboolean | ||||
| lower_window_and_transients (MetaWindow *window, | ||||
|                              gpointer   data) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   meta_window_lower (window); | ||||
|  | ||||
|   meta_window_foreach_transient (window, lower_window_and_transients, NULL); | ||||
| @@ -86,22 +90,22 @@ lower_window_and_transients (MetaWindow *window, | ||||
|        * Do extra sanity checks to avoid possible race conditions. | ||||
|        * (Borrowed from window.c.) | ||||
|        */ | ||||
|       if (window->screen->active_workspace && | ||||
|       if (workspace_manager->active_workspace && | ||||
|           meta_window_located_on_workspace (window, | ||||
|                                             window->screen->active_workspace)) | ||||
|                                             workspace_manager->active_workspace)) | ||||
|         { | ||||
|           GList* link; | ||||
|           link = g_list_find (window->screen->active_workspace->mru_list, | ||||
|           link = g_list_find (workspace_manager->active_workspace->mru_list, | ||||
|                               window); | ||||
|           g_assert (link); | ||||
|  | ||||
|           window->screen->active_workspace->mru_list = | ||||
|             g_list_remove_link (window->screen->active_workspace->mru_list, | ||||
|           workspace_manager->active_workspace->mru_list = | ||||
|             g_list_remove_link (workspace_manager->active_workspace->mru_list, | ||||
|                                 link); | ||||
|           g_list_free (link); | ||||
|  | ||||
|           window->screen->active_workspace->mru_list = | ||||
|             g_list_append (window->screen->active_workspace->mru_list, | ||||
|           workspace_manager->active_workspace->mru_list = | ||||
|             g_list_append (workspace_manager->active_workspace->mru_list, | ||||
|                            window); | ||||
|         } | ||||
|     } | ||||
| @@ -115,6 +119,7 @@ meta_core_user_lower_and_unfocus (Display *xdisplay, | ||||
|                                   guint32  timestamp) | ||||
| { | ||||
|   MetaWindow *window = get_window (xdisplay, frame_xwindow); | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   lower_window_and_transients (window, NULL); | ||||
|  | ||||
| @@ -122,7 +127,7 @@ meta_core_user_lower_and_unfocus (Display *xdisplay, | ||||
|   * the focus window, assume that's always the case. (Typically, | ||||
|   * this will be invoked via keyboard action or by a mouse action; | ||||
|   * in either case the window or a modal child will have been focused.) */ | ||||
|   meta_workspace_focus_default_window (window->screen->active_workspace, | ||||
|   meta_workspace_focus_default_window (workspace_manager->active_workspace, | ||||
|                                        NULL, | ||||
|                                        timestamp); | ||||
| } | ||||
| @@ -219,14 +224,10 @@ meta_core_begin_grab_op (Display    *xdisplay, | ||||
| { | ||||
|   MetaWindow *window = get_window (xdisplay, frame_xwindow); | ||||
|   MetaDisplay *display; | ||||
|   MetaScreen *screen; | ||||
|  | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   screen = display->screen; | ||||
|  | ||||
|   g_assert (screen != NULL); | ||||
|  | ||||
|   return meta_display_begin_grab_op (display, screen, window, | ||||
|   return meta_display_begin_grab_op (display, window, | ||||
|                                      op, pointer_already_grabbed, | ||||
|                                      frame_action, | ||||
|                                      button, modmask, | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
| #include "util-private.h" | ||||
| #include "window-private.h" | ||||
| #include "compositor-private.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <meta/workspace.h> | ||||
| #include <errno.h> | ||||
|  | ||||
|   | ||||
| @@ -37,6 +37,7 @@ | ||||
| #include "keybindings-private.h" | ||||
| #include "startup-notification-private.h" | ||||
| #include "meta-gesture-tracker-private.h" | ||||
| #include "stack-tracker.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/barrier.h> | ||||
| #include <clutter/clutter.h> | ||||
| @@ -47,12 +48,10 @@ | ||||
|  | ||||
| #include <X11/extensions/sync.h> | ||||
|  | ||||
| typedef struct _MetaBell       MetaBell; | ||||
| typedef struct _MetaStack      MetaStack; | ||||
| typedef struct _MetaUISlave    MetaUISlave; | ||||
|  | ||||
| typedef struct _MetaGroupPropHooks  MetaGroupPropHooks; | ||||
| typedef struct _MetaWindowPropHooks MetaWindowPropHooks; | ||||
|  | ||||
| typedef struct MetaEdgeResistanceData MetaEdgeResistanceData; | ||||
|  | ||||
| typedef enum { | ||||
| @@ -102,43 +101,23 @@ typedef enum { | ||||
|   META_EVENT_ROUTE_FRAME_BUTTON, | ||||
| } MetaEventRoute; | ||||
|  | ||||
| typedef gboolean (*MetaAlarmFilter) (MetaDisplay           *display, | ||||
|                                      XSyncAlarmNotifyEvent *event, | ||||
|                                      gpointer               data); | ||||
| typedef void (* MetaDisplayWindowFunc) (MetaWindow *window, | ||||
|                                         gpointer    user_data); | ||||
|  | ||||
| struct _MetaDisplay | ||||
| { | ||||
|   GObject parent_instance; | ||||
|  | ||||
|   char *name; | ||||
|   Display *xdisplay; | ||||
|   MetaX11Display *x11_display; | ||||
|  | ||||
|   int clutter_event_filter; | ||||
|  | ||||
|   Window leader_window; | ||||
|   Window timestamp_pinging_window; | ||||
|  | ||||
|   /* Pull in all the names of atoms as fields; we will intern them when the | ||||
|    * class is constructed. | ||||
|    */ | ||||
| #define item(x)  Atom atom_##x; | ||||
| #include <x11/atomnames.h> | ||||
| #undef item | ||||
|  | ||||
|   /* The window and serial of the most recent FocusIn event. */ | ||||
|   Window server_focus_window; | ||||
|   gulong server_focus_serial; | ||||
|  | ||||
|   /* Our best guess as to the "currently" focused window (that is, the | ||||
|    * window that we expect will be focused at the point when the X | ||||
|    * server processes our next request), and the serial of the request | ||||
|    * or event that caused this. | ||||
|    */ | ||||
|   MetaWindow *focus_window; | ||||
|   /* For windows we've focused that don't necessarily have an X window, | ||||
|    * like the no_focus_window or the stage X window. */ | ||||
|   Window focus_xwindow; | ||||
|   gulong focus_serial; | ||||
|  | ||||
|   /* last timestamp passed to XSetInputFocus */ | ||||
|   guint32 last_focus_time; | ||||
| @@ -169,8 +148,6 @@ struct _MetaDisplay | ||||
|   guint focused_by_us : 1; | ||||
|  | ||||
|   /*< private-ish >*/ | ||||
|   MetaScreen *screen; | ||||
|   GHashTable *xids; | ||||
|   GHashTable *stamps; | ||||
|   GHashTable *wayland_windows; | ||||
|  | ||||
| @@ -229,9 +206,6 @@ struct _MetaDisplay | ||||
|    * to avoid some race conditions on EnterNotify events | ||||
|    */ | ||||
|   int         sentinel_counter; | ||||
|  | ||||
|   int         xkb_base_event_type; | ||||
|   guint32     last_bell_time; | ||||
|   int	      grab_resize_timeout_id; | ||||
|  | ||||
|   MetaKeyBindingManager key_binding_manager; | ||||
| @@ -245,60 +219,30 @@ struct _MetaDisplay | ||||
|   /* Closing down the display */ | ||||
|   int closing; | ||||
|  | ||||
|   /* Managed by group.c */ | ||||
|   GHashTable *groups_by_leader; | ||||
|  | ||||
|   /* Managed by window-props.c */ | ||||
|   MetaWindowPropHooks *prop_hooks_table; | ||||
|   GHashTable *prop_hooks; | ||||
|   int n_prop_hooks; | ||||
|  | ||||
|   /* Managed by group-props.c */ | ||||
|   MetaGroupPropHooks *group_prop_hooks; | ||||
|  | ||||
|   /* Managed by compositor.c */ | ||||
|   MetaCompositor *compositor; | ||||
|  | ||||
|   MetaGestureTracker *gesture_tracker; | ||||
|   ClutterEventSequence *pointer_emulating_sequence; | ||||
|  | ||||
|   MetaAlarmFilter alarm_filter; | ||||
|   gpointer alarm_filter_data; | ||||
|  | ||||
|   int composite_event_base; | ||||
|   int composite_error_base; | ||||
|   int composite_major_version; | ||||
|   int composite_minor_version; | ||||
|   int damage_event_base; | ||||
|   int damage_error_base; | ||||
|   int xfixes_event_base; | ||||
|   int xfixes_error_base; | ||||
|   int xinput_error_base; | ||||
|   int xinput_event_base; | ||||
|   int xinput_opcode; | ||||
|  | ||||
|   ClutterActor *current_pad_osd; | ||||
|  | ||||
|   MetaStartupNotification *startup_notification; | ||||
|  | ||||
|   int xsync_event_base; | ||||
|   int xsync_error_base; | ||||
|   int shape_event_base; | ||||
|   int shape_error_base; | ||||
|   unsigned int have_xsync : 1; | ||||
| #define META_DISPLAY_HAS_XSYNC(display) ((display)->have_xsync) | ||||
|   unsigned int have_shape : 1; | ||||
| #define META_DISPLAY_HAS_SHAPE(display) ((display)->have_shape) | ||||
|   unsigned int have_composite : 1; | ||||
|   unsigned int have_damage : 1; | ||||
| #define META_DISPLAY_HAS_COMPOSITE(display) ((display)->have_composite) | ||||
| #define META_DISPLAY_HAS_DAMAGE(display) ((display)->have_damage) | ||||
| #ifdef HAVE_XI23 | ||||
|   gboolean have_xinput_23 : 1; | ||||
| #define META_DISPLAY_HAS_XINPUT_23(display) ((display)->have_xinput_23) | ||||
| #else | ||||
| #define META_DISPLAY_HAS_XINPUT_23(display) FALSE | ||||
| #endif /* HAVE_XI23 */ | ||||
|   MetaCursor current_cursor; | ||||
|  | ||||
|   MetaStack *stack; | ||||
|   MetaStackTracker *stack_tracker; | ||||
|  | ||||
|   guint tile_preview_timeout_id; | ||||
|  | ||||
|   GSList *startup_sequences; | ||||
|  | ||||
|   guint work_area_later; | ||||
|   guint check_fullscreen_later; | ||||
|  | ||||
|   MetaBell *bell; | ||||
|   MetaWorkspaceManager *workspace_manager; | ||||
| }; | ||||
|  | ||||
| struct _MetaDisplayClass | ||||
| @@ -325,25 +269,14 @@ gboolean      meta_display_open                (void); | ||||
| void          meta_display_close               (MetaDisplay *display, | ||||
|                                                 guint32      timestamp); | ||||
|  | ||||
| void          meta_display_unmanage_windows_for_screen (MetaDisplay *display, | ||||
|                                                         MetaScreen  *screen, | ||||
|                                                         guint32      timestamp); | ||||
| void meta_display_manage_all_windows (MetaDisplay *display); | ||||
| void meta_display_unmanage_windows   (MetaDisplay *display, | ||||
|                                       guint32      timestamp); | ||||
|  | ||||
| /* Utility function to compare the stacking of two windows */ | ||||
| int           meta_display_stack_cmp           (const void *a, | ||||
|                                                 const void *b); | ||||
|  | ||||
| /* A given MetaWindow may have various X windows that "belong" | ||||
|  * to it, such as the frame window. | ||||
|  */ | ||||
| MetaWindow* meta_display_lookup_x_window     (MetaDisplay *display, | ||||
|                                               Window       xwindow); | ||||
| void        meta_display_register_x_window   (MetaDisplay *display, | ||||
|                                               Window      *xwindowp, | ||||
|                                               MetaWindow  *window); | ||||
| void        meta_display_unregister_x_window (MetaDisplay *display, | ||||
|                                               Window       xwindow); | ||||
|  | ||||
| /* Each MetaWindow is uniquely identified by a 64-bit "stamp"; unlike a | ||||
|  * a MetaWindow *, a stamp will never be recycled | ||||
|  */ | ||||
| @@ -372,14 +305,6 @@ void        meta_display_register_wayland_window   (MetaDisplay *display, | ||||
| void        meta_display_unregister_wayland_window (MetaDisplay *display, | ||||
|                                                     MetaWindow  *window); | ||||
|  | ||||
| MetaWindow* meta_display_lookup_sync_alarm     (MetaDisplay *display, | ||||
|                                                 XSyncAlarm   alarm); | ||||
| void        meta_display_register_sync_alarm   (MetaDisplay *display, | ||||
|                                                 XSyncAlarm  *alarmp, | ||||
|                                                 MetaWindow  *window); | ||||
| void        meta_display_unregister_sync_alarm (MetaDisplay *display, | ||||
|                                                 XSyncAlarm   alarm); | ||||
|  | ||||
| void        meta_display_notify_window_created (MetaDisplay  *display, | ||||
|                                                 MetaWindow   *window); | ||||
|  | ||||
| @@ -389,10 +314,8 @@ GSList*     meta_display_list_windows        (MetaDisplay          *display, | ||||
| MetaDisplay* meta_display_for_x_display  (Display     *xdisplay); | ||||
| MetaDisplay* meta_get_display            (void); | ||||
|  | ||||
| Cursor         meta_display_create_x_cursor (MetaDisplay *display, | ||||
|                                              MetaCursor   cursor); | ||||
|  | ||||
| void     meta_display_update_cursor (MetaDisplay *display); | ||||
| void meta_display_reload_cursor (MetaDisplay *display); | ||||
| void meta_display_update_cursor (MetaDisplay *display); | ||||
|  | ||||
| void    meta_display_check_threshold_reached (MetaDisplay *display, | ||||
|                                               int          x, | ||||
| @@ -410,11 +333,6 @@ void meta_display_ungrab_focus_window_button (MetaDisplay *display, | ||||
| /* Next function is defined in edge-resistance.c */ | ||||
| void meta_display_cleanup_edges              (MetaDisplay *display); | ||||
|  | ||||
| /* make a request to ensure the event serial has changed */ | ||||
| void     meta_display_increment_event_serial (MetaDisplay *display); | ||||
|  | ||||
| void     meta_display_update_active_window_hint (MetaDisplay *display); | ||||
|  | ||||
| /* utility goo */ | ||||
| const char* meta_event_mode_to_string   (int m); | ||||
| const char* meta_event_detail_to_string (int d); | ||||
| @@ -448,16 +366,6 @@ void meta_display_accelerator_activate (MetaDisplay     *display, | ||||
|                                         ClutterKeyEvent *event); | ||||
| gboolean meta_display_modifiers_accelerator_activate (MetaDisplay *display); | ||||
|  | ||||
| #ifdef HAVE_XI23 | ||||
| gboolean meta_display_process_barrier_xevent (MetaDisplay *display, | ||||
|                                               XIEvent     *event); | ||||
| #endif /* HAVE_XI23 */ | ||||
|  | ||||
| void meta_display_set_input_focus_xwindow (MetaDisplay *display, | ||||
|                                            MetaScreen  *screen, | ||||
|                                            Window       window, | ||||
|                                            guint32      timestamp); | ||||
|  | ||||
| void meta_display_sync_wayland_input_focus (MetaDisplay *display); | ||||
| void meta_display_update_focus_window (MetaDisplay *display, | ||||
|                                        MetaWindow  *window, | ||||
| @@ -485,17 +393,12 @@ gboolean meta_display_show_resize_popup (MetaDisplay *display, | ||||
|                                          int display_w, | ||||
|                                          int display_h); | ||||
|  | ||||
| void meta_restart_init (void); | ||||
| void meta_restart_finish (void); | ||||
| void meta_set_is_restart (gboolean whether); | ||||
|  | ||||
| void meta_display_cancel_touch (MetaDisplay *display); | ||||
|  | ||||
| gboolean meta_display_windows_are_interactable (MetaDisplay *display); | ||||
|  | ||||
| void meta_display_set_alarm_filter (MetaDisplay    *display, | ||||
|                                     MetaAlarmFilter filter, | ||||
|                                     gpointer        data); | ||||
|  | ||||
| void meta_display_show_tablet_mapping_notification (MetaDisplay        *display, | ||||
|                                                     ClutterInputDevice *pad, | ||||
|                                                     const gchar        *pretty_name); | ||||
| @@ -507,4 +410,25 @@ void meta_display_notify_pad_group_switch (MetaDisplay        *display, | ||||
|                                            guint               n_mode, | ||||
|                                            guint               n_modes); | ||||
|  | ||||
| void meta_display_foreach_window (MetaDisplay          *display, | ||||
|                                   MetaListWindowsFlags  flags, | ||||
|                                   MetaDisplayWindowFunc func, | ||||
|                                   gpointer              data); | ||||
|  | ||||
| void meta_display_restacked (MetaDisplay *display); | ||||
|  | ||||
|  | ||||
| void meta_display_update_tile_preview (MetaDisplay *display, | ||||
|                                        gboolean     delay); | ||||
| void meta_display_hide_tile_preview   (MetaDisplay *display); | ||||
|  | ||||
| gboolean meta_display_apply_startup_properties (MetaDisplay *display, | ||||
|                                                 MetaWindow *window); | ||||
|  | ||||
| void meta_display_queue_workarea_recalc  (MetaDisplay *display); | ||||
| void meta_display_queue_check_fullscreen (MetaDisplay *display); | ||||
|  | ||||
| MetaWindow *meta_display_get_pointer_window (MetaDisplay *display, | ||||
|                                              MetaWindow  *not_this_one); | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										1887
									
								
								src/core/display.c
									
									
									
									
									
								
							
							
						
						
									
										1887
									
								
								src/core/display.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -23,6 +23,7 @@ | ||||
| #include "edge-resistance.h" | ||||
| #include "boxes-private.h" | ||||
| #include "display-private.h" | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "workspace-private.h" | ||||
|  | ||||
| /* A simple macro for whether a given window's edges are potentially | ||||
| @@ -955,6 +956,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display) | ||||
|    * in the layer that we are working on | ||||
|    */ | ||||
|   GSList *rem_windows, *rem_win_stacking; | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|  | ||||
|   g_assert (display->grab_window != NULL); | ||||
|   meta_topic (META_DEBUG_WINDOW_OPS, | ||||
| @@ -965,8 +967,8 @@ compute_resistance_and_snapping_edges (MetaDisplay *display) | ||||
|    * 1st: Get the list of relevant windows, from bottom to top | ||||
|    */ | ||||
|   stacked_windows = | ||||
|     meta_stack_list_windows (display->screen->stack, | ||||
|                              display->screen->active_workspace); | ||||
|     meta_stack_list_windows (display->stack, | ||||
|                              workspace_manager->active_workspace); | ||||
|  | ||||
|   /* | ||||
|    * 2nd: we need to separate that stacked list into a list of windows that | ||||
| @@ -1020,14 +1022,17 @@ compute_resistance_and_snapping_edges (MetaDisplay *display) | ||||
|         { | ||||
|           GList *new_edges; | ||||
|           MetaEdge *new_edge; | ||||
|           MetaRectangle display_rect; | ||||
|           MetaRectangle reduced; | ||||
|  | ||||
|           meta_display_get_size (display, &display_rect.width, &display_rect.height); | ||||
|  | ||||
|           /* We don't care about snapping to any portion of the window that | ||||
|            * is offscreen (we also don't care about parts of edges covered | ||||
|            * by other windows or DOCKS, but that's handled below). | ||||
|            */ | ||||
|           meta_rectangle_intersect (&cur_rect, | ||||
|                                     &display->screen->rect, | ||||
|                                     &display_rect, | ||||
|                                     &reduced); | ||||
|  | ||||
|           new_edges = NULL; | ||||
| @@ -1124,8 +1129,8 @@ compute_resistance_and_snapping_edges (MetaDisplay *display) | ||||
|    */ | ||||
|   cache_edges (display, | ||||
|                edges, | ||||
|                display->screen->active_workspace->monitor_edges, | ||||
|                display->screen->active_workspace->screen_edges); | ||||
|                workspace_manager->active_workspace->monitor_edges, | ||||
|                workspace_manager->active_workspace->screen_edges); | ||||
|   g_list_free (edges); | ||||
|  | ||||
|   /* | ||||
|   | ||||
| @@ -276,7 +276,7 @@ meta_display_handle_event (MetaDisplay        *display, | ||||
|        event->type == CLUTTER_BUTTON_PRESS || | ||||
|        event->type == CLUTTER_TOUCH_BEGIN)) | ||||
|     { | ||||
|       if (CurrentTime == display->current_time) | ||||
|       if (META_CURRENT_TIME == display->current_time) | ||||
|         { | ||||
|           /* We can't use missing (i.e. invalid) timestamps to set user time, | ||||
|            * nor do we want to use them to sanity check other timestamps. | ||||
| @@ -417,7 +417,7 @@ meta_display_handle_event (MetaDisplay        *display, | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|   display->current_time = CurrentTime; | ||||
|   display->current_time = META_CURRENT_TIME; | ||||
|   return bypass_clutter; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -24,9 +24,10 @@ | ||||
| #include <config.h> | ||||
| #include "frame.h" | ||||
| #include "bell.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "keybindings-private.h" | ||||
| #include "backends/x11/meta-backend-x11.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #define EVENT_MASK (SubstructureRedirectMask |                     \ | ||||
|                     StructureNotifyMask | SubstructureNotifyMask | \ | ||||
| @@ -38,10 +39,13 @@ meta_window_ensure_frame (MetaWindow *window) | ||||
|   MetaFrame *frame; | ||||
|   XSetWindowAttributes attrs; | ||||
|   gulong create_serial; | ||||
|   MetaX11Display *x11_display; | ||||
|  | ||||
|   if (window->frame) | ||||
|     return; | ||||
|  | ||||
|   x11_display = window->display->x11_display; | ||||
|  | ||||
|   frame = g_new (MetaFrame, 1); | ||||
|  | ||||
|   frame->window = window; | ||||
| @@ -61,8 +65,8 @@ meta_window_ensure_frame (MetaWindow *window) | ||||
|                 frame->rect.x, frame->rect.y, | ||||
|                 frame->rect.width, frame->rect.height); | ||||
|  | ||||
|   frame->ui_frame = meta_ui_create_frame (window->screen->ui, | ||||
|                                           window->display->xdisplay, | ||||
|   frame->ui_frame = meta_ui_create_frame (x11_display->ui, | ||||
|                                           x11_display->xdisplay, | ||||
|                                           frame->window, | ||||
|                                           window->xvisual, | ||||
|                                           frame->rect.x, | ||||
| @@ -72,18 +76,18 @@ meta_window_ensure_frame (MetaWindow *window) | ||||
|                                           &create_serial); | ||||
|   frame->xwindow = frame->ui_frame->xwindow; | ||||
|  | ||||
|   meta_stack_tracker_record_add (window->screen->stack_tracker, | ||||
|   meta_stack_tracker_record_add (window->display->stack_tracker, | ||||
|                                  frame->xwindow, | ||||
|                                  create_serial); | ||||
|  | ||||
|   meta_verbose ("Frame for %s is 0x%lx\n", frame->window->desc, frame->xwindow); | ||||
|   attrs.event_mask = EVENT_MASK; | ||||
|   XChangeWindowAttributes (window->display->xdisplay, | ||||
|   XChangeWindowAttributes (x11_display->xdisplay, | ||||
| 			   frame->xwindow, CWEventMask, &attrs); | ||||
|  | ||||
|   meta_display_register_x_window (window->display, &frame->xwindow, window); | ||||
|   meta_x11_display_register_x_window (x11_display, &frame->xwindow, window); | ||||
|  | ||||
|   meta_error_trap_push (window->display); | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|   if (window->mapped) | ||||
|     { | ||||
|       window->mapped = FALSE; /* the reparent will unmap the window, | ||||
| @@ -94,16 +98,16 @@ meta_window_ensure_frame (MetaWindow *window) | ||||
|       window->unmaps_pending += 1; | ||||
|     } | ||||
|  | ||||
|   meta_stack_tracker_record_remove (window->screen->stack_tracker, | ||||
|   meta_stack_tracker_record_remove (window->display->stack_tracker, | ||||
|                                     window->xwindow, | ||||
|                                     XNextRequest (window->display->xdisplay)); | ||||
|   XReparentWindow (window->display->xdisplay, | ||||
|                                     XNextRequest (x11_display->xdisplay)); | ||||
|   XReparentWindow (x11_display->xdisplay, | ||||
|                    window->xwindow, | ||||
|                    frame->xwindow, | ||||
|                    frame->child_x, | ||||
|                    frame->child_y); | ||||
|   /* FIXME handle this error */ | ||||
|   meta_error_trap_pop (window->display); | ||||
|   meta_x11_error_trap_pop (x11_display); | ||||
|  | ||||
|   /* stick frame to the window */ | ||||
|   window->frame = frame; | ||||
| @@ -114,7 +118,7 @@ meta_window_ensure_frame (MetaWindow *window) | ||||
|   meta_frame_update_style (frame); | ||||
|   meta_frame_update_title (frame); | ||||
|  | ||||
|   meta_ui_map_frame (frame->window->screen->ui, frame->xwindow); | ||||
|   meta_ui_map_frame (x11_display->ui, frame->xwindow); | ||||
|  | ||||
|   { | ||||
|     MetaBackend *backend = meta_get_backend (); | ||||
| @@ -125,7 +129,7 @@ meta_window_ensure_frame (MetaWindow *window) | ||||
|         /* Since the backend selects for events on another connection, | ||||
|          * make sure to sync the GTK+ connection to ensure that the | ||||
|          * frame window has been created on the server at this point. */ | ||||
|         XSync (window->display->xdisplay, False); | ||||
|         XSync (x11_display->xdisplay, False); | ||||
|  | ||||
|         unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; | ||||
|         XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; | ||||
| @@ -152,10 +156,13 @@ meta_window_destroy_frame (MetaWindow *window) | ||||
| { | ||||
|   MetaFrame *frame; | ||||
|   MetaFrameBorders borders; | ||||
|   MetaX11Display *x11_display; | ||||
|  | ||||
|   if (window->frame == NULL) | ||||
|     return; | ||||
|  | ||||
|   x11_display = window->display->x11_display; | ||||
|  | ||||
|   meta_verbose ("Unframing window %s\n", window->desc); | ||||
|  | ||||
|   frame = window->frame; | ||||
| @@ -167,7 +174,7 @@ meta_window_destroy_frame (MetaWindow *window) | ||||
|   /* Unparent the client window; it may be destroyed, | ||||
|    * thus the error trap. | ||||
|    */ | ||||
|   meta_error_trap_push (window->display); | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|   if (window->mapped) | ||||
|     { | ||||
|       window->mapped = FALSE; /* Keep track of unmapping it, so we | ||||
| @@ -178,24 +185,23 @@ meta_window_destroy_frame (MetaWindow *window) | ||||
|                   "Incrementing unmaps_pending on %s for reparent back to root\n", window->desc); | ||||
|       window->unmaps_pending += 1; | ||||
|     } | ||||
|   meta_stack_tracker_record_add (window->screen->stack_tracker, | ||||
|   meta_stack_tracker_record_add (window->display->stack_tracker, | ||||
|                                  window->xwindow, | ||||
|                                  XNextRequest (window->display->xdisplay)); | ||||
|   XReparentWindow (window->display->xdisplay, | ||||
|                                  XNextRequest (x11_display->xdisplay)); | ||||
|   XReparentWindow (x11_display->xdisplay, | ||||
|                    window->xwindow, | ||||
|                    window->screen->xroot, | ||||
|                    x11_display->xroot, | ||||
|                    /* Using anything other than client root window coordinates | ||||
|                     * coordinates here means we'll need to ensure a configure | ||||
|                     * notify event is sent; see bug 399552. | ||||
|                     */ | ||||
|                    window->frame->rect.x + borders.invisible.left, | ||||
|                    window->frame->rect.y + borders.invisible.top); | ||||
|   meta_error_trap_pop (window->display); | ||||
|   meta_x11_error_trap_pop (x11_display); | ||||
|  | ||||
|   meta_ui_frame_unmanage (frame->ui_frame); | ||||
|  | ||||
|   meta_display_unregister_x_window (window->display, | ||||
|                                     frame->xwindow); | ||||
|   meta_x11_display_unregister_x_window (x11_display, frame->xwindow); | ||||
|  | ||||
|   window->frame = NULL; | ||||
|   if (window->frame_bounds) | ||||
| @@ -369,18 +375,22 @@ void | ||||
| meta_frame_set_screen_cursor (MetaFrame	*frame, | ||||
| 			      MetaCursor cursor) | ||||
| { | ||||
|   MetaX11Display *x11_display; | ||||
|   Cursor xcursor; | ||||
|   if (cursor == frame->current_cursor) | ||||
|     return; | ||||
|  | ||||
|   frame->current_cursor = cursor; | ||||
|   x11_display = frame->window->display->x11_display; | ||||
|  | ||||
|   if (cursor == META_CURSOR_DEFAULT) | ||||
|     XUndefineCursor (frame->window->display->xdisplay, frame->xwindow); | ||||
|     XUndefineCursor (x11_display->xdisplay, frame->xwindow); | ||||
|   else | ||||
|     { | ||||
|       xcursor = meta_display_create_x_cursor (frame->window->display, cursor); | ||||
|       XDefineCursor (frame->window->display->xdisplay, frame->xwindow, xcursor); | ||||
|       XFlush (frame->window->display->xdisplay); | ||||
|       XFreeCursor (frame->window->display->xdisplay, xcursor); | ||||
|       xcursor = meta_x11_display_create_x_cursor (x11_display, cursor); | ||||
|       XDefineCursor (x11_display->xdisplay, frame->xwindow, xcursor); | ||||
|       XFlush (x11_display->xdisplay); | ||||
|       XFreeCursor (x11_display->xdisplay, xcursor); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -114,8 +114,6 @@ typedef struct | ||||
|  | ||||
| void     meta_display_init_keys             (MetaDisplay *display); | ||||
| void     meta_display_shutdown_keys         (MetaDisplay *display); | ||||
| void     meta_screen_grab_keys              (MetaScreen  *screen); | ||||
| void     meta_screen_ungrab_keys            (MetaScreen  *screen); | ||||
| void     meta_window_grab_keys              (MetaWindow  *window); | ||||
| void     meta_window_ungrab_keys            (MetaWindow  *window); | ||||
| gboolean meta_window_grab_all_keys          (MetaWindow  *window, | ||||
| @@ -139,4 +137,7 @@ GList *meta_prefs_get_keybindings (void); | ||||
| void meta_prefs_get_overlay_binding (MetaKeyCombo *combo); | ||||
| const char *meta_prefs_get_iso_next_group_option (void); | ||||
|  | ||||
| void meta_x11_display_grab_keys   (MetaX11Display *x11_display); | ||||
| void meta_x11_display_ungrab_keys (MetaX11Display *x11_display); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -29,12 +29,12 @@ | ||||
|  | ||||
| #include <config.h> | ||||
| #include "keybindings-private.h" | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "workspace-private.h" | ||||
| #include <meta/compositor.h> | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "edge-resistance.h" | ||||
| #include "frame.h" | ||||
| #include "screen-private.h" | ||||
| #include <meta/prefs.h> | ||||
| #include "meta-accel-parse.h" | ||||
|  | ||||
| @@ -47,6 +47,7 @@ | ||||
| #include "backends/meta-monitor-manager-private.h" | ||||
| #include "backends/meta-logical-monitor.h" | ||||
| #include "backends/x11/meta-backend-x11.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include "x11/window-x11.h" | ||||
|  | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
| @@ -165,17 +166,14 @@ meta_key_binding_is_builtin (MetaKeyBinding *binding) | ||||
|  */ | ||||
|  | ||||
| static gboolean process_mouse_move_resize_grab (MetaDisplay     *display, | ||||
|                                                 MetaScreen      *screen, | ||||
|                                                 MetaWindow      *window, | ||||
|                                                 ClutterKeyEvent *event); | ||||
|  | ||||
| static gboolean process_keyboard_move_grab (MetaDisplay     *display, | ||||
|                                             MetaScreen      *screen, | ||||
|                                             MetaWindow      *window, | ||||
|                                             ClutterKeyEvent *event); | ||||
|  | ||||
| static gboolean process_keyboard_resize_grab (MetaDisplay     *display, | ||||
|                                               MetaScreen      *screen, | ||||
|                                               MetaWindow      *window, | ||||
|                                               ClutterKeyEvent *event); | ||||
|  | ||||
| @@ -702,7 +700,8 @@ ungrab_key_bindings (MetaDisplay *display) | ||||
| { | ||||
|   GSList *windows, *l; | ||||
|  | ||||
|   meta_screen_ungrab_keys (display->screen); | ||||
|   if (display->x11_display) | ||||
|     meta_x11_display_ungrab_keys (display->x11_display); | ||||
|  | ||||
|   windows = meta_display_list_windows (display, META_LIST_DEFAULT); | ||||
|   for (l = windows; l; l = l->next) | ||||
| @@ -719,7 +718,8 @@ grab_key_bindings (MetaDisplay *display) | ||||
| { | ||||
|   GSList *windows, *l; | ||||
|  | ||||
|   meta_screen_grab_keys (display->screen); | ||||
|   if (display->x11_display) | ||||
|     meta_x11_display_grab_keys (display->x11_display); | ||||
|  | ||||
|   windows = meta_display_list_windows (display, META_LIST_DEFAULT); | ||||
|   for (l = windows; l; l = l->next) | ||||
| @@ -1297,42 +1297,44 @@ change_binding_keygrabs (MetaKeyBindingManager *keys, | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_screen_change_keygrabs (MetaScreen *screen, | ||||
|                              gboolean    grab) | ||||
| meta_x11_display_change_keygrabs (MetaX11Display *x11_display, | ||||
|                                   gboolean        grab) | ||||
| { | ||||
|   MetaDisplay *display = screen->display; | ||||
|   MetaKeyBindingManager *keys = &display->key_binding_manager; | ||||
|   MetaKeyBindingManager *keys = &x11_display->display->key_binding_manager; | ||||
|   int i; | ||||
|  | ||||
|   if (keys->overlay_resolved_key_combo.len != 0) | ||||
|     meta_change_keygrab (keys, screen->xroot, grab, &keys->overlay_resolved_key_combo); | ||||
|     meta_change_keygrab (keys, x11_display->xroot, | ||||
|                          grab, &keys->overlay_resolved_key_combo); | ||||
|  | ||||
|   for (i = 0; i < keys->n_iso_next_group_combos; i++) | ||||
|     meta_change_keygrab (keys, screen->xroot, grab, &keys->iso_next_group_combo[i]); | ||||
|     meta_change_keygrab (keys, x11_display->xroot, | ||||
|                          grab, &keys->iso_next_group_combo[i]); | ||||
|  | ||||
|   change_binding_keygrabs (keys, screen->xroot, FALSE, grab); | ||||
|   change_binding_keygrabs (keys, x11_display->xroot, | ||||
|                            FALSE, grab); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_screen_grab_keys (MetaScreen *screen) | ||||
| meta_x11_display_grab_keys (MetaX11Display *x11_display) | ||||
| { | ||||
|   if (screen->keys_grabbed) | ||||
|   if (x11_display->keys_grabbed) | ||||
|     return; | ||||
|  | ||||
|   meta_screen_change_keygrabs (screen, TRUE); | ||||
|   meta_x11_display_change_keygrabs (x11_display, TRUE); | ||||
|  | ||||
|   screen->keys_grabbed = TRUE; | ||||
|   x11_display->keys_grabbed = TRUE; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_screen_ungrab_keys (MetaScreen  *screen) | ||||
| meta_x11_display_ungrab_keys (MetaX11Display *x11_display) | ||||
| { | ||||
|   if (!screen->keys_grabbed) | ||||
|   if (!x11_display->keys_grabbed) | ||||
|     return; | ||||
|  | ||||
|   meta_screen_change_keygrabs (screen, FALSE); | ||||
|   meta_x11_display_change_keygrabs (x11_display, FALSE); | ||||
|  | ||||
|   screen->keys_grabbed = FALSE; | ||||
|   x11_display->keys_grabbed = FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -1400,7 +1402,6 @@ meta_window_ungrab_keys (MetaWindow  *window) | ||||
|  | ||||
| static void | ||||
| handle_external_grab (MetaDisplay     *display, | ||||
|                       MetaScreen      *screen, | ||||
|                       MetaWindow      *window, | ||||
|                       ClutterKeyEvent *event, | ||||
|                       MetaKeyBinding  *binding, | ||||
| @@ -1442,7 +1443,7 @@ meta_display_grab_accelerator (MetaDisplay *display, | ||||
|       return META_KEYBINDING_ACTION_NONE; | ||||
|     } | ||||
|  | ||||
|   meta_change_keygrab (keys, display->screen->xroot, TRUE, &resolved_combo); | ||||
|   meta_change_keygrab (keys, display->x11_display->xroot, TRUE, &resolved_combo); | ||||
|  | ||||
|   grab = g_new0 (MetaKeyGrab, 1); | ||||
|   grab->action = next_dynamic_keybinding_action (); | ||||
| @@ -1486,7 +1487,8 @@ meta_display_ungrab_accelerator (MetaDisplay *display, | ||||
|     { | ||||
|       int i; | ||||
|  | ||||
|       meta_change_keygrab (keys, display->screen->xroot, FALSE, &binding->resolved_combo); | ||||
|       meta_change_keygrab (keys, display->x11_display->xroot, | ||||
|                            FALSE, &binding->resolved_combo); | ||||
|  | ||||
|       for (i = 0; i < binding->resolved_combo.len; i++) | ||||
|         { | ||||
| @@ -1676,21 +1678,20 @@ is_modifier (xkb_keysym_t keysym) | ||||
|  | ||||
| static void | ||||
| invoke_handler (MetaDisplay     *display, | ||||
|                 MetaScreen      *screen, | ||||
|                 MetaKeyHandler  *handler, | ||||
|                 MetaWindow      *window, | ||||
|                 ClutterKeyEvent *event, | ||||
|                 MetaKeyBinding  *binding) | ||||
| { | ||||
|   if (handler->func) | ||||
|     (* handler->func) (display, screen, | ||||
|     (* handler->func) (display, | ||||
|                        handler->flags & META_KEY_BINDING_PER_WINDOW ? | ||||
|                        window : NULL, | ||||
|                        event, | ||||
|                        binding, | ||||
|                        handler->user_data); | ||||
|   else | ||||
|     (* handler->default_func) (display, screen, | ||||
|     (* handler->default_func) (display, | ||||
|                                handler->flags & META_KEY_BINDING_PER_WINDOW ? | ||||
|                                window: NULL, | ||||
|                                event, | ||||
| @@ -1700,7 +1701,6 @@ invoke_handler (MetaDisplay     *display, | ||||
|  | ||||
| static gboolean | ||||
| process_event (MetaDisplay          *display, | ||||
|                MetaScreen           *screen, | ||||
|                MetaWindow           *window, | ||||
|                ClutterKeyEvent      *event) | ||||
| { | ||||
| @@ -1750,7 +1750,7 @@ process_event (MetaDisplay          *display, | ||||
|    */ | ||||
|   display->allow_terminal_deactivation = TRUE; | ||||
|  | ||||
|   invoke_handler (display, screen, binding->handler, window, event, binding); | ||||
|   invoke_handler (display, binding->handler, window, event, binding); | ||||
|  | ||||
|   return TRUE; | ||||
|  | ||||
| @@ -1762,7 +1762,6 @@ process_event (MetaDisplay          *display, | ||||
|  | ||||
| static gboolean | ||||
| process_overlay_key (MetaDisplay *display, | ||||
|                      MetaScreen *screen, | ||||
|                      ClutterKeyEvent *event, | ||||
|                      MetaWindow *window) | ||||
| { | ||||
| @@ -1794,7 +1793,7 @@ process_overlay_key (MetaDisplay *display, | ||||
|            * the event. Other clients with global grabs will be out of | ||||
|            * luck. | ||||
|            */ | ||||
|           if (process_event (display, screen, window, event)) | ||||
|           if (process_event (display, window, event)) | ||||
|             { | ||||
|               /* As normally, after we've handled a global key | ||||
|                * binding, we unfreeze the keyboard but keep the grab | ||||
| @@ -1879,7 +1878,6 @@ process_overlay_key (MetaDisplay *display, | ||||
|  | ||||
| static gboolean | ||||
| process_iso_next_group (MetaDisplay *display, | ||||
|                         MetaScreen *screen, | ||||
|                         ClutterKeyEvent *event) | ||||
| { | ||||
|   MetaKeyBindingManager *keys = &display->key_binding_manager; | ||||
| @@ -1923,20 +1921,15 @@ process_key_event (MetaDisplay     *display, | ||||
|   gboolean keep_grab; | ||||
|   gboolean all_keys_grabbed; | ||||
|   gboolean handled; | ||||
|   MetaScreen *screen; | ||||
|  | ||||
|   /* window may be NULL */ | ||||
|  | ||||
|   screen = display->screen; | ||||
|  | ||||
|   all_keys_grabbed = window ? window->all_keys_grabbed : FALSE; | ||||
|   if (!all_keys_grabbed) | ||||
|     { | ||||
|       handled = process_overlay_key (display, screen, event, window); | ||||
|       handled = process_overlay_key (display, event, window); | ||||
|       if (handled) | ||||
|         return TRUE; | ||||
|  | ||||
|       handled = process_iso_next_group (display, screen, event); | ||||
|       handled = process_iso_next_group (display, event); | ||||
|       if (handled) | ||||
|         return TRUE; | ||||
|     } | ||||
| @@ -1970,20 +1963,20 @@ process_key_event (MetaDisplay     *display, | ||||
|                 { | ||||
|                   meta_topic (META_DEBUG_KEYBINDINGS, | ||||
|                               "Processing event for keyboard move\n"); | ||||
|                   keep_grab = process_keyboard_move_grab (display, screen, window, event); | ||||
|                   keep_grab = process_keyboard_move_grab (display, window, event); | ||||
|                 } | ||||
|               else | ||||
|                 { | ||||
|                   meta_topic (META_DEBUG_KEYBINDINGS, | ||||
|                               "Processing event for keyboard resize\n"); | ||||
|                   keep_grab = process_keyboard_resize_grab (display, screen, window, event); | ||||
|                   keep_grab = process_keyboard_resize_grab (display, window, event); | ||||
|                 } | ||||
|             } | ||||
|           else | ||||
|             { | ||||
|               meta_topic (META_DEBUG_KEYBINDINGS, | ||||
|                           "Processing event for mouse-only move/resize\n"); | ||||
|               keep_grab = process_mouse_move_resize_grab (display, screen, window, event); | ||||
|               keep_grab = process_mouse_move_resize_grab (display, window, event); | ||||
|             } | ||||
|         } | ||||
|       if (!keep_grab) | ||||
| @@ -1993,7 +1986,7 @@ process_key_event (MetaDisplay     *display, | ||||
|     } | ||||
|  | ||||
|   /* Do the normal keybindings */ | ||||
|   return process_event (display, screen, window, event); | ||||
|   return process_event (display, window, event); | ||||
| } | ||||
|  | ||||
| /* Handle a key event. May be called recursively: some key events cause | ||||
| @@ -2035,7 +2028,6 @@ meta_keybindings_process_event (MetaDisplay        *display, | ||||
|  | ||||
| static gboolean | ||||
| process_mouse_move_resize_grab (MetaDisplay     *display, | ||||
|                                 MetaScreen      *screen, | ||||
|                                 MetaWindow      *window, | ||||
|                                 ClutterKeyEvent *event) | ||||
| { | ||||
| @@ -2047,7 +2039,7 @@ process_mouse_move_resize_grab (MetaDisplay     *display, | ||||
|     { | ||||
|       /* Hide the tiling preview if necessary */ | ||||
|       if (window->tile_mode != META_TILE_NONE) | ||||
|         meta_screen_hide_tile_preview (screen); | ||||
|         meta_display_hide_tile_preview (display); | ||||
|  | ||||
|       /* Restore the original tile mode */ | ||||
|       window->tile_mode = display->grab_tile_mode; | ||||
| @@ -2079,7 +2071,6 @@ process_mouse_move_resize_grab (MetaDisplay     *display, | ||||
|  | ||||
| static gboolean | ||||
| process_keyboard_move_grab (MetaDisplay     *display, | ||||
|                             MetaScreen      *screen, | ||||
|                             MetaWindow      *window, | ||||
|                             ClutterKeyEvent *event) | ||||
| { | ||||
| @@ -2196,7 +2187,6 @@ process_keyboard_move_grab (MetaDisplay     *display, | ||||
|  | ||||
| static gboolean | ||||
| process_keyboard_resize_grab_op_change (MetaDisplay     *display, | ||||
|                                         MetaScreen      *screen, | ||||
|                                         MetaWindow      *window, | ||||
|                                         ClutterKeyEvent *event) | ||||
| { | ||||
| @@ -2317,7 +2307,6 @@ process_keyboard_resize_grab_op_change (MetaDisplay     *display, | ||||
|  | ||||
| static gboolean | ||||
| process_keyboard_resize_grab (MetaDisplay     *display, | ||||
|                               MetaScreen      *screen, | ||||
|                               MetaWindow      *window, | ||||
|                               ClutterKeyEvent *event) | ||||
| { | ||||
| @@ -2352,7 +2341,7 @@ process_keyboard_resize_grab (MetaDisplay     *display, | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   if (process_keyboard_resize_grab_op_change (display, screen, window, event)) | ||||
|   if (process_keyboard_resize_grab_op_change (display, window, event)) | ||||
|     return TRUE; | ||||
|  | ||||
|   width = window->rect.width; | ||||
| @@ -2547,26 +2536,26 @@ process_keyboard_resize_grab (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_switch_to_last_workspace (MetaDisplay     *display, | ||||
|                                  MetaScreen      *screen, | ||||
|                                  MetaWindow      *event_window, | ||||
|                                  ClutterKeyEvent *event, | ||||
|                                  MetaKeyBinding *binding, | ||||
|                                  gpointer        dummy) | ||||
| { | ||||
|     gint target = meta_screen_get_n_workspaces(screen) - 1; | ||||
|     MetaWorkspace *workspace = meta_screen_get_workspace_by_index (screen, target); | ||||
|     MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|     gint target = meta_workspace_manager_get_n_workspaces (workspace_manager) - 1; | ||||
|     MetaWorkspace *workspace = meta_workspace_manager_get_workspace_by_index (workspace_manager, target); | ||||
|     meta_workspace_activate (workspace, event->time); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_switch_to_workspace (MetaDisplay     *display, | ||||
|                             MetaScreen      *screen, | ||||
|                             MetaWindow      *event_window, | ||||
|                             ClutterKeyEvent *event, | ||||
|                             MetaKeyBinding  *binding, | ||||
|                             gpointer         dummy) | ||||
| { | ||||
|   gint which = binding->handler->data; | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|   MetaWorkspace *workspace; | ||||
|  | ||||
|   if (which < 0) | ||||
| @@ -2575,12 +2564,12 @@ handle_switch_to_workspace (MetaDisplay     *display, | ||||
|        * current workspace. | ||||
|        */ | ||||
|  | ||||
|       workspace = meta_workspace_get_neighbor (screen->active_workspace, | ||||
|       workspace = meta_workspace_get_neighbor (workspace_manager->active_workspace, | ||||
|                                                which); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       workspace = meta_screen_get_workspace_by_index (screen, which); | ||||
|       workspace = meta_workspace_manager_get_workspace_by_index (workspace_manager, which); | ||||
|     } | ||||
|  | ||||
|   if (workspace) | ||||
| @@ -2596,7 +2585,6 @@ handle_switch_to_workspace (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_maximize_vertically (MetaDisplay     *display, | ||||
|                             MetaScreen      *screen, | ||||
|                             MetaWindow      *window, | ||||
|                             ClutterKeyEvent *event, | ||||
|                             MetaKeyBinding  *binding, | ||||
| @@ -2613,7 +2601,6 @@ handle_maximize_vertically (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_maximize_horizontally (MetaDisplay     *display, | ||||
|                               MetaScreen      *screen, | ||||
|                               MetaWindow      *window, | ||||
|                               ClutterKeyEvent *event, | ||||
|                               MetaKeyBinding  *binding, | ||||
| @@ -2630,7 +2617,6 @@ handle_maximize_horizontally (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_always_on_top (MetaDisplay     *display, | ||||
|                       MetaScreen      *screen, | ||||
|                       MetaWindow      *window, | ||||
|                       ClutterKeyEvent *event, | ||||
|                       MetaKeyBinding  *binding, | ||||
| @@ -2644,7 +2630,6 @@ handle_always_on_top (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_move_to_corner_backend (MetaDisplay           *display, | ||||
|                                MetaScreen            *screen, | ||||
|                                MetaWindow            *window, | ||||
|                                int                    gravity) | ||||
| { | ||||
| @@ -2703,95 +2688,86 @@ handle_move_to_corner_backend (MetaDisplay           *display, | ||||
|  | ||||
| static void | ||||
| handle_move_to_corner_nw  (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, NorthWestGravity); | ||||
|   handle_move_to_corner_backend (display, window, NorthWestGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_corner_ne  (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, NorthEastGravity); | ||||
|   handle_move_to_corner_backend (display, window, NorthEastGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_corner_sw  (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, SouthWestGravity); | ||||
|   handle_move_to_corner_backend (display, window, SouthWestGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_corner_se  (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, SouthEastGravity); | ||||
|   handle_move_to_corner_backend (display, window, SouthEastGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_side_n     (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, NorthGravity); | ||||
|   handle_move_to_corner_backend (display, window, NorthGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_side_s     (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, SouthGravity); | ||||
|   handle_move_to_corner_backend (display, window, SouthGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_side_e     (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, EastGravity); | ||||
|   handle_move_to_corner_backend (display, window, EastGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_side_w     (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   handle_move_to_corner_backend (display, screen, window, WestGravity); | ||||
|   handle_move_to_corner_backend (display, window, WestGravity); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_move_to_center  (MetaDisplay     *display, | ||||
|                         MetaScreen      *screen, | ||||
|                         MetaWindow      *window, | ||||
|                         ClutterKeyEvent *event, | ||||
|                         MetaKeyBinding  *binding, | ||||
| @@ -2811,32 +2787,33 @@ handle_move_to_center  (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_show_desktop (MetaDisplay     *display, | ||||
|                      MetaScreen      *screen, | ||||
|                      MetaWindow      *window, | ||||
|                      ClutterKeyEvent *event, | ||||
|                      MetaKeyBinding  *binding, | ||||
|                      gpointer         dummy) | ||||
| { | ||||
|   if (screen->active_workspace->showing_desktop) | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|  | ||||
|   if (workspace_manager->active_workspace->showing_desktop) | ||||
|     { | ||||
|       meta_screen_unshow_desktop (screen); | ||||
|       meta_workspace_focus_default_window (screen->active_workspace, | ||||
|       meta_workspace_manager_unshow_desktop (workspace_manager); | ||||
|       meta_workspace_focus_default_window (workspace_manager->active_workspace, | ||||
|                                            NULL, | ||||
|                                            event->time); | ||||
|     } | ||||
|   else | ||||
|     meta_screen_show_desktop (screen, event->time); | ||||
|     meta_workspace_manager_show_desktop (workspace_manager, event->time); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_panel (MetaDisplay     *display, | ||||
|               MetaScreen      *screen, | ||||
|               MetaWindow      *window, | ||||
|               ClutterKeyEvent *event, | ||||
|               MetaKeyBinding  *binding, | ||||
|               gpointer         dummy) | ||||
| { | ||||
|   MetaKeyBindingAction action = binding->handler->data; | ||||
|   MetaX11Display *x11_display = display->x11_display; | ||||
|   Atom action_atom; | ||||
|   XClientMessageEvent ev; | ||||
|  | ||||
| @@ -2845,18 +2822,18 @@ handle_panel (MetaDisplay     *display, | ||||
|     { | ||||
|       /* FIXME: The numbers are wrong */ | ||||
|     case META_KEYBINDING_ACTION_PANEL_MAIN_MENU: | ||||
|       action_atom = display->atom__GNOME_PANEL_ACTION_MAIN_MENU; | ||||
|       action_atom = x11_display->atom__GNOME_PANEL_ACTION_MAIN_MENU; | ||||
|       break; | ||||
|     case META_KEYBINDING_ACTION_PANEL_RUN_DIALOG: | ||||
|       action_atom = display->atom__GNOME_PANEL_ACTION_RUN_DIALOG; | ||||
|       action_atom = x11_display->atom__GNOME_PANEL_ACTION_RUN_DIALOG; | ||||
|       break; | ||||
|     default: | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   ev.type = ClientMessage; | ||||
|   ev.window = screen->xroot; | ||||
|   ev.message_type = display->atom__GNOME_PANEL_ACTION; | ||||
|   ev.window = x11_display->xroot; | ||||
|   ev.message_type = x11_display->atom__GNOME_PANEL_ACTION; | ||||
|   ev.format = 32; | ||||
|   ev.data.l[0] = action_atom; | ||||
|   ev.data.l[1] = event->time; | ||||
| @@ -2866,23 +2843,22 @@ handle_panel (MetaDisplay     *display, | ||||
|               "off due to keybinding press\n", event->time); | ||||
|   display->mouse_mode = FALSE; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|  | ||||
|   /* Release the grab for the panel before sending the event */ | ||||
|   XUngrabKeyboard (display->xdisplay, event->time); | ||||
|   XUngrabKeyboard (x11_display->xdisplay, event->time); | ||||
|  | ||||
|   XSendEvent (display->xdisplay, | ||||
| 	      screen->xroot, | ||||
|   XSendEvent (x11_display->xdisplay, | ||||
| 	      x11_display->xroot, | ||||
| 	      False, | ||||
| 	      StructureNotifyMask, | ||||
| 	      (XEvent*) &ev); | ||||
|  | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_activate_window_menu (MetaDisplay     *display, | ||||
|                              MetaScreen      *screen, | ||||
|                              MetaWindow      *event_window, | ||||
|                              ClutterKeyEvent *event, | ||||
|                              MetaKeyBinding  *binding, | ||||
| @@ -2908,12 +2884,12 @@ handle_activate_window_menu (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| do_choose_window (MetaDisplay     *display, | ||||
|                   MetaScreen      *screen, | ||||
|                   MetaWindow      *event_window, | ||||
|                   ClutterKeyEvent *event, | ||||
|                   MetaKeyBinding  *binding, | ||||
|                   gboolean         backward) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|   MetaTabList type = binding->handler->data; | ||||
|   MetaWindow *window; | ||||
|  | ||||
| @@ -2922,7 +2898,7 @@ do_choose_window (MetaDisplay     *display, | ||||
|  | ||||
|   window = meta_display_get_tab_next (display, | ||||
|                                       type, | ||||
|                                       screen->active_workspace, | ||||
|                                       workspace_manager->active_workspace, | ||||
|                                       NULL, | ||||
|                                       backward); | ||||
|  | ||||
| @@ -2932,31 +2908,28 @@ do_choose_window (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_switch (MetaDisplay     *display, | ||||
|                MetaScreen      *screen, | ||||
|                MetaWindow      *event_window, | ||||
|                ClutterKeyEvent *event, | ||||
|                MetaKeyBinding  *binding, | ||||
|                gpointer         dummy) | ||||
| { | ||||
|   gboolean backwards = meta_key_binding_is_reversed (binding); | ||||
|   do_choose_window (display, screen, event_window, event, binding, backwards); | ||||
|   do_choose_window (display, event_window, event, binding, backwards); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_cycle (MetaDisplay     *display, | ||||
|               MetaScreen      *screen, | ||||
|               MetaWindow      *event_window, | ||||
|               ClutterKeyEvent *event, | ||||
|               MetaKeyBinding  *binding, | ||||
|               gpointer         dummy) | ||||
| { | ||||
|   gboolean backwards = meta_key_binding_is_reversed (binding); | ||||
|   do_choose_window (display, screen, event_window, event, binding, backwards); | ||||
|   do_choose_window (display, event_window, event, binding, backwards); | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_toggle_fullscreen  (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -2970,7 +2943,6 @@ handle_toggle_fullscreen  (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_toggle_above       (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -2984,7 +2956,6 @@ handle_toggle_above       (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_toggle_tiled (MetaDisplay     *display, | ||||
|                      MetaScreen      *screen, | ||||
|                      MetaWindow      *window, | ||||
|                      ClutterKeyEvent *event, | ||||
|                      MetaKeyBinding  *binding, | ||||
| @@ -3022,7 +2993,6 @@ handle_toggle_tiled (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_toggle_maximized    (MetaDisplay     *display, | ||||
|                             MetaScreen      *screen, | ||||
|                             MetaWindow      *window, | ||||
|                             ClutterKeyEvent *event, | ||||
|                             MetaKeyBinding  *binding, | ||||
| @@ -3036,7 +3006,6 @@ handle_toggle_maximized    (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_maximize           (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -3048,7 +3017,6 @@ handle_maximize           (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_unmaximize         (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -3060,7 +3028,6 @@ handle_unmaximize         (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_toggle_shaded      (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -3074,7 +3041,6 @@ handle_toggle_shaded      (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_close              (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -3086,7 +3052,6 @@ handle_close              (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_minimize        (MetaDisplay     *display, | ||||
|                         MetaScreen      *screen, | ||||
|                         MetaWindow      *window, | ||||
|                         ClutterKeyEvent *event, | ||||
|                         MetaKeyBinding  *binding, | ||||
| @@ -3098,7 +3063,6 @@ handle_minimize        (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_begin_move         (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -3115,7 +3079,6 @@ handle_begin_move         (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_begin_resize       (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
| @@ -3132,7 +3095,6 @@ handle_begin_resize       (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_toggle_on_all_workspaces (MetaDisplay     *display, | ||||
|                                  MetaScreen      *screen, | ||||
|                                  MetaWindow      *window, | ||||
|                                  ClutterKeyEvent *event, | ||||
|                                  MetaKeyBinding  *binding, | ||||
| @@ -3146,32 +3108,32 @@ handle_toggle_on_all_workspaces (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_move_to_workspace_last (MetaDisplay     *display, | ||||
|                                MetaScreen      *screen, | ||||
|                                MetaWindow      *window, | ||||
|                                ClutterKeyEvent *event, | ||||
|                                MetaKeyBinding  *binding, | ||||
|                                gpointer         dummy) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|   gint which; | ||||
|   MetaWorkspace *workspace; | ||||
|  | ||||
|   if (window->always_sticky) | ||||
|     return; | ||||
|  | ||||
|   which = meta_screen_get_n_workspaces (screen) - 1; | ||||
|   workspace = meta_screen_get_workspace_by_index (screen, which); | ||||
|   which = meta_workspace_manager_get_n_workspaces (workspace_manager) - 1; | ||||
|   workspace = meta_workspace_manager_get_workspace_by_index (workspace_manager, which); | ||||
|   meta_window_change_workspace (window, workspace); | ||||
| } | ||||
|  | ||||
|  | ||||
| static void | ||||
| handle_move_to_workspace  (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|   gint which = binding->handler->data; | ||||
|   gboolean flip = (which < 0); | ||||
|   MetaWorkspace *workspace; | ||||
| @@ -3190,12 +3152,12 @@ handle_move_to_workspace  (MetaDisplay     *display, | ||||
|   workspace = NULL; | ||||
|   if (flip) | ||||
|     { | ||||
|       workspace = meta_workspace_get_neighbor (screen->active_workspace, | ||||
|       workspace = meta_workspace_get_neighbor (workspace_manager->active_workspace, | ||||
|                                                which); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       workspace = meta_screen_get_workspace_by_index (screen, which); | ||||
|       workspace = meta_workspace_manager_get_workspace_by_index (workspace_manager, which); | ||||
|     } | ||||
|  | ||||
|   if (workspace) | ||||
| @@ -3207,7 +3169,7 @@ handle_move_to_workspace  (MetaDisplay     *display, | ||||
|           meta_topic (META_DEBUG_FOCUS, | ||||
|                       "Resetting mouse_mode to FALSE due to " | ||||
|                       "handle_move_to_workspace() call with flip set.\n"); | ||||
|           meta_display_clear_mouse_mode (workspace->screen->display); | ||||
|           meta_display_clear_mouse_mode (workspace->display); | ||||
|           meta_workspace_activate_with_focus (workspace, | ||||
|                                               window, | ||||
|                                               event->time); | ||||
| @@ -3221,7 +3183,6 @@ handle_move_to_workspace  (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_move_to_monitor (MetaDisplay    *display, | ||||
|                         MetaScreen     *screen, | ||||
|                         MetaWindow     *window, | ||||
| 		        ClutterKeyEvent *event, | ||||
|                         MetaKeyBinding *binding, | ||||
| @@ -3245,7 +3206,6 @@ handle_move_to_monitor (MetaDisplay    *display, | ||||
|  | ||||
| static void | ||||
| handle_raise_or_lower (MetaDisplay     *display, | ||||
|                        MetaScreen      *screen, | ||||
| 		       MetaWindow      *window, | ||||
| 		       ClutterKeyEvent *event, | ||||
| 		       MetaKeyBinding  *binding, | ||||
| @@ -3256,7 +3216,7 @@ handle_raise_or_lower (MetaDisplay     *display, | ||||
|   MetaWindow *above = NULL; | ||||
|  | ||||
|   /* Check if top */ | ||||
|   if (meta_stack_get_top (window->screen->stack) == window) | ||||
|   if (meta_stack_get_top (window->display->stack) == window) | ||||
|     { | ||||
|       meta_window_lower (window); | ||||
|       return; | ||||
| @@ -3264,7 +3224,7 @@ handle_raise_or_lower (MetaDisplay     *display, | ||||
|  | ||||
|   /* else check if windows in same layer are intersecting it */ | ||||
|  | ||||
|   above = meta_stack_get_above (window->screen->stack, window, TRUE); | ||||
|   above = meta_stack_get_above (window->display->stack, window, TRUE); | ||||
|  | ||||
|   while (above) | ||||
|     { | ||||
| @@ -3283,7 +3243,7 @@ handle_raise_or_lower (MetaDisplay     *display, | ||||
|             } | ||||
|         } | ||||
|  | ||||
|       above = meta_stack_get_above (window->screen->stack, above, TRUE); | ||||
|       above = meta_stack_get_above (window->display->stack, above, TRUE); | ||||
|     } | ||||
|  | ||||
|   /* window is not obscured */ | ||||
| @@ -3292,7 +3252,6 @@ handle_raise_or_lower (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_raise (MetaDisplay     *display, | ||||
|               MetaScreen      *screen, | ||||
|               MetaWindow      *window, | ||||
|               ClutterKeyEvent *event, | ||||
|               MetaKeyBinding  *binding, | ||||
| @@ -3303,7 +3262,6 @@ handle_raise (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_lower (MetaDisplay     *display, | ||||
|               MetaScreen      *screen, | ||||
|               MetaWindow      *window, | ||||
|               ClutterKeyEvent *event, | ||||
|               MetaKeyBinding  *binding, | ||||
| @@ -3314,7 +3272,6 @@ handle_lower (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_set_spew_mark (MetaDisplay     *display, | ||||
|                       MetaScreen      *screen, | ||||
|                       MetaWindow      *window, | ||||
|                       ClutterKeyEvent *event, | ||||
|                       MetaKeyBinding  *binding, | ||||
| @@ -3326,7 +3283,6 @@ handle_set_spew_mark (MetaDisplay     *display, | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
| static void | ||||
| handle_switch_vt (MetaDisplay     *display, | ||||
|                   MetaScreen      *screen, | ||||
|                   MetaWindow      *window, | ||||
|                   ClutterKeyEvent *event, | ||||
|                   MetaKeyBinding  *binding, | ||||
| @@ -3345,7 +3301,6 @@ handle_switch_vt (MetaDisplay     *display, | ||||
|  | ||||
| static void | ||||
| handle_switch_monitor (MetaDisplay    *display, | ||||
|                        MetaScreen     *screen, | ||||
|                        MetaWindow     *window, | ||||
|                        ClutterKeyEvent *event, | ||||
|                        MetaKeyBinding *binding, | ||||
| @@ -3366,7 +3321,6 @@ handle_switch_monitor (MetaDisplay    *display, | ||||
|  | ||||
| static void | ||||
| handle_rotate_monitor (MetaDisplay    *display, | ||||
|                        MetaScreen     *screen, | ||||
|                        MetaWindow     *window, | ||||
|                        ClutterKeyEvent *event, | ||||
|                        MetaKeyBinding *binding, | ||||
| @@ -3381,7 +3335,6 @@ handle_rotate_monitor (MetaDisplay    *display, | ||||
|  | ||||
| static void | ||||
| handle_restore_shortcuts (MetaDisplay     *display, | ||||
|                           MetaScreen      *screen, | ||||
|                           MetaWindow      *window, | ||||
|                           ClutterKeyEvent *event, | ||||
|                           MetaKeyBinding  *binding, | ||||
| @@ -4024,28 +3977,28 @@ init_builtin_key_bindings (MetaDisplay *display) | ||||
|                           common_keybindings, | ||||
|                           META_KEY_BINDING_PER_WINDOW, | ||||
|                           META_KEYBINDING_ACTION_MOVE_TO_MONITOR_LEFT, | ||||
|                           handle_move_to_monitor, META_SCREEN_LEFT); | ||||
|                           handle_move_to_monitor, META_DISPLAY_LEFT); | ||||
|  | ||||
|   add_builtin_keybinding (display, | ||||
|                           "move-to-monitor-right", | ||||
|                           common_keybindings, | ||||
|                           META_KEY_BINDING_PER_WINDOW, | ||||
|                           META_KEYBINDING_ACTION_MOVE_TO_MONITOR_RIGHT, | ||||
|                           handle_move_to_monitor, META_SCREEN_RIGHT); | ||||
|                           handle_move_to_monitor, META_DISPLAY_RIGHT); | ||||
|  | ||||
|   add_builtin_keybinding (display, | ||||
|                           "move-to-monitor-down", | ||||
|                           common_keybindings, | ||||
|                           META_KEY_BINDING_PER_WINDOW, | ||||
|                           META_KEYBINDING_ACTION_MOVE_TO_MONITOR_DOWN, | ||||
|                           handle_move_to_monitor, META_SCREEN_DOWN); | ||||
|                           handle_move_to_monitor, META_DISPLAY_DOWN); | ||||
|  | ||||
|   add_builtin_keybinding (display, | ||||
|                           "move-to-monitor-up", | ||||
|                           common_keybindings, | ||||
|                           META_KEY_BINDING_PER_WINDOW, | ||||
|                           META_KEYBINDING_ACTION_MOVE_TO_MONITOR_UP, | ||||
|                           handle_move_to_monitor, META_SCREEN_UP); | ||||
|                           handle_move_to_monitor, META_DISPLAY_UP); | ||||
|  | ||||
|   add_builtin_keybinding (display, | ||||
|                           "raise-or-lower", | ||||
|   | ||||
| @@ -31,4 +31,6 @@ typedef enum _MetaCompositorType | ||||
| void meta_override_compositor_configuration (MetaCompositorType compositor_type, | ||||
|                                              GType              backend_gtype); | ||||
|  | ||||
| gboolean meta_should_autostart_x11_display (void); | ||||
|  | ||||
| #endif /* META_MAIN_PRIVATE_H */ | ||||
|   | ||||
| @@ -47,7 +47,7 @@ | ||||
| #include <meta/main.h> | ||||
| #include "util-private.h" | ||||
| #include "display-private.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "ui.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/compositor.h> | ||||
| @@ -177,6 +177,7 @@ static gboolean  opt_sync; | ||||
| #ifdef HAVE_WAYLAND | ||||
| static gboolean  opt_wayland; | ||||
| static gboolean  opt_nested; | ||||
| static gboolean  opt_no_x11; | ||||
| #endif | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
| static gboolean  opt_display_server; | ||||
| @@ -231,6 +232,12 @@ static GOptionEntry meta_options[] = { | ||||
|     N_("Run as a nested compositor"), | ||||
|     NULL | ||||
|   }, | ||||
|   { | ||||
|     "no-x11", 0, 0, G_OPTION_ARG_NONE, | ||||
|     &opt_no_x11, | ||||
|     N_("Run wayland compositor without starting Xwayland"), | ||||
|     NULL | ||||
|   }, | ||||
| #endif | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
|   { | ||||
| @@ -294,7 +301,7 @@ meta_finalize (void) | ||||
|  | ||||
|   if (display) | ||||
|     meta_display_close (display, | ||||
|                         CurrentTime); /* I doubt correct timestamps matter here */ | ||||
|                         META_CURRENT_TIME); /* I doubt correct timestamps matter here */ | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   if (meta_is_wayland_compositor ()) | ||||
| @@ -437,6 +444,12 @@ calculate_compositor_configuration (MetaCompositorType *compositor_type, | ||||
|     run_as_wayland_compositor = check_for_wayland_session_type (); | ||||
| #endif /* HAVE_NATIVE_BACKEND */ | ||||
|  | ||||
|   if (!run_as_wayland_compositor && opt_no_x11) | ||||
|     { | ||||
|       meta_warning ("Can't disable X11 support on X11 compositor\n"); | ||||
|       meta_exit (META_EXIT_ERROR); | ||||
|     } | ||||
|  | ||||
|   if (run_as_wayland_compositor) | ||||
|     *compositor_type = META_COMPOSITOR_TYPE_WAYLAND; | ||||
|   else | ||||
| @@ -583,10 +596,6 @@ meta_init (void) | ||||
|     meta_fatal ("Can't specify both SM save file and SM client id\n"); | ||||
|  | ||||
|   meta_main_loop = g_main_loop_new (NULL, FALSE); | ||||
|  | ||||
|   meta_ui_init (); | ||||
|  | ||||
|   meta_restart_init (); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -697,3 +706,16 @@ prefs_changed_callback (MetaPreference pref, | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_should_autostart_x11_display (void) | ||||
| { | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   gboolean is_x11 = TRUE; | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   is_x11 = !opt_no_x11; | ||||
| #endif | ||||
|  | ||||
|   return META_IS_BACKEND_X11_CM (backend) || is_x11; | ||||
| } | ||||
|   | ||||
| @@ -28,6 +28,7 @@ | ||||
| #include "window-private.h" | ||||
| #include <meta/meta-close-dialog.h> | ||||
| #include "meta-close-dialog-default-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/wait.h> | ||||
| @@ -157,7 +158,7 @@ meta_close_dialog_default_show (MetaCloseDialog *dialog) | ||||
|   dialog_pid = | ||||
|     meta_show_dialog ("--question", | ||||
|                       window_content, NULL, | ||||
|                       window->screen->screen_name, | ||||
|                       window->display->x11_display->screen_name, | ||||
|                       _("_Force Quit"), _("_Wait"), | ||||
|                       "face-sad-symbolic", window->xwindow, | ||||
|                       NULL, NULL); | ||||
|   | ||||
							
								
								
									
										94
									
								
								src/core/meta-workspace-manager-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/core/meta-workspace-manager-private.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2002, 2003, 2004 Red Hat, Inc. | ||||
|  * Copyright (C) 2003, 2004 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_WORKSPACE_MANAGER_PRIVATE_H | ||||
| #define META_WORKSPACE_MANAGER_PRIVATE_H | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| #include "core/display-private.h" | ||||
| #include "meta/common.h" | ||||
| #include "meta/types.h" | ||||
| #include "meta/meta-workspace-manager.h" | ||||
|  | ||||
| struct _MetaWorkspaceManager | ||||
| { | ||||
|   GObject parent; | ||||
|  | ||||
|   MetaDisplay *display; | ||||
|   MetaWorkspace *active_workspace; | ||||
|  | ||||
|   GList *workspaces; | ||||
|  | ||||
|   int rows_of_workspaces; | ||||
|   int columns_of_workspaces; | ||||
|   MetaDisplayCorner starting_corner; | ||||
|   guint vertical_workspaces : 1; | ||||
|   guint workspace_layout_overridden : 1; | ||||
| }; | ||||
|  | ||||
| MetaWorkspaceManager *meta_workspace_manager_new (MetaDisplay *display); | ||||
|  | ||||
| void meta_workspace_manager_init_workspaces         (MetaWorkspaceManager *workspace_manager); | ||||
| void meta_workspace_manager_update_workspace_layout (MetaWorkspaceManager *workspace_manager, | ||||
|                                                      MetaDisplayCorner     starting_corner, | ||||
|                                                      gboolean              vertical_layout, | ||||
|                                                      int                   n_rows, | ||||
|                                                      int                   n_columns); | ||||
|  | ||||
| typedef struct MetaWorkspaceLayout MetaWorkspaceLayout; | ||||
|  | ||||
| struct MetaWorkspaceLayout | ||||
| { | ||||
|   int rows; | ||||
|   int cols; | ||||
|   int *grid; | ||||
|   int grid_area; | ||||
|   int current_row; | ||||
|   int current_col; | ||||
| }; | ||||
|  | ||||
| void meta_workspace_manager_calc_workspace_layout (MetaWorkspaceManager *workspace_manager, | ||||
|                                                    int                   num_workspaces, | ||||
|                                                    int                   current_space, | ||||
|                                                    MetaWorkspaceLayout  *layout); | ||||
|  | ||||
| void meta_workspace_manager_free_workspace_layout (MetaWorkspaceLayout *layout); | ||||
|  | ||||
| void meta_workspace_manager_minimize_all_on_active_workspace_except (MetaWorkspaceManager *workspace_manager, | ||||
|                                                                      MetaWindow           *keep); | ||||
|  | ||||
| /* Show/hide the desktop (temporarily hide all windows) */ | ||||
| void meta_workspace_manager_show_desktop   (MetaWorkspaceManager *workspace_manager, | ||||
|                                             guint32               timestamp); | ||||
| void meta_workspace_manager_unshow_desktop (MetaWorkspaceManager *workspace_manager); | ||||
|  | ||||
| void meta_workspace_manager_workspace_switched (MetaWorkspaceManager *workspace_manager, | ||||
|                                                 int                   from, | ||||
|                                                 int                   to, | ||||
|                                                 MetaMotionDirection   direction); | ||||
|  | ||||
| void meta_workspace_manager_update_num_workspaces (MetaWorkspaceManager *workspace_manager, | ||||
|                                                    guint32               timestamp, | ||||
|                                                    int                   new_num); | ||||
|  | ||||
| #endif /* META_WORKSPACE_MANAGER_PRIVATE_H */ | ||||
							
								
								
									
										946
									
								
								src/core/meta-workspace-manager.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										946
									
								
								src/core/meta-workspace-manager.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,946 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2002, 2003, 2004 Red Hat, Inc. | ||||
|  * Copyright (C) 2003, 2004 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "core/meta-workspace-manager-private.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "backends/meta-backend-private.h" | ||||
|  | ||||
| #include "core/window-private.h" | ||||
| #include "core/workspace-private.h" | ||||
|  | ||||
| #include "meta/meta-enum-types.h" | ||||
| #include "meta/prefs.h" | ||||
| #include "meta/util.h" | ||||
|  | ||||
| G_DEFINE_TYPE (MetaWorkspaceManager, meta_workspace_manager, G_TYPE_OBJECT) | ||||
|  | ||||
| enum | ||||
| { | ||||
|   WORKSPACE_ADDED, | ||||
|   WORKSPACE_REMOVED, | ||||
|   WORKSPACE_SWITCHED, | ||||
|   ACTIVE_WORKSPACE_CHANGED, | ||||
|   SHOWING_DESKTOP_CHANGED, | ||||
|   LAST_SIGNAL | ||||
| }; | ||||
|  | ||||
| enum { | ||||
|   PROP_0, | ||||
|  | ||||
|   PROP_N_WORKSPACES | ||||
| }; | ||||
|  | ||||
| static guint workspace_manager_signals [LAST_SIGNAL] = { 0 }; | ||||
|  | ||||
| static void prefs_changed_callback (MetaPreference pref, | ||||
|                                     void          *data); | ||||
|  | ||||
| static void | ||||
| meta_workspace_manager_get_property (GObject    *object, | ||||
|                                      guint       prop_id, | ||||
|                                      GValue     *value, | ||||
|                                      GParamSpec *pspec) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = META_WORKSPACE_MANAGER (object); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_N_WORKSPACES: | ||||
|       g_value_set_int (value, meta_workspace_manager_get_n_workspaces (workspace_manager)); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_workspace_manager_set_property (GObject      *object, | ||||
|                                      guint         prop_id, | ||||
|                                      const GValue *value, | ||||
|                                      GParamSpec   *pspec) | ||||
| { | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_workspace_manager_finalize (GObject *object) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = META_WORKSPACE_MANAGER (object); | ||||
|  | ||||
|   meta_prefs_remove_listener (prefs_changed_callback, workspace_manager); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_workspace_manager_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_workspace_manager_class_init (MetaWorkspaceManagerClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->get_property = meta_workspace_manager_get_property; | ||||
|   object_class->set_property = meta_workspace_manager_set_property; | ||||
|  | ||||
|   object_class->finalize = meta_workspace_manager_finalize; | ||||
|  | ||||
|   workspace_manager_signals[WORKSPACE_ADDED] = | ||||
|     g_signal_new ("workspace-added", | ||||
|                   G_TYPE_FROM_CLASS (klass), | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, | ||||
|                   1, | ||||
|                   G_TYPE_INT); | ||||
|  | ||||
|   workspace_manager_signals[WORKSPACE_REMOVED] = | ||||
|     g_signal_new ("workspace-removed", | ||||
|                   G_TYPE_FROM_CLASS (klass), | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, | ||||
|                   1, | ||||
|                   G_TYPE_INT); | ||||
|  | ||||
|   workspace_manager_signals[WORKSPACE_SWITCHED] = | ||||
|     g_signal_new ("workspace-switched", | ||||
|                   G_TYPE_FROM_CLASS (klass), | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, | ||||
|                   3, | ||||
|                   G_TYPE_INT, | ||||
|                   G_TYPE_INT, | ||||
|                   META_TYPE_MOTION_DIRECTION); | ||||
|  | ||||
|   workspace_manager_signals[ACTIVE_WORKSPACE_CHANGED] = | ||||
|     g_signal_new ("active-workspace-changed", | ||||
|                   G_TYPE_FROM_CLASS (klass), | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, 0); | ||||
|  | ||||
|   workspace_manager_signals[SHOWING_DESKTOP_CHANGED] = | ||||
|     g_signal_new ("showing-desktop-changed", | ||||
|                   G_TYPE_FROM_CLASS (klass), | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, 0); | ||||
|  | ||||
|   g_object_class_install_property (object_class, | ||||
|                                    PROP_N_WORKSPACES, | ||||
|                                    g_param_spec_int ("n-workspaces", | ||||
|                                                      "N Workspaces", | ||||
|                                                      "Number of workspaces", | ||||
|                                                      1, G_MAXINT, 1, | ||||
|                                                      G_PARAM_READABLE)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_workspace_manager_init (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
| } | ||||
|  | ||||
| static void | ||||
| reload_logical_monitors (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   GList *l; | ||||
|  | ||||
|   for (l = workspace_manager->workspaces; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWorkspace *space = l->data; | ||||
|       meta_workspace_invalidate_work_area (space); | ||||
|     } | ||||
| } | ||||
|  | ||||
| MetaWorkspaceManager * | ||||
| meta_workspace_manager_new (MetaDisplay *display) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager; | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   MetaMonitorManager *monitor_manager | ||||
|     = meta_backend_get_monitor_manager (backend); | ||||
|  | ||||
|   workspace_manager = g_object_new (META_TYPE_WORKSPACE_MANAGER, NULL); | ||||
|  | ||||
|   workspace_manager->display = display; | ||||
|   workspace_manager->active_workspace = NULL; | ||||
|   workspace_manager->workspaces = NULL; | ||||
|   workspace_manager->rows_of_workspaces = 1; | ||||
|   workspace_manager->columns_of_workspaces = -1; | ||||
|   workspace_manager->vertical_workspaces = FALSE; | ||||
|   workspace_manager->starting_corner = META_DISPLAY_TOPLEFT; | ||||
|  | ||||
|   /* This is the default layout extracted from default | ||||
|    * variable values in update_num_workspaces () | ||||
|    * This can be overriden using _NET_DESKTOP_LAYOUT in | ||||
|    * meta_x11_display_new (), if it's specified */ | ||||
|   meta_workspace_manager_update_workspace_layout (workspace_manager, | ||||
|                                                   META_DISPLAY_TOPLEFT, | ||||
|                                                   FALSE, | ||||
|                                                   -1, | ||||
|                                                   1); | ||||
|  | ||||
|   /* There must be at least one workspace at all times, | ||||
|    * so create that required workspace. | ||||
|    */ | ||||
|   meta_workspace_new (workspace_manager); | ||||
|  | ||||
|   meta_workspace_manager_init_workspaces (workspace_manager); | ||||
|  | ||||
|   reload_logical_monitors (workspace_manager); | ||||
|  | ||||
|   g_signal_connect_object (monitor_manager, | ||||
|                            "monitors-changed", | ||||
|                            G_CALLBACK (reload_logical_monitors), | ||||
|                            workspace_manager, | ||||
|                            G_CONNECT_SWAPPED); | ||||
|  | ||||
|   meta_prefs_add_listener (prefs_changed_callback, workspace_manager); | ||||
|  | ||||
|   return workspace_manager; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_init_workspaces (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   int num; | ||||
|  | ||||
|   g_return_if_fail (META_IS_WORKSPACE_MANAGER (workspace_manager)); | ||||
|  | ||||
|   if (meta_prefs_get_dynamic_workspaces ()) | ||||
|     /* This will be properly updated using _NET_NUMBER_OF_DESKTOPS | ||||
|      * (if set) in meta_x11_display_new () */ | ||||
|     num = 1; | ||||
|   else | ||||
|     num = meta_prefs_get_num_workspaces (); | ||||
|  | ||||
|   meta_workspace_manager_update_num_workspaces (workspace_manager, META_CURRENT_TIME, num); | ||||
|  | ||||
|   meta_workspace_activate (workspace_manager->workspaces->data, META_CURRENT_TIME); | ||||
| } | ||||
|  | ||||
| int | ||||
| meta_workspace_manager_get_n_workspaces (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   return g_list_length (workspace_manager->workspaces); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_workspace_manager_get_workspace_by_index: | ||||
|  * @workspace_manager: a #MetaWorkspaceManager | ||||
|  * @index: index of one of the display's workspaces | ||||
|  * | ||||
|  * Gets the workspace object for one of a workspace manager's workspaces given the workspace | ||||
|  * index. It's valid to call this function with an out-of-range index and it | ||||
|  * will robustly return %NULL. | ||||
|  * | ||||
|  * Return value: (transfer none): the workspace object with specified index, or %NULL | ||||
|  *   if the index is out of range. | ||||
|  */ | ||||
| MetaWorkspace * | ||||
| meta_workspace_manager_get_workspace_by_index (MetaWorkspaceManager *workspace_manager, | ||||
|                                                int                   idx) | ||||
| { | ||||
|   return g_list_nth_data (workspace_manager->workspaces, idx); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_remove_workspace (MetaWorkspaceManager *workspace_manager, | ||||
|                                          MetaWorkspace        *workspace, | ||||
|                                          guint32               timestamp) | ||||
| { | ||||
|   GList         *l; | ||||
|   GList         *next; | ||||
|   MetaWorkspace *neighbour = NULL; | ||||
|   int            index; | ||||
|   gboolean       active_index_changed; | ||||
|   int            new_num; | ||||
|  | ||||
|   l = g_list_find (workspace_manager->workspaces, workspace); | ||||
|   if (!l) | ||||
|     return; | ||||
|  | ||||
|   next = l->next; | ||||
|  | ||||
|   if (l->prev) | ||||
|     neighbour = l->prev->data; | ||||
|   else if (l->next) | ||||
|     neighbour = l->next->data; | ||||
|   else | ||||
|     { | ||||
|       /* Cannot remove the only workspace! */ | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   meta_workspace_relocate_windows (workspace, neighbour); | ||||
|  | ||||
|   if (workspace == workspace_manager->active_workspace) | ||||
|     meta_workspace_activate (neighbour, timestamp); | ||||
|  | ||||
|   /* To emit the signal after removing the workspace */ | ||||
|   index = meta_workspace_index (workspace); | ||||
|   active_index_changed = index < meta_workspace_manager_get_active_workspace_index (workspace_manager); | ||||
|  | ||||
|   /* This also removes the workspace from the displays list */ | ||||
|   meta_workspace_remove (workspace); | ||||
|  | ||||
|   new_num = g_list_length (workspace_manager->workspaces); | ||||
|  | ||||
|   if (!meta_prefs_get_dynamic_workspaces ()) | ||||
|     meta_prefs_set_num_workspaces (new_num); | ||||
|  | ||||
|   /* If deleting a workspace before the current workspace, the active | ||||
|    * workspace index changes, so we need to update that hint */ | ||||
|   if (active_index_changed) | ||||
|     g_signal_emit (workspace_manager, workspace_manager_signals[ACTIVE_WORKSPACE_CHANGED], 0, NULL); | ||||
|  | ||||
|   for (l = next; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWorkspace *w = l->data; | ||||
|       meta_workspace_index_changed (w); | ||||
|     } | ||||
|  | ||||
|   meta_display_queue_workarea_recalc (workspace_manager->display); | ||||
|  | ||||
|   g_signal_emit (workspace_manager, workspace_manager_signals[WORKSPACE_REMOVED], 0, index); | ||||
|   g_object_notify (G_OBJECT (workspace_manager), "n-workspaces"); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_workspace_manager_append_new_workspace: | ||||
|  * @workspace_manager: a #MetaWorkspaceManager | ||||
|  * @activate: %TRUE if the workspace should be switched to after creation | ||||
|  * @timestamp: if switching to a new workspace, timestamp to be used when | ||||
|  *   focusing a window on the new workspace. (Doesn't hurt to pass a valid | ||||
|  *   timestamp when available even if not switching workspaces.) | ||||
|  * | ||||
|  * Append a new workspace to the workspace manager and (optionally) switch to that | ||||
|  * display. | ||||
|  * | ||||
|  * Return value: (transfer none): the newly appended workspace. | ||||
|  */ | ||||
| MetaWorkspace * | ||||
| meta_workspace_manager_append_new_workspace (MetaWorkspaceManager *workspace_manager, | ||||
|                                              gboolean              activate, | ||||
|                                              guint32               timestamp) | ||||
| { | ||||
|   MetaWorkspace *w; | ||||
|   int new_num; | ||||
|  | ||||
|   /* This also adds the workspace to the workspace manager list */ | ||||
|   w = meta_workspace_new (workspace_manager); | ||||
|  | ||||
|   if (!w) | ||||
|     return NULL; | ||||
|  | ||||
|   if (activate) | ||||
|     meta_workspace_activate (w, timestamp); | ||||
|  | ||||
|   new_num = g_list_length (workspace_manager->workspaces); | ||||
|  | ||||
|   if (!meta_prefs_get_dynamic_workspaces ()) | ||||
|     meta_prefs_set_num_workspaces (new_num); | ||||
|  | ||||
|   meta_display_queue_workarea_recalc (workspace_manager->display); | ||||
|  | ||||
|   g_signal_emit (workspace_manager, workspace_manager_signals[WORKSPACE_ADDED], | ||||
|                  0, meta_workspace_index (w)); | ||||
|   g_object_notify (G_OBJECT (workspace_manager), "n-workspaces"); | ||||
|  | ||||
|   return w; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_update_num_workspaces (MetaWorkspaceManager *workspace_manager, | ||||
|                                               guint32               timestamp, | ||||
|                                               int                   new_num) | ||||
| { | ||||
|   int old_num; | ||||
|   GList *l; | ||||
|   int i = 0; | ||||
|   GList *extras = NULL; | ||||
|   MetaWorkspace *last_remaining = NULL; | ||||
|   gboolean need_change_space = FALSE; | ||||
|  | ||||
|   g_assert (new_num > 0); | ||||
|  | ||||
|   if (g_list_length (workspace_manager->workspaces) == (guint) new_num) | ||||
|     return; | ||||
|  | ||||
|   for (l = workspace_manager->workspaces; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWorkspace *w = l->data; | ||||
|  | ||||
|       if (i >= new_num) | ||||
|         extras = g_list_prepend (extras, w); | ||||
|       else | ||||
|         last_remaining = w; | ||||
|  | ||||
|       ++i; | ||||
|     } | ||||
|   old_num = i; | ||||
|  | ||||
|   g_assert (last_remaining); | ||||
|  | ||||
|   /* Get rid of the extra workspaces by moving all their windows | ||||
|    * to last_remaining, then activating last_remaining if | ||||
|    * one of the removed workspaces was active. This will be a bit | ||||
|    * wacky if the config tool for changing number of workspaces | ||||
|    * is on a removed workspace ;-) | ||||
|    */ | ||||
|   for (l = extras; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWorkspace *w = l->data; | ||||
|  | ||||
|       meta_workspace_relocate_windows (w, last_remaining); | ||||
|  | ||||
|       if (w == workspace_manager->active_workspace) | ||||
|         need_change_space = TRUE; | ||||
|     } | ||||
|  | ||||
|   if (need_change_space) | ||||
|     meta_workspace_activate (last_remaining, timestamp); | ||||
|  | ||||
|   /* Should now be safe to free the workspaces */ | ||||
|   for (l = extras; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWorkspace *w = l->data; | ||||
|  | ||||
|       meta_workspace_remove (w); | ||||
|     } | ||||
|  | ||||
|   g_list_free (extras); | ||||
|  | ||||
|   for (i = old_num; i < new_num; i++) | ||||
|     meta_workspace_new (workspace_manager); | ||||
|  | ||||
|   meta_display_queue_workarea_recalc (workspace_manager->display); | ||||
|  | ||||
|   for (i = old_num; i < new_num; i++) | ||||
|     g_signal_emit (workspace_manager, workspace_manager_signals[WORKSPACE_ADDED], 0, i); | ||||
|  | ||||
|   g_object_notify (G_OBJECT (workspace_manager), "n-workspaces"); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_update_workspace_layout (MetaWorkspaceManager *workspace_manager, | ||||
|                                                 MetaDisplayCorner     starting_corner, | ||||
|                                                 gboolean              vertical_layout, | ||||
|                                                 int                   n_rows, | ||||
|                                                 int                   n_columns) | ||||
| { | ||||
|   g_return_if_fail (META_IS_WORKSPACE_MANAGER (workspace_manager)); | ||||
|   g_return_if_fail (n_rows > 0 || n_columns > 0); | ||||
|   g_return_if_fail (n_rows != 0 && n_columns != 0); | ||||
|  | ||||
|   if (workspace_manager->workspace_layout_overridden) | ||||
|     return; | ||||
|  | ||||
|   workspace_manager->vertical_workspaces = vertical_layout != FALSE; | ||||
|   workspace_manager->starting_corner = starting_corner; | ||||
|   workspace_manager->rows_of_workspaces = n_rows; | ||||
|   workspace_manager->columns_of_workspaces = n_columns; | ||||
|  | ||||
|   meta_verbose ("Workspace layout rows = %d cols = %d orientation = %d starting corner = %u\n", | ||||
|                 workspace_manager->rows_of_workspaces, | ||||
|                 workspace_manager->columns_of_workspaces, | ||||
|                 workspace_manager->vertical_workspaces, | ||||
|                 workspace_manager->starting_corner); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_workspace_manager_override_workspace_layout: | ||||
|  * @workspace_manager: a #MetaWorkspaceManager | ||||
|  * @starting_corner: the corner at which the first workspace is found | ||||
|  * @vertical_layout: if %TRUE the workspaces are laid out in columns rather than rows | ||||
|  * @n_rows: number of rows of workspaces, or -1 to determine the number of rows from | ||||
|  *   @n_columns and the total number of workspaces | ||||
|  * @n_columns: number of columns of workspaces, or -1 to determine the number of columns from | ||||
|  *   @n_rows and the total number of workspaces | ||||
|  * | ||||
|  * Explicitly set the layout of workspaces. Once this has been called, the contents of the | ||||
|  * _NET_DESKTOP_LAYOUT property on the root window are completely ignored. | ||||
|  */ | ||||
| void | ||||
| meta_workspace_manager_override_workspace_layout (MetaWorkspaceManager *workspace_manager, | ||||
|                                                   MetaDisplayCorner     starting_corner, | ||||
|                                                   gboolean              vertical_layout, | ||||
|                                                   int                   n_rows, | ||||
|                                                   int                   n_columns) | ||||
| { | ||||
|   meta_workspace_manager_update_workspace_layout (workspace_manager, | ||||
|                                                   starting_corner, | ||||
|                                                   vertical_layout, | ||||
|                                                   n_rows, | ||||
|                                                   n_columns); | ||||
|  | ||||
|   workspace_manager->workspace_layout_overridden = TRUE; | ||||
| } | ||||
|  | ||||
| #ifdef WITH_VERBOSE_MODE | ||||
| static const char * | ||||
| meta_workspace_manager_corner_to_string (MetaDisplayCorner corner) | ||||
| { | ||||
|   switch (corner) | ||||
|     { | ||||
|     case META_DISPLAY_TOPLEFT: | ||||
|       return "TopLeft"; | ||||
|     case META_DISPLAY_TOPRIGHT: | ||||
|       return "TopRight"; | ||||
|     case META_DISPLAY_BOTTOMLEFT: | ||||
|       return "BottomLeft"; | ||||
|     case META_DISPLAY_BOTTOMRIGHT: | ||||
|       return "BottomRight"; | ||||
|     } | ||||
|  | ||||
|   return "Unknown"; | ||||
| } | ||||
| #endif /* WITH_VERBOSE_MODE */ | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_calc_workspace_layout (MetaWorkspaceManager *workspace_manager, | ||||
|                                               int                   num_workspaces, | ||||
|                                               int                   current_space, | ||||
|                                               MetaWorkspaceLayout  *layout) | ||||
| { | ||||
|   int rows, cols; | ||||
|   int grid_area; | ||||
|   int *grid; | ||||
|   int i, r, c; | ||||
|   int current_row, current_col; | ||||
|  | ||||
|   rows = workspace_manager->rows_of_workspaces; | ||||
|   cols = workspace_manager->columns_of_workspaces; | ||||
|   if (rows <= 0 && cols <= 0) | ||||
|     cols = num_workspaces; | ||||
|  | ||||
|   if (rows <= 0) | ||||
|     rows = num_workspaces / cols + ((num_workspaces % cols) > 0 ? 1 : 0); | ||||
|   if (cols <= 0) | ||||
|     cols = num_workspaces / rows + ((num_workspaces % rows) > 0 ? 1 : 0); | ||||
|  | ||||
|   /* paranoia */ | ||||
|   if (rows < 1) | ||||
|     rows = 1; | ||||
|   if (cols < 1) | ||||
|     cols = 1; | ||||
|  | ||||
|   g_assert (rows != 0 && cols != 0); | ||||
|  | ||||
|   grid_area = rows * cols; | ||||
|  | ||||
|   meta_verbose ("Getting layout rows = %d cols = %d current = %d " | ||||
|                 "num_spaces = %d vertical = %s corner = %s\n", | ||||
|                 rows, cols, current_space, num_workspaces, | ||||
|                 workspace_manager->vertical_workspaces ? "(true)" : "(false)", | ||||
|                 meta_workspace_manager_corner_to_string (workspace_manager->starting_corner)); | ||||
|  | ||||
|   /* ok, we want to setup the distances in the workspace array to go | ||||
|    * in each direction. Remember, there are many ways that a workspace | ||||
|    * array can be setup. | ||||
|    * see http://www.freedesktop.org/standards/wm-spec/1.2/html/x109.html | ||||
|    * and look at the _NET_DESKTOP_LAYOUT section for details. | ||||
|    * For instance: | ||||
|    */ | ||||
|   /* starting_corner = META_DISPLAY_TOPLEFT | ||||
|    *  vertical_workspaces = 0                 vertical_workspaces=1 | ||||
|    *       1234                                    1357 | ||||
|    *       5678                                    2468 | ||||
|    * | ||||
|    * starting_corner = META_DISPLAY_TOPRIGHT | ||||
|    *  vertical_workspaces = 0                 vertical_workspaces=1 | ||||
|    *       4321                                    7531 | ||||
|    *       8765                                    8642 | ||||
|    * | ||||
|    * starting_corner = META_DISPLAY_BOTTOMLEFT | ||||
|    *  vertical_workspaces = 0                 vertical_workspaces=1 | ||||
|    *       5678                                    2468 | ||||
|    *       1234                                    1357 | ||||
|    * | ||||
|    * starting_corner = META_DISPLAY_BOTTOMRIGHT | ||||
|    *  vertical_workspaces = 0                 vertical_workspaces=1 | ||||
|    *       8765                                    8642 | ||||
|    *       4321                                    7531 | ||||
|    * | ||||
|    */ | ||||
|   /* keep in mind that we could have a ragged layout, e.g. the "8" | ||||
|    * in the above grids could be missing | ||||
|    */ | ||||
|  | ||||
|  | ||||
|   grid = g_new (int, grid_area); | ||||
|  | ||||
|   current_row = -1; | ||||
|   current_col = -1; | ||||
|   i = 0; | ||||
|  | ||||
|   switch (workspace_manager->starting_corner) | ||||
|     { | ||||
|     case META_DISPLAY_TOPLEFT: | ||||
|       if (workspace_manager->vertical_workspaces) | ||||
|         { | ||||
|           c = 0; | ||||
|           while (c < cols) | ||||
|             { | ||||
|               r = 0; | ||||
|               while (r < rows) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   ++r; | ||||
|                 } | ||||
|               ++c; | ||||
|             } | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           r = 0; | ||||
|           while (r < rows) | ||||
|             { | ||||
|               c = 0; | ||||
|               while (c < cols) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   ++c; | ||||
|                 } | ||||
|               ++r; | ||||
|             } | ||||
|         } | ||||
|       break; | ||||
|     case META_DISPLAY_TOPRIGHT: | ||||
|       if (workspace_manager->vertical_workspaces) | ||||
|         { | ||||
|           c = cols - 1; | ||||
|           while (c >= 0) | ||||
|             { | ||||
|               r = 0; | ||||
|               while (r < rows) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   ++r; | ||||
|                 } | ||||
|               --c; | ||||
|             } | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           r = 0; | ||||
|           while (r < rows) | ||||
|             { | ||||
|               c = cols - 1; | ||||
|               while (c >= 0) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   --c; | ||||
|                 } | ||||
|               ++r; | ||||
|             } | ||||
|         } | ||||
|       break; | ||||
|     case META_DISPLAY_BOTTOMLEFT: | ||||
|       if (workspace_manager->vertical_workspaces) | ||||
|         { | ||||
|           c = 0; | ||||
|           while (c < cols) | ||||
|             { | ||||
|               r = rows - 1; | ||||
|               while (r >= 0) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   --r; | ||||
|                 } | ||||
|               ++c; | ||||
|             } | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           r = rows - 1; | ||||
|           while (r >= 0) | ||||
|             { | ||||
|               c = 0; | ||||
|               while (c < cols) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   ++c; | ||||
|                 } | ||||
|               --r; | ||||
|             } | ||||
|         } | ||||
|       break; | ||||
|     case META_DISPLAY_BOTTOMRIGHT: | ||||
|       if (workspace_manager->vertical_workspaces) | ||||
|         { | ||||
|           c = cols - 1; | ||||
|           while (c >= 0) | ||||
|             { | ||||
|               r = rows - 1; | ||||
|               while (r >= 0) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   --r; | ||||
|                 } | ||||
|               --c; | ||||
|             } | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           r = rows - 1; | ||||
|           while (r >= 0) | ||||
|             { | ||||
|               c = cols - 1; | ||||
|               while (c >= 0) | ||||
|                 { | ||||
|                   grid[r*cols+c] = i; | ||||
|                   ++i; | ||||
|                   --c; | ||||
|                 } | ||||
|               --r; | ||||
|             } | ||||
|         } | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|   if (i != grid_area) | ||||
|     meta_bug ("did not fill in the whole workspace grid in %s (%d filled)\n", | ||||
|               G_STRFUNC, i); | ||||
|  | ||||
|   current_row = 0; | ||||
|   current_col = 0; | ||||
|   r = 0; | ||||
|   while (r < rows) | ||||
|     { | ||||
|       c = 0; | ||||
|       while (c < cols) | ||||
|         { | ||||
|           if (grid[r*cols+c] == current_space) | ||||
|             { | ||||
|               current_row = r; | ||||
|               current_col = c; | ||||
|             } | ||||
|           else if (grid[r*cols+c] >= num_workspaces) | ||||
|             { | ||||
|               /* flag nonexistent spaces with -1 */ | ||||
|               grid[r*cols+c] = -1; | ||||
|             } | ||||
|           ++c; | ||||
|         } | ||||
|       ++r; | ||||
|     } | ||||
|  | ||||
|   layout->rows = rows; | ||||
|   layout->cols = cols; | ||||
|   layout->grid = grid; | ||||
|   layout->grid_area = grid_area; | ||||
|   layout->current_row = current_row; | ||||
|   layout->current_col = current_col; | ||||
|  | ||||
| #ifdef WITH_VERBOSE_MODE | ||||
|   if (meta_is_verbose ()) | ||||
|     { | ||||
|       r = 0; | ||||
|       while (r < layout->rows) | ||||
|         { | ||||
|           meta_verbose (" "); | ||||
|           meta_push_no_msg_prefix (); | ||||
|           c = 0; | ||||
|           while (c < layout->cols) | ||||
|             { | ||||
|               if (r == layout->current_row && | ||||
|                   c == layout->current_col) | ||||
|                 meta_verbose ("*%2d ", layout->grid[r*layout->cols+c]); | ||||
|               else | ||||
|                 meta_verbose ("%3d ", layout->grid[r*layout->cols+c]); | ||||
|               ++c; | ||||
|             } | ||||
|           meta_verbose ("\n"); | ||||
|           meta_pop_no_msg_prefix (); | ||||
|           ++r; | ||||
|         } | ||||
|     } | ||||
| #endif /* WITH_VERBOSE_MODE */ | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_free_workspace_layout (MetaWorkspaceLayout *layout) | ||||
| { | ||||
|   g_free (layout->grid); | ||||
| } | ||||
|  | ||||
| static void | ||||
| queue_windows_showing (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   GSList *windows, *l; | ||||
|  | ||||
|   /* Must operate on all windows on display instead of just on the | ||||
|    * active_workspace's window list, because the active_workspace's | ||||
|    * window list may not contain the on_all_workspace windows. | ||||
|    */ | ||||
|   windows = meta_display_list_windows (workspace_manager->display, META_LIST_DEFAULT); | ||||
|  | ||||
|   for (l = windows; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWindow *w = l->data; | ||||
|       meta_window_queue (w, META_QUEUE_CALC_SHOWING); | ||||
|     } | ||||
|  | ||||
|   g_slist_free (windows); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_minimize_all_on_active_workspace_except (MetaWorkspaceManager *workspace_manager, | ||||
|                                                                 MetaWindow           *keep) | ||||
| { | ||||
|   GList *l; | ||||
|  | ||||
|   for (l = workspace_manager->active_workspace->windows; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWindow *w = l->data; | ||||
|  | ||||
|       if (w->has_minimize_func && w != keep) | ||||
| 	meta_window_minimize (w); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_show_desktop (MetaWorkspaceManager *workspace_manager, | ||||
|                                      guint32               timestamp) | ||||
| { | ||||
|   GList *l; | ||||
|  | ||||
|   if (workspace_manager->active_workspace->showing_desktop) | ||||
|     return; | ||||
|  | ||||
|   workspace_manager->active_workspace->showing_desktop = TRUE; | ||||
|  | ||||
|   queue_windows_showing (workspace_manager); | ||||
|  | ||||
|   /* Focus the most recently used META_WINDOW_DESKTOP window, if there is one; | ||||
|    * see bug 159257. | ||||
|    */ | ||||
|   for (l = workspace_manager->active_workspace->mru_list; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaWindow *w = l->data; | ||||
|  | ||||
|       if (w->type == META_WINDOW_DESKTOP) | ||||
|         { | ||||
|           meta_window_focus (w, timestamp); | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   g_signal_emit (workspace_manager, workspace_manager_signals[SHOWING_DESKTOP_CHANGED], 0, NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_workspace_manager_unshow_desktop (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   if (!workspace_manager->active_workspace->showing_desktop) | ||||
|     return; | ||||
|  | ||||
|   workspace_manager->active_workspace->showing_desktop = FALSE; | ||||
|  | ||||
|   queue_windows_showing (workspace_manager); | ||||
|  | ||||
|   g_signal_emit (workspace_manager, workspace_manager_signals[SHOWING_DESKTOP_CHANGED], 0, NULL); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_workspace_manager_get_workspaces: (skip) | ||||
|  * @workspace_manager: a #MetaWorkspaceManager | ||||
|  * | ||||
|  * Returns: (transfer none) (element-type Meta.Workspace): The workspaces for @display | ||||
|  */ | ||||
| GList * | ||||
| meta_workspace_manager_get_workspaces (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   return workspace_manager->workspaces; | ||||
| } | ||||
|  | ||||
| int | ||||
| meta_workspace_manager_get_active_workspace_index (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   MetaWorkspace *active = workspace_manager->active_workspace; | ||||
|  | ||||
|   if (!active) | ||||
|     return -1; | ||||
|  | ||||
|   return meta_workspace_index (active); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_workspace_manager_get_active_workspace: | ||||
|  * @workspace_manager: A #MetaWorkspaceManager | ||||
|  * | ||||
|  * Returns: (transfer none): The current workspace | ||||
|  */ | ||||
| MetaWorkspace * | ||||
| meta_workspace_manager_get_active_workspace (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   return workspace_manager->active_workspace; | ||||
| } | ||||
|  | ||||
| void  | ||||
| meta_workspace_manager_workspace_switched (MetaWorkspaceManager *workspace_manager, | ||||
|                                            int                   from, | ||||
|                                            int                   to, | ||||
|                                            MetaMotionDirection   direction) | ||||
| { | ||||
|   g_signal_emit (workspace_manager, workspace_manager_signals[WORKSPACE_SWITCHED], 0, | ||||
|                  from, to, direction); | ||||
| } | ||||
|  | ||||
| static void | ||||
| prefs_changed_callback (MetaPreference pref, | ||||
|                         void          *data) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = data; | ||||
|  | ||||
|   if ((pref == META_PREF_NUM_WORKSPACES || | ||||
|             pref == META_PREF_DYNAMIC_WORKSPACES) && | ||||
|             !meta_prefs_get_dynamic_workspaces ()) | ||||
|     { | ||||
|       /* GSettings doesn't provide timestamps, but luckily update_num_workspaces | ||||
|        * often doesn't need it... | ||||
|        */ | ||||
|       guint32 timestamp = | ||||
|         meta_display_get_current_time_roundtrip (workspace_manager->display); | ||||
|       int new_num = meta_prefs_get_num_workspaces (); | ||||
|       meta_workspace_manager_update_num_workspaces (workspace_manager, timestamp, new_num); | ||||
|     } | ||||
| } | ||||
| @@ -36,6 +36,7 @@ | ||||
| #include <stdlib.h> | ||||
| #include "keybindings-private.h" | ||||
| #include "meta-accel-parse.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| /* If you add a key, it needs updating in init() and in the gsettings | ||||
|  * notify listener and of course in the .schemas file. | ||||
| @@ -137,13 +138,6 @@ static void bindings_changed (GSettings      *settings, | ||||
|                               gchar          *key, | ||||
|                               gpointer        data); | ||||
|  | ||||
| static void shell_shows_app_menu_changed (GtkSettings *settings, | ||||
|                                           GParamSpec  *pspec, | ||||
|                                           gpointer     data); | ||||
|  | ||||
| static void update_cursor_size_from_gtk (GtkSettings *settings, | ||||
|                                          GParamSpec *pspec, | ||||
|                                          gpointer data); | ||||
| static void update_cursor_size (void); | ||||
|  | ||||
| static void queue_changed (MetaPreference  pref); | ||||
| @@ -160,7 +154,6 @@ static void     do_override               (char *key, char *schema); | ||||
|  | ||||
| static void     init_bindings             (void); | ||||
|  | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   MetaPrefsChangedFunc func; | ||||
| @@ -976,14 +969,6 @@ meta_prefs_init (void) | ||||
|                       G_CALLBACK (wayland_settings_changed), NULL); | ||||
|   g_hash_table_insert (settings_schemas, g_strdup (SCHEMA_INTERFACE), settings); | ||||
|  | ||||
|   g_signal_connect (gtk_settings_get_default (), | ||||
|                     "notify::gtk-shell-shows-app-menu", | ||||
|                     G_CALLBACK (shell_shows_app_menu_changed), NULL); | ||||
|  | ||||
|   if (!meta_is_wayland_compositor ()) | ||||
|     g_signal_connect (gtk_settings_get_default (), "notify::gtk-cursor-theme-size", | ||||
|                       G_CALLBACK (update_cursor_size_from_gtk), NULL); | ||||
|  | ||||
|   settings = g_settings_new (SCHEMA_INPUT_SOURCES); | ||||
|   g_signal_connect (settings, "changed::" KEY_XKB_OPTIONS, | ||||
|                     G_CALLBACK (settings_changed), NULL); | ||||
| @@ -1005,7 +990,6 @@ meta_prefs_init (void) | ||||
|   handle_preference_init_int (); | ||||
|  | ||||
|   update_cursor_size (); | ||||
|   shell_shows_app_menu_changed (gtk_settings_get_default (), NULL, NULL); | ||||
|  | ||||
|   init_bindings (); | ||||
| } | ||||
| @@ -1220,27 +1204,6 @@ bindings_changed (GSettings *settings, | ||||
|   g_strfreev (strokes); | ||||
| } | ||||
|  | ||||
| static void | ||||
| shell_shows_app_menu_changed (GtkSettings *settings, | ||||
|                               GParamSpec *pspec, | ||||
|                               gpointer data) | ||||
| { | ||||
|   int shell_shows_app_menu = 1; | ||||
|   gboolean changed = FALSE; | ||||
|  | ||||
|   g_object_get (settings, | ||||
|                 "gtk-shell-shows-app-menu", &shell_shows_app_menu, | ||||
|                 NULL); | ||||
|  | ||||
|  | ||||
|   changed = (show_fallback_app_menu == !!shell_shows_app_menu); | ||||
|  | ||||
|   show_fallback_app_menu = !shell_shows_app_menu; | ||||
|  | ||||
|   if (changed) | ||||
|     queue_changed (META_PREF_BUTTON_LAYOUT); | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_cursor_size (void) | ||||
| { | ||||
| @@ -1255,13 +1218,9 @@ update_cursor_size (void) | ||||
|       cursor_size = | ||||
|         g_settings_get_int (SETTINGS (SCHEMA_INTERFACE), "cursor-size"); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       update_cursor_size_from_gtk (gtk_settings_get_default (), NULL, NULL); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| void | ||||
| update_cursor_size_from_gtk (GtkSettings *settings, | ||||
|                              GParamSpec *pspec, | ||||
|                              gpointer data) | ||||
| @@ -1345,6 +1304,19 @@ meta_prefs_get_show_fallback_app_menu (void) | ||||
|   return show_fallback_app_menu; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_prefs_set_show_fallback_app_menu (gboolean whether) | ||||
| { | ||||
|   gboolean changed = FALSE; | ||||
|  | ||||
|   changed = (show_fallback_app_menu == !whether); | ||||
|  | ||||
|   show_fallback_app_menu = whether; | ||||
|  | ||||
|   if (changed) | ||||
|     queue_changed (META_PREF_BUTTON_LAYOUT); | ||||
| } | ||||
|  | ||||
| const char* | ||||
| meta_prefs_get_cursor_theme (void) | ||||
| { | ||||
|   | ||||
| @@ -43,21 +43,16 @@ | ||||
| #include "ui.h" | ||||
| #include "util-private.h" | ||||
| #include "display-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| static gboolean restart_helper_started = FALSE; | ||||
| static gboolean restart_message_shown = FALSE; | ||||
| static gboolean is_restart = FALSE; | ||||
|  | ||||
| void | ||||
| meta_restart_init (void) | ||||
| meta_set_is_restart (gboolean whether) | ||||
| { | ||||
|   Display *xdisplay = meta_ui_get_display (); | ||||
|   Atom atom_restart_helper = XInternAtom (xdisplay, "_MUTTER_RESTART_HELPER", False); | ||||
|   Window restart_helper_window = None; | ||||
|  | ||||
|   restart_helper_window = XGetSelectionOwner (xdisplay, atom_restart_helper); | ||||
|   if (restart_helper_window) | ||||
|     is_restart = TRUE; | ||||
|   is_restart = whether; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -186,17 +181,6 @@ meta_restart (const char *message) | ||||
|   return; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_restart_finish (void) | ||||
| { | ||||
|   if (is_restart) | ||||
|     { | ||||
|       Display *xdisplay = meta_display_get_xdisplay (meta_get_display ()); | ||||
|       Atom atom_restart_helper = XInternAtom (xdisplay, "_MUTTER_RESTART_HELPER", False); | ||||
|       XSetSelectionOwner (xdisplay, atom_restart_helper, None, CurrentTime); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_is_restart: | ||||
|  * | ||||
|   | ||||
| @@ -1,194 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /** | ||||
|  * \file screen-private.h  Screens which Mutter manages | ||||
|  * | ||||
|  * Managing X screens. | ||||
|  * This file contains methods on this class which are available to | ||||
|  * routines in core but not outside it.  (See screen.h for the routines | ||||
|  * which the rest of the world is allowed to use.) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_SCREEN_PRIVATE_H | ||||
| #define META_SCREEN_PRIVATE_H | ||||
|  | ||||
| #include "display-private.h" | ||||
| #include <meta/screen.h> | ||||
| #include <X11/Xutil.h> | ||||
| #include "stack-tracker.h" | ||||
| #include "ui.h" | ||||
| #include "meta-monitor-manager-private.h" | ||||
|  | ||||
| typedef void (* MetaScreenWindowFunc) (MetaWindow *window, | ||||
|                                        gpointer    user_data); | ||||
|  | ||||
| #define META_WIREFRAME_XOR_LINE_WIDTH 2 | ||||
|  | ||||
| struct _MetaScreen | ||||
| { | ||||
|   GObject parent_instance; | ||||
|  | ||||
|   MetaDisplay *display; | ||||
|   char *screen_name; | ||||
|   Window xroot; | ||||
|   int default_depth; | ||||
|   Visual *default_xvisual; | ||||
|   MetaRectangle rect;  /* Size of screen; rect.x & rect.y are always 0 */ | ||||
|   MetaUI *ui; | ||||
|  | ||||
|   guint tile_preview_timeout_id; | ||||
|  | ||||
|   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; | ||||
|   MetaStackTracker *stack_tracker; | ||||
|  | ||||
|   MetaCursor current_cursor; | ||||
|  | ||||
|   Window wm_sn_selection_window; | ||||
|   Atom wm_sn_atom; | ||||
|   guint32 wm_sn_timestamp; | ||||
|  | ||||
|   gboolean has_xinerama_indices; | ||||
|  | ||||
|   GSList *startup_sequences; | ||||
|  | ||||
|   Window wm_cm_selection_window; | ||||
|   guint work_area_later; | ||||
|   guint check_fullscreen_later; | ||||
|  | ||||
|   int rows_of_workspaces; | ||||
|   int columns_of_workspaces; | ||||
|   MetaScreenCorner starting_corner; | ||||
|   guint vertical_workspaces : 1; | ||||
|   guint workspace_layout_overridden : 1; | ||||
|  | ||||
|   guint keys_grabbed : 1; | ||||
|  | ||||
|   int closing; | ||||
|  | ||||
|   /* Instead of unmapping withdrawn windows we can leave them mapped | ||||
|    * and restack them below a guard window. When using a compositor | ||||
|    * this allows us to provide live previews of unmapped windows */ | ||||
|   Window guard_window; | ||||
|  | ||||
|   Window composite_overlay_window; | ||||
| }; | ||||
|  | ||||
| struct _MetaScreenClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   void (*restacked)         (MetaScreen *); | ||||
|   void (*workareas_changed) (MetaScreen *); | ||||
|   void (*monitors_changed)  (MetaScreen *); | ||||
| }; | ||||
|  | ||||
| MetaScreen*   meta_screen_new                 (MetaDisplay                *display, | ||||
|                                                guint32                     timestamp); | ||||
| void          meta_screen_free                (MetaScreen                 *screen, | ||||
|                                                guint32                     timestamp); | ||||
| void          meta_screen_init_workspaces     (MetaScreen                 *screen); | ||||
| void          meta_screen_manage_all_windows  (MetaScreen                 *screen); | ||||
| void          meta_screen_foreach_window      (MetaScreen                 *screen, | ||||
|                                                MetaListWindowsFlags        flags, | ||||
|                                                MetaScreenWindowFunc        func, | ||||
|                                                gpointer                    data); | ||||
|  | ||||
| void          meta_screen_update_cursor       (MetaScreen                 *screen); | ||||
|  | ||||
| void          meta_screen_update_tile_preview          (MetaScreen    *screen, | ||||
|                                                         gboolean       delay); | ||||
| void          meta_screen_hide_tile_preview            (MetaScreen    *screen); | ||||
|  | ||||
| MetaWindow*   meta_screen_get_mouse_window     (MetaScreen                 *screen, | ||||
|                                                 MetaWindow                 *not_this_one); | ||||
|  | ||||
| void          meta_screen_update_workspace_layout (MetaScreen             *screen); | ||||
| void          meta_screen_update_workspace_names  (MetaScreen             *screen); | ||||
| void          meta_screen_queue_workarea_recalc   (MetaScreen             *screen); | ||||
| void          meta_screen_queue_check_fullscreen  (MetaScreen             *screen); | ||||
|  | ||||
|  | ||||
| Window meta_create_offscreen_window (Display *xdisplay, | ||||
|                                      Window   parent, | ||||
|                                      long     valuemask); | ||||
|  | ||||
| typedef struct MetaWorkspaceLayout MetaWorkspaceLayout; | ||||
|  | ||||
| struct MetaWorkspaceLayout | ||||
| { | ||||
|   int rows; | ||||
|   int cols; | ||||
|   int *grid; | ||||
|   int grid_area; | ||||
|   int current_row; | ||||
|   int current_col; | ||||
| }; | ||||
|  | ||||
| void meta_screen_calc_workspace_layout (MetaScreen          *screen, | ||||
|                                         int                  num_workspaces, | ||||
|                                         int                  current_space, | ||||
|                                         MetaWorkspaceLayout *layout); | ||||
| void meta_screen_free_workspace_layout (MetaWorkspaceLayout *layout); | ||||
|  | ||||
| void     meta_screen_minimize_all_on_active_workspace_except (MetaScreen *screen, | ||||
|                                                               MetaWindow *keep); | ||||
|  | ||||
| /* Show/hide the desktop (temporarily hide all windows) */ | ||||
| void     meta_screen_show_desktop        (MetaScreen *screen, | ||||
|                                           guint32     timestamp); | ||||
| void     meta_screen_unshow_desktop      (MetaScreen *screen); | ||||
|  | ||||
| /* Update whether the destkop is being shown for the current active_workspace */ | ||||
| void     meta_screen_update_showing_desktop_hint          (MetaScreen *screen); | ||||
|  | ||||
| gboolean meta_screen_apply_startup_properties (MetaScreen *screen, | ||||
|                                                MetaWindow *window); | ||||
| void     meta_screen_restacked (MetaScreen *screen); | ||||
|  | ||||
| void     meta_screen_workspace_switched (MetaScreen         *screen, | ||||
|                                          int                 from, | ||||
|                                          int                 to, | ||||
|                                          MetaMotionDirection direction); | ||||
|  | ||||
| void meta_screen_set_active_workspace_hint (MetaScreen *screen); | ||||
|  | ||||
| void meta_screen_create_guard_window (MetaScreen *screen); | ||||
|  | ||||
| gboolean meta_screen_handle_xevent (MetaScreen *screen, | ||||
|                                     XEvent     *xevent); | ||||
|  | ||||
| MetaLogicalMonitor * meta_screen_xinerama_index_to_logical_monitor (MetaScreen *screen, | ||||
|                                                                     int         index); | ||||
|  | ||||
| int meta_screen_logical_monitor_to_xinerama_index (MetaScreen         *screen, | ||||
|                                                    MetaLogicalMonitor *logical_monitor); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										2862
									
								
								src/core/screen.c
									
									
									
									
									
								
							
							
						
						
									
										2862
									
								
								src/core/screen.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -37,13 +37,15 @@ | ||||
| #include <string.h> | ||||
|  | ||||
| #include "frame.h" | ||||
| #include "screen-private.h" | ||||
| #include "display-private.h" | ||||
| #include "stack-tracker.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <meta/util.h> | ||||
|  | ||||
| #include <meta/compositor.h> | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| /* The complexity here comes from resolving two competing factors: | ||||
|  * | ||||
|  *  - We need to have a view of the stacking order that takes into | ||||
| @@ -140,7 +142,7 @@ union _MetaStackOp | ||||
|  | ||||
| struct _MetaStackTracker | ||||
| { | ||||
|   MetaScreen *screen; | ||||
|   MetaDisplay *display; | ||||
|  | ||||
|   /* This is the serial of the last request we made that was reflected | ||||
|    * in xserver_stack | ||||
| @@ -175,7 +177,7 @@ static inline const char * | ||||
| get_window_desc (MetaStackTracker *tracker, | ||||
|                  guint64           window) | ||||
| { | ||||
|   return meta_display_describe_stack_id (tracker->screen->display, window); | ||||
|   return meta_display_describe_stack_id (tracker->display, window); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -474,41 +476,47 @@ copy_stack (GArray *stack) | ||||
| } | ||||
|  | ||||
| static void | ||||
| query_xserver_stack (MetaStackTracker *tracker) | ||||
| query_xserver_stack (MetaDisplay      *display, | ||||
|                      MetaStackTracker *tracker) | ||||
| { | ||||
|   MetaScreen *screen = tracker->screen; | ||||
|   MetaX11Display *x11_display = display->x11_display; | ||||
|   Window ignored1, ignored2; | ||||
|   Window *children; | ||||
|   guint n_children; | ||||
|   guint i; | ||||
|   guint i, old_len; | ||||
|  | ||||
|   tracker->xserver_serial = XNextRequest (screen->display->xdisplay); | ||||
|   tracker->xserver_serial = XNextRequest (x11_display->xdisplay); | ||||
|  | ||||
|   XQueryTree (screen->display->xdisplay, | ||||
|               screen->xroot, | ||||
|   XQueryTree (x11_display->xdisplay, | ||||
|               x11_display->xroot, | ||||
|               &ignored1, &ignored2, &children, &n_children); | ||||
|  | ||||
|   tracker->verified_stack = g_array_sized_new (FALSE, FALSE, sizeof (guint64), n_children); | ||||
|   g_array_set_size (tracker->verified_stack, n_children); | ||||
|   old_len = tracker->verified_stack->len; | ||||
|  | ||||
|   g_array_set_size (tracker->verified_stack, old_len + n_children); | ||||
|  | ||||
|   for (i = 0; i < n_children; i++) | ||||
|     g_array_index (tracker->verified_stack, guint64, i) = children[i]; | ||||
|     g_array_index (tracker->verified_stack, guint64, old_len + i) = children[i]; | ||||
|  | ||||
|   XFree (children); | ||||
| } | ||||
|  | ||||
| MetaStackTracker * | ||||
| meta_stack_tracker_new (MetaScreen *screen) | ||||
| meta_stack_tracker_new (MetaDisplay *display) | ||||
| { | ||||
|   MetaStackTracker *tracker; | ||||
|  | ||||
|   tracker = g_new0 (MetaStackTracker, 1); | ||||
|   tracker->screen = screen; | ||||
|  | ||||
|   query_xserver_stack (tracker); | ||||
|   tracker->display = display; | ||||
|  | ||||
|   tracker->verified_stack = g_array_new (FALSE, FALSE, sizeof (guint64)); | ||||
|   tracker->unverified_predictions = g_queue_new (); | ||||
|  | ||||
|   g_signal_connect (display, | ||||
|                     "x11-display-opened", | ||||
|                     G_CALLBACK (query_xserver_stack), | ||||
|                     tracker); | ||||
|  | ||||
|   meta_stack_tracker_dump (tracker); | ||||
|  | ||||
|   return tracker; | ||||
| @@ -528,6 +536,10 @@ meta_stack_tracker_free (MetaStackTracker *tracker) | ||||
|   g_queue_free (tracker->unverified_predictions); | ||||
|   tracker->unverified_predictions = NULL; | ||||
|  | ||||
|   g_signal_handlers_disconnect_by_func (tracker->display, | ||||
|                                         (gpointer)query_xserver_stack, | ||||
|                                         tracker); | ||||
|  | ||||
|   g_free (tracker); | ||||
| } | ||||
|  | ||||
| @@ -849,8 +861,9 @@ meta_stack_tracker_sync_stack (MetaStackTracker *tracker) | ||||
|  | ||||
|       if (META_STACK_ID_IS_X11 (window)) | ||||
|         { | ||||
|           MetaX11Display *x11_display = tracker->display->x11_display; | ||||
|           MetaWindow *meta_window = | ||||
|             meta_display_lookup_x_window (tracker->screen->display, (Window)window); | ||||
|             meta_x11_display_lookup_x_window (x11_display, (Window)window); | ||||
|  | ||||
|           /* When mapping back from xwindow to MetaWindow we have to be a bit careful; | ||||
|            * children of the root could include unmapped windows created by toolkits | ||||
| @@ -865,14 +878,14 @@ meta_stack_tracker_sync_stack (MetaStackTracker *tracker) | ||||
|         } | ||||
|       else | ||||
|         meta_windows = g_list_prepend (meta_windows, | ||||
|                                        meta_display_lookup_stamp (tracker->screen->display, window)); | ||||
|                                        meta_display_lookup_stamp (tracker->display, window)); | ||||
|     } | ||||
|  | ||||
|   meta_compositor_sync_stack (tracker->screen->display->compositor, | ||||
|   meta_compositor_sync_stack (tracker->display->compositor, | ||||
|                               meta_windows); | ||||
|   g_list_free (meta_windows); | ||||
|  | ||||
|   meta_screen_restacked (tracker->screen); | ||||
|   meta_display_restacked (tracker->display); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| @@ -977,6 +990,7 @@ meta_stack_tracker_lower_below (MetaStackTracker *tracker, | ||||
|                                 guint64           sibling) | ||||
| { | ||||
|   gulong serial = 0; | ||||
|   MetaX11Display *x11_display = tracker->display->x11_display; | ||||
|  | ||||
|   if (META_STACK_ID_IS_X11 (window)) | ||||
|     { | ||||
| @@ -985,18 +999,18 @@ meta_stack_tracker_lower_below (MetaStackTracker *tracker, | ||||
|  | ||||
|       if (changes.sibling != find_x11_sibling_upwards (tracker, window)) | ||||
|         { | ||||
|           serial = XNextRequest (tracker->screen->display->xdisplay); | ||||
|           serial = XNextRequest (x11_display->xdisplay); | ||||
|  | ||||
|           meta_error_trap_push (tracker->screen->display); | ||||
|           meta_x11_error_trap_push (x11_display); | ||||
|  | ||||
|           changes.stack_mode = changes.sibling ? Below : Above; | ||||
|  | ||||
|           XConfigureWindow (tracker->screen->display->xdisplay, | ||||
|           XConfigureWindow (x11_display->xdisplay, | ||||
|                             window, | ||||
|                             (changes.sibling ? CWSibling : 0) | CWStackMode, | ||||
|                             &changes); | ||||
|  | ||||
|           meta_error_trap_pop (tracker->screen->display); | ||||
|           meta_x11_error_trap_pop (x11_display); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -1011,6 +1025,7 @@ meta_stack_tracker_raise_above (MetaStackTracker *tracker, | ||||
|                                 guint64           sibling) | ||||
| { | ||||
|   gulong serial = 0; | ||||
|   MetaX11Display *x11_display = tracker->display->x11_display; | ||||
|  | ||||
|   if (META_STACK_ID_IS_X11 (window)) | ||||
|     { | ||||
| @@ -1019,18 +1034,18 @@ meta_stack_tracker_raise_above (MetaStackTracker *tracker, | ||||
|  | ||||
|       if (changes.sibling != find_x11_sibling_downwards (tracker, window)) | ||||
|         { | ||||
|           serial = XNextRequest (tracker->screen->display->xdisplay); | ||||
|           serial = XNextRequest (x11_display->xdisplay); | ||||
|  | ||||
|           meta_error_trap_push (tracker->screen->display); | ||||
|           meta_x11_error_trap_push (x11_display); | ||||
|  | ||||
|           changes.stack_mode = changes.sibling ? Above : Below; | ||||
|  | ||||
|           XConfigureWindow (tracker->screen->display->xdisplay, | ||||
|           XConfigureWindow (x11_display->xdisplay, | ||||
|                             (Window)window, | ||||
|                             (changes.sibling ? CWSibling : 0) | CWStackMode, | ||||
|                             &changes); | ||||
|  | ||||
|           meta_error_trap_pop (tracker->screen->display); | ||||
|           meta_x11_error_trap_pop (x11_display); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -1057,7 +1072,7 @@ meta_stack_tracker_keep_override_redirect_on_top (MetaStackTracker *tracker) | ||||
|  | ||||
|   for (i = n_windows - 1; i >= 0; i--) | ||||
|     { | ||||
|       window = meta_display_lookup_stack_id (tracker->screen->display, stack[i]); | ||||
|       window = meta_display_lookup_stack_id (tracker->display, stack[i]); | ||||
|       if (window && window->layer != META_LAYER_OVERRIDE_REDIRECT) | ||||
|         break; | ||||
|     } | ||||
| @@ -1066,7 +1081,7 @@ meta_stack_tracker_keep_override_redirect_on_top (MetaStackTracker *tracker) | ||||
|  | ||||
|   for (i -= 1; i >= 0; i--) | ||||
|     { | ||||
|       window = meta_display_lookup_stack_id (tracker->screen->display, stack[i]); | ||||
|       window = meta_display_lookup_stack_id (tracker->display, stack[i]); | ||||
|       if (window && window->layer == META_LAYER_OVERRIDE_REDIRECT) | ||||
|         { | ||||
|           meta_stack_tracker_raise_above (tracker, stack[i], stack[topmost_non_or]); | ||||
| @@ -1098,9 +1113,9 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker, | ||||
|   old_pos = n_windows - 1; | ||||
|   for (old_pos = n_windows - 1; old_pos >= 0; old_pos--) | ||||
|     { | ||||
|       MetaWindow *old_window = meta_display_lookup_stack_id (tracker->screen->display, windows[old_pos]); | ||||
|       MetaWindow *old_window = meta_display_lookup_stack_id (tracker->display, windows[old_pos]); | ||||
|       if ((old_window && !old_window->override_redirect && !old_window->unmanaging) || | ||||
|           windows[old_pos] == tracker->screen->guard_window) | ||||
|           windows[old_pos] == tracker->display->x11_display->guard_window) | ||||
|         break; | ||||
|     } | ||||
|   g_assert (old_pos >= 0); | ||||
| @@ -1119,7 +1134,7 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker, | ||||
|  | ||||
|   while (old_pos >= 0 && new_pos >= 0) | ||||
|     { | ||||
|       if (windows[old_pos] == tracker->screen->guard_window) | ||||
|       if (windows[old_pos] == tracker->display->x11_display->guard_window) | ||||
|         break; | ||||
|  | ||||
|       if (windows[old_pos] == managed[new_pos]) | ||||
| @@ -1129,7 +1144,7 @@ meta_stack_tracker_restack_managed (MetaStackTracker *tracker, | ||||
|           continue; | ||||
|         } | ||||
|  | ||||
|       MetaWindow *old_window = meta_display_lookup_stack_id (tracker->screen->display, windows[old_pos]); | ||||
|       MetaWindow *old_window = meta_display_lookup_stack_id (tracker->display, windows[old_pos]); | ||||
|       if (!old_window || old_window->override_redirect || old_window->unmanaging) | ||||
|         { | ||||
|           old_pos--; | ||||
|   | ||||
| @@ -34,12 +34,12 @@ | ||||
| #ifndef META_STACK_TRACKER_H | ||||
| #define META_STACK_TRACKER_H | ||||
|  | ||||
| #include <meta/screen.h> | ||||
| #include <meta/display.h> | ||||
| #include <meta/window.h> | ||||
|  | ||||
| typedef struct _MetaStackTracker MetaStackTracker; | ||||
|  | ||||
| MetaStackTracker *meta_stack_tracker_new  (MetaScreen       *screen); | ||||
| MetaStackTracker *meta_stack_tracker_new  (MetaDisplay      *display); | ||||
| void              meta_stack_tracker_free (MetaStackTracker *tracker); | ||||
|  | ||||
| /* These functions are called when we make an X call that changes the | ||||
|   | ||||
| @@ -27,8 +27,9 @@ | ||||
|  | ||||
| #include <config.h> | ||||
| #include "stack.h" | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "window-private.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "frame.h" | ||||
| #include <meta/group.h> | ||||
| #include <meta/prefs.h> | ||||
| @@ -37,6 +38,7 @@ | ||||
|  | ||||
| #include <X11/Xatom.h> | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include "x11/group-private.h" | ||||
|  | ||||
| #define WINDOW_HAS_TRANSIENT_TYPE(w)                    \ | ||||
| @@ -62,14 +64,14 @@ static void stack_do_resort           (MetaStack *stack); | ||||
|  | ||||
| static void stack_ensure_sorted (MetaStack *stack); | ||||
|  | ||||
| MetaStack* | ||||
| meta_stack_new (MetaScreen *screen) | ||||
| MetaStack * | ||||
| meta_stack_new (MetaDisplay *display) | ||||
| { | ||||
|   MetaStack *stack; | ||||
|  | ||||
|   stack = g_new (MetaStack, 1); | ||||
|  | ||||
|   stack->screen = screen; | ||||
|   stack->display = display; | ||||
|   stack->xwindows = g_array_new (FALSE, FALSE, sizeof (Window)); | ||||
|  | ||||
|   stack->sorted = NULL; | ||||
| @@ -102,6 +104,8 @@ void | ||||
| meta_stack_add (MetaStack  *stack, | ||||
|                 MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   g_return_if_fail (!window->override_redirect); | ||||
|  | ||||
|   meta_topic (META_DEBUG_STACK, "Adding window %s to the stack\n", window->desc); | ||||
| @@ -118,13 +122,15 @@ meta_stack_add (MetaStack  *stack, | ||||
|               window->desc, window->stack_position); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (stack, workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stack_remove (MetaStack  *stack, | ||||
|                    MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   meta_topic (META_DEBUG_STACK, "Removing window %s from the stack\n", window->desc); | ||||
|  | ||||
|   if (window->stack_position < 0) | ||||
| @@ -158,27 +164,29 @@ meta_stack_remove (MetaStack  *stack, | ||||
|     } | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (stack, workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stack_update_layer (MetaStack  *stack, | ||||
|                          MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   stack->need_relayer = TRUE; | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (stack, workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stack_update_transient (MetaStack  *stack, | ||||
|                              MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   stack->need_constrain = TRUE; | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (stack, workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| /* raise/lower within a layer */ | ||||
| @@ -186,6 +194,7 @@ void | ||||
| meta_stack_raise (MetaStack  *stack, | ||||
|                   MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   GList *l; | ||||
|   int max_stack_position = window->stack_position; | ||||
|   MetaWorkspace *workspace; | ||||
| @@ -207,13 +216,14 @@ meta_stack_raise (MetaStack  *stack, | ||||
|   meta_window_set_stack_position_no_sync (window, max_stack_position); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (stack, workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stack_lower (MetaStack  *stack, | ||||
|                   MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   GList *l; | ||||
|   int min_stack_position = window->stack_position; | ||||
|   MetaWorkspace *workspace; | ||||
| @@ -235,7 +245,7 @@ meta_stack_lower (MetaStack  *stack, | ||||
|   meta_window_set_stack_position_no_sync (window, min_stack_position); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (stack, workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -496,8 +506,6 @@ add_constraint (Constraint **constraints, | ||||
| { | ||||
|   Constraint *c; | ||||
|  | ||||
|   g_assert (above->screen == below->screen); | ||||
|  | ||||
|   /* check if constraint is a duplicate */ | ||||
|   c = constraints[below->stack_position]; | ||||
|   while (c != NULL) | ||||
| @@ -558,7 +566,6 @@ create_constraints (Constraint **constraints, | ||||
|               MetaWindow *group_window = tmp2->data; | ||||
|  | ||||
|               if (!WINDOW_IN_STACK (group_window) || | ||||
|                   w->screen != group_window->screen || | ||||
|                   group_window->override_redirect) | ||||
|                 { | ||||
|                   tmp2 = tmp2->next; | ||||
| @@ -950,7 +957,7 @@ stack_do_resort (MetaStack *stack) | ||||
|   stack->sorted = g_list_sort (stack->sorted, | ||||
|                                (GCompareFunc) compare_window_position); | ||||
|  | ||||
|   meta_screen_queue_check_fullscreen (stack->screen); | ||||
|   meta_display_queue_check_fullscreen (stack->display); | ||||
|  | ||||
|   stack->need_resort = FALSE; | ||||
| } | ||||
| @@ -1057,7 +1064,7 @@ stack_sync_to_xserver (MetaStack *stack) | ||||
|  | ||||
|   /* The screen guard window sits above all hidden windows and acts as | ||||
|    * a barrier to input reaching these windows. */ | ||||
|   guint64 guard_window_id = stack->screen->guard_window; | ||||
|   guint64 guard_window_id = stack->display->x11_display->guard_window; | ||||
|   g_array_append_val (hidden_stack_ids, guard_window_id); | ||||
|  | ||||
|   /* Sync to server */ | ||||
| @@ -1065,25 +1072,25 @@ stack_sync_to_xserver (MetaStack *stack) | ||||
|   meta_topic (META_DEBUG_STACK, "Restacking %u windows\n", | ||||
|               all_root_children_stacked->len); | ||||
|  | ||||
|   meta_stack_tracker_restack_managed (stack->screen->stack_tracker, | ||||
|   meta_stack_tracker_restack_managed (stack->display->stack_tracker, | ||||
|                                       (guint64 *)all_root_children_stacked->data, | ||||
|                                       all_root_children_stacked->len); | ||||
|   meta_stack_tracker_restack_at_bottom (stack->screen->stack_tracker, | ||||
|   meta_stack_tracker_restack_at_bottom (stack->display->stack_tracker, | ||||
|                                         (guint64 *)hidden_stack_ids->data, | ||||
|                                         hidden_stack_ids->len); | ||||
|  | ||||
|   /* Sync _NET_CLIENT_LIST and _NET_CLIENT_LIST_STACKING */ | ||||
|  | ||||
|   XChangeProperty (stack->screen->display->xdisplay, | ||||
|                    stack->screen->xroot, | ||||
|                    stack->screen->display->atom__NET_CLIENT_LIST, | ||||
|   XChangeProperty (stack->display->x11_display->xdisplay, | ||||
|                    stack->display->x11_display->xroot, | ||||
|                    stack->display->x11_display->atom__NET_CLIENT_LIST, | ||||
|                    XA_WINDOW, | ||||
|                    32, PropModeReplace, | ||||
|                    (unsigned char *)stack->xwindows->data, | ||||
|                    stack->xwindows->len); | ||||
|   XChangeProperty (stack->screen->display->xdisplay, | ||||
|                    stack->screen->xroot, | ||||
|                    stack->screen->display->atom__NET_CLIENT_LIST_STACKING, | ||||
|   XChangeProperty (stack->display->x11_display->xdisplay, | ||||
|                    stack->display->x11_display->xroot, | ||||
|                    stack->display->x11_display->atom__NET_CLIENT_LIST_STACKING, | ||||
|                    XA_WINDOW, | ||||
|                    32, PropModeReplace, | ||||
|                    (unsigned char *)x11_stacked->data, | ||||
| @@ -1286,8 +1293,6 @@ meta_stack_windows_cmp  (MetaStack  *stack, | ||||
|                          MetaWindow *window_a, | ||||
|                          MetaWindow *window_b) | ||||
| { | ||||
|   g_return_val_if_fail (window_a->screen == window_b->screen, 0); | ||||
|  | ||||
|   /* -1 means a below b */ | ||||
|  | ||||
|   stack_ensure_sorted (stack); /* update constraints, layers */ | ||||
| @@ -1416,10 +1421,10 @@ meta_window_set_stack_position_no_sync (MetaWindow *window, | ||||
|   int low, high, delta; | ||||
|   GList *tmp; | ||||
|  | ||||
|   g_return_if_fail (window->screen->stack != NULL); | ||||
|   g_return_if_fail (window->display->stack != NULL); | ||||
|   g_return_if_fail (window->stack_position >= 0); | ||||
|   g_return_if_fail (position >= 0); | ||||
|   g_return_if_fail (position < window->screen->stack->n_positions); | ||||
|   g_return_if_fail (position < window->display->stack->n_positions); | ||||
|  | ||||
|   if (position == window->stack_position) | ||||
|     { | ||||
| @@ -1428,8 +1433,8 @@ meta_window_set_stack_position_no_sync (MetaWindow *window, | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   window->screen->stack->need_resort = TRUE; | ||||
|   window->screen->stack->need_constrain = TRUE; | ||||
|   window->display->stack->need_resort = TRUE; | ||||
|   window->display->stack->need_constrain = TRUE; | ||||
|  | ||||
|   if (position < window->stack_position) | ||||
|     { | ||||
| @@ -1444,7 +1449,7 @@ meta_window_set_stack_position_no_sync (MetaWindow *window, | ||||
|       delta = -1; | ||||
|     } | ||||
|  | ||||
|   tmp = window->screen->stack->sorted; | ||||
|   tmp = window->display->stack->sorted; | ||||
|   while (tmp != NULL) | ||||
|     { | ||||
|       MetaWindow *w = tmp->data; | ||||
| @@ -1467,8 +1472,10 @@ void | ||||
| meta_window_set_stack_position (MetaWindow *window, | ||||
|                                 int         position) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   meta_window_set_stack_position_no_sync (window, position); | ||||
|   stack_sync_to_xserver (window->screen->stack); | ||||
|   meta_stack_update_window_tile_matches (window->screen->stack, | ||||
|                                          window->screen->active_workspace); | ||||
|   stack_sync_to_xserver (window->display->stack); | ||||
|   meta_stack_update_window_tile_matches (window->display->stack, | ||||
|                                          workspace_manager->active_workspace); | ||||
| } | ||||
|   | ||||
| @@ -40,7 +40,7 @@ | ||||
|  * by layer, then by stack_position within each layer. | ||||
|  */ | ||||
|  | ||||
| #include "screen-private.h" | ||||
| #include "display-private.h" | ||||
|  | ||||
| /** | ||||
|  * A sorted list of windows bearing some level of resemblance to the stack of | ||||
| @@ -51,8 +51,8 @@ | ||||
|  */ | ||||
| struct _MetaStack | ||||
| { | ||||
|   /** The MetaScreen containing this stack. */ | ||||
|   MetaScreen *screen; | ||||
|   /** The MetaDisplay containing this stack. */ | ||||
|   MetaDisplay *display; | ||||
|  | ||||
|   /** | ||||
|    * A sequence of all the Windows (X handles, not MetaWindows) of the windows | ||||
| @@ -123,13 +123,13 @@ struct _MetaStack | ||||
|  | ||||
| /** | ||||
|  * meta_stack_new: | ||||
|  * @screen: The MetaScreen which will be the parent of this stack. | ||||
|  * @display: The MetaDisplay which will be the parent of this stack. | ||||
|  * | ||||
|  * Creates and initialises a MetaStack. | ||||
|  * | ||||
|  * Returns: The new screen. | ||||
|  * Returns: The new stack. | ||||
|  */ | ||||
| MetaStack *meta_stack_new       (MetaScreen     *screen); | ||||
| MetaStack *meta_stack_new       (MetaDisplay    *display); | ||||
|  | ||||
| /** | ||||
|  * meta_stack_free: | ||||
|   | ||||
| @@ -26,9 +26,9 @@ | ||||
|  | ||||
| #include <glib-object.h> | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "display-private.h" | ||||
| #include "screen-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include "startup-notification-private.h" | ||||
|  | ||||
| /* This should be fairly long, as it should never be required unless | ||||
| @@ -143,19 +143,19 @@ static void meta_startup_notification_ensure_timeout  (MetaStartupNotification * | ||||
| static void | ||||
| meta_startup_notification_update_feedback (MetaStartupNotification *sn) | ||||
| { | ||||
|   MetaScreen *screen = sn->display->screen; | ||||
|   MetaDisplay *display = sn->display; | ||||
|  | ||||
|   if (sn->startup_sequences != NULL) | ||||
|     { | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Setting busy cursor\n"); | ||||
|       meta_screen_set_cursor (screen, META_CURSOR_BUSY); | ||||
|       meta_display_set_cursor (display, META_CURSOR_BUSY); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Setting default cursor\n"); | ||||
|       meta_screen_set_cursor (screen, META_CURSOR_DEFAULT); | ||||
|       meta_display_set_cursor (display, META_CURSOR_DEFAULT); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -528,11 +528,6 @@ meta_startup_notification_finalize (GObject *object) | ||||
| { | ||||
|   MetaStartupNotification *sn = META_STARTUP_NOTIFICATION (object); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   sn_monitor_context_unref (sn->sn_context); | ||||
|   sn_display_unref (sn->sn_display); | ||||
| #endif | ||||
|  | ||||
|   if (sn->startup_sequence_timeout) | ||||
|     g_source_remove (sn->startup_sequence_timeout); | ||||
|  | ||||
| @@ -589,7 +584,7 @@ sn_error_trap_push (SnDisplay *sn_display, | ||||
|   MetaDisplay *display; | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   if (display != NULL) | ||||
|     meta_error_trap_push (display); | ||||
|     meta_x11_error_trap_push (display->x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -599,7 +594,7 @@ sn_error_trap_pop (SnDisplay *sn_display, | ||||
|   MetaDisplay *display; | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   if (display != NULL) | ||||
|     meta_error_trap_pop (display); | ||||
|     meta_x11_error_trap_pop (display->x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -660,6 +655,33 @@ meta_startup_notification_sn_event (SnMonitorEvent *event, | ||||
|  | ||||
|   sn_startup_sequence_unref (sequence); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_x11_display_opened (MetaStartupNotification *sn) | ||||
| { | ||||
|   MetaX11Display *x11_display = sn->display->x11_display; | ||||
|  | ||||
|   sn->sn_display = sn_display_new (x11_display->xdisplay, | ||||
|                                    sn_error_trap_push, | ||||
|                                    sn_error_trap_pop); | ||||
|  | ||||
|   sn->sn_context = | ||||
|     sn_monitor_context_new (sn->sn_display, | ||||
|                             meta_x11_display_get_screen_number (x11_display), | ||||
|                             meta_startup_notification_sn_event, | ||||
|                             sn, | ||||
|                             NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_x11_display_closing (MetaStartupNotification *sn) | ||||
| { | ||||
|   sn_monitor_context_unref (sn->sn_context); | ||||
|   sn->sn_context = NULL; | ||||
|  | ||||
|   sn_display_unref (sn->sn_display); | ||||
|   sn->sn_display = NULL; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| @@ -670,16 +692,22 @@ meta_startup_notification_constructed (GObject *object) | ||||
|   g_assert (sn->display != NULL); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   sn->sn_display = sn_display_new (sn->display->xdisplay, | ||||
|                                    sn_error_trap_push, | ||||
|                                    sn_error_trap_pop); | ||||
|   sn->sn_context = | ||||
|     sn_monitor_context_new (sn->sn_display, | ||||
|                             meta_ui_get_screen_number (), | ||||
|                             meta_startup_notification_sn_event, | ||||
|                             sn, | ||||
|                             NULL); | ||||
|   sn->sn_display = NULL; | ||||
|   sn->sn_context = NULL; | ||||
|  | ||||
|   g_signal_connect_object (sn->display, | ||||
|                           "x11-display-opened", | ||||
|                            G_CALLBACK (on_x11_display_opened), | ||||
|                            sn, | ||||
|                            G_CONNECT_SWAPPED); | ||||
|  | ||||
|   g_signal_connect_object (sn->display, | ||||
|                            "x11-display-closing", | ||||
|                            G_CALLBACK (on_x11_display_closing), | ||||
|                            sn, | ||||
|                            G_CONNECT_SWAPPED); | ||||
| #endif | ||||
|  | ||||
|   sn->startup_sequences = NULL; | ||||
|   sn->startup_sequence_timeout = 0; | ||||
| } | ||||
| @@ -753,6 +781,9 @@ meta_startup_notification_get_sequences (MetaStartupNotification *sn) | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   GSList *l; | ||||
|  | ||||
|   if (!sn->sn_display) | ||||
|     return sequences; | ||||
|  | ||||
|   /* We return a list of SnStartupSequences here */ | ||||
|   for (l = sn->startup_sequences; l; l = l->next) | ||||
|     { | ||||
|   | ||||
| @@ -36,7 +36,7 @@ | ||||
| #include <meta/compositor.h> | ||||
| #include <meta/window.h> | ||||
| #include <meta/meta-close-dialog.h> | ||||
| #include "screen-private.h" | ||||
| #include "backends/meta-logical-monitor.h" | ||||
| #include <meta/util.h> | ||||
| #include "stack.h" | ||||
| #include <X11/Xutil.h> | ||||
| @@ -134,7 +134,6 @@ struct _MetaWindow | ||||
|   GObject parent_instance; | ||||
|  | ||||
|   MetaDisplay *display; | ||||
|   MetaScreen *screen; | ||||
|   guint64 stamp; | ||||
|   MetaLogicalMonitor *monitor; | ||||
|   MetaWorkspace *workspace; | ||||
| @@ -567,7 +566,6 @@ struct _MetaWindowClass | ||||
| #define META_WINDOW_ALLOWS_VERTICAL_RESIZE(w)   (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && (w)->size_hints.min_height < (w)->size_hints.max_height) | ||||
|  | ||||
| MetaWindow * _meta_window_shared_new       (MetaDisplay         *display, | ||||
|                                             MetaScreen          *screen, | ||||
|                                             MetaWindowClientType client_type, | ||||
|                                             MetaWaylandSurface  *surface, | ||||
|                                             Window               xwindow, | ||||
|   | ||||
| @@ -32,7 +32,8 @@ | ||||
| #include "edge-resistance.h" | ||||
| #include "util-private.h" | ||||
| #include "frame.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "workspace-private.h" | ||||
| #include "stack.h" | ||||
| #include "keybindings-private.h" | ||||
| @@ -52,6 +53,7 @@ | ||||
| #include <meta/meta-cursor-tracker.h> | ||||
| #include "meta/compositor-mutter.h" | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include "x11/window-x11.h" | ||||
| #include "x11/window-props.h" | ||||
| #include "x11/xprops.h" | ||||
| @@ -679,9 +681,10 @@ is_desktop_or_dock_foreach (MetaWindow *window, | ||||
| static void | ||||
| maybe_leave_show_desktop_mode (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   gboolean is_desktop_or_dock; | ||||
|  | ||||
|   if (!window->screen->active_workspace->showing_desktop) | ||||
|   if (!workspace_manager->active_workspace->showing_desktop) | ||||
|     return; | ||||
|  | ||||
|   /* If the window is a transient for the dock or desktop, don't | ||||
| @@ -698,9 +701,9 @@ maybe_leave_show_desktop_mode (MetaWindow *window) | ||||
|  | ||||
|   if (!is_desktop_or_dock) | ||||
|     { | ||||
|       meta_screen_minimize_all_on_active_workspace_except (window->screen, | ||||
|                                                            window); | ||||
|       meta_screen_unshow_desktop (window->screen); | ||||
|       meta_workspace_manager_minimize_all_on_active_workspace_except (workspace_manager, | ||||
|                                                                       window); | ||||
|       meta_workspace_manager_unshow_desktop (workspace_manager); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -753,17 +756,17 @@ sync_client_window_mapped (MetaWindow *window) | ||||
|  | ||||
|   window->mapped = should_be_mapped; | ||||
|  | ||||
|   meta_error_trap_push (window->display); | ||||
|   meta_x11_error_trap_push (window->display->x11_display); | ||||
|   if (should_be_mapped) | ||||
|     { | ||||
|       XMapWindow (window->display->xdisplay, window->xwindow); | ||||
|       XMapWindow (window->display->x11_display->xdisplay, window->xwindow); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       XUnmapWindow (window->display->xdisplay, window->xwindow); | ||||
|       XUnmapWindow (window->display->x11_display->xdisplay, window->xwindow); | ||||
|       window->unmaps_pending ++; | ||||
|     } | ||||
|   meta_error_trap_pop (window->display); | ||||
|   meta_x11_error_trap_pop (window->display->x11_display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -823,10 +826,10 @@ meta_window_main_monitor_changed (MetaWindow               *window, | ||||
|   META_WINDOW_GET_CLASS (window)->main_monitor_changed (window, old); | ||||
|  | ||||
|   if (old) | ||||
|     g_signal_emit_by_name (window->screen, "window-left-monitor", | ||||
|     g_signal_emit_by_name (window->display, "window-left-monitor", | ||||
|                            old->number, window); | ||||
|   if (window->monitor) | ||||
|     g_signal_emit_by_name (window->screen, "window-entered-monitor", | ||||
|     g_signal_emit_by_name (window->display, "window-entered-monitor", | ||||
|                            window->monitor->number, window); | ||||
| } | ||||
|  | ||||
| @@ -845,7 +848,6 @@ meta_window_calculate_main_logical_monitor (MetaWindow *window) | ||||
|  | ||||
| MetaWindow * | ||||
| _meta_window_shared_new (MetaDisplay         *display, | ||||
|                          MetaScreen          *screen, | ||||
|                          MetaWindowClientType client_type, | ||||
|                          MetaWaylandSurface  *surface, | ||||
|                          Window               xwindow, | ||||
| @@ -853,6 +855,7 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|                          MetaCompEffect       effect, | ||||
|                          XWindowAttributes   *attrs) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = display->workspace_manager; | ||||
|   MetaWindow *window; | ||||
|  | ||||
|   g_assert (attrs != NULL); | ||||
| @@ -882,9 +885,6 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|   window->surface = surface; | ||||
|   window->xwindow = xwindow; | ||||
|  | ||||
|   /* this is in window->screen->display, but that's too annoying to | ||||
|    * type | ||||
|    */ | ||||
|   window->display = display; | ||||
|   meta_display_register_stamp (window->display, &window->stamp, window); | ||||
|  | ||||
| @@ -895,15 +895,13 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|   window->sync_request_timeout_id = 0; | ||||
|   window->sync_request_alarm = None; | ||||
|  | ||||
|   window->screen = screen; | ||||
|  | ||||
|   meta_window_update_flatpak_id (window); | ||||
|   meta_window_update_desc (window); | ||||
|  | ||||
|   window->override_redirect = attrs->override_redirect; | ||||
|  | ||||
|   /* avoid tons of stack updates */ | ||||
|   meta_stack_freeze (window->screen->stack); | ||||
|   meta_stack_freeze (window->display->stack); | ||||
|  | ||||
|   window->rect.x = attrs->x; | ||||
|   window->rect.y = attrs->y; | ||||
| @@ -1088,7 +1086,7 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|   /* Apply any window attributes such as initial workspace | ||||
|    * based on startup notification | ||||
|    */ | ||||
|   meta_screen_apply_startup_properties (window->screen, window); | ||||
|   meta_display_apply_startup_properties (window->display, window); | ||||
|  | ||||
|   /* Try to get a "launch timestamp" for the window.  If the window is | ||||
|    * a transient, we'd like to be able to get a last-usage timestamp | ||||
| @@ -1161,8 +1159,8 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|                       "Window %s is initially on space %d\n", | ||||
|                       window->desc, window->initial_workspace); | ||||
|  | ||||
|           workspace = meta_screen_get_workspace_by_index (window->screen, | ||||
|                                                           window->initial_workspace); | ||||
|           workspace = meta_workspace_manager_get_workspace_by_index (workspace_manager, | ||||
|                                                                      window->initial_workspace); | ||||
|         } | ||||
|  | ||||
|       set_workspace_state (window, on_all_workspaces, workspace); | ||||
| @@ -1201,7 +1199,7 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|                       "Putting window %s on active workspace\n", | ||||
|                       window->desc); | ||||
|  | ||||
|           set_workspace_state (window, FALSE, window->screen->active_workspace); | ||||
|           set_workspace_state (window, FALSE, workspace_manager->active_workspace); | ||||
|         } | ||||
|  | ||||
|       meta_window_update_struts (window); | ||||
| @@ -1217,7 +1215,7 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|    * means restacking it. | ||||
|    */ | ||||
|   if (!window->override_redirect) | ||||
|     meta_stack_add (window->screen->stack, | ||||
|     meta_stack_add (window->display->stack, | ||||
|                     window); | ||||
|   else | ||||
|     window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */ | ||||
| @@ -1231,18 +1229,18 @@ _meta_window_shared_new (MetaDisplay         *display, | ||||
|       set_net_wm_state (window); | ||||
|     } | ||||
|  | ||||
|   meta_compositor_add_window (screen->display->compositor, window); | ||||
|   meta_compositor_add_window (window->display->compositor, window); | ||||
|   window->known_to_compositor = TRUE; | ||||
|  | ||||
|   /* Sync stack changes */ | ||||
|   meta_stack_thaw (window->screen->stack); | ||||
|   meta_stack_thaw (window->display->stack); | ||||
|  | ||||
|   /* Usually the we'll have queued a stack sync anyways, because we've | ||||
|    * added a new frame window or restacked. But if an undecorated | ||||
|    * window is mapped, already stacked in the right place, then we | ||||
|    * might need to do this explicitly. | ||||
|    */ | ||||
|   meta_stack_tracker_queue_sync_stack (window->screen->stack_tracker); | ||||
|   meta_stack_tracker_queue_sync_stack (window->display->stack_tracker); | ||||
|  | ||||
|   /* disable show desktop mode unless we're a desktop component */ | ||||
|   maybe_leave_show_desktop_mode (window); | ||||
| @@ -1301,6 +1299,7 @@ void | ||||
| meta_window_unmanage (MetaWindow  *window, | ||||
|                       guint32      timestamp) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   GList *tmp; | ||||
|  | ||||
|   meta_verbose ("Unmanaging %s\n", window->desc); | ||||
| @@ -1350,7 +1349,7 @@ meta_window_unmanage (MetaWindow  *window, | ||||
|   /* Make sure to only show window on all workspaces if requested, to | ||||
|    * not confuse other window managers that may take over | ||||
|    */ | ||||
|   if (window->screen->closing && meta_prefs_get_workspaces_only_on_primary ()) | ||||
|   if (meta_prefs_get_workspaces_only_on_primary ()) | ||||
|     meta_window_on_all_workspaces_changed (window); | ||||
|  | ||||
|   if (window->fullscreen) | ||||
| @@ -1361,11 +1360,11 @@ meta_window_unmanage (MetaWindow  *window, | ||||
|        * other windows in its group to a higher layer | ||||
|        */ | ||||
|  | ||||
|       meta_stack_freeze (window->screen->stack); | ||||
|       meta_stack_freeze (window->display->stack); | ||||
|       group = meta_window_get_group (window); | ||||
|       if (group) | ||||
|         meta_group_update_layers (group); | ||||
|       meta_stack_thaw (window->screen->stack); | ||||
|       meta_stack_thaw (window->display->stack); | ||||
|     } | ||||
|  | ||||
|   meta_display_remove_pending_pings_for_window (window->display, window); | ||||
| @@ -1387,7 +1386,7 @@ meta_window_unmanage (MetaWindow  *window, | ||||
|       meta_topic (META_DEBUG_FOCUS, | ||||
|                   "Focusing default window since we're unmanaging %s\n", | ||||
|                   window->desc); | ||||
|       meta_workspace_focus_default_window (window->screen->active_workspace, NULL, timestamp); | ||||
|       meta_workspace_focus_default_window (workspace_manager->active_workspace, NULL, timestamp); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
| @@ -1433,7 +1432,7 @@ meta_window_unmanage (MetaWindow  *window, | ||||
|   g_assert (window->workspace == NULL); | ||||
|  | ||||
| #ifndef G_DISABLE_CHECKS | ||||
|   tmp = window->screen->workspaces; | ||||
|   tmp = workspace_manager->workspaces; | ||||
|   while (tmp != NULL) | ||||
|     { | ||||
|       MetaWorkspace *workspace = tmp->data; | ||||
| @@ -1454,13 +1453,13 @@ meta_window_unmanage (MetaWindow  *window, | ||||
|     } | ||||
|  | ||||
|   if (!window->override_redirect) | ||||
|     meta_stack_remove (window->screen->stack, window); | ||||
|     meta_stack_remove (window->display->stack, window); | ||||
|  | ||||
|   /* If an undecorated window is being withdrawn, that will change the | ||||
|    * stack as presented to the compositing manager, without actually | ||||
|    * changing the stacking order of X windows. | ||||
|    */ | ||||
|   meta_stack_tracker_queue_sync_stack (window->screen->stack_tracker); | ||||
|   meta_stack_tracker_queue_sync_stack (window->display->stack_tracker); | ||||
|  | ||||
|   if (window->display->autoraise_window == window) | ||||
|     meta_display_remove_autoraise_callback (window->display); | ||||
| @@ -1468,7 +1467,7 @@ meta_window_unmanage (MetaWindow  *window, | ||||
|   META_WINDOW_GET_CLASS (window)->unmanage (window); | ||||
|  | ||||
|   meta_prefs_remove_listener (prefs_changed_callback, window); | ||||
|   meta_screen_queue_check_fullscreen (window->screen); | ||||
|   meta_display_queue_check_fullscreen (window->display); | ||||
|  | ||||
|   g_signal_emit (window, window_signals[UNMANAGED], 0); | ||||
|  | ||||
| @@ -1545,6 +1544,7 @@ ancestor_is_minimized (MetaWindow *window) | ||||
| gboolean | ||||
| meta_window_showing_on_its_workspace (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   gboolean showing; | ||||
|   gboolean is_desktop_or_dock; | ||||
|   MetaWorkspace* workspace_of_window; | ||||
| @@ -1564,7 +1564,7 @@ meta_window_showing_on_its_workspace (MetaWindow *window) | ||||
|                                 &is_desktop_or_dock); | ||||
|  | ||||
|   if (window->on_all_workspaces) | ||||
|     workspace_of_window = window->screen->active_workspace; | ||||
|     workspace_of_window = workspace_manager->active_workspace; | ||||
|   else if (window->workspace) | ||||
|     workspace_of_window = window->workspace; | ||||
|   else /* This only seems to be needed for startup */ | ||||
| @@ -1596,6 +1596,8 @@ meta_window_showing_on_its_workspace (MetaWindow *window) | ||||
| gboolean | ||||
| meta_window_should_be_showing (MetaWindow  *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND && | ||||
|       !meta_wayland_surface_get_buffer (window->surface)) | ||||
| @@ -1604,7 +1606,7 @@ meta_window_should_be_showing (MetaWindow  *window) | ||||
|  | ||||
|   /* Windows should be showing if they're located on the | ||||
|    * active workspace and they're showing on their own workspace. */ | ||||
|   return (meta_window_located_on_workspace (window, window->screen->active_workspace) && | ||||
|   return (meta_window_located_on_workspace (window, workspace_manager->active_workspace) && | ||||
|           meta_window_showing_on_its_workspace (window)); | ||||
| } | ||||
|  | ||||
| @@ -1653,11 +1655,8 @@ stackcmp (gconstpointer a, gconstpointer b) | ||||
|   MetaWindow *aw = (gpointer) a; | ||||
|   MetaWindow *bw = (gpointer) b; | ||||
|  | ||||
|   if (aw->screen != bw->screen) | ||||
|     return 0; /* don't care how they sort with respect to each other */ | ||||
|   else | ||||
|     return meta_stack_windows_cmp (aw->screen->stack, | ||||
|                                    aw, bw); | ||||
|   return meta_stack_windows_cmp (aw->display->stack, | ||||
|                                  aw, bw); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| @@ -2359,9 +2358,9 @@ meta_window_show (MetaWindow *window) | ||||
|  | ||||
|   if (window->hidden) | ||||
|     { | ||||
|       meta_stack_freeze (window->screen->stack); | ||||
|       meta_stack_freeze (window->display->stack); | ||||
|       window->hidden = FALSE; | ||||
|       meta_stack_thaw (window->screen->stack); | ||||
|       meta_stack_thaw (window->display->stack); | ||||
|       did_show = TRUE; | ||||
|     } | ||||
|  | ||||
| @@ -2432,7 +2431,7 @@ meta_window_show (MetaWindow *window) | ||||
|     } | ||||
|  | ||||
|   if (did_show) | ||||
|     meta_screen_queue_check_fullscreen (window->screen); | ||||
|     meta_display_queue_check_fullscreen (window->display); | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   if (did_show && window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND) | ||||
| @@ -2459,6 +2458,7 @@ meta_window_show (MetaWindow *window) | ||||
| static void | ||||
| meta_window_hide (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   gboolean did_hide; | ||||
|  | ||||
|   meta_topic (META_DEBUG_WINDOW_STATE, | ||||
| @@ -2490,9 +2490,9 @@ meta_window_hide (MetaWindow *window) | ||||
|  | ||||
|   if (!window->hidden) | ||||
|     { | ||||
|       meta_stack_freeze (window->screen->stack); | ||||
|       meta_stack_freeze (window->display->stack); | ||||
|       window->hidden = TRUE; | ||||
|       meta_stack_thaw (window->screen->stack); | ||||
|       meta_stack_thaw (window->display->stack); | ||||
|  | ||||
|       did_hide = TRUE; | ||||
|     } | ||||
| @@ -2529,17 +2529,17 @@ meta_window_hide (MetaWindow *window) | ||||
|        * We also pass in NULL if we are in the process of hiding all non-desktop | ||||
|        * windows to avoid unexpected changes to the stacking order. | ||||
|        */ | ||||
|       if (my_workspace == window->screen->active_workspace && | ||||
|       if (my_workspace == workspace_manager->active_workspace && | ||||
|           !my_workspace->showing_desktop) | ||||
|         not_this_one = window; | ||||
|  | ||||
|       meta_workspace_focus_default_window (window->screen->active_workspace, | ||||
|       meta_workspace_focus_default_window (workspace_manager->active_workspace, | ||||
|                                            not_this_one, | ||||
|                                            timestamp); | ||||
|     } | ||||
|  | ||||
|   if (did_hide) | ||||
|     meta_screen_queue_check_fullscreen (window->screen); | ||||
|     meta_display_queue_check_fullscreen (window->display); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| @@ -2688,7 +2688,7 @@ meta_window_maximize_internal (MetaWindow        *window, | ||||
|   set_net_wm_state (window); | ||||
|  | ||||
|   if (window->monitor->in_fullscreen) | ||||
|     meta_screen_queue_check_fullscreen (window->screen); | ||||
|     meta_display_queue_check_fullscreen (window->display); | ||||
|  | ||||
|   g_object_freeze_notify (G_OBJECT (window)); | ||||
|   g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_MAXIMIZED_HORIZONTALLY]); | ||||
| @@ -2810,7 +2810,7 @@ meta_window_is_screen_sized (MetaWindow *window) | ||||
|   MetaRectangle window_rect; | ||||
|   int screen_width, screen_height; | ||||
|  | ||||
|   meta_screen_get_size (window->screen, &screen_width, &screen_height); | ||||
|   meta_display_get_size (window->display, &screen_width, &screen_height); | ||||
|   meta_window_get_frame_rect (window, &window_rect); | ||||
|  | ||||
|   if (window_rect.x == 0 && window_rect.y == 0 && | ||||
| @@ -2841,7 +2841,7 @@ meta_window_is_monitor_sized (MetaWindow *window) | ||||
|       MetaRectangle window_rect, monitor_rect; | ||||
|  | ||||
|       meta_window_get_frame_rect (window, &window_rect); | ||||
|       meta_screen_get_monitor_geometry (window->screen, window->monitor->number, &monitor_rect); | ||||
|       meta_display_get_monitor_geometry (window->display, window->monitor->number, &monitor_rect); | ||||
|  | ||||
|       if (meta_rectangle_equal (&window_rect, &monitor_rect)) | ||||
|         return TRUE; | ||||
| @@ -2902,7 +2902,7 @@ meta_window_tile (MetaWindow *window) | ||||
|     directions = META_MAXIMIZE_VERTICAL; | ||||
|  | ||||
|   meta_window_maximize_internal (window, directions, NULL); | ||||
|   meta_screen_update_tile_preview (window->screen, FALSE); | ||||
|   meta_display_update_tile_preview (window->display, FALSE); | ||||
|  | ||||
|   meta_window_get_frame_rect (window, &old_frame_rect); | ||||
|   meta_window_get_buffer_rect (window, &old_buffer_rect); | ||||
| @@ -2938,7 +2938,7 @@ meta_window_can_tile_side_by_side (MetaWindow *window) | ||||
|   if (!meta_window_can_tile_maximized (window)) | ||||
|     return FALSE; | ||||
|  | ||||
|   monitor = meta_screen_get_current_monitor (window->screen); | ||||
|   monitor = meta_display_get_current_monitor (window->display); | ||||
|   meta_window_get_work_area_for_monitor (window, monitor, &tile_area); | ||||
|  | ||||
|   /* Do not allow tiling in portrait orientation */ | ||||
| @@ -2968,11 +2968,8 @@ unmaximize_window_before_freeing (MetaWindow        *window) | ||||
|       window->rect = window->saved_rect; | ||||
|       set_net_wm_state (window); | ||||
|     } | ||||
|   else if (window->screen->closing      /* See bug #358042 */ | ||||
| #ifdef HAVE_WAYLAND | ||||
|            && !meta_is_wayland_compositor () | ||||
| #endif | ||||
|            ) | ||||
|   else if (!meta_is_wayland_compositor ()) | ||||
|     { | ||||
|       /* Do NOT update net_wm_state: this screen is closing, | ||||
|        * it likely will be managed by another window manager | ||||
| @@ -2987,6 +2984,7 @@ unmaximize_window_before_freeing (MetaWindow        *window) | ||||
|                                      window->saved_rect.width, | ||||
|                                      window->saved_rect.height); | ||||
|     } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -3109,7 +3107,7 @@ meta_window_unmaximize (MetaWindow        *window, | ||||
|       meta_window_recalc_features (window); | ||||
|       set_net_wm_state (window); | ||||
|       if (!window->monitor->in_fullscreen) | ||||
|         meta_screen_queue_check_fullscreen (window->screen); | ||||
|         meta_display_queue_check_fullscreen (window->display); | ||||
|     } | ||||
|  | ||||
|   g_object_freeze_notify (G_OBJECT (window)); | ||||
| @@ -3173,16 +3171,16 @@ meta_window_make_fullscreen_internal (MetaWindow  *window) | ||||
|  | ||||
|       window->fullscreen = TRUE; | ||||
|  | ||||
|       meta_stack_freeze (window->screen->stack); | ||||
|       meta_stack_freeze (window->display->stack); | ||||
|  | ||||
|       meta_window_raise (window); | ||||
|       meta_stack_thaw (window->screen->stack); | ||||
|       meta_stack_thaw (window->display->stack); | ||||
|  | ||||
|       meta_window_recalc_features (window); | ||||
|       set_net_wm_state (window); | ||||
|  | ||||
|       /* For the auto-minimize feature, if we fail to get focus */ | ||||
|       meta_screen_queue_check_fullscreen (window->screen); | ||||
|       meta_display_queue_check_fullscreen (window->display); | ||||
|  | ||||
|       g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_FULLSCREEN]); | ||||
|     } | ||||
| @@ -3256,7 +3254,7 @@ meta_window_unmake_fullscreen (MetaWindow  *window) | ||||
|                                         NorthWestGravity, | ||||
|                                         target_rect); | ||||
|  | ||||
|       meta_screen_queue_check_fullscreen (window->screen); | ||||
|       meta_display_queue_check_fullscreen (window->display); | ||||
|  | ||||
|       g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_FULLSCREEN]); | ||||
|     } | ||||
| @@ -3374,6 +3372,7 @@ meta_window_activate_full (MetaWindow     *window, | ||||
|                            MetaClientType  source_indication, | ||||
|                            MetaWorkspace  *workspace) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   gboolean allow_workspace_switch; | ||||
|   meta_topic (META_DEBUG_FOCUS, | ||||
|               "_NET_ACTIVE_WINDOW message sent for %s at time %u " | ||||
| @@ -3402,7 +3401,7 @@ meta_window_activate_full (MetaWindow     *window, | ||||
|  | ||||
|   /* Get window on current or given workspace */ | ||||
|   if (workspace == NULL) | ||||
|     workspace = window->screen->active_workspace; | ||||
|     workspace = workspace_manager->active_workspace; | ||||
|  | ||||
|   /* For non-transient windows, we just set up a pulsing indicator, | ||||
|      rather than move windows or workspaces. | ||||
| @@ -3600,6 +3599,7 @@ void | ||||
| meta_window_update_monitor (MetaWindow *window, | ||||
|                             gboolean    user_op) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   const MetaLogicalMonitor *old; | ||||
|  | ||||
|   old = window->monitor; | ||||
| @@ -3619,8 +3619,8 @@ meta_window_update_monitor (MetaWindow *window, | ||||
|        */ | ||||
|       if (meta_prefs_get_workspaces_only_on_primary () && user_op && | ||||
|           meta_window_is_on_primary_monitor (window)  && | ||||
|           window->screen->active_workspace != window->workspace) | ||||
|         meta_window_change_workspace (window, window->screen->active_workspace); | ||||
|           workspace_manager->active_workspace != window->workspace) | ||||
|         meta_window_change_workspace (window, workspace_manager->active_workspace); | ||||
|  | ||||
|       meta_window_main_monitor_changed (window, old); | ||||
|  | ||||
| @@ -3655,6 +3655,7 @@ meta_window_move_resize_internal (MetaWindow          *window, | ||||
|    * to the client. | ||||
|    */ | ||||
|  | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   gboolean did_placement; | ||||
|   guint old_output_winsys_id; | ||||
|   MetaRectangle unconstrained_rect; | ||||
| @@ -3776,8 +3777,8 @@ meta_window_move_resize_internal (MetaWindow          *window, | ||||
|  | ||||
|   meta_window_foreach_transient (window, maybe_move_attached_dialog, NULL); | ||||
|  | ||||
|   meta_stack_update_window_tile_matches (window->screen->stack, | ||||
|                                          window->screen->active_workspace); | ||||
|   meta_stack_update_window_tile_matches (window->display->stack, | ||||
|                                          workspace_manager->active_workspace); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -3906,7 +3907,7 @@ meta_window_move_to_monitor (MetaWindow  *window, | ||||
|   window->preferred_output_winsys_id = window->monitor->winsys_id; | ||||
|  | ||||
|   if (window->fullscreen || window->override_redirect) | ||||
|     meta_screen_queue_check_fullscreen (window->screen); | ||||
|     meta_display_queue_check_fullscreen (window->display); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -4319,6 +4320,7 @@ void | ||||
| meta_window_focus (MetaWindow  *window, | ||||
|                    guint32      timestamp) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   MetaWindow *modal_transient; | ||||
|  | ||||
|   g_return_if_fail (!window->override_redirect); | ||||
| @@ -4345,8 +4347,8 @@ meta_window_focus (MetaWindow  *window, | ||||
|       meta_topic (META_DEBUG_FOCUS, | ||||
|                   "%s has %s as a modal transient, so focusing it instead.\n", | ||||
|                   window->desc, modal_transient->desc); | ||||
|       if (!meta_window_located_on_workspace (modal_transient, window->screen->active_workspace)) | ||||
|         meta_window_change_workspace (modal_transient, window->screen->active_workspace); | ||||
|       if (!meta_window_located_on_workspace (modal_transient, workspace_manager->active_workspace)) | ||||
|         meta_window_change_workspace (modal_transient, workspace_manager->active_workspace); | ||||
|       window = modal_transient; | ||||
|     } | ||||
|  | ||||
| @@ -4396,6 +4398,8 @@ set_workspace_state (MetaWindow    *window, | ||||
|                      gboolean       on_all_workspaces, | ||||
|                      MetaWorkspace *workspace) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   /* If we're on all workspaces, then our new workspace must be NULL. */ | ||||
|   if (on_all_workspaces) | ||||
|     g_assert (workspace == NULL); | ||||
| @@ -4417,7 +4421,7 @@ set_workspace_state (MetaWindow    *window, | ||||
|   else if (window->on_all_workspaces) | ||||
|     { | ||||
|       GList *l; | ||||
|       for (l = window->screen->workspaces; l != NULL; l = l->next) | ||||
|       for (l = workspace_manager->workspaces; l != NULL; l = l->next) | ||||
|         { | ||||
|           MetaWorkspace *ws = l->data; | ||||
|           meta_workspace_remove_window (ws, window); | ||||
| @@ -4432,7 +4436,7 @@ set_workspace_state (MetaWindow    *window, | ||||
|   else if (window->on_all_workspaces) | ||||
|     { | ||||
|       GList *l; | ||||
|       for (l = window->screen->workspaces; l != NULL; l = l->next) | ||||
|       for (l = workspace_manager->workspaces; l != NULL; l = l->next) | ||||
|         { | ||||
|           MetaWorkspace *ws = l->data; | ||||
|           meta_workspace_add_window (ws, window); | ||||
| @@ -4465,6 +4469,7 @@ should_be_on_all_workspaces (MetaWindow *window) | ||||
| void | ||||
| meta_window_on_all_workspaces_changed (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   gboolean on_all_workspaces = should_be_on_all_workspaces (window); | ||||
|  | ||||
|   if (window->on_all_workspaces == on_all_workspaces) | ||||
| @@ -4480,7 +4485,7 @@ meta_window_on_all_workspaces_changed (MetaWindow *window) | ||||
|     { | ||||
|       /* We're coming out of the sticky state. Put the window on | ||||
|        * the currently active workspace. */ | ||||
|       workspace = window->screen->active_workspace; | ||||
|       workspace = workspace_manager->active_workspace; | ||||
|     } | ||||
|  | ||||
|   set_workspace_state (window, on_all_workspaces, workspace); | ||||
| @@ -4656,13 +4661,13 @@ meta_window_raise (MetaWindow  *window) | ||||
|    * constraints in stack.c then magically take care of raising all | ||||
|    * the child windows appropriately. | ||||
|    */ | ||||
|   if (window->screen->stack == ancestor->screen->stack) | ||||
|     meta_stack_raise (window->screen->stack, ancestor); | ||||
|   if (window->display->stack == ancestor->display->stack) | ||||
|     meta_stack_raise (window->display->stack, ancestor); | ||||
|   else | ||||
|     { | ||||
|       meta_warning ( | ||||
|                     "Either stacks aren't per screen or some window has a weird " | ||||
|                     "transient_for hint; window->screen->stack != " | ||||
|                     "transient_for hint; window->display->stack != " | ||||
|                     "ancestor->screen->stack.  window = %s, ancestor = %s.\n", | ||||
|                     window->desc, ancestor->desc); | ||||
|       /* We could raise the window here, but don't want to do that twice and | ||||
| @@ -4676,7 +4681,7 @@ meta_window_raise (MetaWindow  *window) | ||||
|    * correct child.  See bug 307875. | ||||
|    */ | ||||
|   if (window != ancestor) | ||||
|     meta_stack_raise (window->screen->stack, window); | ||||
|     meta_stack_raise (window->display->stack, window); | ||||
|  | ||||
|   g_signal_emit (window, window_signals[RAISED], 0); | ||||
| } | ||||
| @@ -4689,7 +4694,7 @@ meta_window_lower (MetaWindow  *window) | ||||
|   meta_topic (META_DEBUG_WINDOW_OPS, | ||||
|               "Lowering window %s\n", window->desc); | ||||
|  | ||||
|   meta_stack_lower (window->screen->stack, window); | ||||
|   meta_stack_lower (window->display->stack, window); | ||||
| } | ||||
|  | ||||
| /* | ||||
| @@ -4701,8 +4706,9 @@ meta_window_change_workspace_by_index (MetaWindow *window, | ||||
|                                        gint        space_index, | ||||
|                                        gboolean    append) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager; | ||||
|   MetaWorkspace *workspace; | ||||
|   MetaScreen    *screen; | ||||
|   MetaDisplay   *display; | ||||
|  | ||||
|   g_return_if_fail (!window->override_redirect); | ||||
|  | ||||
| @@ -4712,13 +4718,14 @@ meta_window_change_workspace_by_index (MetaWindow *window, | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   screen = window->screen; | ||||
|   display = window->display; | ||||
|   workspace_manager = display->workspace_manager; | ||||
|  | ||||
|   workspace = | ||||
|     meta_screen_get_workspace_by_index (screen, space_index); | ||||
|     meta_workspace_manager_get_workspace_by_index (workspace_manager, space_index); | ||||
|  | ||||
|   if (!workspace && append) | ||||
|     workspace = meta_screen_append_new_workspace (screen, FALSE, CurrentTime); | ||||
|     workspace = meta_workspace_manager_append_new_workspace (workspace_manager, FALSE, META_CURRENT_TIME); | ||||
|  | ||||
|   if (workspace) | ||||
|     meta_window_change_workspace (window, workspace); | ||||
| @@ -4818,6 +4825,8 @@ void | ||||
| meta_window_set_focused_internal (MetaWindow *window, | ||||
|                                   gboolean    focused) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   if (focused) | ||||
|     { | ||||
|       window->has_focus = TRUE; | ||||
| @@ -4832,22 +4841,22 @@ meta_window_set_focused_internal (MetaWindow *window, | ||||
|        * list only if the window is actually on the active | ||||
|        * workspace. | ||||
|        */ | ||||
|       if (window->screen->active_workspace && | ||||
|       if (workspace_manager->active_workspace && | ||||
|           meta_window_located_on_workspace (window, | ||||
|                                             window->screen->active_workspace)) | ||||
|                                             workspace_manager->active_workspace)) | ||||
|         { | ||||
|           GList* link; | ||||
|           link = g_list_find (window->screen->active_workspace->mru_list, | ||||
|           link = g_list_find (workspace_manager->active_workspace->mru_list, | ||||
|                               window); | ||||
|           g_assert (link); | ||||
|  | ||||
|           window->screen->active_workspace->mru_list = | ||||
|             g_list_remove_link (window->screen->active_workspace->mru_list, | ||||
|           workspace_manager->active_workspace->mru_list = | ||||
|             g_list_remove_link (workspace_manager->active_workspace->mru_list, | ||||
|                                 link); | ||||
|           g_list_free (link); | ||||
|  | ||||
|           window->screen->active_workspace->mru_list = | ||||
|             g_list_prepend (window->screen->active_workspace->mru_list, | ||||
|           workspace_manager->active_workspace->mru_list = | ||||
|             g_list_prepend (workspace_manager->active_workspace->mru_list, | ||||
|                             window); | ||||
|         } | ||||
|  | ||||
| @@ -5090,8 +5099,10 @@ idle_update_icon (gpointer data) | ||||
| GList* | ||||
| meta_window_get_workspaces (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   if (window->on_all_workspaces) | ||||
|     return window->screen->workspaces; | ||||
|     return workspace_manager->workspaces; | ||||
|   else if (window->workspace != NULL) | ||||
|     return window->workspace->list_containing_self; | ||||
|   else if (window->constructing) | ||||
| @@ -5321,13 +5332,17 @@ meta_window_recalc_features (MetaWindow *window) | ||||
|   if (!window->has_resize_func) | ||||
|     { | ||||
|       window->has_maximize_func = FALSE; | ||||
|       MetaRectangle display_rect; | ||||
|  | ||||
|       meta_display_get_size (window->display, &display_rect.width, | ||||
|                              &display_rect.height); | ||||
|  | ||||
|       /* don't allow fullscreen if we can't resize, unless the size | ||||
|        * is entire screen size (kind of broken, because we | ||||
|        * actually fullscreen to monitor size not screen size) | ||||
|        */ | ||||
|       if (window->size_hints.min_width == window->screen->rect.width && | ||||
|           window->size_hints.min_height == window->screen->rect.height) | ||||
|       if (window->size_hints.min_width == display_rect.width && | ||||
|           window->size_hints.min_height == display_rect.height) | ||||
|         ; /* leave fullscreen available */ | ||||
|       else | ||||
|         window->has_fullscreen_func = FALSE; | ||||
| @@ -5444,6 +5459,7 @@ meta_window_show_menu_for_rect (MetaWindow         *window, | ||||
| void | ||||
| meta_window_shove_titlebar_onscreen (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   MetaRectangle  frame_rect; | ||||
|   GList         *onscreen_region; | ||||
|   int            horiz_amount, vert_amount; | ||||
| @@ -5456,7 +5472,7 @@ meta_window_shove_titlebar_onscreen (MetaWindow *window) | ||||
|  | ||||
|   /* Get the basic info we need */ | ||||
|   meta_window_get_frame_rect (window, &frame_rect); | ||||
|   onscreen_region = window->screen->active_workspace->screen_region; | ||||
|   onscreen_region = workspace_manager->active_workspace->screen_region; | ||||
|  | ||||
|   /* Extend the region (just in case the window is too big to fit on the | ||||
|    * screen), then shove the window on screen, then return the region to | ||||
| @@ -5484,6 +5500,7 @@ meta_window_shove_titlebar_onscreen (MetaWindow *window) | ||||
| gboolean | ||||
| meta_window_titlebar_is_onscreen (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   MetaRectangle  titlebar_rect, frame_rect; | ||||
|   GList         *onscreen_region; | ||||
|   gboolean       is_onscreen; | ||||
| @@ -5508,7 +5525,7 @@ meta_window_titlebar_is_onscreen (MetaWindow *window) | ||||
|    * them overlaps with the titlebar sufficiently to consider it onscreen. | ||||
|    */ | ||||
|   is_onscreen = FALSE; | ||||
|   onscreen_region = window->screen->active_workspace->screen_region; | ||||
|   onscreen_region = workspace_manager->active_workspace->screen_region; | ||||
|   while (onscreen_region) | ||||
|     { | ||||
|       MetaRectangle *spanning_rect = onscreen_region->data; | ||||
| @@ -5814,8 +5831,8 @@ update_move (MetaWindow  *window, | ||||
|    * trigger it unwittingly, e.g. when shaking loose the window or moving | ||||
|    * it to another monitor. | ||||
|    */ | ||||
|   meta_screen_update_tile_preview (window->screen, | ||||
|                                    window->tile_mode != META_TILE_NONE); | ||||
|   meta_display_update_tile_preview (window->display, | ||||
|                                     window->tile_mode != META_TILE_NONE); | ||||
|  | ||||
|   meta_window_get_frame_rect (window, &old); | ||||
|  | ||||
| @@ -6219,9 +6236,13 @@ meta_window_get_work_area_all_monitors (MetaWindow    *window, | ||||
|                                         MetaRectangle *area) | ||||
| { | ||||
|   GList *tmp; | ||||
|   MetaRectangle display_rect; | ||||
|  | ||||
|   /* Initialize to the whole screen */ | ||||
|   *area = window->screen->rect; | ||||
|   meta_display_get_size (window->display, &display_rect.width, | ||||
|                          &display_rect.height); | ||||
|  | ||||
|   /* Initialize to the whole display */ | ||||
|   *area = display_rect; | ||||
|  | ||||
|   tmp = meta_window_get_workspaces (window); | ||||
|   while (tmp != NULL) | ||||
| @@ -6436,10 +6457,12 @@ warp_grab_pointer (MetaWindow          *window, | ||||
|                    int                 *x, | ||||
|                    int                 *y) | ||||
| { | ||||
|   MetaRectangle  rect; | ||||
|   MetaRectangle  display_rect, rect; | ||||
|   MetaDisplay   *display; | ||||
|  | ||||
|   display = window->display; | ||||
|   meta_display_get_size (display, &display_rect.width, | ||||
|                          &display_rect.height); | ||||
|  | ||||
|   /* We may not have done begin_grab_op yet, i.e. may not be in a grab | ||||
|    */ | ||||
| @@ -6464,10 +6487,10 @@ warp_grab_pointer (MetaWindow          *window, | ||||
|   *y += rect.y; | ||||
|  | ||||
|   /* Avoid weird bouncing at the screen edge; see bug 154706 */ | ||||
|   *x = CLAMP (*x, 0, window->screen->rect.width-1); | ||||
|   *y = CLAMP (*y, 0, window->screen->rect.height-1); | ||||
|   *x = CLAMP (*x, 0, display_rect.width-1); | ||||
|   *y = CLAMP (*y, 0, display_rect.height-1); | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (display->x11_display); | ||||
|  | ||||
|   meta_topic (META_DEBUG_WINDOW_OPS, | ||||
|               "Warping pointer to %d,%d with window at %d,%d\n", | ||||
| @@ -6489,7 +6512,7 @@ warp_grab_pointer (MetaWindow          *window, | ||||
|     meta_backend_warp_pointer (backend, *x, *y); | ||||
|   } | ||||
|  | ||||
|   if (meta_error_trap_pop_with_return (display) != Success) | ||||
|   if (meta_x11_error_trap_pop_with_return (display->x11_display) != Success) | ||||
|     { | ||||
|       meta_verbose ("Failed to warp pointer for window %s\n", | ||||
|                     window->desc); | ||||
| @@ -6511,7 +6534,6 @@ meta_window_begin_grab_op (MetaWindow *window, | ||||
|                      op, &x, &y); | ||||
|  | ||||
|   meta_display_begin_grab_op (window->display, | ||||
|                               window->screen, | ||||
|                               window, | ||||
|                               op, | ||||
|                               FALSE, | ||||
| @@ -6551,13 +6573,13 @@ meta_window_update_layer (MetaWindow *window) | ||||
| { | ||||
|   MetaGroup *group; | ||||
|  | ||||
|   meta_stack_freeze (window->screen->stack); | ||||
|   meta_stack_freeze (window->display->stack); | ||||
|   group = meta_window_get_group (window); | ||||
|   if (group) | ||||
|     meta_group_update_layers (group); | ||||
|   else | ||||
|     meta_stack_update_layer (window->screen->stack, window); | ||||
|   meta_stack_thaw (window->screen->stack); | ||||
|     meta_stack_update_layer (window->display->stack, window); | ||||
|   meta_stack_thaw (window->display->stack); | ||||
| } | ||||
|  | ||||
| /* ensure_mru_position_after ensures that window appears after | ||||
| @@ -6575,11 +6597,12 @@ ensure_mru_position_after (MetaWindow *window, | ||||
|    * map. | ||||
|    */ | ||||
|  | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   GList* active_mru_list; | ||||
|   GList* window_position; | ||||
|   GList* after_this_one_position; | ||||
|  | ||||
|   active_mru_list         = window->screen->active_workspace->mru_list; | ||||
|   active_mru_list         = workspace_manager->active_workspace->mru_list; | ||||
|   window_position         = g_list_find (active_mru_list, window); | ||||
|   after_this_one_position = g_list_find (active_mru_list, after_this_one); | ||||
|  | ||||
| @@ -6592,12 +6615,12 @@ ensure_mru_position_after (MetaWindow *window, | ||||
|  | ||||
|   if (g_list_length (window_position) > g_list_length (after_this_one_position)) | ||||
|     { | ||||
|       window->screen->active_workspace->mru_list = | ||||
|         g_list_delete_link (window->screen->active_workspace->mru_list, | ||||
|       workspace_manager->active_workspace->mru_list = | ||||
|         g_list_delete_link (workspace_manager->active_workspace->mru_list, | ||||
|                             window_position); | ||||
|  | ||||
|       window->screen->active_workspace->mru_list = | ||||
|         g_list_insert_before (window->screen->active_workspace->mru_list, | ||||
|       workspace_manager->active_workspace->mru_list = | ||||
|         g_list_insert_before (workspace_manager->active_workspace->mru_list, | ||||
|                               after_this_one_position->next, | ||||
|                               window); | ||||
|     } | ||||
| @@ -6715,12 +6738,13 @@ meta_window_get_stable_sequence (MetaWindow *window) | ||||
| void | ||||
| meta_window_set_demands_attention (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   MetaRectangle candidate_rect, other_rect; | ||||
|   GList *stack = window->screen->stack->sorted; | ||||
|   GList *stack = window->display->stack->sorted; | ||||
|   MetaWindow *other_window; | ||||
|   gboolean obscured = FALSE; | ||||
|  | ||||
|   MetaWorkspace *workspace = window->screen->active_workspace; | ||||
|   MetaWorkspace *workspace = workspace_manager->active_workspace; | ||||
|  | ||||
|   if (window->wm_state_demands_attention) | ||||
|     return; | ||||
| @@ -6864,20 +6888,6 @@ meta_window_is_skip_taskbar (MetaWindow *window) | ||||
|   return window->skip_taskbar; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_window_get_screen: | ||||
|  * @window: a #MetaWindow | ||||
|  * | ||||
|  * Gets the #MetaScreen that the window is on. | ||||
|  * | ||||
|  * Return value: (transfer none): the #MetaScreen for the window | ||||
|  */ | ||||
| MetaScreen * | ||||
| meta_window_get_screen (MetaWindow *window) | ||||
| { | ||||
|   return window->screen; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_window_get_display: | ||||
|  * @window: A #MetaWindow | ||||
| @@ -6920,8 +6930,10 @@ meta_window_get_window_type (MetaWindow *window) | ||||
| MetaWorkspace * | ||||
| meta_window_get_workspace (MetaWindow *window) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|  | ||||
|   if (window->on_all_workspaces) | ||||
|     return window->screen->active_workspace; | ||||
|     return workspace_manager->active_workspace; | ||||
|   else | ||||
|     return window->workspace; | ||||
| } | ||||
| @@ -7148,8 +7160,8 @@ meta_window_get_transient_for (MetaWindow *window) | ||||
|   if (window->transient_for) | ||||
|     return window->transient_for; | ||||
|   else if (window->xtransient_for) | ||||
|     return meta_display_lookup_x_window (window->display, | ||||
|                                          window->xtransient_for); | ||||
|     return meta_x11_display_lookup_x_window (window->display->x11_display, | ||||
|                                              window->xtransient_for); | ||||
|   else | ||||
|     return NULL; | ||||
| } | ||||
| @@ -7395,7 +7407,7 @@ meta_window_compute_tile_match (MetaWindow *window) | ||||
|   else | ||||
|     return; | ||||
|  | ||||
|   stack = window->screen->stack; | ||||
|   stack = window->display->stack; | ||||
|  | ||||
|   for (match = meta_stack_get_top (stack); | ||||
|        match; | ||||
| @@ -7414,7 +7426,7 @@ meta_window_compute_tile_match (MetaWindow *window) | ||||
|       MetaWindow *above, *bottommost, *topmost; | ||||
|       MetaRectangle above_rect, bottommost_rect, topmost_rect; | ||||
|  | ||||
|       if (meta_stack_windows_cmp (window->screen->stack, match, window) > 0) | ||||
|       if (meta_stack_windows_cmp (window->display->stack, match, window) > 0) | ||||
|         { | ||||
|           topmost = match; | ||||
|           bottommost = window; | ||||
| @@ -7577,7 +7589,7 @@ meta_window_set_transient_for (MetaWindow *window, | ||||
|  | ||||
|   /* update stacking constraints */ | ||||
|   if (!window->override_redirect) | ||||
|     meta_stack_update_transient (window->screen->stack, window); | ||||
|     meta_stack_update_transient (window->display->stack, window); | ||||
|  | ||||
|   /* possibly change its group. We treat being a window's transient as | ||||
|    * equivalent to making it your group leader, to work around shortcomings | ||||
| @@ -7663,9 +7675,8 @@ mouse_mode_focus (MetaWindow  *window, | ||||
|                       "Unsetting focus from %s due to mouse entering " | ||||
|                       "the DESKTOP window\n", | ||||
|                       display->focus_window->desc); | ||||
|           meta_display_focus_the_no_focus_window (display, | ||||
|                                                   window->screen, | ||||
|                                                   timestamp); | ||||
|           meta_x11_display_focus_the_no_focus_window (display->x11_display, | ||||
|                                                       timestamp); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -7688,25 +7699,24 @@ window_has_pointer_wayland (MetaWindow *window) | ||||
| static gboolean | ||||
| window_has_pointer_x11 (MetaWindow *window) | ||||
| { | ||||
|   MetaDisplay *display = window->display; | ||||
|   MetaScreen *screen = window->screen; | ||||
|   MetaX11Display *x11_display = window->display->x11_display; | ||||
|   Window root, child; | ||||
|   double root_x, root_y, x, y; | ||||
|   XIButtonState buttons; | ||||
|   XIModifierState mods; | ||||
|   XIGroupState group; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   XIQueryPointer (display->xdisplay, | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|   XIQueryPointer (x11_display->xdisplay, | ||||
|                   META_VIRTUAL_CORE_POINTER_ID, | ||||
|                   screen->xroot, | ||||
|                   x11_display->xroot, | ||||
|                   &root, &child, | ||||
|                   &root_x, &root_y, &x, &y, | ||||
|                   &buttons, &mods, &group); | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (x11_display); | ||||
|   free (buttons.mask); | ||||
|  | ||||
|   return meta_display_lookup_x_window (display, child) == window; | ||||
|   return meta_x11_display_lookup_x_window (x11_display, child) == window; | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| @@ -7942,7 +7952,6 @@ meta_window_handle_ungrabbed_event (MetaWindow         *window, | ||||
|  | ||||
|           if (op != META_GRAB_OP_WINDOW_BASE) | ||||
|             meta_display_begin_grab_op (display, | ||||
|                                         window->screen, | ||||
|                                         window, | ||||
|                                         op, | ||||
|                                         TRUE, | ||||
| @@ -7966,7 +7975,6 @@ meta_window_handle_ungrabbed_event (MetaWindow         *window, | ||||
|       if (window->has_move_func) | ||||
|         { | ||||
|           meta_display_begin_grab_op (display, | ||||
|                                       window->screen, | ||||
|                                       window, | ||||
|                                       META_GRAB_OP_MOVING, | ||||
|                                       TRUE, | ||||
|   | ||||
| @@ -37,7 +37,8 @@ | ||||
| struct _MetaWorkspace | ||||
| { | ||||
|   GObject parent_instance; | ||||
|   MetaScreen *screen; | ||||
|   MetaDisplay *display; | ||||
|   MetaWorkspaceManager *manager; | ||||
|  | ||||
|   GList *windows; | ||||
|  | ||||
| @@ -72,7 +73,7 @@ struct _MetaWorkspaceClass | ||||
|   GObjectClass parent_class; | ||||
| }; | ||||
|  | ||||
| MetaWorkspace* meta_workspace_new           (MetaScreen    *screen); | ||||
| MetaWorkspace* meta_workspace_new           (MetaWorkspaceManager *workspace_manager); | ||||
| void           meta_workspace_remove        (MetaWorkspace *workspace); | ||||
| void           meta_workspace_add_window    (MetaWorkspace *workspace, | ||||
|                                              MetaWindow    *window); | ||||
|   | ||||
| @@ -34,11 +34,12 @@ | ||||
| #include <config.h> | ||||
| #include "backends/meta-backend-private.h" | ||||
| #include "backends/meta-logical-monitor.h" | ||||
| #include "screen-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include <meta/workspace.h> | ||||
| #include "meta-workspace-manager-private.h" | ||||
| #include "workspace-private.h" | ||||
| #include "boxes-private.h" | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <meta/prefs.h> | ||||
|  | ||||
| #include <meta/compositor.h> | ||||
| @@ -221,17 +222,20 @@ meta_workspace_init (MetaWorkspace *workspace) | ||||
| { | ||||
| } | ||||
|  | ||||
| MetaWorkspace* | ||||
| meta_workspace_new (MetaScreen *screen) | ||||
| MetaWorkspace * | ||||
| meta_workspace_new (MetaWorkspaceManager *workspace_manager) | ||||
| { | ||||
|   MetaDisplay *display = workspace_manager->display; | ||||
|   MetaWorkspace *workspace; | ||||
|   GSList *windows, *l; | ||||
|  | ||||
|   workspace = g_object_new (META_TYPE_WORKSPACE, NULL); | ||||
|  | ||||
|   workspace->screen = screen; | ||||
|   workspace->screen->workspaces = | ||||
|     g_list_append (workspace->screen->workspaces, workspace); | ||||
|   workspace->display = display; | ||||
|   workspace->manager = workspace_manager; | ||||
|  | ||||
|   workspace_manager->workspaces = | ||||
|     g_list_append (workspace_manager->workspaces, workspace); | ||||
|   workspace->windows = NULL; | ||||
|   workspace->mru_list = NULL; | ||||
|  | ||||
| @@ -252,7 +256,7 @@ meta_workspace_new (MetaScreen *screen) | ||||
|   workspace->showing_desktop = FALSE; | ||||
|  | ||||
|   /* make sure sticky windows are in our mru_list */ | ||||
|   windows = meta_display_list_windows (screen->display, META_LIST_SORTED); | ||||
|   windows = meta_display_list_windows (display, META_LIST_SORTED); | ||||
|   for (l = windows; l; l = l->next) | ||||
|     if (meta_window_located_on_workspace (l->data, workspace)) | ||||
|       meta_workspace_add_window (workspace, l->data); | ||||
| @@ -318,12 +322,14 @@ assert_workspace_empty (MetaWorkspace *workspace) | ||||
| void | ||||
| meta_workspace_remove (MetaWorkspace *workspace) | ||||
| { | ||||
|   g_return_if_fail (workspace != workspace->screen->active_workspace); | ||||
|   MetaWorkspaceManager *manager = workspace->display->workspace_manager; | ||||
|  | ||||
|   g_return_if_fail (workspace != manager->active_workspace); | ||||
|  | ||||
|   assert_workspace_empty (workspace); | ||||
|  | ||||
|   workspace->screen->workspaces = | ||||
|     g_list_remove (workspace->screen->workspaces, workspace); | ||||
|   manager->workspaces = | ||||
|     g_list_remove (manager->workspaces, workspace); | ||||
|  | ||||
|   meta_workspace_clear_logical_monitor_data (workspace); | ||||
|  | ||||
| @@ -438,14 +444,14 @@ workspace_switch_sound(MetaWorkspace *from, | ||||
|   int i, nw, x, y, fi, ti; | ||||
|   const char *e; | ||||
|  | ||||
|   nw = meta_screen_get_n_workspaces(from->screen); | ||||
|   nw = meta_workspace_manager_get_n_workspaces (from->manager); | ||||
|   fi = meta_workspace_index(from); | ||||
|   ti = meta_workspace_index(to); | ||||
|  | ||||
|   meta_screen_calc_workspace_layout(from->screen, | ||||
|                                     nw, | ||||
|                                     fi, | ||||
|                                     &layout); | ||||
|   meta_workspace_manager_calc_workspace_layout (from->manager, | ||||
|                                                 nw, | ||||
|                                                 fi, | ||||
|                                                 &layout); | ||||
|  | ||||
|   for (i = 0; i < nw; i++) | ||||
|     if (layout.grid[i] == ti) | ||||
| @@ -488,7 +494,7 @@ workspace_switch_sound(MetaWorkspace *from, | ||||
|                   NULL); | ||||
|  | ||||
|  finish: | ||||
|   meta_screen_free_workspace_layout (&layout); | ||||
|   meta_workspace_manager_free_workspace_layout (&layout); | ||||
| #endif /* HAVE_LIBCANBERRA */ | ||||
| } | ||||
|  | ||||
| @@ -518,8 +524,6 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, | ||||
| { | ||||
|   MetaWorkspace  *old; | ||||
|   MetaWindow     *move_window; | ||||
|   MetaScreen     *screen; | ||||
|   MetaDisplay    *display; | ||||
|   MetaCompositor *comp; | ||||
|   MetaWorkspaceLayout layout1, layout2; | ||||
|   gint num_workspaces, current_space, new_space; | ||||
| @@ -528,36 +532,36 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, | ||||
|   meta_verbose ("Activating workspace %d\n", | ||||
|                 meta_workspace_index (workspace)); | ||||
|  | ||||
|   if (workspace->screen->active_workspace == workspace) | ||||
|   if (workspace->manager->active_workspace == workspace) | ||||
|     return; | ||||
|  | ||||
|   /* Free any cached pointers to the workspaces's edges from | ||||
|    * a current resize or move operation */ | ||||
|   meta_display_cleanup_edges (workspace->screen->display); | ||||
|   meta_display_cleanup_edges (workspace->display); | ||||
|  | ||||
|   if (workspace->screen->active_workspace) | ||||
|     workspace_switch_sound (workspace->screen->active_workspace, workspace); | ||||
|   if (workspace->manager->active_workspace) | ||||
|     workspace_switch_sound (workspace->manager->active_workspace, workspace); | ||||
|  | ||||
|   /* Note that old can be NULL; e.g. when starting up */ | ||||
|   old = workspace->screen->active_workspace; | ||||
|   old = workspace->manager->active_workspace; | ||||
|  | ||||
|   workspace->screen->active_workspace = workspace; | ||||
|   workspace->manager->active_workspace = workspace; | ||||
|  | ||||
|   meta_screen_set_active_workspace_hint (workspace->screen); | ||||
|   g_signal_emit_by_name (workspace->manager, "active-workspace-changed"); | ||||
|  | ||||
|   if (old == NULL) | ||||
|     return; | ||||
|  | ||||
|   /* If the "show desktop" mode is active for either the old workspace | ||||
|    * or the new one *but not both*, then update the | ||||
|    * _net_showing_desktop hint | ||||
|    */ | ||||
|   if (old && (old->showing_desktop != workspace->showing_desktop)) | ||||
|     meta_screen_update_showing_desktop_hint (workspace->screen); | ||||
|  | ||||
|   if (old == NULL) | ||||
|     return; | ||||
|   if (old->showing_desktop != workspace->showing_desktop) | ||||
|     g_signal_emit_by_name (workspace->manager, "showing-desktop-changed"); | ||||
|  | ||||
|   move_window = NULL; | ||||
|   if (meta_grab_op_is_moving (workspace->screen->display->grab_op)) | ||||
|     move_window = workspace->screen->display->grab_window; | ||||
|   if (meta_grab_op_is_moving (workspace->display->grab_op)) | ||||
|     move_window = workspace->display->grab_window; | ||||
|  | ||||
|   if (move_window != NULL) | ||||
|     { | ||||
| @@ -578,19 +582,17 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, | ||||
|    /* | ||||
|     * Notify the compositor that the active workspace is changing. | ||||
|     */ | ||||
|    screen = workspace->screen; | ||||
|    display = meta_screen_get_display (screen); | ||||
|    comp = meta_display_get_compositor (display); | ||||
|    comp = meta_display_get_compositor (workspace->display); | ||||
|    direction = 0; | ||||
|  | ||||
|    current_space = meta_workspace_index (old); | ||||
|    new_space     = meta_workspace_index (workspace); | ||||
|    num_workspaces = meta_screen_get_n_workspaces (workspace->screen); | ||||
|    meta_screen_calc_workspace_layout (workspace->screen, num_workspaces, | ||||
|                                       current_space, &layout1); | ||||
|    num_workspaces = meta_workspace_manager_get_n_workspaces (workspace->manager); | ||||
|    meta_workspace_manager_calc_workspace_layout (workspace->manager, num_workspaces, | ||||
|                                                  current_space, &layout1); | ||||
|  | ||||
|    meta_screen_calc_workspace_layout (workspace->screen, num_workspaces, | ||||
|                                       new_space, &layout2); | ||||
|    meta_workspace_manager_calc_workspace_layout (workspace->manager, num_workspaces, | ||||
|                                                  new_space, &layout2); | ||||
|  | ||||
|    if (meta_get_locale_direction () == META_LOCALE_DIRECTION_RTL) | ||||
|      { | ||||
| @@ -627,8 +629,8 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, | ||||
|          direction = META_MOTION_UP_LEFT; | ||||
|      } | ||||
|  | ||||
|    meta_screen_free_workspace_layout (&layout1); | ||||
|    meta_screen_free_workspace_layout (&layout2); | ||||
|    meta_workspace_manager_free_workspace_layout (&layout1); | ||||
|    meta_workspace_manager_free_workspace_layout (&layout2); | ||||
|  | ||||
|    meta_compositor_switch_workspace (comp, old, workspace, direction); | ||||
|  | ||||
| @@ -651,8 +653,8 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, | ||||
|       meta_workspace_focus_default_window (workspace, NULL, timestamp); | ||||
|     } | ||||
|  | ||||
|    /* Emit switched signal from screen.c */ | ||||
|    meta_screen_workspace_switched (screen, current_space, new_space, direction); | ||||
|    meta_workspace_manager_workspace_switched (workspace->manager, current_space, | ||||
|                                               new_space, direction); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -667,7 +669,7 @@ meta_workspace_index (MetaWorkspace *workspace) | ||||
| { | ||||
|   int ret; | ||||
|  | ||||
|   ret = g_list_index (workspace->screen->workspaces, workspace); | ||||
|   ret = g_list_index (workspace->manager->workspaces, workspace); | ||||
|  | ||||
|   if (ret < 0) | ||||
|     meta_bug ("Workspace does not exist to index!\n"); | ||||
| @@ -703,7 +705,7 @@ meta_workspace_list_windows (MetaWorkspace *workspace) | ||||
|   GSList *display_windows, *l; | ||||
|   GList *workspace_windows; | ||||
|  | ||||
|   display_windows = meta_display_list_windows (workspace->screen->display, | ||||
|   display_windows = meta_display_list_windows (workspace->display, | ||||
|                                                META_LIST_DEFAULT); | ||||
|  | ||||
|   workspace_windows = NULL; | ||||
| @@ -740,8 +742,8 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace) | ||||
|  | ||||
|   /* If we are in the middle of a resize or move operation, we | ||||
|    * might have cached pointers to the workspace's edges */ | ||||
|   if (workspace == workspace->screen->active_workspace) | ||||
|     meta_display_cleanup_edges (workspace->screen->display); | ||||
|   if (workspace == workspace->manager->active_workspace) | ||||
|     meta_display_cleanup_edges (workspace->display); | ||||
|  | ||||
|   meta_workspace_clear_logical_monitor_data (workspace); | ||||
|  | ||||
| @@ -767,7 +769,7 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace) | ||||
|  | ||||
|   g_list_free (windows); | ||||
|  | ||||
|   meta_screen_queue_workarea_recalc (workspace->screen); | ||||
|   meta_display_queue_workarea_recalc (workspace->display); | ||||
| } | ||||
|  | ||||
| static MetaStrut * | ||||
| @@ -796,7 +798,7 @@ ensure_work_areas_validated (MetaWorkspace *workspace) | ||||
|   GList *windows; | ||||
|   GList *tmp; | ||||
|   GList *logical_monitors, *l; | ||||
|   MetaRectangle work_area; | ||||
|   MetaRectangle display_rect, work_area; | ||||
|  | ||||
|   if (!workspace->work_areas_invalid) | ||||
|     return; | ||||
| @@ -806,6 +808,9 @@ ensure_work_areas_validated (MetaWorkspace *workspace) | ||||
|   g_assert (workspace->screen_edges == NULL); | ||||
|   g_assert (workspace->monitor_edges == NULL); | ||||
|  | ||||
|   meta_display_get_size (workspace->display, &display_rect.width, | ||||
|                          &display_rect.height); | ||||
|  | ||||
|   /* STEP 1: Get the list of struts */ | ||||
|  | ||||
|   workspace->all_struts = copy_strut_list (workspace->builtin_struts); | ||||
| @@ -848,13 +853,13 @@ ensure_work_areas_validated (MetaWorkspace *workspace) | ||||
|  | ||||
|   workspace->screen_region = | ||||
|     meta_rectangle_get_minimal_spanning_set_for_region ( | ||||
|       &workspace->screen->rect, | ||||
|       &display_rect, | ||||
|       workspace->all_struts); | ||||
|  | ||||
|   /* STEP 3: Get the work areas (region-to-maximize-to) for the screen and | ||||
|    *         monitors. | ||||
|    */ | ||||
|   work_area = workspace->screen->rect;  /* start with the screen */ | ||||
|   work_area = display_rect;  /* start with the screen */ | ||||
|   if (workspace->screen_region == NULL) | ||||
|     work_area = meta_rect (0, 0, -1, -1); | ||||
|   else | ||||
| @@ -871,7 +876,7 @@ ensure_work_areas_validated (MetaWorkspace *workspace) | ||||
|                     work_area.width, MIN_SANE_AREA); | ||||
|       if (work_area.width < 1) | ||||
|         { | ||||
|           work_area.x = (workspace->screen->rect.width - MIN_SANE_AREA)/2; | ||||
|           work_area.x = (display_rect.width - MIN_SANE_AREA)/2; | ||||
|           work_area.width = MIN_SANE_AREA; | ||||
|         } | ||||
|       else | ||||
| @@ -888,7 +893,7 @@ ensure_work_areas_validated (MetaWorkspace *workspace) | ||||
|                     work_area.height, MIN_SANE_AREA); | ||||
|       if (work_area.height < 1) | ||||
|         { | ||||
|           work_area.y = (workspace->screen->rect.height - MIN_SANE_AREA)/2; | ||||
|           work_area.y = (display_rect.height - MIN_SANE_AREA)/2; | ||||
|           work_area.height = MIN_SANE_AREA; | ||||
|         } | ||||
|       else | ||||
| @@ -955,7 +960,7 @@ ensure_work_areas_validated (MetaWorkspace *workspace) | ||||
|   g_assert (workspace->screen_edges    == NULL); | ||||
|   g_assert (workspace->monitor_edges  == NULL); | ||||
|   workspace->screen_edges = | ||||
|     meta_rectangle_find_onscreen_edges (&workspace->screen->rect, | ||||
|     meta_rectangle_find_onscreen_edges (&display_rect, | ||||
|                                         workspace->all_struts); | ||||
|   tmp = NULL; | ||||
|   for (l = logical_monitors; l; l = l->next) | ||||
| @@ -1006,9 +1011,12 @@ meta_workspace_set_builtin_struts (MetaWorkspace *workspace, | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   MetaMonitorManager *monitor_manager = | ||||
|     meta_backend_get_monitor_manager (backend); | ||||
|   MetaScreen *screen = workspace->screen; | ||||
|   MetaDisplay *display = workspace->display; | ||||
|   MetaRectangle display_rect; | ||||
|   GSList *l; | ||||
|  | ||||
|   meta_display_get_size (display, &display_rect.width, &display_rect.height); | ||||
|  | ||||
|   for (l = struts; l; l = l->next) | ||||
|     { | ||||
|       MetaStrut *strut = l->data; | ||||
| @@ -1023,7 +1031,7 @@ meta_workspace_set_builtin_struts (MetaWorkspace *workspace, | ||||
|         case META_SIDE_TOP: | ||||
|           if (meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager, | ||||
|                                                                  logical_monitor, | ||||
|                                                                  META_SCREEN_UP)) | ||||
|                                                                  META_DISPLAY_UP)) | ||||
|             continue; | ||||
|  | ||||
|           strut->rect.height += strut->rect.y; | ||||
| @@ -1032,15 +1040,15 @@ meta_workspace_set_builtin_struts (MetaWorkspace *workspace, | ||||
|         case META_SIDE_BOTTOM: | ||||
|           if (meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager, | ||||
|                                                                  logical_monitor, | ||||
|                                                                  META_SCREEN_DOWN)) | ||||
|                                                                  META_DISPLAY_DOWN)) | ||||
|             continue; | ||||
|  | ||||
|           strut->rect.height = screen->rect.height - strut->rect.y; | ||||
|           strut->rect.height = display_rect.height - strut->rect.y; | ||||
|           break; | ||||
|         case META_SIDE_LEFT: | ||||
|           if (meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager, | ||||
|                                                                  logical_monitor, | ||||
|                                                                  META_SCREEN_LEFT)) | ||||
|                                                                  META_DISPLAY_LEFT)) | ||||
|             continue; | ||||
|  | ||||
|           strut->rect.width += strut->rect.x; | ||||
| @@ -1049,10 +1057,10 @@ meta_workspace_set_builtin_struts (MetaWorkspace *workspace, | ||||
|         case META_SIDE_RIGHT: | ||||
|           if (meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager, | ||||
|                                                                  logical_monitor, | ||||
|                                                                  META_SCREEN_RIGHT)) | ||||
|                                                                  META_DISPLAY_RIGHT)) | ||||
|             continue; | ||||
|  | ||||
|           strut->rect.width = screen->rect.width - strut->rect.x; | ||||
|           strut->rect.width = display_rect.width - strut->rect.x; | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
| @@ -1195,9 +1203,9 @@ meta_workspace_get_neighbor (MetaWorkspace      *workspace, | ||||
|   gboolean ltr; | ||||
|  | ||||
|   current_space = meta_workspace_index (workspace); | ||||
|   num_workspaces = meta_screen_get_n_workspaces (workspace->screen); | ||||
|   meta_screen_calc_workspace_layout (workspace->screen, num_workspaces, | ||||
|                                      current_space, &layout); | ||||
|   num_workspaces = meta_workspace_manager_get_n_workspaces (workspace->manager); | ||||
|   meta_workspace_manager_calc_workspace_layout (workspace->manager, num_workspaces, | ||||
|                                                 current_space, &layout); | ||||
|  | ||||
|   meta_verbose ("Getting neighbor of %d in direction %s\n", | ||||
|                 current_space, meta_motion_direction_to_string (direction)); | ||||
| @@ -1242,9 +1250,9 @@ meta_workspace_get_neighbor (MetaWorkspace      *workspace, | ||||
|   meta_verbose ("Neighbor workspace is %d at row %d col %d\n", | ||||
|                 i, layout.current_row, layout.current_col); | ||||
|  | ||||
|   meta_screen_free_workspace_layout (&layout); | ||||
|   meta_workspace_manager_free_workspace_layout (&layout); | ||||
|  | ||||
|   return meta_screen_get_workspace_by_index (workspace->screen, i); | ||||
|   return meta_workspace_manager_get_workspace_by_index (workspace->manager, i); | ||||
| } | ||||
|  | ||||
| const char* | ||||
| @@ -1258,26 +1266,26 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace, | ||||
|                                      MetaWindow    *not_this_one, | ||||
|                                      guint32        timestamp) | ||||
| { | ||||
|   if (timestamp == CurrentTime) | ||||
|     meta_warning ("CurrentTime used to choose focus window; " | ||||
|   if (timestamp == META_CURRENT_TIME) | ||||
|     meta_warning ("META_CURRENT_TIME used to choose focus window; " | ||||
|                   "focus window may not be correct.\n"); | ||||
|  | ||||
|   if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK || | ||||
|       !workspace->screen->display->mouse_mode) | ||||
|       !workspace->display->mouse_mode) | ||||
|     focus_ancestor_or_top_window (workspace, not_this_one, timestamp); | ||||
|   else | ||||
|     { | ||||
|       MetaWindow * window; | ||||
|       window = meta_screen_get_mouse_window (workspace->screen, not_this_one); | ||||
|       window = meta_display_get_pointer_window (workspace->display, not_this_one); | ||||
|       if (window && | ||||
|           window->type != META_WINDOW_DOCK && | ||||
|           window->type != META_WINDOW_DESKTOP) | ||||
|         { | ||||
|           if (timestamp == CurrentTime) | ||||
|           if (timestamp == META_CURRENT_TIME) | ||||
|             { | ||||
|  | ||||
|               /* We would like for this to never happen.  However, if | ||||
|                * it does happen then we kludge since using CurrentTime | ||||
|                * it does happen then we kludge since using META_CURRENT_TIME | ||||
|                * can mean ugly race conditions--and we can avoid these | ||||
|                * by allowing EnterNotify events (which come with | ||||
|                * timestamps) to handle focus. | ||||
| @@ -1293,11 +1301,10 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace, | ||||
|               meta_window_focus (window, timestamp); | ||||
|             } | ||||
|  | ||||
|           if (workspace->screen->display->autoraise_window != window && | ||||
|           if (workspace->display->autoraise_window != window && | ||||
|               meta_prefs_get_auto_raise ()) | ||||
|             { | ||||
|               meta_display_queue_autoraise_callback (workspace->screen->display, | ||||
|                                                      window); | ||||
|               meta_display_queue_autoraise_callback (workspace->display, window); | ||||
|             } | ||||
|         } | ||||
|       else if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_SLOPPY) | ||||
| @@ -1307,9 +1314,8 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace, | ||||
|           meta_topic (META_DEBUG_FOCUS, | ||||
|                       "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); | ||||
|           meta_x11_display_focus_the_no_focus_window (workspace->display->x11_display, | ||||
|                                                       timestamp); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1363,7 +1369,7 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   window = meta_stack_get_default_focus_window (workspace->screen->stack, | ||||
|   window = meta_stack_get_default_focus_window (workspace->display->stack, | ||||
|                                                 workspace, | ||||
|                                                 not_this_one); | ||||
|  | ||||
| @@ -1381,23 +1387,21 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace, | ||||
|   else | ||||
|     { | ||||
|       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); | ||||
|       meta_x11_display_focus_the_no_focus_window (workspace->display->x11_display, | ||||
|                                                   timestamp); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_workspace_get_screen: | ||||
|  * meta_workspace_get_display: | ||||
|  * @workspace: a #MetaWorkspace | ||||
|  * | ||||
|  * Gets the #MetaScreen that the workspace is part of. | ||||
|  * Gets the #MetaDisplay that the workspace is part of. | ||||
|  * | ||||
|  * Return value: (transfer none): the #MetaScreen for the workspace | ||||
|  * Return value: (transfer none): the #MetaDisplay for the workspace | ||||
|  */ | ||||
| MetaScreen * | ||||
| meta_workspace_get_screen (MetaWorkspace *workspace) | ||||
| MetaDisplay * | ||||
| meta_workspace_get_display (MetaWorkspace *workspace) | ||||
| { | ||||
|   return workspace->screen; | ||||
|   return workspace->display; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -43,6 +43,9 @@ | ||||
| #define META_VIRTUAL_CORE_POINTER_ID 2 | ||||
| #define META_VIRTUAL_CORE_KEYBOARD_ID 3 | ||||
|  | ||||
| /* Replacement for X11 CurrentTime */ | ||||
| #define META_CURRENT_TIME 0L | ||||
|  | ||||
| /** | ||||
|  * MetaFrameFlags: | ||||
|  * @META_FRAME_ALLOWS_DELETE: frame allows delete | ||||
|   | ||||
| @@ -32,21 +32,21 @@ | ||||
| #include <meta/meta-window-actor.h> | ||||
|  | ||||
| /* Public compositor API */ | ||||
| ClutterActor *meta_get_stage_for_screen         (MetaScreen *screen); | ||||
| Window        meta_get_overlay_window           (MetaScreen *screen); | ||||
| GList        *meta_get_window_actors            (MetaScreen *screen); | ||||
| ClutterActor *meta_get_window_group_for_screen  (MetaScreen *screen); | ||||
| ClutterActor *meta_get_top_window_group_for_screen (MetaScreen *screen); | ||||
| ClutterActor *meta_get_feedback_group_for_screen (MetaScreen *screen); | ||||
| ClutterActor *meta_get_stage_for_display            (MetaDisplay *display); | ||||
| Window        meta_get_overlay_window               (MetaDisplay *display); | ||||
| GList        *meta_get_window_actors                (MetaDisplay *display); | ||||
| ClutterActor *meta_get_window_group_for_display     (MetaDisplay *display); | ||||
| ClutterActor *meta_get_top_window_group_for_display (MetaDisplay *display); | ||||
| ClutterActor *meta_get_feedback_group_for_display   (MetaDisplay *display); | ||||
|  | ||||
| void        meta_disable_unredirect_for_screen  (MetaScreen *screen); | ||||
| void        meta_enable_unredirect_for_screen   (MetaScreen *screen); | ||||
| void meta_disable_unredirect_for_display (MetaDisplay *display); | ||||
| void meta_enable_unredirect_for_display  (MetaDisplay *display); | ||||
|  | ||||
| void meta_set_stage_input_region     (MetaScreen    *screen, | ||||
|                                       XserverRegion  region); | ||||
| void meta_empty_stage_input_region   (MetaScreen    *screen); | ||||
| void meta_focus_stage_window         (MetaScreen    *screen, | ||||
|                                       guint32        timestamp); | ||||
| gboolean meta_stage_is_focused       (MetaScreen    *screen); | ||||
| void meta_set_stage_input_region   (MetaDisplay  *display, | ||||
|                                     XserverRegion region); | ||||
| void meta_empty_stage_input_region (MetaDisplay  *display); | ||||
| void meta_focus_stage_window       (MetaDisplay  *display, | ||||
|                                     guint32       timestamp); | ||||
| gboolean meta_stage_is_focused     (MetaDisplay  *display); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -114,8 +114,8 @@ void meta_compositor_queue_frame_drawn    (MetaCompositor *compositor, | ||||
| void meta_compositor_sync_stack                (MetaCompositor *compositor, | ||||
|                                                 GList          *stack); | ||||
|  | ||||
| void meta_compositor_flash_screen              (MetaCompositor *compositor, | ||||
|                                                 MetaScreen     *screen); | ||||
| void meta_compositor_flash_display             (MetaCompositor *compositor, | ||||
|                                                 MetaDisplay    *display); | ||||
|  | ||||
| void meta_compositor_show_tile_preview (MetaCompositor *compositor, | ||||
|                                         MetaWindow     *window, | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
| #include <meta/types.h> | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/common.h> | ||||
| #include <meta/workspace.h> | ||||
|  | ||||
| /** | ||||
|  * MetaTabList: | ||||
| @@ -73,21 +74,13 @@ GType meta_display_get_type (void) G_GNUC_CONST; | ||||
|  | ||||
| #define meta_XFree(p) do { if ((p)) XFree ((p)); } while (0) | ||||
|  | ||||
| int meta_display_get_xinput_opcode (MetaDisplay *display); | ||||
| gboolean meta_display_supports_extended_barriers (MetaDisplay *display); | ||||
| Display *meta_display_get_xdisplay (MetaDisplay *display); | ||||
| MetaCompositor *meta_display_get_compositor (MetaDisplay *display); | ||||
|  | ||||
| gboolean meta_display_has_shape (MetaDisplay *display); | ||||
| MetaCompositor *meta_display_get_compositor  (MetaDisplay *display); | ||||
| MetaX11Display *meta_display_get_x11_display (MetaDisplay *display); | ||||
|  | ||||
| MetaWindow *meta_display_get_focus_window (MetaDisplay *display); | ||||
|  | ||||
| gboolean  meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display, | ||||
|                                                      Window xwindow); | ||||
|  | ||||
| int meta_display_get_damage_event_base (MetaDisplay *display); | ||||
| int meta_display_get_shape_event_base (MetaDisplay *display); | ||||
|  | ||||
| gboolean meta_display_xserver_time_is_before (MetaDisplay *display, | ||||
|                                               guint32      time1, | ||||
|                                               guint32      time2); | ||||
| @@ -111,7 +104,6 @@ MetaWindow* meta_display_get_tab_current (MetaDisplay   *display, | ||||
|                                           MetaWorkspace *workspace); | ||||
|  | ||||
| gboolean meta_display_begin_grab_op (MetaDisplay *display, | ||||
|                                      MetaScreen  *screen, | ||||
|                                      MetaWindow  *window, | ||||
|                                      MetaGrabOp   op, | ||||
|                                      gboolean     pointer_already_grabbed, | ||||
| @@ -145,38 +137,12 @@ guint meta_display_get_keybinding_action (MetaDisplay  *display, | ||||
|                                           unsigned int  keycode, | ||||
|                                           unsigned long mask); | ||||
|  | ||||
| /* meta_display_set_input_focus_window is like XSetInputFocus, except | ||||
|  * that (a) it can't detect timestamps later than the current time, | ||||
|  * since Mutter isn't part of the XServer, and thus gives erroneous | ||||
|  * behavior in this circumstance (so don't do it), (b) it uses | ||||
|  * display->last_focus_time since we don't have access to the true | ||||
|  * Xserver one, (c) it makes use of display->user_time since checking | ||||
|  * whether a window should be allowed to be focused should depend | ||||
|  * on user_time events (see bug 167358, comment 15 in particular) | ||||
|  */ | ||||
| void meta_display_set_input_focus_window   (MetaDisplay *display, | ||||
|                                             MetaWindow  *window, | ||||
|                                             gboolean     focus_frame, | ||||
|                                             guint32      timestamp); | ||||
|  | ||||
| /* meta_display_focus_the_no_focus_window is called when the | ||||
|  * designated no_focus_window should be focused, but is otherwise the | ||||
|  * same as meta_display_set_input_focus_window | ||||
|  */ | ||||
| void meta_display_focus_the_no_focus_window (MetaDisplay *display, | ||||
|                                              MetaScreen  *screen, | ||||
|                                              guint32      timestamp); | ||||
|  | ||||
| GSList *meta_display_sort_windows_by_stacking (MetaDisplay *display, | ||||
|                                                GSList      *windows); | ||||
|  | ||||
| void meta_display_add_ignored_crossing_serial (MetaDisplay  *display, | ||||
|                                                unsigned long serial); | ||||
|  | ||||
| void meta_display_unmanage_screen (MetaDisplay *display, | ||||
|                                    MetaScreen  *screen, | ||||
|                                    guint32      timestamp); | ||||
|  | ||||
| void meta_display_clear_mouse_mode (MetaDisplay *display); | ||||
|  | ||||
| void meta_display_freeze_keyboard (MetaDisplay *display, | ||||
| @@ -196,4 +162,65 @@ gchar * meta_display_get_pad_action_label (MetaDisplay        *display, | ||||
|                                            MetaPadActionType   action_type, | ||||
|                                            guint               action_number); | ||||
|  | ||||
| void meta_display_get_size (MetaDisplay *display, | ||||
|                             int         *width, | ||||
|                             int         *height); | ||||
|  | ||||
| void meta_display_set_cursor (MetaDisplay *display, | ||||
|                               MetaCursor   cursor); | ||||
|  | ||||
| GSList *meta_display_get_startup_sequences (MetaDisplay *display); | ||||
|  | ||||
| /** | ||||
|  * MetaDisplayDirection: | ||||
|  * @META_DISPLAY_UP: up | ||||
|  * @META_DISPLAY_DOWN: down | ||||
|  * @META_DISPLAY_LEFT: left | ||||
|  * @META_DISPLAY_RIGHT: right | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|   META_DISPLAY_UP, | ||||
|   META_DISPLAY_DOWN, | ||||
|   META_DISPLAY_LEFT, | ||||
|   META_DISPLAY_RIGHT | ||||
| } MetaDisplayDirection; | ||||
|  | ||||
| int  meta_display_get_n_monitors       (MetaDisplay   *display); | ||||
| int  meta_display_get_primary_monitor  (MetaDisplay   *display); | ||||
| int  meta_display_get_current_monitor  (MetaDisplay   *display); | ||||
| void meta_display_get_monitor_geometry (MetaDisplay   *display, | ||||
|                                         int            monitor, | ||||
|                                         MetaRectangle *geometry); | ||||
|  | ||||
| gboolean meta_display_get_monitor_in_fullscreen (MetaDisplay *display, | ||||
|                                                  int          monitor); | ||||
|  | ||||
| int meta_display_get_monitor_index_for_rect (MetaDisplay   *display, | ||||
|                                              MetaRectangle *rect); | ||||
|  | ||||
| int meta_display_get_monitor_neighbor_index (MetaDisplay         *display, | ||||
|                                              int                  which_monitor, | ||||
|                                              MetaDisplayDirection dir); | ||||
|  | ||||
| void meta_display_focus_default_window (MetaDisplay *display, | ||||
|                                         guint32      timestamp); | ||||
|  | ||||
| /** | ||||
|  * MetaDisplayCorner: | ||||
|  * @META_DISPLAY_TOPLEFT: top-left corner | ||||
|  * @META_DISPLAY_TOPRIGHT: top-right corner | ||||
|  * @META_DISPLAY_BOTTOMLEFT: bottom-left corner | ||||
|  * @META_DISPLAY_BOTTOMRIGHT: bottom-right corner | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|   META_DISPLAY_TOPLEFT, | ||||
|   META_DISPLAY_TOPRIGHT, | ||||
|   META_DISPLAY_BOTTOMLEFT, | ||||
|   META_DISPLAY_BOTTOMRIGHT | ||||
| } MetaDisplayCorner; | ||||
|  | ||||
| MetaWorkspaceManager *meta_display_get_workspace_manager (MetaDisplay *display); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -34,8 +34,8 @@ void       meta_window_shutdown_group  (MetaWindow *window); | ||||
| void       meta_window_group_leader_changed (MetaWindow *window); | ||||
|  | ||||
| /* note, can return NULL */ | ||||
| MetaGroup* meta_display_lookup_group   (MetaDisplay *display, | ||||
|                                         Window       group_leader); | ||||
| MetaGroup *meta_x11_display_lookup_group (MetaX11Display *x11_display, | ||||
|                                           Window          group_leader); | ||||
|  | ||||
| GSList*    meta_group_list_windows     (MetaGroup *group); | ||||
|  | ||||
| @@ -49,7 +49,3 @@ gboolean meta_group_property_notify   (MetaGroup  *group, | ||||
|                                        XEvent     *event); | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,6 @@ | ||||
| #define META_BACKGROUND_ACTOR_H | ||||
|  | ||||
| #include <clutter/clutter.h> | ||||
| #include <meta/screen.h> | ||||
| #include <meta/meta-background.h> | ||||
|  | ||||
| #include <gsettings-desktop-schemas/gdesktop-enums.h> | ||||
| @@ -61,8 +60,8 @@ struct _MetaBackgroundActor | ||||
|  | ||||
| GType meta_background_actor_get_type (void); | ||||
|  | ||||
| ClutterActor *meta_background_actor_new    (MetaScreen *screen, | ||||
|                                             int         monitor); | ||||
| ClutterActor *meta_background_actor_new    (MetaDisplay *display, | ||||
|                                             int          monitor); | ||||
|  | ||||
| void meta_background_actor_set_background  (MetaBackgroundActor *self, | ||||
|                                             MetaBackground      *background); | ||||
|   | ||||
| @@ -23,7 +23,6 @@ | ||||
|  | ||||
| #include <clutter/clutter.h> | ||||
| #include <gsettings-desktop-schemas/gdesktop-enums.h> | ||||
| #include <meta/screen.h> | ||||
|  | ||||
| /** | ||||
|  * MetaBackground: | ||||
| @@ -61,7 +60,7 @@ void meta_background_refresh_all (void); | ||||
|  | ||||
| GType meta_background_get_type (void); | ||||
|  | ||||
| MetaBackground *meta_background_new  (MetaScreen *screen); | ||||
| MetaBackground *meta_background_new (MetaDisplay *display); | ||||
|  | ||||
| void meta_background_set_color    (MetaBackground            *self, | ||||
|                                    ClutterColor              *color); | ||||
|   | ||||
| @@ -39,7 +39,7 @@ typedef struct _MetaCursorTrackerClass   MetaCursorTrackerClass; | ||||
|  | ||||
| GType meta_cursor_tracker_get_type (void); | ||||
|  | ||||
| MetaCursorTracker *meta_cursor_tracker_get_for_screen (MetaScreen *screen); | ||||
| MetaCursorTracker *meta_cursor_tracker_get_for_display (MetaDisplay *display); | ||||
|  | ||||
| void           meta_cursor_tracker_get_hot    (MetaCursorTracker *tracker, | ||||
|                                                int               *x, | ||||
|   | ||||
| @@ -421,7 +421,7 @@ void | ||||
| meta_plugin_end_modal (MetaPlugin *plugin, | ||||
|                        guint32     timestamp); | ||||
|  | ||||
| MetaScreen *meta_plugin_get_screen        (MetaPlugin *plugin); | ||||
| MetaDisplay *meta_plugin_get_display (MetaPlugin *plugin); | ||||
|  | ||||
| void _meta_plugin_set_compositor (MetaPlugin *plugin, MetaCompositor *compositor); | ||||
|  | ||||
|   | ||||
							
								
								
									
										59
									
								
								src/meta/meta-workspace-manager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/meta/meta-workspace-manager.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2002, 2003, 2004 Red Hat, Inc. | ||||
|  * Copyright (C) 2003, 2004 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_WORKSPACE_MANAGER_H | ||||
| #define META_WORKSPACE_MANAGER_H | ||||
|  | ||||
| #include <glib-object.h> | ||||
|  | ||||
| #include <meta/common.h> | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/types.h> | ||||
|  | ||||
| #define META_TYPE_WORKSPACE_MANAGER (meta_workspace_manager_get_type ()) | ||||
| G_DECLARE_FINAL_TYPE (MetaWorkspaceManager, meta_workspace_manager, META, WORKSPACE_MANAGER, GObject) | ||||
|  | ||||
| GList *meta_workspace_manager_get_workspaces (MetaWorkspaceManager *workspace_manager); | ||||
|  | ||||
| int meta_workspace_manager_get_n_workspaces (MetaWorkspaceManager *workspace_manager); | ||||
|  | ||||
| MetaWorkspace* meta_workspace_manager_get_workspace_by_index (MetaWorkspaceManager *workspace_manager, | ||||
|                                                               int                   index); | ||||
|  | ||||
| void meta_workspace_manager_remove_workspace (MetaWorkspaceManager *workspace_manager, | ||||
|                                               MetaWorkspace        *workspace, | ||||
|                                               guint32               timestamp); | ||||
|  | ||||
| MetaWorkspace *meta_workspace_manager_append_new_workspace (MetaWorkspaceManager *workspace_manager, | ||||
|                                                             gboolean              activate, | ||||
|                                                             guint32               timestamp); | ||||
|  | ||||
| int meta_workspace_manager_get_active_workspace_index (MetaWorkspaceManager *workspace_manager); | ||||
|  | ||||
| MetaWorkspace *meta_workspace_manager_get_active_workspace (MetaWorkspaceManager *workspace_manager); | ||||
|  | ||||
| void meta_workspace_manager_override_workspace_layout (MetaWorkspaceManager *workspace_manager, | ||||
|                                                        MetaDisplayCorner     starting_corner, | ||||
|                                                        gboolean              vertical_layout, | ||||
|                                                        int                   n_rows, | ||||
|                                                        int                   n_columns); | ||||
| #endif /* META_WORKSPACE_MANAGER_H */ | ||||
							
								
								
									
										68
									
								
								src/meta/meta-x11-display.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/meta/meta-x11-display.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2008 Iain Holmes | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_X11_DISPLAY_H | ||||
| #define META_X11_DISPLAY_H | ||||
|  | ||||
| #include <glib-object.h> | ||||
| #include <X11/Xlib.h> | ||||
|  | ||||
| #include <meta/common.h> | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/types.h> | ||||
|  | ||||
| #define META_TYPE_X11_DISPLAY (meta_x11_display_get_type ()) | ||||
| G_DECLARE_FINAL_TYPE (MetaX11Display, meta_x11_display, META, X11_DISPLAY, GObject) | ||||
|  | ||||
| int      meta_x11_display_get_screen_number (MetaX11Display *x11_display); | ||||
| Display *meta_x11_display_get_xdisplay      (MetaX11Display *x11_display); | ||||
| Window   meta_x11_display_get_xroot         (MetaX11Display *x11_display); | ||||
|  | ||||
| int      meta_x11_display_get_xinput_opcode     (MetaX11Display *x11_display); | ||||
| int      meta_x11_display_get_damage_event_base (MetaX11Display *x11_display); | ||||
| int      meta_x11_display_get_shape_event_base  (MetaX11Display *x11_display); | ||||
| gboolean meta_x11_display_has_shape             (MetaX11Display *x11_display); | ||||
|  | ||||
| void meta_x11_display_set_cm_selection (MetaX11Display *x11_display); | ||||
|  | ||||
| gboolean meta_x11_display_xwindow_is_a_no_focus_window (MetaX11Display *x11_display, | ||||
|                                                         Window xwindow); | ||||
|  | ||||
| /* meta_x11_display_set_input_focus_window is like XSetInputFocus, except | ||||
|  * that (a) it can't detect timestamps later than the current time, | ||||
|  * since Mutter isn't part of the XServer, and thus gives erroneous | ||||
|  * behavior in this circumstance (so don't do it), (b) it uses | ||||
|  * display->last_focus_time since we don't have access to the true | ||||
|  * Xserver one, (c) it makes use of display->user_time since checking | ||||
|  * whether a window should be allowed to be focused should depend | ||||
|  * on user_time events (see bug 167358, comment 15 in particular) | ||||
|  */ | ||||
| void meta_x11_display_set_input_focus_window (MetaX11Display *x11_display, | ||||
|                                               MetaWindow     *window, | ||||
|                                               gboolean        focus_frame, | ||||
|                                               guint32         timestamp); | ||||
|  | ||||
| /* meta_x11_display_focus_the_no_focus_window is called when the | ||||
|  * designated no_focus_window should be focused, but is otherwise the | ||||
|  * same as meta_display_set_input_focus_window | ||||
|  */ | ||||
| void meta_x11_display_focus_the_no_focus_window (MetaX11Display *x11_display, | ||||
|                                                  guint32         timestamp); | ||||
|  | ||||
| #endif /* META_X11_DISPLAY_H */ | ||||
| @@ -25,13 +25,13 @@ | ||||
| #include <X11/Xlib.h> | ||||
| 
 | ||||
| #include <meta/util.h> | ||||
| #include <meta/display.h> | ||||
| #include <meta/meta-x11-display.h> | ||||
| 
 | ||||
| void      meta_error_trap_push (MetaDisplay *display); | ||||
| void      meta_error_trap_pop  (MetaDisplay *display); | ||||
| void      meta_x11_error_trap_push (MetaX11Display *x11_display); | ||||
| void      meta_x11_error_trap_pop  (MetaX11Display *x11_display); | ||||
| 
 | ||||
| /* returns X error code, or 0 for no error */ | ||||
| int       meta_error_trap_pop_with_return  (MetaDisplay *display); | ||||
| int       meta_x11_error_trap_pop_with_return  (MetaX11Display *x11_display); | ||||
| 
 | ||||
| 
 | ||||
| #endif | ||||
| @@ -140,7 +140,9 @@ gboolean                    meta_prefs_get_gnome_animations   (void); | ||||
| gboolean                    meta_prefs_get_edge_tiling        (void); | ||||
| gboolean                    meta_prefs_get_auto_maximize      (void); | ||||
| gboolean                    meta_prefs_get_center_new_windows (void); | ||||
|  | ||||
| gboolean                    meta_prefs_get_show_fallback_app_menu (void); | ||||
| void                        meta_prefs_set_show_fallback_app_menu (gboolean whether); | ||||
|  | ||||
| void                        meta_prefs_get_button_layout (MetaButtonLayout *button_layout); | ||||
|  | ||||
| @@ -384,7 +386,6 @@ typedef enum | ||||
| /** | ||||
|  * MetaKeyHandlerFunc: | ||||
|  * @display: a #MetaDisplay | ||||
|  * @screen: a #MetaScreen | ||||
|  * @window: a #MetaWindow | ||||
|  * @event: (type gpointer): a #ClutterKeyEvent | ||||
|  * @binding: a #MetaKeyBinding | ||||
| @@ -392,7 +393,6 @@ typedef enum | ||||
|  * | ||||
|  */ | ||||
| typedef void (* MetaKeyHandlerFunc) (MetaDisplay     *display, | ||||
|                                      MetaScreen      *screen, | ||||
|                                      MetaWindow      *window, | ||||
|                                      ClutterKeyEvent *event, | ||||
|                                      MetaKeyBinding  *binding, | ||||
|   | ||||
| @@ -1,128 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2008 Iain Holmes | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_SCREEN_H | ||||
| #define META_SCREEN_H | ||||
|  | ||||
| #include <X11/Xlib.h> | ||||
| #include <glib-object.h> | ||||
| #include <meta/types.h> | ||||
| #include <meta/workspace.h> | ||||
|  | ||||
| #define META_TYPE_SCREEN            (meta_screen_get_type ()) | ||||
| #define META_SCREEN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_SCREEN, MetaScreen)) | ||||
| #define META_SCREEN_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_SCREEN, MetaScreenClass)) | ||||
| #define META_IS_SCREEN(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_SCREEN)) | ||||
| #define META_IS_SCREEN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_SCREEN)) | ||||
| #define META_SCREEN_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_SCREEN, MetaScreenClass)) | ||||
|  | ||||
| typedef struct _MetaScreenClass   MetaScreenClass; | ||||
|  | ||||
| GType meta_screen_get_type (void); | ||||
|  | ||||
| int meta_screen_get_screen_number (MetaScreen *screen); | ||||
| MetaDisplay *meta_screen_get_display (MetaScreen *screen); | ||||
|  | ||||
| Window meta_screen_get_xroot (MetaScreen *screen); | ||||
| void meta_screen_get_size (MetaScreen *screen, | ||||
|                            int        *width, | ||||
|                            int        *height); | ||||
|  | ||||
| void meta_screen_set_cm_selection (MetaScreen *screen); | ||||
|  | ||||
| GSList *meta_screen_get_startup_sequences (MetaScreen *screen); | ||||
|  | ||||
| GList *meta_screen_get_workspaces (MetaScreen *screen); | ||||
|  | ||||
| int meta_screen_get_n_workspaces (MetaScreen *screen); | ||||
|  | ||||
| MetaWorkspace* meta_screen_get_workspace_by_index (MetaScreen    *screen, | ||||
|                                                    int            index); | ||||
| void meta_screen_remove_workspace (MetaScreen    *screen, | ||||
|                                    MetaWorkspace *workspace, | ||||
|                                    guint32        timestamp); | ||||
|  | ||||
| MetaWorkspace *meta_screen_append_new_workspace (MetaScreen    *screen, | ||||
|                                                  gboolean       activate, | ||||
|                                                  guint32        timestamp); | ||||
|  | ||||
| int meta_screen_get_active_workspace_index (MetaScreen *screen); | ||||
|  | ||||
| MetaWorkspace * meta_screen_get_active_workspace (MetaScreen *screen); | ||||
|  | ||||
| /** | ||||
|  * MetaScreenDirection: | ||||
|  * @META_SCREEN_UP: up | ||||
|  * @META_SCREEN_DOWN: down | ||||
|  * @META_SCREEN_LEFT: left | ||||
|  * @META_SCREEN_RIGHT: right | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|   META_SCREEN_UP, | ||||
|   META_SCREEN_DOWN, | ||||
|   META_SCREEN_LEFT, | ||||
|   META_SCREEN_RIGHT | ||||
| } MetaScreenDirection; | ||||
|  | ||||
| int  meta_screen_get_n_monitors       (MetaScreen    *screen); | ||||
| int  meta_screen_get_primary_monitor  (MetaScreen    *screen); | ||||
| int  meta_screen_get_current_monitor  (MetaScreen    *screen); | ||||
| void meta_screen_get_monitor_geometry (MetaScreen    *screen, | ||||
|                                        int            monitor, | ||||
|                                        MetaRectangle *geometry); | ||||
|  | ||||
| gboolean meta_screen_get_monitor_in_fullscreen (MetaScreen  *screen, | ||||
|                                                 int          monitor); | ||||
|  | ||||
| int meta_screen_get_monitor_index_for_rect (MetaScreen    *screen, | ||||
|                                             MetaRectangle *rect); | ||||
|  | ||||
| int meta_screen_get_monitor_neighbor_index (MetaScreen *screen, | ||||
|                                             int         which_monitor, | ||||
|                                             MetaScreenDirection dir); | ||||
|  | ||||
| void meta_screen_focus_default_window (MetaScreen *screen, | ||||
|                                        guint32     timestamp); | ||||
|  | ||||
| /** | ||||
|  * MetaScreenCorner: | ||||
|  * @META_SCREEN_TOPLEFT: top-left corner | ||||
|  * @META_SCREEN_TOPRIGHT: top-right corner | ||||
|  * @META_SCREEN_BOTTOMLEFT: bottom-left corner | ||||
|  * @META_SCREEN_BOTTOMRIGHT: bottom-right corner | ||||
|  */ | ||||
| typedef enum | ||||
| { | ||||
|   META_SCREEN_TOPLEFT, | ||||
|   META_SCREEN_TOPRIGHT, | ||||
|   META_SCREEN_BOTTOMLEFT, | ||||
|   META_SCREEN_BOTTOMRIGHT | ||||
| } MetaScreenCorner; | ||||
|  | ||||
| void meta_screen_override_workspace_layout (MetaScreen      *screen, | ||||
|                                             MetaScreenCorner starting_corner, | ||||
|                                             gboolean         vertical_layout, | ||||
|                                             int              n_rows, | ||||
|                                             int              n_columns); | ||||
|  | ||||
| void          meta_screen_set_cursor          (MetaScreen                 *screen, | ||||
|                                                MetaCursor                  cursor); | ||||
|  | ||||
| #endif | ||||
| @@ -27,8 +27,8 @@ | ||||
| typedef struct _MetaBackend     MetaBackend; | ||||
| typedef struct _MetaCompositor  MetaCompositor; | ||||
| typedef struct _MetaDisplay     MetaDisplay; | ||||
| typedef struct _MetaX11Display  MetaX11Display; | ||||
| typedef struct _MetaFrame       MetaFrame; | ||||
| typedef struct _MetaScreen      MetaScreen; | ||||
| typedef struct _MetaWindow      MetaWindow; | ||||
| typedef struct _MetaWorkspace   MetaWorkspace; | ||||
| /** | ||||
| @@ -42,4 +42,6 @@ typedef struct _MetaCursorTracker MetaCursorTracker; | ||||
| typedef struct _MetaDnd         MetaDnd; | ||||
| typedef struct _MetaSettings    MetaSettings; | ||||
|  | ||||
| typedef struct _MetaWorkspaceManager MetaWorkspaceManager; | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -119,7 +119,6 @@ void meta_window_frame_rect_to_client_rect (MetaWindow    *window, | ||||
|                                             MetaRectangle *frame_rect, | ||||
|                                             MetaRectangle *client_rect); | ||||
|  | ||||
| MetaScreen *meta_window_get_screen (MetaWindow *window); | ||||
| MetaDisplay *meta_window_get_display (MetaWindow *window); | ||||
| Window meta_window_get_xwindow (MetaWindow *window); | ||||
| MetaWindowType meta_window_get_window_type (MetaWindow *window); | ||||
|   | ||||
| @@ -23,7 +23,6 @@ | ||||
|  | ||||
| #include <meta/types.h> | ||||
| #include <meta/boxes.h> | ||||
| #include <meta/screen.h> | ||||
|  | ||||
| #define META_TYPE_WORKSPACE            (meta_workspace_get_type ()) | ||||
| #define META_WORKSPACE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_WORKSPACE, MetaWorkspace)) | ||||
| @@ -37,7 +36,7 @@ typedef struct _MetaWorkspaceClass   MetaWorkspaceClass; | ||||
| GType meta_workspace_get_type (void); | ||||
|  | ||||
| int  meta_workspace_index (MetaWorkspace *workspace); | ||||
| MetaScreen *meta_workspace_get_screen (MetaWorkspace *workspace); | ||||
| MetaDisplay *meta_workspace_get_display (MetaWorkspace *workspace); | ||||
| GList* meta_workspace_list_windows (MetaWorkspace *workspace); | ||||
| void meta_workspace_get_work_area_for_monitor (MetaWorkspace *workspace, | ||||
|                                                int            which_monitor, | ||||
|   | ||||
| @@ -29,6 +29,7 @@ | ||||
| #include "meta-plugin-manager.h" | ||||
| #include "wayland/meta-wayland.h" | ||||
| #include "window-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #define TEST_RUNNER_ERROR test_runner_error_quark () | ||||
|  | ||||
| @@ -60,7 +61,8 @@ async_waiter_new (void) | ||||
| { | ||||
|   AsyncWaiter *waiter = g_new0 (AsyncWaiter, 1); | ||||
|  | ||||
|   Display *xdisplay = meta_get_display ()->xdisplay; | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   Display *xdisplay = display->x11_display->xdisplay; | ||||
|   XSyncValue value; | ||||
|   XSyncAlarmAttributes attr; | ||||
|  | ||||
| @@ -100,7 +102,8 @@ async_waiter_new (void) | ||||
| static void | ||||
| async_waiter_destroy (AsyncWaiter *waiter) | ||||
| { | ||||
|   Display *xdisplay = meta_get_display ()->xdisplay; | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   Display *xdisplay = display->x11_display->xdisplay; | ||||
|  | ||||
|   XSyncDestroyAlarm (xdisplay, waiter->alarm); | ||||
|   XSyncDestroyCounter (xdisplay, waiter->counter); | ||||
| @@ -128,7 +131,8 @@ async_waiter_wait (AsyncWaiter *waiter, | ||||
| static void | ||||
| async_waiter_set_and_wait (AsyncWaiter *waiter) | ||||
| { | ||||
|   Display *xdisplay = meta_get_display ()->xdisplay; | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   Display *xdisplay = display->x11_display->xdisplay; | ||||
|   int wait_value = async_waiter_next_value (waiter); | ||||
|  | ||||
|   XSyncValue sync_value; | ||||
| @@ -140,7 +144,7 @@ async_waiter_set_and_wait (AsyncWaiter *waiter) | ||||
|  | ||||
| static gboolean | ||||
| async_waiter_alarm_filter (AsyncWaiter           *waiter, | ||||
|                            MetaDisplay           *display, | ||||
|                            MetaX11Display        *x11_display, | ||||
|                            XSyncAlarmNotifyEvent *event) | ||||
| { | ||||
|   if (event->alarm != waiter->alarm) | ||||
| @@ -396,11 +400,11 @@ test_client_find_window (TestClient *client, | ||||
|  | ||||
| static gboolean | ||||
| test_client_alarm_filter (TestClient            *client, | ||||
|                           MetaDisplay           *display, | ||||
|                           MetaX11Display        *x11_display, | ||||
|                           XSyncAlarmNotifyEvent *event) | ||||
| { | ||||
|   if (client->waiter) | ||||
|     return async_waiter_alarm_filter (client->waiter, display, event); | ||||
|     return async_waiter_alarm_filter (client->waiter, x11_display, event); | ||||
|   else | ||||
|     return FALSE; | ||||
| } | ||||
| @@ -416,7 +420,7 @@ typedef struct { | ||||
| } TestCase; | ||||
|  | ||||
| static gboolean | ||||
| test_case_alarm_filter (MetaDisplay           *display, | ||||
| test_case_alarm_filter (MetaX11Display        *x11_display, | ||||
|                         XSyncAlarmNotifyEvent *event, | ||||
|                         gpointer               data) | ||||
| { | ||||
| @@ -424,12 +428,12 @@ test_case_alarm_filter (MetaDisplay           *display, | ||||
|   GHashTableIter iter; | ||||
|   gpointer key, value; | ||||
|  | ||||
|   if (async_waiter_alarm_filter (test->waiter, display, event)) | ||||
|   if (async_waiter_alarm_filter (test->waiter, x11_display, event)) | ||||
|     return TRUE; | ||||
|  | ||||
|   g_hash_table_iter_init (&iter, test->clients); | ||||
|   while (g_hash_table_iter_next (&iter, &key, &value)) | ||||
|     if (test_client_alarm_filter (value, display, event)) | ||||
|     if (test_client_alarm_filter (value, x11_display, event)) | ||||
|       return TRUE; | ||||
|  | ||||
|   return FALSE; | ||||
| @@ -478,8 +482,8 @@ test_case_new (void) | ||||
|                                             test_case_log_func, | ||||
|                                             test); | ||||
|  | ||||
|   meta_display_set_alarm_filter (meta_get_display (), | ||||
|                                  test_case_alarm_filter, test); | ||||
|   meta_x11_display_set_alarm_filter (meta_get_display ()->x11_display, | ||||
|                                      test_case_alarm_filter, test); | ||||
|  | ||||
|   test->clients = g_hash_table_new (g_str_hash, g_str_equal); | ||||
|   test->waiter = async_waiter_new (); | ||||
| @@ -588,7 +592,7 @@ test_case_assert_stacking (TestCase *test, | ||||
|   GString *expected_string = g_string_new (NULL); | ||||
|   int i; | ||||
|  | ||||
|   meta_stack_tracker_get_stack (display->screen->stack_tracker, &windows, &n_windows); | ||||
|   meta_stack_tracker_get_stack (display->stack_tracker, &windows, &n_windows); | ||||
|   for (i = 0; i < n_windows; i++) | ||||
|     { | ||||
|       MetaWindow *window = meta_display_lookup_stack_id (display, windows[i]); | ||||
| @@ -598,7 +602,7 @@ test_case_assert_stacking (TestCase *test, | ||||
|            * is managed as a MetaWindow. | ||||
|            */ | ||||
|           if (META_STACK_ID_IS_X11 (windows[i]) && | ||||
|               meta_ui_window_is_dummy (display->screen->ui, windows[i])) | ||||
|               meta_ui_window_is_dummy (display->x11_display->ui, windows[i])) | ||||
|             continue; | ||||
|  | ||||
|           if (stack_string->len > 0) | ||||
| @@ -609,7 +613,7 @@ test_case_assert_stacking (TestCase *test, | ||||
|           else | ||||
|             g_string_append_printf (stack_string, "(%s)", window->title); | ||||
|         } | ||||
|       else if (windows[i] == display->screen->guard_window) | ||||
|       else if (windows[i] == display->x11_display->guard_window) | ||||
|         { | ||||
|           if (stack_string->len > 0) | ||||
|             g_string_append_c (stack_string, ' '); | ||||
| @@ -660,7 +664,7 @@ test_case_check_xserver_stacking (TestCase *test, | ||||
|  | ||||
|   guint64 *windows; | ||||
|   int n_windows; | ||||
|   meta_stack_tracker_get_stack (display->screen->stack_tracker, &windows, &n_windows); | ||||
|   meta_stack_tracker_get_stack (display->stack_tracker, &windows, &n_windows); | ||||
|  | ||||
|   for (i = 0; i < n_windows; i++) | ||||
|     { | ||||
| @@ -677,8 +681,8 @@ test_case_check_xserver_stacking (TestCase *test, | ||||
|   Window parent; | ||||
|   Window *children; | ||||
|   unsigned int n_children; | ||||
|   XQueryTree (display->xdisplay, | ||||
|               meta_screen_get_xroot (display->screen), | ||||
|   XQueryTree (display->x11_display->xdisplay, | ||||
|               display->x11_display->xroot, | ||||
|               &root, &parent, &children, &n_children); | ||||
|  | ||||
|   for (i = 0; i < (int)n_children; i++) | ||||
| @@ -878,7 +882,8 @@ test_case_destroy (TestCase *test, | ||||
|  | ||||
|   async_waiter_destroy (test->waiter); | ||||
|  | ||||
|   meta_display_set_alarm_filter (meta_get_display (), NULL, NULL); | ||||
|   meta_x11_display_set_alarm_filter (meta_get_display ()->x11_display, | ||||
|                                      NULL, NULL); | ||||
|  | ||||
|   g_hash_table_destroy (test->clients); | ||||
|   g_free (test); | ||||
|   | ||||
							
								
								
									
										59
									
								
								src/ui/ui.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								src/ui/ui.c
									
									
									
									
									
								
							| @@ -26,6 +26,7 @@ | ||||
| #include <meta/util.h> | ||||
| #include "core.h" | ||||
| #include "theme-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| @@ -44,52 +45,18 @@ struct _MetaUI | ||||
|   guint32 button_click_time; | ||||
| }; | ||||
|  | ||||
| void | ||||
| meta_ui_init (void) | ||||
| MetaUI * | ||||
| meta_ui_new (MetaX11Display *x11_display) | ||||
| { | ||||
|   const char *gdk_gl_env = NULL; | ||||
|   gdk_set_allowed_backends ("x11"); | ||||
|  | ||||
|   gdk_gl_env = g_getenv ("GDK_GL"); | ||||
|   g_setenv("GDK_GL", "disable", TRUE); | ||||
|  | ||||
|   if (!gtk_init_check (NULL, NULL)) | ||||
|     meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL)); | ||||
|  | ||||
|   if (gdk_gl_env) | ||||
|     g_setenv("GDK_GL", gdk_gl_env, TRUE); | ||||
|   else | ||||
|     unsetenv("GDK_GL"); | ||||
|  | ||||
|   /* We need to be able to fully trust that the window and monitor sizes | ||||
|      that Gdk reports corresponds to the X ones, so we disable the automatic | ||||
|      scale handling */ | ||||
|   gdk_x11_display_set_window_scale (gdk_display_get_default (), 1); | ||||
| } | ||||
|  | ||||
| Display* | ||||
| meta_ui_get_display (void) | ||||
| { | ||||
|   return GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); | ||||
| } | ||||
|  | ||||
| gint | ||||
| meta_ui_get_screen_number (void) | ||||
| { | ||||
|   return gdk_screen_get_number (gdk_screen_get_default ()); | ||||
| } | ||||
|  | ||||
| MetaUI* | ||||
| meta_ui_new (Display *xdisplay) | ||||
| { | ||||
|   GdkDisplay *gdisplay; | ||||
|   MetaUI *ui; | ||||
|  | ||||
|   ui = g_new0 (MetaUI, 1); | ||||
|   ui->xdisplay = xdisplay; | ||||
|   if (!gtk_init_check (NULL, NULL)) | ||||
|     meta_fatal ("Unable to initialize GTK"); | ||||
|  | ||||
|   gdisplay = gdk_x11_lookup_xdisplay (xdisplay); | ||||
|   g_assert (gdisplay == gdk_display_get_default ()); | ||||
|   g_assert (x11_display->gdk_display == gdk_display_get_default ()); | ||||
|  | ||||
|   ui = g_new0 (MetaUI, 1); | ||||
|   ui->xdisplay = x11_display->xdisplay; | ||||
|  | ||||
|   ui->frames = meta_frames_new (); | ||||
|   /* GTK+ needs the frame-sync protocol to work in order to properly | ||||
| @@ -100,7 +67,7 @@ meta_ui_new (Display *xdisplay) | ||||
|    */ | ||||
|   gtk_widget_show (GTK_WIDGET (ui->frames)); | ||||
|  | ||||
|   g_object_set_data (G_OBJECT (gdisplay), "meta-ui", ui); | ||||
|   g_object_set_data (G_OBJECT (x11_display->gdk_display), "meta-ui", ui); | ||||
|  | ||||
|   return ui; | ||||
| } | ||||
| @@ -108,12 +75,12 @@ meta_ui_new (Display *xdisplay) | ||||
| void | ||||
| meta_ui_free (MetaUI *ui) | ||||
| { | ||||
|   GdkDisplay *gdisplay; | ||||
|   GdkDisplay *gdk_display; | ||||
|  | ||||
|   gtk_widget_destroy (GTK_WIDGET (ui->frames)); | ||||
|  | ||||
|   gdisplay = gdk_x11_lookup_xdisplay (ui->xdisplay); | ||||
|   g_object_set_data (G_OBJECT (gdisplay), "meta-ui", NULL); | ||||
|   gdk_display = gdk_x11_lookup_xdisplay (ui->xdisplay); | ||||
|   g_object_set_data (G_OBJECT (gdk_display), "meta-ui", NULL); | ||||
|  | ||||
|   g_free (ui); | ||||
| } | ||||
|   | ||||
| @@ -36,13 +36,7 @@ typedef struct _MetaUIFrame MetaUIFrame; | ||||
|  | ||||
| typedef gboolean (* MetaEventFunc) (XEvent *xevent, gpointer data); | ||||
|  | ||||
| void meta_ui_init (void); | ||||
|  | ||||
| Display* meta_ui_get_display (void); | ||||
|  | ||||
| gint meta_ui_get_screen_number (void); | ||||
|  | ||||
| MetaUI* meta_ui_new (Display *xdisplay); | ||||
| MetaUI *meta_ui_new  (MetaX11Display *x11_display); | ||||
| void    meta_ui_free (MetaUI *ui); | ||||
|  | ||||
| void meta_ui_theme_get_frame_borders (MetaUI *ui, | ||||
|   | ||||
| @@ -190,7 +190,6 @@ meta_wayland_popup_grab_begin (MetaWaylandPopupGrab *grab, | ||||
|  | ||||
|   meta_wayland_pointer_start_grab (pointer, (MetaWaylandPointerGrab*)grab); | ||||
|   meta_display_begin_grab_op (window->display, | ||||
|                               window->screen, | ||||
|                               window, | ||||
|                               META_GRAB_OP_WAYLAND_POPUP, | ||||
|                               FALSE, /* pointer_already_grabbed */ | ||||
|   | ||||
| @@ -26,7 +26,6 @@ | ||||
| #include "meta-wayland-surface-role-cursor.h" | ||||
| #include "meta-wayland-buffer.h" | ||||
| #include "meta-xwayland.h" | ||||
| #include "screen-private.h" | ||||
| #include "meta-wayland-private.h" | ||||
| #include "backends/meta-backend-private.h" | ||||
| #include "backends/meta-logical-monitor.h" | ||||
|   | ||||
| @@ -1410,7 +1410,6 @@ meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface, | ||||
|      constrain it in the same way as it would be if the window was | ||||
|      being moved/resized via a SSD event. */ | ||||
|   return meta_display_begin_grab_op (window->display, | ||||
|                                      window->screen, | ||||
|                                      window, | ||||
|                                      grab_op, | ||||
|                                      TRUE, /* pointer_already_grabbed */ | ||||
|   | ||||
| @@ -45,6 +45,8 @@ | ||||
| #include "meta-wayland-inhibit-shortcuts.h" | ||||
| #include "meta-wayland-inhibit-shortcuts-dialog.h" | ||||
|  | ||||
| #include "main-private.h" | ||||
|  | ||||
| static MetaWaylandCompositor _meta_wayland_compositor; | ||||
| static char *_display_name_override; | ||||
|  | ||||
| @@ -362,7 +364,8 @@ meta_wayland_init (void) | ||||
|   meta_wayland_keyboard_shortcuts_inhibit_init (compositor); | ||||
|   meta_wayland_surface_inhibit_shortcuts_dialog_init (); | ||||
|  | ||||
|   if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display)) | ||||
|   if (meta_should_autostart_x11_display () && | ||||
|       !meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display)) | ||||
|     g_error ("Failed to start X Wayland"); | ||||
|  | ||||
|   if (_display_name_override) | ||||
| @@ -383,7 +386,9 @@ meta_wayland_init (void) | ||||
|         g_error ("Failed to create socket"); | ||||
|     } | ||||
|  | ||||
|   set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor)); | ||||
|   if (meta_should_autostart_x11_display ()) | ||||
|     set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor)); | ||||
|  | ||||
|   set_gnome_env ("WAYLAND_DISPLAY", meta_wayland_get_wayland_display_name (compositor)); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
|  | ||||
| #include "meta-window-wayland.h" | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <errno.h> | ||||
| #include <string.h> /* for strerror () */ | ||||
| #include "window-private.h" | ||||
| @@ -85,7 +85,7 @@ meta_window_wayland_manage (MetaWindow *window) | ||||
|   meta_display_register_wayland_window (display, window); | ||||
|  | ||||
|   { | ||||
|     meta_stack_tracker_record_add (window->screen->stack_tracker, | ||||
|     meta_stack_tracker_record_add (window->display->stack_tracker, | ||||
|                                    window->stamp, | ||||
|                                    0); | ||||
|   } | ||||
| @@ -97,7 +97,7 @@ static void | ||||
| meta_window_wayland_unmanage (MetaWindow *window) | ||||
| { | ||||
|   { | ||||
|     meta_stack_tracker_record_remove (window->screen->stack_tracker, | ||||
|     meta_stack_tracker_record_remove (window->display->stack_tracker, | ||||
|                                       window->stamp, | ||||
|                                       0); | ||||
|   } | ||||
| @@ -136,10 +136,10 @@ meta_window_wayland_focus (MetaWindow *window, | ||||
|                            guint32     timestamp) | ||||
| { | ||||
|   if (window->input) | ||||
|     meta_display_set_input_focus_window (window->display, | ||||
|                                          window, | ||||
|                                          FALSE, | ||||
|                                          timestamp); | ||||
|     meta_x11_display_set_input_focus_window (window->display->x11_display, | ||||
|                                              window, | ||||
|                                              FALSE, | ||||
|                                              timestamp); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -564,7 +564,6 @@ meta_window_wayland_new (MetaDisplay        *display, | ||||
|                          MetaWaylandSurface *surface) | ||||
| { | ||||
|   XWindowAttributes attrs = { 0 }; | ||||
|   MetaScreen *scr = display->screen; | ||||
|   MetaWindow *window; | ||||
|  | ||||
|   /* | ||||
| @@ -585,12 +584,11 @@ meta_window_wayland_new (MetaDisplay        *display, | ||||
|    * X requests (passing a window xid of None) until we thoroughly audit all | ||||
|    * the code to make sure it knows about non X based clients... | ||||
|    */ | ||||
|   meta_error_trap_push (display); /* Push a trap over all of window | ||||
|                                    * creation, to reduce XSync() calls | ||||
|                                    */ | ||||
|   meta_x11_error_trap_push (display->x11_display); /* Push a trap over all of window | ||||
|                                                 * creation, to reduce XSync() calls | ||||
|                                                 */ | ||||
|  | ||||
|   window = _meta_window_shared_new (display, | ||||
|                                     scr, | ||||
|                                     META_WINDOW_CLIENT_TYPE_WAYLAND, | ||||
|                                     surface, | ||||
|                                     None, | ||||
| @@ -599,7 +597,7 @@ meta_window_wayland_new (MetaDisplay        *display, | ||||
|                                     &attrs); | ||||
|   window->can_ping = TRUE; | ||||
|  | ||||
|   meta_error_trap_pop (display); /* pop the XSync()-reducing trap */ | ||||
|   meta_x11_error_trap_pop (display->x11_display); /* pop the XSync()-reducing trap */ | ||||
|  | ||||
|   return window; | ||||
| } | ||||
|   | ||||
| @@ -34,11 +34,12 @@ | ||||
| #include <X11/Xatom.h> | ||||
| #include <X11/extensions/Xfixes.h> | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "meta-xwayland.h" | ||||
| #include "meta-xwayland-private.h" | ||||
| #include "meta-xwayland-selection-private.h" | ||||
| #include "meta-wayland-data-device.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| #define INCR_CHUNK_SIZE (128 * 1024) | ||||
| #define XDND_VERSION 5 | ||||
| @@ -466,7 +467,7 @@ x11_selection_data_send_finished (MetaSelectionBridge *selection, | ||||
|                          gdk_x11_get_xatom_by_name ("DELETE"), | ||||
|                          gdk_x11_get_xatom_by_name ("_META_SELECTION"), | ||||
|                          selection->window, | ||||
|                          CurrentTime); | ||||
|                          META_CURRENT_TIME); | ||||
|     } | ||||
|  | ||||
|   xdnd_send_finished (selection->x11_selection->selection_data, | ||||
| @@ -562,7 +563,7 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event, | ||||
|                             MetaWaylandCompositor  *compositor) | ||||
| { | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   MetaScreen *screen = display->screen; | ||||
|   MetaX11Display *x11_display = display->x11_display; | ||||
|   MetaWaylandDataDevice *data_device; | ||||
|   MetaWaylandDataSource *wayland_source; | ||||
|   MetaSelectionBridge *selection; | ||||
| @@ -609,11 +610,11 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event, | ||||
|   data->cancellable = g_cancellable_new (); | ||||
|   data->stream = g_unix_input_stream_new (p[0], TRUE); | ||||
|  | ||||
|   data->window = meta_display_lookup_x_window (meta_get_display (), | ||||
|                                                data->request_event.requestor); | ||||
|   data->window = meta_x11_display_lookup_x_window (x11_display, | ||||
|                                                    data->request_event.requestor); | ||||
|  | ||||
|   /* Do *not* change the event mask on the root window, bugger! */ | ||||
|   if (!data->window && data->request_event.requestor != screen->xroot) | ||||
|   if (!data->window && data->request_event.requestor != x11_display->xroot) | ||||
|     { | ||||
|       /* Not a managed window, set the PropertyChangeMask | ||||
|        * for INCR deletion notifications. | ||||
| @@ -648,15 +649,15 @@ static void | ||||
| wayland_selection_data_free (WaylandSelectionData *data) | ||||
| { | ||||
|   MetaDisplay *display = meta_get_display (); | ||||
|   MetaScreen *screen = display->screen; | ||||
|   MetaX11Display *x11_display = display->x11_display; | ||||
|  | ||||
|   /* Do *not* change the event mask on the root window, bugger! */ | ||||
|   if (!data->window && data->request_event.requestor != screen->xroot) | ||||
|   if (!data->window && data->request_event.requestor != x11_display->xroot) | ||||
|     { | ||||
|       meta_error_trap_push (display); | ||||
|       meta_x11_error_trap_push (x11_display); | ||||
|       XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), | ||||
|                     data->request_event.requestor, NoEventMask); | ||||
|       meta_error_trap_pop (display); | ||||
|       meta_x11_error_trap_pop (x11_display); | ||||
|     } | ||||
|  | ||||
|   g_cancellable_cancel (data->cancellable); | ||||
| @@ -1344,7 +1345,7 @@ pick_drop_surface (MetaWaylandCompositor *compositor, | ||||
|   ClutterPoint pos; | ||||
|  | ||||
|   clutter_event_get_coords (event, &pos.x, &pos.y); | ||||
|   focus_window = meta_stack_get_default_focus_window_at_point (display->screen->stack, | ||||
|   focus_window = meta_stack_get_default_focus_window_at_point (display->stack, | ||||
|                                                                NULL, NULL, | ||||
|                                                                pos.x, pos.y); | ||||
|   return focus_window ? focus_window->surface : NULL; | ||||
| @@ -1616,7 +1617,7 @@ meta_xwayland_selection_handle_xfixes_selection_notify (MetaWaylandCompositor *c | ||||
|                              gdk_x11_get_xatom_by_name ("TARGETS"), | ||||
|                              gdk_x11_get_xatom_by_name ("_META_SELECTION"), | ||||
|                              selection->window, | ||||
|                              CurrentTime); | ||||
|                              META_CURRENT_TIME); | ||||
|           XFlush (xdisplay); | ||||
|         } | ||||
|     } | ||||
| @@ -1631,7 +1632,7 @@ meta_xwayland_selection_handle_xfixes_selection_notify (MetaWaylandCompositor *c | ||||
|       if (event->owner != None && event->owner != selection->window && | ||||
|           focus && meta_xwayland_is_xwayland_surface (focus)) | ||||
|         { | ||||
|           selection->client_message_timestamp = CurrentTime; | ||||
|           selection->client_message_timestamp = META_CURRENT_TIME; | ||||
|           selection->source = meta_wayland_data_source_xwayland_new (selection); | ||||
|           meta_wayland_data_device_set_dnd_source (&compositor->seat->data_device, | ||||
|                                                    selection->source); | ||||
| @@ -1673,9 +1674,9 @@ meta_xwayland_selection_handle_event (XEvent *xevent) | ||||
|       return meta_xwayland_selection_handle_client_message (compositor, xevent); | ||||
|     default: | ||||
|       { | ||||
|         MetaDisplay *display = meta_get_display (); | ||||
|         MetaX11Display *x11_display = meta_get_display ()->x11_display; | ||||
|  | ||||
|         if (xevent->type - display->xfixes_event_base == XFixesSelectionNotify) | ||||
|         if (xevent->type - x11_display->xfixes_event_base == XFixesSelectionNotify) | ||||
|           return meta_xwayland_selection_handle_xfixes_selection_notify (compositor, xevent); | ||||
|  | ||||
|         return FALSE; | ||||
| @@ -1702,7 +1703,7 @@ meta_selection_bridge_ownership_notify (struct wl_listener *listener, | ||||
|       XSetSelectionOwner (xdisplay, | ||||
|                           selection->selection_atom, | ||||
|                           selection->window, | ||||
|                           CurrentTime); | ||||
|                           META_CURRENT_TIME); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										471
									
								
								src/x11/events.c
									
									
									
									
									
								
							
							
						
						
									
										471
									
								
								src/x11/events.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -25,7 +25,7 @@ | ||||
| #ifndef META_EVENTS_X11_H | ||||
| #define META_EVENTS_X11_H | ||||
|  | ||||
| void meta_display_init_events_x11 (MetaDisplay *display); | ||||
| void meta_display_free_events_x11 (MetaDisplay *display); | ||||
| void meta_x11_display_init_events (MetaX11Display *x11_display); | ||||
| void meta_x11_display_free_events (MetaX11Display *x11_display); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -27,7 +27,7 @@ | ||||
| struct _MetaGroup | ||||
| { | ||||
|   int refcount; | ||||
|   MetaDisplay *display; | ||||
|   MetaX11Display *x11_display; | ||||
|   GSList *windows; | ||||
|   Window group_leader; | ||||
|   char *startup_id; | ||||
|   | ||||
| @@ -23,13 +23,14 @@ | ||||
| #include "group-props.h" | ||||
| #include "group-private.h" | ||||
| #include "xprops.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include <X11/Xatom.h> | ||||
|  | ||||
| typedef void (* InitValueFunc)   (MetaDisplay   *display, | ||||
|                                   Atom           property, | ||||
|                                   MetaPropValue *value); | ||||
| typedef void (* ReloadValueFunc) (MetaGroup     *group, | ||||
|                                   MetaPropValue *value); | ||||
| typedef void (* InitValueFunc)   (MetaX11Display *x11_display, | ||||
|                                   Atom            property, | ||||
|                                   MetaPropValue  *value); | ||||
| typedef void (* ReloadValueFunc) (MetaGroup      *group, | ||||
|                                   MetaPropValue  *value); | ||||
|  | ||||
| struct _MetaGroupPropHooks | ||||
| { | ||||
| @@ -38,15 +39,13 @@ struct _MetaGroupPropHooks | ||||
|   ReloadValueFunc reload_func; | ||||
| }; | ||||
|  | ||||
| static void                init_prop_value   (MetaDisplay   *display, | ||||
|                                               Atom           property, | ||||
|                                               MetaPropValue *value); | ||||
| static void                reload_prop_value (MetaGroup     *group, | ||||
|                                               MetaPropValue *value); | ||||
| static MetaGroupPropHooks* find_hooks        (MetaDisplay   *display, | ||||
|                                               Atom           property); | ||||
|  | ||||
|  | ||||
| static void                init_prop_value   (MetaX11Display *x11_display, | ||||
|                                               Atom            property, | ||||
|                                               MetaPropValue  *value); | ||||
| static void                reload_prop_value (MetaGroup      *group, | ||||
|                                               MetaPropValue  *value); | ||||
| static MetaGroupPropHooks *find_hooks        (MetaX11Display *x11_display, | ||||
|                                               Atom            property); | ||||
|  | ||||
| void | ||||
| meta_group_reload_property (MetaGroup *group, | ||||
| @@ -71,11 +70,12 @@ meta_group_reload_properties (MetaGroup  *group, | ||||
|   i = 0; | ||||
|   while (i < n_properties) | ||||
|     { | ||||
|       init_prop_value (group->display, properties[i], &values[i]); | ||||
|       init_prop_value (group->x11_display, properties[i], &values[i]); | ||||
|       ++i; | ||||
|     } | ||||
|  | ||||
|   meta_prop_get_values (group->display, group->group_leader, | ||||
|   meta_prop_get_values (group->x11_display, | ||||
|                         group->group_leader, | ||||
|                         values, n_properties); | ||||
|  | ||||
|   i = 0; | ||||
| @@ -93,18 +93,18 @@ meta_group_reload_properties (MetaGroup  *group, | ||||
|  | ||||
| /* Fill in the MetaPropValue used to get the value of "property" */ | ||||
| static void | ||||
| init_prop_value (MetaDisplay   *display, | ||||
|                  Atom           property, | ||||
|                  MetaPropValue *value) | ||||
| init_prop_value (MetaX11Display *x11_display, | ||||
|                  Atom            property, | ||||
|                  MetaPropValue  *value) | ||||
| { | ||||
|   MetaGroupPropHooks *hooks; | ||||
|  | ||||
|   value->type = META_PROP_VALUE_INVALID; | ||||
|   value->atom = None; | ||||
|  | ||||
|   hooks = find_hooks (display, property); | ||||
|   hooks = find_hooks (x11_display, property); | ||||
|   if (hooks && hooks->init_func != NULL) | ||||
|     (* hooks->init_func) (display, property, value); | ||||
|     (* hooks->init_func) (x11_display, property, value); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -113,18 +113,18 @@ reload_prop_value (MetaGroup    *group, | ||||
| { | ||||
|   MetaGroupPropHooks *hooks; | ||||
|  | ||||
|   hooks = find_hooks (group->display, value->atom); | ||||
|   hooks = find_hooks (group->x11_display, value->atom); | ||||
|   if (hooks && hooks->reload_func != NULL) | ||||
|     (* hooks->reload_func) (group, value); | ||||
| } | ||||
|  | ||||
| static void | ||||
| init_wm_client_machine (MetaDisplay   *display, | ||||
|                         Atom           property, | ||||
|                         MetaPropValue *value) | ||||
| init_wm_client_machine (MetaX11Display *x11_display, | ||||
|                         Atom            property, | ||||
|                         MetaPropValue  *value) | ||||
| { | ||||
|   value->type = META_PROP_VALUE_STRING; | ||||
|   value->atom = display->atom_WM_CLIENT_MACHINE; | ||||
|   value->atom = x11_display->atom_WM_CLIENT_MACHINE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -142,12 +142,12 @@ reload_wm_client_machine (MetaGroup     *group, | ||||
| } | ||||
|  | ||||
| static void | ||||
| init_net_startup_id (MetaDisplay   *display, | ||||
|                      Atom           property, | ||||
|                      MetaPropValue *value) | ||||
| init_net_startup_id (MetaX11Display *x11_display, | ||||
|                      Atom            property, | ||||
|                      MetaPropValue  *value) | ||||
| { | ||||
|   value->type = META_PROP_VALUE_UTF8; | ||||
|   value->atom = display->atom__NET_STARTUP_ID; | ||||
|   value->atom = x11_display->atom__NET_STARTUP_ID; | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -167,29 +167,29 @@ reload_net_startup_id (MetaGroup     *group, | ||||
| #define N_HOOKS 3 | ||||
|  | ||||
| void | ||||
| meta_display_init_group_prop_hooks (MetaDisplay *display) | ||||
| meta_x11_display_init_group_prop_hooks (MetaX11Display *x11_display) | ||||
| { | ||||
|   int i; | ||||
|   MetaGroupPropHooks *hooks; | ||||
|  | ||||
|   g_assert (display->group_prop_hooks == NULL); | ||||
|   g_assert (x11_display->group_prop_hooks == NULL); | ||||
|  | ||||
|   display->group_prop_hooks = g_new0 (MetaGroupPropHooks, N_HOOKS); | ||||
|   hooks = display->group_prop_hooks; | ||||
|   x11_display->group_prop_hooks = g_new0 (MetaGroupPropHooks, N_HOOKS); | ||||
|   hooks = x11_display->group_prop_hooks; | ||||
|  | ||||
|   i = 0; | ||||
|  | ||||
|   hooks[i].property = display->atom_WM_CLIENT_MACHINE; | ||||
|   hooks[i].property = x11_display->atom_WM_CLIENT_MACHINE; | ||||
|   hooks[i].init_func = init_wm_client_machine; | ||||
|   hooks[i].reload_func = reload_wm_client_machine; | ||||
|   ++i; | ||||
|  | ||||
|   hooks[i].property = display->atom__NET_WM_PID; | ||||
|   hooks[i].property = x11_display->atom__NET_WM_PID; | ||||
|   hooks[i].init_func = NULL; | ||||
|   hooks[i].reload_func = NULL; | ||||
|   ++i; | ||||
|  | ||||
|   hooks[i].property = display->atom__NET_STARTUP_ID; | ||||
|   hooks[i].property = x11_display->atom__NET_STARTUP_ID; | ||||
|   hooks[i].init_func = init_net_startup_id; | ||||
|   hooks[i].reload_func = reload_net_startup_id; | ||||
|   ++i; | ||||
| @@ -201,17 +201,17 @@ meta_display_init_group_prop_hooks (MetaDisplay *display) | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_display_free_group_prop_hooks (MetaDisplay *display) | ||||
| meta_x11_display_free_group_prop_hooks (MetaX11Display *x11_display) | ||||
| { | ||||
|   g_assert (display->group_prop_hooks != NULL); | ||||
|   g_assert (x11_display->group_prop_hooks != NULL); | ||||
|  | ||||
|   g_free (display->group_prop_hooks); | ||||
|   display->group_prop_hooks = NULL; | ||||
|   g_free (x11_display->group_prop_hooks); | ||||
|   x11_display->group_prop_hooks = NULL; | ||||
| } | ||||
|  | ||||
| static MetaGroupPropHooks* | ||||
| find_hooks (MetaDisplay *display, | ||||
|             Atom         property) | ||||
| find_hooks (MetaX11Display *x11_display, | ||||
|             Atom            property) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
| @@ -222,8 +222,8 @@ find_hooks (MetaDisplay *display, | ||||
|   i = 0; | ||||
|   while (i < N_HOOKS) | ||||
|     { | ||||
|       if (display->group_prop_hooks[i].property == property) | ||||
|         return &display->group_prop_hooks[i]; | ||||
|       if (x11_display->group_prop_hooks[i].property == property) | ||||
|         return &x11_display->group_prop_hooks[i]; | ||||
|  | ||||
|       ++i; | ||||
|     } | ||||
|   | ||||
| @@ -30,7 +30,8 @@ void meta_group_reload_property         (MetaGroup   *group, | ||||
| void meta_group_reload_properties       (MetaGroup   *group, | ||||
|                                          const Atom  *properties, | ||||
|                                          int          n_properties); | ||||
| void meta_display_init_group_prop_hooks (MetaDisplay *display); | ||||
| void meta_display_free_group_prop_hooks (MetaDisplay *display); | ||||
|  | ||||
| void meta_x11_display_init_group_prop_hooks (MetaX11Display *x11_display); | ||||
| void meta_x11_display_free_group_prop_hooks (MetaX11Display *x11_display); | ||||
|  | ||||
| #endif /* META_GROUP_PROPS_H */ | ||||
|   | ||||
| @@ -30,12 +30,13 @@ | ||||
| #include "group-private.h" | ||||
| #include "group-props.h" | ||||
| #include "window-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include <meta/window.h> | ||||
| #include <X11/Xlib-xcb.h> | ||||
|  | ||||
| static MetaGroup* | ||||
| meta_group_new (MetaDisplay *display, | ||||
|                 Window       group_leader) | ||||
| meta_group_new (MetaX11Display *x11_display, | ||||
|                 Window          group_leader) | ||||
| { | ||||
|   MetaGroup *group; | ||||
| #define N_INITIAL_PROPS 3 | ||||
| @@ -46,12 +47,12 @@ meta_group_new (MetaDisplay *display, | ||||
|  | ||||
|   group = g_new0 (MetaGroup, 1); | ||||
|  | ||||
|   group->display = display; | ||||
|   group->x11_display = x11_display; | ||||
|   group->windows = NULL; | ||||
|   group->group_leader = group_leader; | ||||
|   group->refcount = 1; /* owned by caller, hash table has only weak ref */ | ||||
|  | ||||
|   xcb_connection_t *xcb_conn = XGetXCBConnection (display->xdisplay); | ||||
|   xcb_connection_t *xcb_conn = XGetXCBConnection (x11_display->xdisplay); | ||||
|   xcb_generic_error_t *e; | ||||
|   g_autofree xcb_get_window_attributes_reply_t *attrs = | ||||
|     xcb_get_window_attributes_reply (xcb_conn, | ||||
| @@ -64,21 +65,21 @@ meta_group_new (MetaDisplay *display, | ||||
|   xcb_change_window_attributes (xcb_conn, group_leader, | ||||
|                                 XCB_CW_EVENT_MASK, events); | ||||
|  | ||||
|   if (display->groups_by_leader == NULL) | ||||
|     display->groups_by_leader = g_hash_table_new (meta_unsigned_long_hash, | ||||
|                                                   meta_unsigned_long_equal); | ||||
|   if (x11_display->groups_by_leader == NULL) | ||||
|     x11_display->groups_by_leader = g_hash_table_new (meta_unsigned_long_hash, | ||||
|                                                       meta_unsigned_long_equal); | ||||
|  | ||||
|   g_assert (g_hash_table_lookup (display->groups_by_leader, &group_leader) == NULL); | ||||
|   g_assert (g_hash_table_lookup (x11_display->groups_by_leader, &group_leader) == NULL); | ||||
|  | ||||
|   g_hash_table_insert (display->groups_by_leader, | ||||
|   g_hash_table_insert (x11_display->groups_by_leader, | ||||
|                        &group->group_leader, | ||||
|                        group); | ||||
|  | ||||
|   /* Fill these in the order we want them to be gotten */ | ||||
|   i = 0; | ||||
|   initial_props[i++] = display->atom_WM_CLIENT_MACHINE; | ||||
|   initial_props[i++] = display->atom__NET_WM_PID; | ||||
|   initial_props[i++] = display->atom__NET_STARTUP_ID; | ||||
|   initial_props[i++] = x11_display->atom_WM_CLIENT_MACHINE; | ||||
|   initial_props[i++] = x11_display->atom__NET_WM_PID; | ||||
|   initial_props[i++] = x11_display->atom__NET_STARTUP_ID; | ||||
|   g_assert (N_INITIAL_PROPS == i); | ||||
|  | ||||
|   meta_group_reload_properties (group, initial_props, N_INITIAL_PROPS); | ||||
| @@ -102,16 +103,16 @@ meta_group_unref (MetaGroup *group) | ||||
|                   "Destroying group with leader 0x%lx\n", | ||||
|                   group->group_leader); | ||||
|  | ||||
|       g_assert (group->display->groups_by_leader != NULL); | ||||
|       g_assert (group->x11_display->groups_by_leader != NULL); | ||||
|  | ||||
|       g_hash_table_remove (group->display->groups_by_leader, | ||||
|       g_hash_table_remove (group->x11_display->groups_by_leader, | ||||
|                            &group->group_leader); | ||||
|  | ||||
|       /* mop up hash table, this is how it gets freed on display close */ | ||||
|       if (g_hash_table_size (group->display->groups_by_leader) == 0) | ||||
|       if (g_hash_table_size (group->x11_display->groups_by_leader) == 0) | ||||
|         { | ||||
|           g_hash_table_destroy (group->display->groups_by_leader); | ||||
|           group->display->groups_by_leader = NULL; | ||||
|           g_hash_table_destroy (group->x11_display->groups_by_leader); | ||||
|           group->x11_display->groups_by_leader = NULL; | ||||
|         } | ||||
|  | ||||
|       g_free (group->wm_client_machine); | ||||
| @@ -140,6 +141,7 @@ meta_window_compute_group (MetaWindow* window) | ||||
| { | ||||
|   MetaGroup *group; | ||||
|   MetaWindow *ancestor; | ||||
|   MetaX11Display *x11_display = window->display->x11_display; | ||||
|  | ||||
|   /* use window->xwindow if no window->xgroup_leader */ | ||||
|  | ||||
| @@ -150,15 +152,15 @@ meta_window_compute_group (MetaWindow* window) | ||||
|    */ | ||||
|   ancestor = meta_window_find_root_ancestor (window); | ||||
|  | ||||
|   if (window->display->groups_by_leader) | ||||
|   if (x11_display->groups_by_leader) | ||||
|     { | ||||
|       if (ancestor != window) | ||||
|         group = ancestor->group; | ||||
|       else if (window->xgroup_leader != None) | ||||
|         group = g_hash_table_lookup (window->display->groups_by_leader, | ||||
|         group = g_hash_table_lookup (x11_display->groups_by_leader, | ||||
|                                      &window->xgroup_leader); | ||||
|       else | ||||
|         group = g_hash_table_lookup (window->display->groups_by_leader, | ||||
|         group = g_hash_table_lookup (x11_display->groups_by_leader, | ||||
|                                      &window->xwindow); | ||||
|     } | ||||
|  | ||||
| @@ -170,13 +172,13 @@ meta_window_compute_group (MetaWindow* window) | ||||
|   else | ||||
|     { | ||||
|       if (ancestor != window && ancestor->xgroup_leader != None) | ||||
|         group = meta_group_new (window->display, | ||||
|         group = meta_group_new (x11_display, | ||||
|                                 ancestor->xgroup_leader); | ||||
|       else if (window->xgroup_leader != None) | ||||
|         group = meta_group_new (window->display, | ||||
|         group = meta_group_new (x11_display, | ||||
|                                 window->xgroup_leader); | ||||
|       else | ||||
|         group = meta_group_new (window->display, | ||||
|         group = meta_group_new (x11_display, | ||||
|                                 window->xwindow); | ||||
|  | ||||
|       window->group = group; | ||||
| @@ -223,21 +225,21 @@ meta_window_shutdown_group (MetaWindow *window) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_display_lookup_group: (skip) | ||||
|  * @display: a #MetaDisplay | ||||
|  * meta_x11_display_lookup_group: (skip) | ||||
|  * @x11_display: a #MetaX11Display | ||||
|  * @group_leader: a X window | ||||
|  * | ||||
|  */ | ||||
| MetaGroup* | ||||
| meta_display_lookup_group (MetaDisplay *display, | ||||
|                            Window       group_leader) | ||||
| MetaGroup * | ||||
| meta_x11_display_lookup_group (MetaX11Display *x11_display, | ||||
|                                Window          group_leader) | ||||
| { | ||||
|   MetaGroup *group; | ||||
|  | ||||
|   group = NULL; | ||||
|  | ||||
|   if (display->groups_by_leader) | ||||
|     group = g_hash_table_lookup (display->groups_by_leader, | ||||
|   if (x11_display->groups_by_leader) | ||||
|     group = g_hash_table_lookup (x11_display->groups_by_leader, | ||||
|                                  &group_leader); | ||||
|  | ||||
|   return group; | ||||
| @@ -274,10 +276,10 @@ meta_group_update_layers (MetaGroup *group) | ||||
|        * but doesn't hurt anything. have to handle | ||||
|        * groups that span 2 screens. | ||||
|        */ | ||||
|       meta_stack_freeze (window->screen->stack); | ||||
|       frozen_stacks = g_slist_prepend (frozen_stacks, window->screen->stack); | ||||
|       meta_stack_freeze (window->display->stack); | ||||
|       frozen_stacks = g_slist_prepend (frozen_stacks, window->display->stack); | ||||
|  | ||||
|       meta_stack_update_layer (window->screen->stack, | ||||
|       meta_stack_update_layer (window->display->stack, | ||||
|                                window); | ||||
|  | ||||
|       tmp = tmp->next; | ||||
|   | ||||
| @@ -21,9 +21,10 @@ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include "iconcache.h" | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include <meta/meta-x11-errors.h> | ||||
|  | ||||
| #include <cairo.h> | ||||
| #include <cairo-xlib.h> | ||||
| @@ -188,7 +189,7 @@ argbdata_to_surface (gulong *argb_data, int w, int h) | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| read_rgb_icon (MetaDisplay      *display, | ||||
| read_rgb_icon (MetaX11Display   *x11_display, | ||||
|                Window            xwindow, | ||||
|                int               ideal_width, | ||||
|                int               ideal_height, | ||||
| @@ -209,16 +210,16 @@ read_rgb_icon (MetaDisplay      *display, | ||||
|   int mini_w, mini_h; | ||||
|   gulong *data_as_long; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|   type = None; | ||||
|   data = NULL; | ||||
|   result = XGetWindowProperty (display->xdisplay, | ||||
|   result = XGetWindowProperty (x11_display->xdisplay, | ||||
| 			       xwindow, | ||||
|                                display->atom__NET_WM_ICON, | ||||
|                                x11_display->atom__NET_WM_ICON, | ||||
| 			       0, G_MAXLONG, | ||||
| 			       False, XA_CARDINAL, &type, &format, &nitems, | ||||
| 			       &bytes_after, &data); | ||||
|   err = meta_error_trap_pop_with_return (display); | ||||
|   err = meta_x11_error_trap_pop_with_return (x11_display); | ||||
|  | ||||
|   if (err != Success || | ||||
|       result != Success) | ||||
| @@ -257,11 +258,11 @@ read_rgb_icon (MetaDisplay      *display, | ||||
| } | ||||
|  | ||||
| static void | ||||
| get_pixmap_geometry (MetaDisplay *display, | ||||
|                      Pixmap       pixmap, | ||||
|                      int         *w, | ||||
|                      int         *h, | ||||
|                      int         *d) | ||||
| get_pixmap_geometry (MetaX11Display *x11_display, | ||||
|                      Pixmap          pixmap, | ||||
|                      int            *w, | ||||
|                      int            *h, | ||||
|                      int            *d) | ||||
| { | ||||
|   Window root_ignored; | ||||
|   int x_ignored, y_ignored; | ||||
| @@ -276,7 +277,7 @@ get_pixmap_geometry (MetaDisplay *display, | ||||
|   if (d) | ||||
|     *d = 1; | ||||
|  | ||||
|   XGetGeometry (display->xdisplay, | ||||
|   XGetGeometry (x11_display->xdisplay, | ||||
|                 pixmap, &root_ignored, &x_ignored, &y_ignored, | ||||
|                 &width, &height, &border_width_ignored, &depth); | ||||
|  | ||||
| @@ -327,32 +328,32 @@ surface_from_pixmap (Display *xdisplay, Pixmap xpixmap, | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| try_pixmap_and_mask (MetaDisplay      *display, | ||||
| try_pixmap_and_mask (MetaX11Display   *x11_display, | ||||
|                      Pixmap            src_pixmap, | ||||
|                      Pixmap            src_mask, | ||||
|                      cairo_surface_t **iconp) | ||||
| { | ||||
|   Display *xdisplay = display->xdisplay; | ||||
|   Display *xdisplay = x11_display->xdisplay; | ||||
|   cairo_surface_t *icon, *mask = NULL; | ||||
|   int w, h, d; | ||||
|  | ||||
|   if (src_pixmap == None) | ||||
|     return FALSE; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|  | ||||
|   get_pixmap_geometry (display, src_pixmap, &w, &h, &d); | ||||
|   get_pixmap_geometry (x11_display, src_pixmap, &w, &h, &d); | ||||
|   icon = surface_from_pixmap (xdisplay, src_pixmap, w, h); | ||||
|  | ||||
|   if (icon && src_mask != None) | ||||
|     { | ||||
|       get_pixmap_geometry (display, src_mask, &w, &h, &d); | ||||
|       get_pixmap_geometry (x11_display, src_mask, &w, &h, &d); | ||||
|  | ||||
|       if (d == 1) | ||||
|         mask = surface_from_pixmap (xdisplay, src_mask, w, h); | ||||
|     } | ||||
|  | ||||
|   meta_error_trap_pop (display); | ||||
|   meta_x11_error_trap_pop (x11_display); | ||||
|  | ||||
|   if (icon && mask) | ||||
|     { | ||||
| @@ -387,10 +388,10 @@ try_pixmap_and_mask (MetaDisplay      *display, | ||||
| } | ||||
|  | ||||
| static void | ||||
| get_kwm_win_icon (MetaDisplay *display, | ||||
|                   Window       xwindow, | ||||
|                   Pixmap      *pixmap, | ||||
|                   Pixmap      *mask) | ||||
| get_kwm_win_icon (MetaX11Display *x11_display, | ||||
|                   Window          xwindow, | ||||
|                   Pixmap         *pixmap, | ||||
|                   Pixmap         *mask) | ||||
| { | ||||
|   Atom type; | ||||
|   int format; | ||||
| @@ -403,23 +404,23 @@ get_kwm_win_icon (MetaDisplay *display, | ||||
|   *pixmap = None; | ||||
|   *mask = None; | ||||
|  | ||||
|   meta_error_trap_push (display); | ||||
|   meta_x11_error_trap_push (x11_display); | ||||
|   icons = NULL; | ||||
|   result = XGetWindowProperty (display->xdisplay, xwindow, | ||||
|                                display->atom__KWM_WIN_ICON, | ||||
|   result = XGetWindowProperty (x11_display->xdisplay, xwindow, | ||||
|                                x11_display->atom__KWM_WIN_ICON, | ||||
| 			       0, G_MAXLONG, | ||||
| 			       False, | ||||
|                                display->atom__KWM_WIN_ICON, | ||||
|                                x11_display->atom__KWM_WIN_ICON, | ||||
| 			       &type, &format, &nitems, | ||||
| 			       &bytes_after, &data); | ||||
|   icons = (Pixmap *)data; | ||||
|  | ||||
|   err = meta_error_trap_pop_with_return (display); | ||||
|   err = meta_x11_error_trap_pop_with_return (x11_display); | ||||
|   if (err != Success || | ||||
|       result != Success) | ||||
|     return; | ||||
|  | ||||
|   if (type != display->atom__KWM_WIN_ICON) | ||||
|   if (type != x11_display->atom__KWM_WIN_ICON) | ||||
|     { | ||||
|       XFree (icons); | ||||
|       return; | ||||
| @@ -447,13 +448,13 @@ meta_icon_cache_init (MetaIconCache *icon_cache) | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_icon_cache_property_changed (MetaIconCache *icon_cache, | ||||
|                                   MetaDisplay   *display, | ||||
|                                   Atom           atom) | ||||
| meta_icon_cache_property_changed (MetaIconCache  *icon_cache, | ||||
|                                   MetaX11Display *x11_display, | ||||
|                                   Atom            atom) | ||||
| { | ||||
|   if (atom == display->atom__NET_WM_ICON) | ||||
|   if (atom == x11_display->atom__NET_WM_ICON) | ||||
|     icon_cache->net_wm_icon_dirty = TRUE; | ||||
|   else if (atom == display->atom__KWM_WIN_ICON) | ||||
|   else if (atom == x11_display->atom__KWM_WIN_ICON) | ||||
|     icon_cache->kwm_win_icon_dirty = TRUE; | ||||
|   else if (atom == XA_WM_HINTS) | ||||
|     icon_cache->wm_hints_dirty = TRUE; | ||||
| @@ -478,7 +479,7 @@ meta_icon_cache_get_icon_invalidated (MetaIconCache *icon_cache) | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_read_icons (MetaScreen       *screen, | ||||
| meta_read_icons (MetaX11Display   *x11_display, | ||||
|                  Window            xwindow, | ||||
|                  MetaIconCache    *icon_cache, | ||||
|                  Pixmap            wm_hints_pixmap, | ||||
| @@ -514,7 +515,7 @@ meta_read_icons (MetaScreen       *screen, | ||||
|     { | ||||
|       icon_cache->net_wm_icon_dirty = FALSE; | ||||
|  | ||||
|       if (read_rgb_icon (screen->display, xwindow, | ||||
|       if (read_rgb_icon (x11_display, xwindow, | ||||
|                          ideal_width, ideal_height, | ||||
|                          ideal_mini_width, ideal_mini_height, | ||||
|                          iconp, mini_iconp)) | ||||
| @@ -543,7 +544,7 @@ meta_read_icons (MetaScreen       *screen, | ||||
|            mask != icon_cache->prev_mask) && | ||||
|           pixmap != None) | ||||
|         { | ||||
|           if (try_pixmap_and_mask (screen->display, pixmap, mask, iconp)) | ||||
|           if (try_pixmap_and_mask (x11_display, pixmap, mask, iconp)) | ||||
|             { | ||||
|               *mini_iconp = cairo_surface_reference (*iconp); | ||||
|               icon_cache->prev_pixmap = pixmap; | ||||
| @@ -562,13 +563,13 @@ meta_read_icons (MetaScreen       *screen, | ||||
|  | ||||
|       icon_cache->kwm_win_icon_dirty = FALSE; | ||||
|  | ||||
|       get_kwm_win_icon (screen->display, xwindow, &pixmap, &mask); | ||||
|       get_kwm_win_icon (x11_display, xwindow, &pixmap, &mask); | ||||
|  | ||||
|       if ((pixmap != icon_cache->prev_pixmap || | ||||
|            mask != icon_cache->prev_mask) && | ||||
|           pixmap != None) | ||||
|         { | ||||
|           if (try_pixmap_and_mask (screen->display, pixmap, mask, iconp)) | ||||
|           if (try_pixmap_and_mask (x11_display, pixmap, mask, iconp)) | ||||
|             { | ||||
|               *mini_iconp = cairo_surface_reference (*iconp); | ||||
|               icon_cache->prev_pixmap = pixmap; | ||||
|   | ||||
| @@ -22,7 +22,7 @@ | ||||
| #ifndef META_ICON_CACHE_H | ||||
| #define META_ICON_CACHE_H | ||||
|  | ||||
| #include "screen-private.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
|  | ||||
| typedef struct _MetaIconCache MetaIconCache; | ||||
|  | ||||
| @@ -50,13 +50,13 @@ struct _MetaIconCache | ||||
|   guint net_wm_icon_dirty : 1; | ||||
| }; | ||||
|  | ||||
| void           meta_icon_cache_init                 (MetaIconCache *icon_cache); | ||||
| void           meta_icon_cache_property_changed     (MetaIconCache *icon_cache, | ||||
|                                                      MetaDisplay   *display, | ||||
|                                                      Atom           atom); | ||||
| gboolean       meta_icon_cache_get_icon_invalidated (MetaIconCache *icon_cache); | ||||
| void           meta_icon_cache_init                 (MetaIconCache  *icon_cache); | ||||
| void           meta_icon_cache_property_changed     (MetaIconCache  *icon_cache, | ||||
|                                                      MetaX11Display *x11_display, | ||||
|                                                      Atom            atom); | ||||
| gboolean       meta_icon_cache_get_icon_invalidated (MetaIconCache  *icon_cache); | ||||
|  | ||||
| gboolean meta_read_icons         (MetaScreen       *screen, | ||||
| gboolean meta_read_icons         (MetaX11Display   *x11_display, | ||||
|                                   Window            xwindow, | ||||
|                                   MetaIconCache    *icon_cache, | ||||
|                                   Pixmap            wm_hints_pixmap, | ||||
|   | ||||
							
								
								
									
										216
									
								
								src/x11/meta-x11-display-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								src/x11/meta-x11-display-private.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* Mutter X display handler */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2002 Red Hat, Inc. | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as | ||||
|  * published by the Free Software Foundation; either version 2 of the | ||||
|  * License, or (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_X11_DISPLAY_PRIVATE_H | ||||
| #define META_X11_DISPLAY_PRIVATE_H | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <X11/Xlib.h> | ||||
|  | ||||
| #include "backends/meta-monitor-manager-private.h" | ||||
| #include "core/display-private.h" | ||||
| #include "meta/common.h" | ||||
| #include "meta/types.h" | ||||
| #include "meta/meta-x11-display.h" | ||||
| #include "ui/ui.h" | ||||
|  | ||||
| typedef struct _MetaGroupPropHooks  MetaGroupPropHooks; | ||||
| typedef struct _MetaWindowPropHooks MetaWindowPropHooks; | ||||
|  | ||||
| typedef gboolean (*MetaAlarmFilter) (MetaX11Display        *x11_display, | ||||
|                                      XSyncAlarmNotifyEvent *event, | ||||
|                                      gpointer               data); | ||||
|  | ||||
| struct _MetaX11Display | ||||
| { | ||||
|   GObject parent; | ||||
|  | ||||
|   MetaDisplay *display; | ||||
|   GdkDisplay *gdk_display; | ||||
|  | ||||
|   char *name; | ||||
|   char *screen_name; | ||||
|  | ||||
|   Display *xdisplay; | ||||
|   Window xroot; | ||||
|   int default_depth; | ||||
|   Visual *default_xvisual; | ||||
|  | ||||
|   guint32 timestamp; | ||||
|  | ||||
|   /* Pull in all the names of atoms as fields; we will intern them when the | ||||
|    * class is constructed. | ||||
|    */ | ||||
| #define item(x) Atom atom_##x; | ||||
| #include "x11/atomnames.h" | ||||
| #undef item | ||||
|  | ||||
|   Window leader_window; | ||||
|   Window timestamp_pinging_window; | ||||
|  | ||||
|   /* The window and serial of the most recent FocusIn event. */ | ||||
|   Window server_focus_window; | ||||
|   gulong server_focus_serial; | ||||
|  | ||||
|   /* For windows we've focused that don't necessarily have an X window, | ||||
|    * like the no_focus_window or the stage X window. */ | ||||
|   Window focus_xwindow; | ||||
|   gulong focus_serial; | ||||
|  | ||||
|   /* This window holds the focus when we don't want to focus | ||||
|    * any actual clients | ||||
|    */ | ||||
|   Window no_focus_window; | ||||
|  | ||||
|   /* Instead of unmapping withdrawn windows we can leave them mapped | ||||
|    * and restack them below a guard window. When using a compositor | ||||
|    * this allows us to provide live previews of unmapped windows */ | ||||
|   Window guard_window; | ||||
|  | ||||
|   Window wm_sn_selection_window; | ||||
|   Atom wm_sn_atom; | ||||
|   guint32 wm_sn_timestamp; | ||||
|  | ||||
|   Window wm_cm_selection_window; | ||||
|  | ||||
|   Window composite_overlay_window; | ||||
|  | ||||
|   GHashTable *xids; | ||||
|  | ||||
|   gboolean has_xinerama_indices; | ||||
|  | ||||
|   /* Managed by group.c */ | ||||
|   GHashTable *groups_by_leader; | ||||
|  | ||||
|   /* Managed by window-props.c */ | ||||
|   MetaWindowPropHooks *prop_hooks_table; | ||||
|   GHashTable *prop_hooks; | ||||
|   int n_prop_hooks; | ||||
|  | ||||
|   /* Managed by group-props.c */ | ||||
|   MetaGroupPropHooks *group_prop_hooks; | ||||
|  | ||||
|   int xkb_base_event_type; | ||||
|   guint32 last_bell_time; | ||||
|  | ||||
|   MetaAlarmFilter alarm_filter; | ||||
|   gpointer alarm_filter_data; | ||||
|  | ||||
|   MetaUI *ui; | ||||
|  | ||||
|   guint keys_grabbed : 1; | ||||
|  | ||||
|   int composite_event_base; | ||||
|   int composite_error_base; | ||||
|   int composite_major_version; | ||||
|   int composite_minor_version; | ||||
|   int damage_event_base; | ||||
|   int damage_error_base; | ||||
|   int xfixes_event_base; | ||||
|   int xfixes_error_base; | ||||
|   int xinput_error_base; | ||||
|   int xinput_event_base; | ||||
|   int xinput_opcode; | ||||
|   int xsync_event_base; | ||||
|   int xsync_error_base; | ||||
|   int shape_event_base; | ||||
|   int shape_error_base; | ||||
|   unsigned int have_xsync : 1; | ||||
| #define META_X11_DISPLAY_HAS_XSYNC(x11_display) ((x11_display)->have_xsync) | ||||
|   unsigned int have_shape : 1; | ||||
| #define META_X11_DISPLAY_HAS_SHAPE(x11_display) ((x11_display)->have_shape) | ||||
|   unsigned int have_composite : 1; | ||||
|   unsigned int have_damage : 1; | ||||
| #define META_X11_DISPLAY_HAS_COMPOSITE(x11_display) ((x11_display)->have_composite) | ||||
| #define META_X11_DISPLAY_HAS_DAMAGE(x11_display) ((x11_display)->have_damage) | ||||
| #ifdef HAVE_XI23 | ||||
|   gboolean have_xinput_23 : 1; | ||||
| #define META_X11_DISPLAY_HAS_XINPUT_23(x11_display) ((x11_display)->have_xinput_23) | ||||
| #else | ||||
| #define META_X11_DISPLAY_HAS_XINPUT_23(x11_display) FALSE | ||||
| #endif /* HAVE_XI23 */ | ||||
| }; | ||||
|  | ||||
| MetaX11Display *meta_x11_display_new (MetaDisplay *display, GError **error); | ||||
|  | ||||
| Window meta_x11_display_create_offscreen_window (MetaX11Display *x11_display, | ||||
|                                                  Window          parent, | ||||
|                                                  long            valuemask); | ||||
|  | ||||
| Cursor meta_x11_display_create_x_cursor (MetaX11Display *x11_display, | ||||
|                                          MetaCursor      cursor); | ||||
|  | ||||
| void meta_x11_display_reload_cursor (MetaX11Display *x11_display); | ||||
|  | ||||
| MetaWindow *meta_x11_display_lookup_x_window     (MetaX11Display *x11_display, | ||||
|                                                   Window          xwindow); | ||||
| void        meta_x11_display_register_x_window   (MetaX11Display *x11_display, | ||||
|                                                   Window         *xwindowp, | ||||
|                                                   MetaWindow     *window); | ||||
| void        meta_x11_display_unregister_x_window (MetaX11Display *x11_display, | ||||
|                                                   Window          xwindow); | ||||
|  | ||||
| MetaWindow *meta_x11_display_lookup_sync_alarm     (MetaX11Display *x11_display, | ||||
|                                                     XSyncAlarm      alarm); | ||||
| void        meta_x11_display_register_sync_alarm   (MetaX11Display *x11_display, | ||||
|                                                     XSyncAlarm     *alarmp, | ||||
|                                                     MetaWindow     *window); | ||||
| void        meta_x11_display_unregister_sync_alarm (MetaX11Display *x11_display, | ||||
|                                                     XSyncAlarm      alarm); | ||||
|  | ||||
| #ifdef HAVE_XI23 | ||||
| gboolean meta_x11_display_process_barrier_xevent (MetaX11Display *x11_display, | ||||
|                                                   XIEvent        *event); | ||||
| #endif /* HAVE_XI23 */ | ||||
|  | ||||
| void meta_x11_display_set_alarm_filter (MetaX11Display *x11_display, | ||||
|                                         MetaAlarmFilter filter, | ||||
|                                         gpointer        data); | ||||
|  | ||||
| void meta_x11_display_create_guard_window (MetaX11Display *x11_display); | ||||
|  | ||||
| /* make a request to ensure the event serial has changed */ | ||||
| void meta_x11_display_increment_event_serial    (MetaX11Display *x11_display); | ||||
| void meta_x11_display_update_active_window_hint (MetaX11Display *x11_display); | ||||
|  | ||||
| guint32 meta_x11_display_get_current_time_roundtrip (MetaX11Display *x11_display); | ||||
|  | ||||
| void meta_x11_display_set_input_focus_xwindow (MetaX11Display *x11_display, | ||||
|                                                Window          window, | ||||
|                                                guint32         timestamp); | ||||
|  | ||||
| int meta_x11_display_logical_monitor_to_xinerama_index (MetaX11Display     *x11_display, | ||||
|                                                         MetaLogicalMonitor *logical_monitor); | ||||
|  | ||||
| MetaLogicalMonitor *meta_x11_display_xinerama_index_to_logical_monitor (MetaX11Display *x11_display, | ||||
|                                                                         int             xinerama_index); | ||||
|  | ||||
| void meta_x11_display_update_workspace_layout (MetaX11Display *x11_display); | ||||
| void meta_x11_display_update_workspace_names  (MetaX11Display *x11_display); | ||||
|  | ||||
| void update_cursor_size_from_gtk (GtkSettings *settings, | ||||
|                                   GParamSpec  *pspec, | ||||
|                                   gpointer     data); | ||||
|  | ||||
| #endif /* META_X11_DISPLAY_PRIVATE_H */ | ||||
							
								
								
									
										2128
									
								
								src/x11/meta-x11-display.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2128
									
								
								src/x11/meta-x11-display.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -25,11 +25,11 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include <config.h> | ||||
| #include <meta/errors.h> | ||||
| #include "display-private.h" | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include <errno.h> | ||||
| #include <stdlib.h> | ||||
| #include <gdk/gdk.h> | ||||
| #include <gdk/gdkx.h> | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| 
 | ||||
| /* In GTK+-3.0, the error trapping code was significantly rewritten. The new code
 | ||||
|  * has some neat features (like knowing automatically if a sync is needed or not | ||||
| @@ -44,19 +44,19 @@ | ||||
|  */ | ||||
| 
 | ||||
| void | ||||
| meta_error_trap_push (MetaDisplay *display) | ||||
| meta_x11_error_trap_push (MetaX11Display *x11_display) | ||||
| { | ||||
|   gdk_error_trap_push (); | ||||
|   gdk_x11_display_error_trap_push (x11_display->gdk_display); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| meta_error_trap_pop (MetaDisplay *display) | ||||
| meta_x11_error_trap_pop (MetaX11Display *x11_display) | ||||
| { | ||||
|   gdk_error_trap_pop_ignored (); | ||||
|   gdk_x11_display_error_trap_pop_ignored (x11_display->gdk_display); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| meta_error_trap_pop_with_return  (MetaDisplay *display) | ||||
| meta_x11_error_trap_pop_with_return (MetaX11Display *x11_display) | ||||
| { | ||||
|   return gdk_error_trap_pop (); | ||||
|   return gdk_x11_display_error_trap_pop (x11_display->gdk_display); | ||||
| } | ||||
| @@ -26,6 +26,7 @@ | ||||
| #include "util-private.h" | ||||
| #include <meta/main.h> | ||||
| #include "session.h" | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include <X11/Xatom.h> | ||||
|  | ||||
| #include <time.h> | ||||
| @@ -1816,7 +1817,7 @@ warn_about_lame_clients_and_finish_interact (gboolean shutdown) | ||||
|                            "and will have to be restarted manually next time " | ||||
|                            "you log in."), | ||||
|                          "240", | ||||
|                          meta_get_display()->screen->screen_name, | ||||
|                          meta_get_display()->x11_display->screen_name, | ||||
|                          NULL, NULL, NULL, | ||||
|                          None, | ||||
|                          columns, | ||||
|   | ||||
| @@ -40,7 +40,8 @@ | ||||
| #include "window-props.h" | ||||
| #include "window-x11.h" | ||||
| #include "window-x11-private.h" | ||||
| #include <meta/errors.h> | ||||
| #include "x11/meta-x11-display-private.h" | ||||
| #include <meta/meta-x11-errors.h> | ||||
| #include "xprops.h" | ||||
| #include "frame.h" | ||||
| #include <meta/group.h> | ||||
| @@ -48,6 +49,7 @@ | ||||
| #include <unistd.h> | ||||
| #include <string.h> | ||||
| #include "util-private.h" | ||||
| #include "meta-workspace-manager-private.h" | ||||
|  | ||||
| #ifndef HOST_NAME_MAX | ||||
| /* Solaris headers apparently don't define this so do so manually; #326745 */ | ||||
| @@ -81,8 +83,8 @@ static void reload_prop_value          (MetaWindow          *window, | ||||
|                                         MetaWindowPropHooks *hooks, | ||||
|                                         MetaPropValue       *value, | ||||
|                                         gboolean             initial); | ||||
| static MetaWindowPropHooks* find_hooks (MetaDisplay *display, | ||||
|                                         Atom         property); | ||||
| static MetaWindowPropHooks *find_hooks (MetaX11Display *x11_display, | ||||
|                                         Atom            property); | ||||
|  | ||||
|  | ||||
| void | ||||
| @@ -94,7 +96,7 @@ meta_window_reload_property_from_xwindow (MetaWindow      *window, | ||||
|   MetaPropValue value = { 0, }; | ||||
|   MetaWindowPropHooks *hooks; | ||||
|  | ||||
|   hooks = find_hooks (window->display, property); | ||||
|   hooks = find_hooks (window->display->x11_display, property); | ||||
|   if (!hooks) | ||||
|     return; | ||||
|  | ||||
| @@ -103,7 +105,7 @@ meta_window_reload_property_from_xwindow (MetaWindow      *window, | ||||
|  | ||||
|   init_prop_value (window, hooks, &value); | ||||
|  | ||||
|   meta_prop_get_values (window->display, xwindow, | ||||
|   meta_prop_get_values (window->display->x11_display, xwindow, | ||||
|                         &value, 1); | ||||
|  | ||||
|   reload_prop_value (window, hooks, &value, | ||||
| @@ -129,13 +131,14 @@ meta_window_load_initial_properties (MetaWindow *window) | ||||
|   int i, j; | ||||
|   MetaPropValue *values; | ||||
|   int n_properties = 0; | ||||
|   MetaX11Display *x11_display = window->display->x11_display; | ||||
|  | ||||
|   values = g_new0 (MetaPropValue, window->display->n_prop_hooks); | ||||
|   values = g_new0 (MetaPropValue, x11_display->n_prop_hooks); | ||||
|  | ||||
|   j = 0; | ||||
|   for (i = 0; i < window->display->n_prop_hooks; i++) | ||||
|   for (i = 0; i < x11_display->n_prop_hooks; i++) | ||||
|     { | ||||
|       MetaWindowPropHooks *hooks = &window->display->prop_hooks_table[i]; | ||||
|       MetaWindowPropHooks *hooks = &x11_display->prop_hooks_table[i]; | ||||
|       if (hooks->flags & LOAD_INIT) | ||||
|         { | ||||
|           init_prop_value (window, hooks, &values[j]); | ||||
| @@ -144,13 +147,13 @@ meta_window_load_initial_properties (MetaWindow *window) | ||||
|     } | ||||
|   n_properties = j; | ||||
|  | ||||
|   meta_prop_get_values (window->display, window->xwindow, | ||||
|   meta_prop_get_values (window->display->x11_display, window->xwindow, | ||||
|                         values, n_properties); | ||||
|  | ||||
|   j = 0; | ||||
|   for (i = 0; i < window->display->n_prop_hooks; i++) | ||||
|   for (i = 0; i < x11_display->n_prop_hooks; i++) | ||||
|     { | ||||
|       MetaWindowPropHooks *hooks = &window->display->prop_hooks_table[i]; | ||||
|       MetaWindowPropHooks *hooks = &x11_display->prop_hooks_table[i]; | ||||
|       if (hooks->flags & LOAD_INIT) | ||||
|         { | ||||
|           /* If we didn't actually manage to load anything then we don't need | ||||
| @@ -240,6 +243,7 @@ reload_net_wm_window_type (MetaWindow    *window, | ||||
|                            MetaPropValue *value, | ||||
|                            gboolean       initial) | ||||
| { | ||||
|   MetaX11Display *x11_display = window->display->x11_display; | ||||
|   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); | ||||
|   MetaWindowX11Private *priv = window_x11->priv; | ||||
|  | ||||
| @@ -254,20 +258,20 @@ reload_net_wm_window_type (MetaWindow    *window, | ||||
|           /* We break as soon as we find one we recognize, | ||||
|            * supposed to prefer those near the front of the list | ||||
|            */ | ||||
|           if (atom == window->display->atom__NET_WM_WINDOW_TYPE_DESKTOP || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_DOCK || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_TOOLBAR || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_MENU || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_UTILITY || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_SPLASH || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_DIALOG || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_TOOLTIP || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_COMBO || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_DND || | ||||
|               atom == window->display->atom__NET_WM_WINDOW_TYPE_NORMAL) | ||||
|           if (atom == x11_display->atom__NET_WM_WINDOW_TYPE_DESKTOP || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_DOCK || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_TOOLBAR || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_MENU || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_UTILITY || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_SPLASH || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_DIALOG || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_TOOLTIP || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_COMBO || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_DND || | ||||
|               atom == x11_display->atom__NET_WM_WINDOW_TYPE_NORMAL) | ||||
|             { | ||||
|               priv->type_atom = atom; | ||||
|               break; | ||||
| @@ -286,7 +290,7 @@ reload_icon (MetaWindow    *window, | ||||
|   MetaWindowX11Private *priv = window_x11->priv; | ||||
|  | ||||
|   meta_icon_cache_property_changed (&priv->icon_cache, | ||||
|                                     window->display, | ||||
|                                     window->display->x11_display, | ||||
|                                     atom); | ||||
|   meta_window_queue(window, META_QUEUE_UPDATE_ICON); | ||||
| } | ||||
| @@ -296,7 +300,7 @@ reload_net_wm_icon (MetaWindow    *window, | ||||
|                     MetaPropValue *value, | ||||
|                     gboolean       initial) | ||||
| { | ||||
|   reload_icon (window, window->display->atom__NET_WM_ICON); | ||||
|   reload_icon (window, window->display->x11_display->atom__NET_WM_ICON); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -304,7 +308,7 @@ reload_kwm_win_icon (MetaWindow    *window, | ||||
|                      MetaPropValue *value, | ||||
|                      gboolean       initial) | ||||
| { | ||||
|   reload_icon (window, window->display->atom__KWM_WIN_ICON); | ||||
|   reload_icon (window, window->display->x11_display->atom__KWM_WIN_ICON); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -466,10 +470,10 @@ reload_net_wm_user_time_window (MetaWindow    *window, | ||||
|       if (window->user_time_window != None) | ||||
|         { | ||||
|           /* See the comment to the meta_display_register_x_window call below. */ | ||||
|           meta_display_unregister_x_window (window->display, | ||||
|                                             window->user_time_window); | ||||
|           meta_x11_display_unregister_x_window (window->display->x11_display, | ||||
|                                                 window->user_time_window); | ||||
|           /* Don't get events on not-managed windows */ | ||||
|           XSelectInput (window->display->xdisplay, | ||||
|           XSelectInput (window->display->x11_display->xdisplay, | ||||
|                         window->user_time_window, | ||||
|                         NoEventMask); | ||||
|         } | ||||
| @@ -477,10 +481,12 @@ reload_net_wm_user_time_window (MetaWindow    *window, | ||||
|       /* Ensure the new user time window is not used on another MetaWindow, | ||||
|        * and unset its user time window if that is the case. | ||||
|        */ | ||||
|       prev_owner = meta_display_lookup_x_window (window->display, value->v.xwindow); | ||||
|       prev_owner = meta_x11_display_lookup_x_window (window->display->x11_display, | ||||
|                                                      value->v.xwindow); | ||||
|       if (prev_owner && prev_owner->user_time_window == value->v.xwindow) | ||||
|         { | ||||
|           meta_display_unregister_x_window (window->display, value->v.xwindow); | ||||
|           meta_x11_display_unregister_x_window (window->display->x11_display, | ||||
|                                                value->v.xwindow); | ||||
|           prev_owner->user_time_window = None; | ||||
|         } | ||||
|  | ||||
| @@ -500,11 +506,11 @@ reload_net_wm_user_time_window (MetaWindow    *window, | ||||
|            * than atom__NET_WM_USER_TIME ones, but I just don't care | ||||
|            * and it's not specified in the spec anyway. | ||||
|            */ | ||||
|           meta_display_register_x_window (window->display, | ||||
|                                           &window->user_time_window, | ||||
|                                           window); | ||||
|           meta_x11_display_register_x_window (window->display->x11_display, | ||||
|                                               &window->user_time_window, | ||||
|                                               window); | ||||
|           /* Just listen for property notify events */ | ||||
|           XSelectInput (window->display->xdisplay, | ||||
|           XSelectInput (window->display->x11_display->xdisplay, | ||||
|                         window->user_time_window, | ||||
|                         PropertyChangeMask); | ||||
|  | ||||
| @@ -515,7 +521,7 @@ reload_net_wm_user_time_window (MetaWindow    *window, | ||||
|           meta_window_reload_property_from_xwindow ( | ||||
|             window, | ||||
|             window->user_time_window, | ||||
|             window->display->atom__NET_WM_USER_TIME, | ||||
|             window->display->x11_display->atom__NET_WM_USER_TIME, | ||||
|             initial); | ||||
|         } | ||||
|     } | ||||
| @@ -564,18 +570,18 @@ set_title_text (MetaWindow  *window, | ||||
|     *target = g_strdup (title); | ||||
|  | ||||
|   if (modified && atom != None) | ||||
|     meta_prop_set_utf8_string_hint (window->display, | ||||
|     meta_prop_set_utf8_string_hint (window->display->x11_display, | ||||
|                                     window->xwindow, | ||||
|                                     atom, *target); | ||||
|  | ||||
|   /* Bug 330671 -- Don't forget to clear _NET_WM_VISIBLE_(ICON_)NAME */ | ||||
|   if (!modified && previous_was_modified) | ||||
|     { | ||||
|       meta_error_trap_push (window->display); | ||||
|       XDeleteProperty (window->display->xdisplay, | ||||
|       meta_x11_error_trap_push (window->display->x11_display); | ||||
|       XDeleteProperty (window->display->x11_display->xdisplay, | ||||
|                        window->xwindow, | ||||
|                        atom); | ||||
|       meta_error_trap_pop (window->display); | ||||
|       meta_x11_error_trap_pop (window->display->x11_display); | ||||
|     } | ||||
|  | ||||
|   return modified; | ||||
| @@ -594,7 +600,7 @@ set_window_title (MetaWindow *window, | ||||
|     set_title_text (window, | ||||
|                     priv->using_net_wm_visible_name, | ||||
|                     title, | ||||
|                     window->display->atom__NET_WM_VISIBLE_NAME, | ||||
|                     window->display->x11_display->atom__NET_WM_VISIBLE_NAME, | ||||
|                     &new_title); | ||||
|   priv->using_net_wm_visible_name = modified; | ||||
|  | ||||
| @@ -775,6 +781,7 @@ reload_net_wm_state (MetaWindow    *window, | ||||
|                      MetaPropValue *value, | ||||
|                      gboolean       initial) | ||||
| { | ||||
|   MetaX11Display *x11_display = window->display->x11_display; | ||||
|   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); | ||||
|   MetaWindowX11Private *priv = window_x11->priv; | ||||
|  | ||||
| @@ -808,32 +815,32 @@ reload_net_wm_state (MetaWindow    *window, | ||||
|   i = 0; | ||||
|   while (i < value->v.atom_list.n_atoms) | ||||
|     { | ||||
|       if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SHADED) | ||||
|       if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_SHADED) | ||||
|         window->shaded = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_MAXIMIZED_HORZ) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ) | ||||
|         window->maximize_horizontally_after_placement = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_MAXIMIZED_VERT) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT) | ||||
|         window->maximize_vertically_after_placement = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_HIDDEN) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_HIDDEN) | ||||
|         window->minimize_after_placement = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_MODAL) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_MODAL) | ||||
|         priv->wm_state_modal = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_TASKBAR) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_SKIP_TASKBAR) | ||||
|         priv->wm_state_skip_taskbar = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_PAGER) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_SKIP_PAGER) | ||||
|         priv->wm_state_skip_pager = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_FULLSCREEN) | ||||
|         { | ||||
|           window->fullscreen = TRUE; | ||||
|           g_object_notify (G_OBJECT (window), "fullscreen"); | ||||
|         } | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_ABOVE) | ||||
|         window->wm_state_above = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_BELOW) | ||||
|         window->wm_state_below = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_DEMANDS_ATTENTION) | ||||
|         window->wm_state_demands_attention = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_STICKY) | ||||
|       else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_STICKY) | ||||
|         window->on_all_workspaces_requested = TRUE; | ||||
|  | ||||
|       ++i; | ||||
| @@ -1021,6 +1028,7 @@ reload_net_startup_id (MetaWindow    *window, | ||||
|                        MetaPropValue *value, | ||||
|                        gboolean       initial) | ||||
| { | ||||
|   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; | ||||
|   guint32 timestamp = window->net_wm_user_time; | ||||
|   MetaWorkspace *workspace = NULL; | ||||
|  | ||||
| @@ -1037,13 +1045,14 @@ reload_net_startup_id (MetaWindow    *window, | ||||
|     window->initial_timestamp_set = 0; | ||||
|     window->initial_workspace_set = 0; | ||||
|  | ||||
|     if (meta_screen_apply_startup_properties (window->screen, window)) | ||||
|     if (meta_display_apply_startup_properties (window->display, window)) | ||||
|       { | ||||
|  | ||||
|         if (window->initial_timestamp_set) | ||||
|           timestamp = window->initial_timestamp; | ||||
|         if (window->initial_workspace_set) | ||||
|           workspace = meta_screen_get_workspace_by_index (window->screen, window->initial_workspace); | ||||
|           workspace = meta_workspace_manager_get_workspace_by_index (workspace_manager, | ||||
|                                                                      window->initial_workspace); | ||||
|  | ||||
|         meta_window_activate_with_workspace (window, timestamp, workspace); | ||||
|       } | ||||
| @@ -1533,13 +1542,13 @@ reload_wm_protocols (MetaWindow    *window, | ||||
|   while (i < value->v.atom_list.n_atoms) | ||||
|     { | ||||
|       if (value->v.atom_list.atoms[i] == | ||||
|           window->display->atom_WM_TAKE_FOCUS) | ||||
|           window->display->x11_display->atom_WM_TAKE_FOCUS) | ||||
|         window->take_focus = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == | ||||
|                window->display->atom_WM_DELETE_WINDOW) | ||||
|                window->display->x11_display->atom_WM_DELETE_WINDOW) | ||||
|         window->delete_window = TRUE; | ||||
|       else if (value->v.atom_list.atoms[i] == | ||||
|                window->display->atom__NET_WM_PING) | ||||
|                window->display->x11_display->atom__NET_WM_PING) | ||||
|         window->can_ping = TRUE; | ||||
|       ++i; | ||||
|     } | ||||
| @@ -1609,7 +1618,7 @@ reload_wm_hints (MetaWindow    *window, | ||||
|   meta_window_set_urgent (window, urgent); | ||||
|  | ||||
|   meta_icon_cache_property_changed (&priv->icon_cache, | ||||
|                                     window->display, | ||||
|                                     window->display->x11_display, | ||||
|                                     XA_WM_HINTS); | ||||
|  | ||||
|   meta_window_queue (window, META_QUEUE_UPDATE_ICON | META_QUEUE_MOVE_RESIZE); | ||||
| @@ -1627,7 +1636,8 @@ reload_transient_for (MetaWindow    *window, | ||||
|     { | ||||
|       transient_for = value->v.xwindow; | ||||
|  | ||||
|       parent = meta_display_lookup_x_window (window->display, transient_for); | ||||
|       parent = meta_x11_display_lookup_x_window (window->display->x11_display, | ||||
|                                                  transient_for); | ||||
|       if (!parent) | ||||
|         { | ||||
|           meta_warning ("Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n", | ||||
| @@ -1646,8 +1656,8 @@ reload_transient_for (MetaWindow    *window, | ||||
|               break; | ||||
|             } | ||||
|  | ||||
|           parent = meta_display_lookup_x_window (parent->display, | ||||
|                                                  parent->xtransient_for); | ||||
|           parent = meta_x11_display_lookup_x_window (parent->display->x11_display, | ||||
|                                                      parent->xtransient_for); | ||||
|         } | ||||
|     } | ||||
|   else | ||||
| @@ -1663,12 +1673,13 @@ reload_transient_for (MetaWindow    *window, | ||||
|   else | ||||
|     meta_verbose ("Window %s is not transient\n", window->desc); | ||||
|  | ||||
|   if (window->xtransient_for == None || window->xtransient_for == window->screen->xroot) | ||||
|   if (window->xtransient_for == None || | ||||
|       window->xtransient_for == window->display->x11_display->xroot) | ||||
|     meta_window_set_transient_for (window, NULL); | ||||
|   else | ||||
|     { | ||||
|       parent = meta_display_lookup_x_window (window->display, | ||||
|                                              window->xtransient_for); | ||||
|       parent = meta_x11_display_lookup_x_window (window->display->x11_display, | ||||
|                                                  window->xtransient_for); | ||||
|       meta_window_set_transient_for (window, parent); | ||||
|     } | ||||
| } | ||||
| @@ -1792,8 +1803,8 @@ RELOAD_STRING (gtk_menubar_object_path,     "gtk-menubar-object-path") | ||||
| #undef RELOAD_STRING | ||||
|  | ||||
| /** | ||||
|  * meta_display_init_window_prop_hooks: | ||||
|  * @display: The #MetaDisplay | ||||
|  * meta_x11_display_init_window_prop_hooks: | ||||
|  * @x11_display: The #MetaDX11isplay | ||||
|  * | ||||
|  * Initialises the property hooks system.  Each row in the table named "hooks" | ||||
|  * represents an action to take when a property is found on a newly-created | ||||
| @@ -1809,7 +1820,7 @@ RELOAD_STRING (gtk_menubar_object_path,     "gtk-menubar-object-path") | ||||
|  * This value may be NULL, in which case no callback will be called. | ||||
|  */ | ||||
| void | ||||
| meta_display_init_window_prop_hooks (MetaDisplay *display) | ||||
| meta_x11_display_init_window_prop_hooks (MetaX11Display *x11_display) | ||||
| { | ||||
|   /* The ordering here is significant for the properties we load | ||||
|    * initially: they are roughly ordered in the order we want them to | ||||
| @@ -1825,54 +1836,54 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) | ||||
|    *    for different types of override-redirect windows. | ||||
|    */ | ||||
|   MetaWindowPropHooks hooks[] = { | ||||
|     { display->atom_WM_CLIENT_MACHINE, META_PROP_VALUE_STRING,   reload_wm_client_machine, LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__NET_WM_NAME,      META_PROP_VALUE_UTF8,     reload_net_wm_name,       LOAD_INIT | INCLUDE_OR }, | ||||
|     { XA_WM_CLASS,                     META_PROP_VALUE_CLASS_HINT, reload_wm_class,        LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__NET_WM_PID,       META_PROP_VALUE_CARDINAL, reload_net_wm_pid,        LOAD_INIT | INCLUDE_OR }, | ||||
|     { XA_WM_NAME,                      META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name,      LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__MUTTER_HINTS,     META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__NET_WM_OPAQUE_REGION, META_PROP_VALUE_CARDINAL_LIST, reload_opaque_region, LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__NET_WM_DESKTOP,   META_PROP_VALUE_CARDINAL, reload_net_wm_desktop,    LOAD_INIT | INIT_ONLY }, | ||||
|     { display->atom__NET_STARTUP_ID,   META_PROP_VALUE_UTF8,     reload_net_startup_id,    LOAD_INIT }, | ||||
|     { display->atom__NET_WM_SYNC_REQUEST_COUNTER, META_PROP_VALUE_SYNC_COUNTER_LIST, reload_update_counter, LOAD_INIT | INCLUDE_OR }, | ||||
|     { XA_WM_NORMAL_HINTS,              META_PROP_VALUE_SIZE_HINTS, reload_normal_hints,    LOAD_INIT }, | ||||
|     { display->atom_WM_PROTOCOLS,      META_PROP_VALUE_ATOM_LIST, reload_wm_protocols,     LOAD_INIT }, | ||||
|     { XA_WM_HINTS,                     META_PROP_VALUE_WM_HINTS,  reload_wm_hints,         LOAD_INIT }, | ||||
|     { display->atom__NET_WM_USER_TIME, META_PROP_VALUE_CARDINAL, reload_net_wm_user_time,  LOAD_INIT }, | ||||
|     { display->atom__NET_WM_STATE,     META_PROP_VALUE_ATOM_LIST, reload_net_wm_state,     LOAD_INIT | INIT_ONLY }, | ||||
|     { display->atom__MOTIF_WM_HINTS,   META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints,      LOAD_INIT }, | ||||
|     { XA_WM_TRANSIENT_FOR,             META_PROP_VALUE_WINDOW,    reload_transient_for,    LOAD_INIT }, | ||||
|     { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8,     reload_gtk_theme_variant, LOAD_INIT }, | ||||
|     { display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL,     reload_gtk_hide_titlebar_when_maximized, LOAD_INIT }, | ||||
|     { display->atom__GTK_APPLICATION_ID,               META_PROP_VALUE_UTF8,         reload_gtk_application_id,               LOAD_INIT }, | ||||
|     { display->atom__GTK_UNIQUE_BUS_NAME,              META_PROP_VALUE_UTF8,         reload_gtk_unique_bus_name,              LOAD_INIT }, | ||||
|     { display->atom__GTK_APPLICATION_OBJECT_PATH,      META_PROP_VALUE_UTF8,         reload_gtk_application_object_path,      LOAD_INIT }, | ||||
|     { display->atom__GTK_WINDOW_OBJECT_PATH,           META_PROP_VALUE_UTF8,         reload_gtk_window_object_path,           LOAD_INIT }, | ||||
|     { display->atom__GTK_APP_MENU_OBJECT_PATH,         META_PROP_VALUE_UTF8,         reload_gtk_app_menu_object_path,         LOAD_INIT }, | ||||
|     { display->atom__GTK_MENUBAR_OBJECT_PATH,          META_PROP_VALUE_UTF8,         reload_gtk_menubar_object_path,          LOAD_INIT }, | ||||
|     { display->atom__GTK_FRAME_EXTENTS,                META_PROP_VALUE_CARDINAL_LIST,reload_gtk_frame_extents,                LOAD_INIT }, | ||||
|     { display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, LOAD_INIT }, | ||||
|     { display->atom__NET_WM_ICON,      META_PROP_VALUE_INVALID,  reload_net_wm_icon,  NONE }, | ||||
|     { display->atom__KWM_WIN_ICON,     META_PROP_VALUE_INVALID,  reload_kwm_win_icon, NONE }, | ||||
|     { display->atom__NET_WM_ICON_GEOMETRY, META_PROP_VALUE_CARDINAL_LIST, reload_icon_geometry, LOAD_INIT }, | ||||
|     { display->atom_WM_CLIENT_LEADER,  META_PROP_VALUE_INVALID, complain_about_broken_client, NONE }, | ||||
|     { display->atom_SM_CLIENT_ID,      META_PROP_VALUE_INVALID, complain_about_broken_client, NONE }, | ||||
|     { display->atom_WM_WINDOW_ROLE,    META_PROP_VALUE_STRING, reload_wm_window_role, LOAD_INIT | FORCE_INIT }, | ||||
|     { display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type, LOAD_INIT | INCLUDE_OR | FORCE_INIT }, | ||||
|     { display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts, NONE }, | ||||
|     { display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, NONE }, | ||||
|     { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, LOAD_INIT | INCLUDE_OR }, | ||||
|     { display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom_WM_CLIENT_MACHINE, META_PROP_VALUE_STRING,   reload_wm_client_machine, LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom__NET_WM_NAME,      META_PROP_VALUE_UTF8,     reload_net_wm_name,       LOAD_INIT | INCLUDE_OR }, | ||||
|     { XA_WM_CLASS,                         META_PROP_VALUE_CLASS_HINT, reload_wm_class,        LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom__NET_WM_PID,       META_PROP_VALUE_CARDINAL, reload_net_wm_pid,        LOAD_INIT | INCLUDE_OR }, | ||||
|     { XA_WM_NAME,                          META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name,      LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom__MUTTER_HINTS,     META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom__NET_WM_OPAQUE_REGION, META_PROP_VALUE_CARDINAL_LIST, reload_opaque_region, LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom__NET_WM_DESKTOP,   META_PROP_VALUE_CARDINAL, reload_net_wm_desktop,    LOAD_INIT | INIT_ONLY }, | ||||
|     { x11_display->atom__NET_STARTUP_ID,   META_PROP_VALUE_UTF8,     reload_net_startup_id,    LOAD_INIT }, | ||||
|     { x11_display->atom__NET_WM_SYNC_REQUEST_COUNTER, META_PROP_VALUE_SYNC_COUNTER_LIST, reload_update_counter, LOAD_INIT | INCLUDE_OR }, | ||||
|     { XA_WM_NORMAL_HINTS,                  META_PROP_VALUE_SIZE_HINTS, reload_normal_hints,    LOAD_INIT }, | ||||
|     { x11_display->atom_WM_PROTOCOLS,      META_PROP_VALUE_ATOM_LIST, reload_wm_protocols,     LOAD_INIT }, | ||||
|     { XA_WM_HINTS,                         META_PROP_VALUE_WM_HINTS,  reload_wm_hints,         LOAD_INIT }, | ||||
|     { x11_display->atom__NET_WM_USER_TIME, META_PROP_VALUE_CARDINAL, reload_net_wm_user_time,  LOAD_INIT }, | ||||
|     { x11_display->atom__NET_WM_STATE,     META_PROP_VALUE_ATOM_LIST, reload_net_wm_state,     LOAD_INIT | INIT_ONLY }, | ||||
|     { x11_display->atom__MOTIF_WM_HINTS,   META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints,      LOAD_INIT }, | ||||
|     { XA_WM_TRANSIENT_FOR,                 META_PROP_VALUE_WINDOW,    reload_transient_for,    LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8,     reload_gtk_theme_variant, LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL,     reload_gtk_hide_titlebar_when_maximized, LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_APPLICATION_ID,               META_PROP_VALUE_UTF8,         reload_gtk_application_id,               LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_UNIQUE_BUS_NAME,              META_PROP_VALUE_UTF8,         reload_gtk_unique_bus_name,              LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_APPLICATION_OBJECT_PATH,      META_PROP_VALUE_UTF8,         reload_gtk_application_object_path,      LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_WINDOW_OBJECT_PATH,           META_PROP_VALUE_UTF8,         reload_gtk_window_object_path,           LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_APP_MENU_OBJECT_PATH,         META_PROP_VALUE_UTF8,         reload_gtk_app_menu_object_path,         LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_MENUBAR_OBJECT_PATH,          META_PROP_VALUE_UTF8,         reload_gtk_menubar_object_path,          LOAD_INIT }, | ||||
|     { x11_display->atom__GTK_FRAME_EXTENTS,                META_PROP_VALUE_CARDINAL_LIST,reload_gtk_frame_extents,                LOAD_INIT }, | ||||
|     { x11_display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, LOAD_INIT }, | ||||
|     { x11_display->atom__NET_WM_ICON,      META_PROP_VALUE_INVALID,  reload_net_wm_icon,  NONE }, | ||||
|     { x11_display->atom__KWM_WIN_ICON,     META_PROP_VALUE_INVALID,  reload_kwm_win_icon, NONE }, | ||||
|     { x11_display->atom__NET_WM_ICON_GEOMETRY, META_PROP_VALUE_CARDINAL_LIST, reload_icon_geometry, LOAD_INIT }, | ||||
|     { x11_display->atom_WM_CLIENT_LEADER,  META_PROP_VALUE_INVALID, complain_about_broken_client, NONE }, | ||||
|     { x11_display->atom_SM_CLIENT_ID,      META_PROP_VALUE_INVALID, complain_about_broken_client, NONE }, | ||||
|     { x11_display->atom_WM_WINDOW_ROLE,    META_PROP_VALUE_STRING, reload_wm_window_role, LOAD_INIT | FORCE_INIT }, | ||||
|     { x11_display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type, LOAD_INIT | INCLUDE_OR | FORCE_INIT }, | ||||
|     { x11_display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts, NONE }, | ||||
|     { x11_display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, NONE }, | ||||
|     { x11_display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, LOAD_INIT | INCLUDE_OR }, | ||||
|     { x11_display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, LOAD_INIT | INCLUDE_OR }, | ||||
|     { 0 }, | ||||
|   }; | ||||
|  | ||||
|   MetaWindowPropHooks *table = g_memdup (hooks, sizeof (hooks)), | ||||
|     *cursor = table; | ||||
|  | ||||
|   g_assert (display->prop_hooks == NULL); | ||||
|   g_assert (x11_display->prop_hooks == NULL); | ||||
|  | ||||
|   display->prop_hooks_table = (gpointer) table; | ||||
|   display->prop_hooks = g_hash_table_new (NULL, NULL); | ||||
|   x11_display->prop_hooks_table = (gpointer) table; | ||||
|   x11_display->prop_hooks = g_hash_table_new (NULL, NULL); | ||||
|  | ||||
|   while (cursor->property) | ||||
|     { | ||||
| @@ -1886,28 +1897,28 @@ meta_display_init_window_prop_hooks (MetaDisplay *display) | ||||
|        * anything 32 bits or less, and atoms are 32 bits with the top three | ||||
|        * bits clear.  (Scheifler & Gettys, 2e, p372) | ||||
|        */ | ||||
|       g_hash_table_insert (display->prop_hooks, | ||||
|       g_hash_table_insert (x11_display->prop_hooks, | ||||
|                            GINT_TO_POINTER (cursor->property), | ||||
|                            cursor); | ||||
|       cursor++; | ||||
|     } | ||||
|   display->n_prop_hooks = cursor - table; | ||||
|   x11_display->n_prop_hooks = cursor - table; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_display_free_window_prop_hooks (MetaDisplay *display) | ||||
| meta_x11_display_free_window_prop_hooks (MetaX11Display *x11_display) | ||||
| { | ||||
|   g_hash_table_unref (display->prop_hooks); | ||||
|   display->prop_hooks = NULL; | ||||
|   g_hash_table_unref (x11_display->prop_hooks); | ||||
|   x11_display->prop_hooks = NULL; | ||||
|  | ||||
|   g_free (display->prop_hooks_table); | ||||
|   display->prop_hooks_table = NULL; | ||||
|   g_free (x11_display->prop_hooks_table); | ||||
|   x11_display->prop_hooks_table = NULL; | ||||
| } | ||||
|  | ||||
| static MetaWindowPropHooks* | ||||
| find_hooks (MetaDisplay *display, | ||||
|             Atom         property) | ||||
| static MetaWindowPropHooks * | ||||
| find_hooks (MetaX11Display *x11_display, | ||||
|             Atom            property) | ||||
| { | ||||
|   return g_hash_table_lookup (display->prop_hooks, | ||||
|   return g_hash_table_lookup (x11_display->prop_hooks, | ||||
|                               GINT_TO_POINTER (property)); | ||||
| } | ||||
|   | ||||
| @@ -60,22 +60,22 @@ void meta_window_reload_property_from_xwindow (MetaWindow      *window, | ||||
| void meta_window_load_initial_properties (MetaWindow *window); | ||||
|  | ||||
| /** | ||||
|  * meta_display_init_window_prop_hooks: | ||||
|  * @display:  The display. | ||||
|  * meta_x11_display_init_window_prop_hooks: | ||||
|  * @x11_display:  The X11 display. | ||||
|  * | ||||
|  * Initialises the hooks used for the reload_propert* functions | ||||
|  * on a particular display, and stores a pointer to them in the | ||||
|  * display. | ||||
|  * x11_display. | ||||
|  */ | ||||
| void meta_display_init_window_prop_hooks (MetaDisplay *display); | ||||
| void meta_x11_display_init_window_prop_hooks (MetaX11Display *x11_display); | ||||
|  | ||||
| /** | ||||
|  * meta_display_free_window_prop_hooks: | ||||
|  * @display:  The display. | ||||
|  * meta_x11_display_free_window_prop_hooks: | ||||
|  * @x11_display:  The X11 display. | ||||
|  * Frees the hooks used for the reload_propert* functions | ||||
|  * for a particular display. | ||||
|  */ | ||||
| void meta_display_free_window_prop_hooks (MetaDisplay *display); | ||||
| void meta_x11_display_free_window_prop_hooks (MetaX11Display *x11_display); | ||||
|  | ||||
| /** | ||||
|  * meta_set_normal_hints: | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user