From 89b931435d386c647ac17b2a60355ff7d10447a8 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 31 Mar 2014 23:00:07 -0400 Subject: [PATCH] Move meta_clutter_init into a new file We'll use this to get the initialization between the Wayland and X11 compositor codepaths back in sync. --- src/Makefile.am | 2 + src/backends/meta-backend.c | 95 +++++++++++++++++++++++++++++++++++++ src/backends/meta-backend.h | 30 ++++++++++++ src/core/main.c | 67 +------------------------- 4 files changed, 128 insertions(+), 66 deletions(-) create mode 100644 src/backends/meta-backend.c create mode 100644 src/backends/meta-backend.h diff --git a/src/Makefile.am b/src/Makefile.am index 6eb4dc518..a1983bd99 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -51,6 +51,8 @@ wayland_protocols = \ wayland/protocol/xserver.xml libmutter_wayland_la_SOURCES = \ + backends/meta-backend.c \ + backends/meta-backend.h \ backends/meta-cursor.c \ backends/meta-cursor.h \ backends/meta-cursor-private.h \ diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c new file mode 100644 index 000000000..b4de3f674 --- /dev/null +++ b/src/backends/meta-backend.c @@ -0,0 +1,95 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Jasper St. Pierre + */ + +#include "config.h" + +#include "meta-backend.h" + +#include +#include +#include + +/* Mutter is responsible for pulling events off the X queue, so Clutter + * doesn't need (and shouldn't) run its normal event source which polls + * the X fd, but we do have to deal with dispatching events that accumulate + * in the clutter queue. This happens, for example, when clutter generate + * enter/leave events on mouse motion - several events are queued in the + * clutter queue but only one dispatched. It could also happen because of + * explicit calls to clutter_event_put(). We add a very simple custom + * event loop source which is simply responsible for pulling events off + * of the queue and dispatching them before we block for new events. + */ + +static gboolean +event_prepare (GSource *source, + gint *timeout_) +{ + *timeout_ = -1; + + return clutter_events_pending (); +} + +static gboolean +event_check (GSource *source) +{ + return clutter_events_pending (); +} + +static gboolean +event_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + ClutterEvent *event = clutter_event_get (); + + if (event) + { + clutter_do_event (event); + clutter_event_free (event); + } + + return TRUE; +} + +static GSourceFuncs event_funcs = { + event_prepare, + event_check, + event_dispatch +}; + +void +meta_clutter_init (void) +{ + GSource *source; + + clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); + clutter_x11_disable_event_retrieval (); + + if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) + g_error ("Unable to initialize Clutter.\n"); + + source = g_source_new (&event_funcs, sizeof (GSource)); + g_source_attach (source, NULL); + g_source_unref (source); +} diff --git a/src/backends/meta-backend.h b/src/backends/meta-backend.h new file mode 100644 index 000000000..4c4ee1fc3 --- /dev/null +++ b/src/backends/meta-backend.h @@ -0,0 +1,30 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2014 Red Hat + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Jasper St. Pierre + */ + +#ifndef META_BACKEND_H +#define META_BACKEND_H + +void meta_clutter_init (void); + +#endif /* META_BACKEND_H */ diff --git a/src/core/main.c b/src/core/main.c index 4ccf75a07..c0aeeb651 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -55,7 +55,6 @@ #include #include -#include #include #include @@ -71,7 +70,6 @@ #include #include -#include #ifdef HAVE_INTROSPECTION #include @@ -80,6 +78,7 @@ #include "x11/session.h" #include "wayland/meta-wayland.h" +#include "backends/meta-backend.h" /* * The exit code we'll return to our parent process when we eventually die. @@ -267,70 +266,6 @@ meta_get_option_context (void) return ctx; } -/* Mutter is responsible for pulling events off the X queue, so Clutter - * doesn't need (and shouldn't) run its normal event source which polls - * the X fd, but we do have to deal with dispatching events that accumulate - * in the clutter queue. This happens, for example, when clutter generate - * enter/leave events on mouse motion - several events are queued in the - * clutter queue but only one dispatched. It could also happen because of - * explicit calls to clutter_event_put(). We add a very simple custom - * event loop source which is simply responsible for pulling events off - * of the queue and dispatching them before we block for new events. - */ - -static gboolean -event_prepare (GSource *source, - gint *timeout_) -{ - *timeout_ = -1; - - return clutter_events_pending (); -} - -static gboolean -event_check (GSource *source) -{ - return clutter_events_pending (); -} - -static gboolean -event_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data) -{ - ClutterEvent *event = clutter_event_get (); - - if (event) - { - clutter_do_event (event); - clutter_event_free (event); - } - - return TRUE; -} - -static GSourceFuncs event_funcs = { - event_prepare, - event_check, - event_dispatch -}; - -static void -meta_clutter_init (void) -{ - GSource *source; - - clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); - clutter_x11_disable_event_retrieval (); - - if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) - meta_fatal ("Unable to initialize Clutter.\n"); - - source = g_source_new (&event_funcs, sizeof (GSource)); - g_source_attach (source, NULL); - g_source_unref (source); -} - /** * meta_select_display: *