diff --git a/src/Makefile.am b/src/Makefile.am index 2b40090e9..f6b0c0909 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -69,6 +69,8 @@ libmutter_la_SOURCES = \ backends/meta-monitor-manager.h \ backends/meta-monitor-manager-dummy.c \ backends/meta-monitor-manager-dummy.h \ + backends/meta-stage.h \ + backends/meta-stage.c \ backends/edid-parse.c \ backends/edid.h \ backends/x11/meta-backend-x11.c \ @@ -115,8 +117,6 @@ libmutter_la_SOURCES = \ compositor/meta-surface-actor-x11.h \ compositor/meta-surface-actor-wayland.c \ compositor/meta-surface-actor-wayland.h \ - compositor/meta-stage.h \ - compositor/meta-stage.c \ compositor/meta-texture-rectangle.c \ compositor/meta-texture-rectangle.h \ compositor/meta-texture-tower.c \ diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index 13dd53c70..bd665c17a 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -84,6 +84,9 @@ struct _MetaBackendClass void (* lock_layout_group) (MetaBackend *backend, guint idx); + + void (* update_screen_size) (MetaBackend *backend, int width, int height); + void (* select_stage_events) (MetaBackend *backend); }; MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index d2cd2eea9..75222daef 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -27,9 +27,8 @@ #include #include "meta-backend-private.h" -#include - #include "backends/x11/meta-backend-x11.h" +#include "meta-stage.h" #ifdef HAVE_NATIVE_BACKEND #include "backends/native/meta-backend-native.h" @@ -54,6 +53,8 @@ struct _MetaBackendPrivate { MetaMonitorManager *monitor_manager; MetaCursorRenderer *cursor_renderer; + + ClutterActor *stage; }; typedef struct _MetaBackendPrivate MetaBackendPrivate; @@ -77,12 +78,40 @@ meta_backend_finalize (GObject *object) G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object); } +static void +meta_backend_sync_screen_size (MetaBackend *backend) +{ + MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + int width, height; + + meta_monitor_manager_get_screen_size (priv->monitor_manager, &width, &height); + + META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height); +} + +static void +on_monitors_changed (MetaMonitorManager *monitors, + gpointer user_data) +{ + MetaBackend *backend = META_BACKEND (user_data); + meta_backend_sync_screen_size (backend); +} + static void meta_backend_real_post_init (MetaBackend *backend) { MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + priv->stage = meta_stage_new (); + clutter_actor_realize (priv->stage); + META_BACKEND_GET_CLASS (backend)->select_stage_events (backend); + priv->monitor_manager = META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend); + + g_signal_connect (priv->monitor_manager, "monitors-changed", + G_CALLBACK (on_monitors_changed), backend); + meta_backend_sync_screen_size (backend); + priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend); } @@ -110,6 +139,21 @@ meta_backend_real_ungrab_device (MetaBackend *backend, return TRUE; } +static void +meta_backend_real_update_screen_size (MetaBackend *backend, + int width, int height) +{ + MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + + clutter_actor_set_size (priv->stage, width, height); +} + +static void +meta_backend_real_select_stage_events (MetaBackend *backend) +{ + /* Do nothing */ +} + static void meta_backend_class_init (MetaBackendClass *klass) { @@ -121,6 +165,8 @@ meta_backend_class_init (MetaBackendClass *klass) klass->create_cursor_renderer = meta_backend_real_create_cursor_renderer; klass->grab_device = meta_backend_real_grab_device; klass->ungrab_device = meta_backend_real_ungrab_device; + klass->update_screen_size = meta_backend_real_update_screen_size; + klass->select_stage_events = meta_backend_real_select_stage_events; } static void @@ -251,6 +297,21 @@ meta_backend_lock_layout_group (MetaBackend *backend, META_BACKEND_GET_CLASS (backend)->lock_layout_group (backend, idx); } +/** + * meta_backend_get_stage: + * @backend: A #MetaBackend + * + * Gets the global #ClutterStage that's managed by this backend. + * + * Returns: (transfer none): the #ClutterStage + */ +ClutterActor * +meta_backend_get_stage (MetaBackend *backend) +{ + MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + return priv->stage; +} + static GType get_backend_type (void) { diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c index 21f1a463e..3d1f85718 100644 --- a/src/backends/meta-cursor-renderer.c +++ b/src/backends/meta-cursor-renderer.c @@ -27,14 +27,15 @@ #include "meta-cursor-renderer.h" #include "meta-cursor-private.h" +#include +#include + #include #include #include #include "meta-stage.h" -#include "wayland/meta-wayland-private.h" - struct _MetaCursorRendererPrivate { int current_x, current_y; @@ -51,8 +52,8 @@ static void queue_redraw (MetaCursorRenderer *renderer) { MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); - MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default (); - ClutterActor *stage = compositor->stage; + MetaBackend *backend = meta_get_backend (); + ClutterActor *stage = meta_backend_get_stage (backend); /* During early initialization, we can have no stage */ if (!stage) diff --git a/src/compositor/meta-stage.c b/src/backends/meta-stage.c similarity index 100% rename from src/compositor/meta-stage.c rename to src/backends/meta-stage.c diff --git a/src/compositor/meta-stage.h b/src/backends/meta-stage.h similarity index 100% rename from src/compositor/meta-stage.h rename to src/backends/meta-stage.h diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c index 87b3f28dd..70454bb01 100644 --- a/src/backends/native/meta-launcher.c +++ b/src/backends/native/meta-launcher.c @@ -101,15 +101,15 @@ session_unpause (void) clutter_egl_thaw_master_clock (); { - MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default (); MetaBackend *backend = meta_get_backend (); MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (backend); + ClutterActor *stage = meta_backend_get_stage (backend); /* When we mode-switch back, we need to immediately queue a redraw * in case nothing else queued one for us, and force the cursor to * update. */ - clutter_actor_queue_redraw (compositor->stage); + clutter_actor_queue_redraw (stage); meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer)); } } diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index 5e8c25a05..2d420cb05 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -592,6 +592,40 @@ meta_backend_x11_lock_layout_group (MetaBackend *backend, XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx); } +static void +meta_backend_x11_update_screen_size (MetaBackend *backend, + int width, int height) +{ + MetaBackendX11 *x11 = META_BACKEND_X11 (backend); + MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); + Window xwin = meta_backend_x11_get_xwindow (x11); + XResizeWindow (priv->xdisplay, xwin, width, height); +} + +static void +meta_backend_x11_select_stage_events (MetaBackend *backend) +{ + MetaBackendX11 *x11 = META_BACKEND_X11 (backend); + MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); + Window xwin = meta_backend_x11_get_xwindow (x11); + unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; + XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; + + XISetMask (mask.mask, XI_KeyPress); + XISetMask (mask.mask, XI_KeyRelease); + XISetMask (mask.mask, XI_ButtonPress); + XISetMask (mask.mask, XI_ButtonRelease); + XISetMask (mask.mask, XI_Enter); + XISetMask (mask.mask, XI_Leave); + XISetMask (mask.mask, XI_FocusIn); + XISetMask (mask.mask, XI_FocusOut); + XISetMask (mask.mask, XI_Motion); + XIClearMask (mask.mask, XI_TouchBegin); + XIClearMask (mask.mask, XI_TouchEnd); + XIClearMask (mask.mask, XI_TouchUpdate); + XISelectEvents (priv->xdisplay, xwin, &mask, 1); +} + static void meta_backend_x11_class_init (MetaBackendX11Class *klass) { @@ -601,13 +635,14 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass) backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor; backend_class->create_monitor_manager = meta_backend_x11_create_monitor_manager; backend_class->create_cursor_renderer = meta_backend_x11_create_cursor_renderer; - backend_class->grab_device = meta_backend_x11_grab_device; backend_class->ungrab_device = meta_backend_x11_ungrab_device; backend_class->warp_pointer = meta_backend_x11_warp_pointer; backend_class->set_keymap = meta_backend_x11_set_keymap; backend_class->get_keymap = meta_backend_x11_get_keymap; backend_class->lock_layout_group = meta_backend_x11_lock_layout_group; + backend_class->update_screen_size = meta_backend_x11_update_screen_size; + backend_class->select_stage_events = meta_backend_x11_select_stage_events; } static void @@ -628,12 +663,6 @@ meta_backend_x11_get_xdisplay (MetaBackendX11 *x11) Window meta_backend_x11_get_xwindow (MetaBackendX11 *x11) { - MetaDisplay *display = meta_get_display (); - MetaCompositor *compositor = display->compositor; - - if (compositor == NULL) - return None; - - ClutterStage *stage = CLUTTER_STAGE (compositor->stage); - return clutter_x11_get_stage_window (stage); + ClutterActor *stage = meta_backend_get_stage (META_BACKEND (x11)); + return clutter_x11_get_stage_window (CLUTTER_STAGE (stage)); } diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 887be9e2d..a887c0657 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -73,7 +73,6 @@ #include #include "meta-window-actor-private.h" #include "meta-window-group.h" -#include "meta-stage.h" #include "window-private.h" /* to check window->hidden */ #include "display-private.h" /* for meta_display_lookup_x_window() and meta_display_cancel_touch() */ #include "util-private.h" @@ -450,55 +449,13 @@ meta_compositor_manage (MetaCompositor *compositor) MetaDisplay *display = compositor->display; Display *xdisplay = display->xdisplay; MetaScreen *screen = display->screen; - Window xwin = 0; - gint width, height; meta_screen_set_cm_selection (display->screen); - if (meta_is_wayland_compositor ()) - { - MetaWaylandCompositor *wayland_compositor = meta_wayland_compositor_get_default (); - - compositor->stage = meta_stage_new (); - - wayland_compositor->stage = compositor->stage; - - meta_screen_get_size (screen, &width, &height); - clutter_actor_set_size (compositor->stage, width, height); - clutter_actor_show (compositor->stage); - } - else - { - compositor->stage = clutter_stage_new (); - - meta_screen_get_size (screen, &width, &height); - clutter_actor_realize (compositor->stage); - - xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage)); - - XResizeWindow (xdisplay, xwin, width, height); - - { - MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ()); - Display *backend_xdisplay = meta_backend_x11_get_xdisplay (backend); - unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; - XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; - - XISetMask (mask.mask, XI_KeyPress); - XISetMask (mask.mask, XI_KeyRelease); - XISetMask (mask.mask, XI_ButtonPress); - XISetMask (mask.mask, XI_ButtonRelease); - XISetMask (mask.mask, XI_Enter); - XISetMask (mask.mask, XI_Leave); - XISetMask (mask.mask, XI_FocusIn); - XISetMask (mask.mask, XI_FocusOut); - XISetMask (mask.mask, XI_Motion); - XIClearMask (mask.mask, XI_TouchBegin); - XIClearMask (mask.mask, XI_TouchEnd); - XIClearMask (mask.mask, XI_TouchUpdate); - XISelectEvents (backend_xdisplay, xwin, &mask, 1); - } - } + { + MetaBackend *backend = meta_get_backend (); + compositor->stage = meta_backend_get_stage (backend); + } /* We use connect_after() here to accomodate code in GNOME Shell that, * when benchmarking drawing performance, connects to ::after-paint @@ -528,8 +485,12 @@ meta_compositor_manage (MetaCompositor *compositor) } else { + Window xwin; + compositor->output = screen->composite_overlay_window; + xwin = meta_backend_x11_get_xwindow (META_BACKEND_X11 (meta_get_backend ())); + XReparentWindow (xdisplay, xwin, compositor->output, 0, 0); meta_empty_stage_input_region (screen); @@ -1021,43 +982,6 @@ meta_compositor_sync_window_geometry (MetaCompositor *compositor, meta_window_actor_sync_actor_geometry (window_actor, did_placement); } -void -meta_compositor_sync_screen_size (MetaCompositor *compositor, - guint width, - guint height) -{ - MetaDisplay *display = compositor->display; - - if (meta_is_wayland_compositor ()) - { - /* FIXME: when we support a sliced stage, this is the place to do it - But! This is not the place to apply KMS config, here we only - notify Clutter/Cogl/GL that the framebuffer sizes changed. - - And because for now clutter does not do sliced, we use one - framebuffer the size of the whole screen, and when running on - bare metal MetaMonitorManager will do the necessary tricks to - show the right portions on the right screens. - */ - - clutter_actor_set_size (compositor->stage, width, height); - } - else - { - Display *xdisplay; - Window xwin; - - xdisplay = meta_display_get_xdisplay (display); - xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage)); - - XResizeWindow (xdisplay, xwin, width, height); - } - - meta_verbose ("Changed size for stage on screen %d to %dx%d\n", - meta_screen_get_screen_number (display->screen), - width, height); -} - static void frame_callback (CoglOnscreen *onscreen, CoglFrameEvent event, diff --git a/src/core/screen.c b/src/core/screen.c index 9742db7ab..4b46413c7 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -2522,9 +2522,6 @@ on_monitors_changed (MetaMonitorManager *manager, &changes); } - meta_compositor_sync_screen_size (screen->display->compositor, - screen->rect.width, screen->rect.height); - /* Queue a resize on all the windows */ meta_screen_foreach_window (screen, meta_screen_resize_func, 0); diff --git a/src/meta/compositor.h b/src/meta/compositor.h index 6c4ba51b5..3ba55c953 100644 --- a/src/meta/compositor.h +++ b/src/meta/compositor.h @@ -109,9 +109,6 @@ void meta_compositor_queue_frame_drawn (MetaCompositor *compositor, void meta_compositor_sync_stack (MetaCompositor *compositor, GList *stack); -void meta_compositor_sync_screen_size (MetaCompositor *compositor, - guint width, - guint height); void meta_compositor_flash_screen (MetaCompositor *compositor, MetaScreen *screen); diff --git a/src/meta/meta-backend.h b/src/meta/meta-backend.h index da0b452f9..c50429abe 100644 --- a/src/meta/meta-backend.h +++ b/src/meta/meta-backend.h @@ -27,6 +27,8 @@ #include +#include + typedef struct _MetaBackend MetaBackend; typedef struct _MetaBackendClass MetaBackendClass; @@ -42,6 +44,8 @@ void meta_backend_set_keymap (MetaBackend *backend, void meta_backend_lock_layout_group (MetaBackend *backend, guint idx); +ClutterActor *meta_backend_get_stage (MetaBackend *backend); + void meta_clutter_init (void); #endif /* META_BACKEND_H */