summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2020-02-27 16:09:17 +0200
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2020-02-28 19:36:12 +0200
commitf8bdb8494e5f7fe3ecb78664bfc06c62cc87437d (patch)
tree132e46817bc083d9fea33a1fa8c196fc63b85ea8
parent7a7aaa338b89c0c66122958e7c6cb56322e73371 (diff)
downloadmetacity-f8bdb8494e5f7fe3ecb78664bfc06c62cc87437d.tar.gz
compositor: add MetaCompositorExternal
-rw-r--r--src/Makefile.am2
-rw-r--r--src/compositor/meta-compositor-external.c138
-rw-r--r--src/compositor/meta-compositor-external.h34
-rw-r--r--src/core/display.c7
-rw-r--r--src/include/meta-compositor.h1
5 files changed, 182 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 07966e27..373c653c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -27,6 +27,8 @@ metacity_CFLAGS = \
metacity_SOURCES = \
compositor/meta-compositor.c \
+ compositor/meta-compositor-external.c \
+ compositor/meta-compositor-external.h \
compositor/meta-compositor-none.c \
compositor/meta-compositor-none.h \
compositor/meta-compositor-private.h \
diff --git a/src/compositor/meta-compositor-external.c b/src/compositor/meta-compositor-external.c
new file mode 100644
index 00000000..4e144df7
--- /dev/null
+++ b/src/compositor/meta-compositor-external.c
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2020 Alberts Muktupāvels
+ *
+ * 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 "meta-compositor-external.h"
+
+#include <X11/extensions/Xfixes.h>
+
+#include "display-private.h"
+
+struct _MetaCompositorExternal
+{
+ MetaCompositor parent;
+
+ Atom cm_atom;
+};
+
+G_DEFINE_TYPE (MetaCompositorExternal, meta_compositor_external, META_TYPE_COMPOSITOR)
+
+static gboolean
+meta_compositor_external_manage (MetaCompositor *compositor,
+ GError **error)
+{
+ MetaCompositorExternal *self;
+ MetaDisplay *display;
+ Display *xdisplay;
+ gchar *atom_name;
+ gboolean composited;
+
+ self = META_COMPOSITOR_EXTERNAL (compositor);
+
+ display = meta_compositor_get_display (compositor);
+ xdisplay = meta_display_get_xdisplay (display);
+
+ if (!display->have_xfixes)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Missing xfixes extension");
+
+ return FALSE;
+ }
+
+ atom_name = g_strdup_printf ("_NET_WM_CM_S%d", DefaultScreen (xdisplay));
+ self->cm_atom = XInternAtom (xdisplay, atom_name, FALSE);
+ g_free (atom_name);
+
+ XFixesSelectSelectionInput (xdisplay,
+ DefaultRootWindow (xdisplay),
+ self->cm_atom,
+ XFixesSetSelectionOwnerNotifyMask);
+
+ composited = XGetSelectionOwner (xdisplay, self->cm_atom) != None;
+ meta_compositor_set_composited (compositor, composited);
+
+ return TRUE;
+}
+
+static MetaSurface *
+meta_compositor_external_add_window (MetaCompositor *compositor,
+ MetaWindow *window)
+{
+ return NULL;
+}
+
+static void
+meta_compositor_external_process_event (MetaCompositor *compositor,
+ XEvent *event,
+ MetaWindow *window)
+{
+ MetaCompositorExternal *self;
+ MetaDisplay *display;
+ XFixesSelectionNotifyEvent *xfixes_event;
+
+ self = META_COMPOSITOR_EXTERNAL (compositor);
+ display = meta_compositor_get_display (compositor);
+
+ if (event->type != display->xfixes_event_base + XFixesSelectionNotify)
+ return;
+
+ xfixes_event = (XFixesSelectionNotifyEvent *) event;
+ if (xfixes_event->selection != self->cm_atom)
+ return;
+
+ meta_compositor_set_composited (compositor, xfixes_event->owner != None);
+}
+
+static void
+meta_compositor_external_sync_screen_size (MetaCompositor *compositor)
+{
+}
+
+static void
+meta_compositor_external_redraw (MetaCompositor *compositor,
+ XserverRegion all_damage)
+{
+}
+
+static void
+meta_compositor_external_class_init (MetaCompositorExternalClass *self_class)
+{
+ MetaCompositorClass *compositor_class;
+
+ compositor_class = META_COMPOSITOR_CLASS (self_class);
+
+ compositor_class->manage = meta_compositor_external_manage;
+ compositor_class->add_window = meta_compositor_external_add_window;
+ compositor_class->process_event = meta_compositor_external_process_event;
+ compositor_class->sync_screen_size = meta_compositor_external_sync_screen_size;
+ compositor_class->redraw = meta_compositor_external_redraw;
+}
+
+static void
+meta_compositor_external_init (MetaCompositorExternal *self)
+{
+}
+
+MetaCompositor *
+meta_compositor_external_new (MetaDisplay *display,
+ GError **error)
+{
+ return g_initable_new (META_TYPE_COMPOSITOR_EXTERNAL, NULL, error,
+ "display", display,
+ NULL);
+}
diff --git a/src/compositor/meta-compositor-external.h b/src/compositor/meta-compositor-external.h
new file mode 100644
index 00000000..438566f8
--- /dev/null
+++ b/src/compositor/meta-compositor-external.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2020 Alberts Muktupāvels
+ *
+ * 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_COMPOSITOR_EXTERNAL_H
+#define META_COMPOSITOR_EXTERNAL_H
+
+#include "meta-compositor-private.h"
+
+G_BEGIN_DECLS
+
+#define META_TYPE_COMPOSITOR_EXTERNAL (meta_compositor_external_get_type ())
+G_DECLARE_FINAL_TYPE (MetaCompositorExternal, meta_compositor_external,
+ META, COMPOSITOR_EXTERNAL, MetaCompositor)
+
+MetaCompositor *meta_compositor_external_new (MetaDisplay *display,
+ GError **error);
+
+G_END_DECLS
+
+#endif
diff --git a/src/core/display.c b/src/core/display.c
index 679b1a89..06d8b580 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -68,6 +68,7 @@
#include "compositor/meta-compositor-none.h"
#include "compositor/meta-compositor-xrender.h"
+#include "compositor/meta-compositor-external.h"
#ifdef HAVE_VULKAN
#include "compositor/meta-compositor-vulkan.h"
@@ -277,6 +278,8 @@ get_compositor_type (MetaDisplay *display)
type = META_COMPOSITOR_TYPE_VULKAN;
else if (g_strcmp0 (compositor, "xrender") == 0)
type = META_COMPOSITOR_TYPE_XRENDER;
+ else if (g_strcmp0 (compositor, "external") == 0)
+ type = META_COMPOSITOR_TYPE_EXTERNAL;
else
type = META_COMPOSITOR_TYPE_NONE;
}
@@ -310,6 +313,10 @@ create_compositor (MetaDisplay *display,
compositor = meta_compositor_xrender_new (display, error);
break;
+ case META_COMPOSITOR_TYPE_EXTERNAL:
+ compositor = meta_compositor_external_new (display, error);
+ break;
+
case META_COMPOSITOR_TYPE_VULKAN:
#ifdef HAVE_VULKAN
compositor = meta_compositor_vulkan_new (display, error);
diff --git a/src/include/meta-compositor.h b/src/include/meta-compositor.h
index 25d09079..0aaa5d27 100644
--- a/src/include/meta-compositor.h
+++ b/src/include/meta-compositor.h
@@ -35,6 +35,7 @@ typedef enum
{
META_COMPOSITOR_TYPE_NONE,
META_COMPOSITOR_TYPE_XRENDER,
+ META_COMPOSITOR_TYPE_EXTERNAL,
META_COMPOSITOR_TYPE_VULKAN
} MetaCompositorType;