gnome-shell r167 - trunk/src
- From: danw svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-shell r167 - trunk/src
- Date: Tue, 27 Jan 2009 20:29:17 +0000 (UTC)
Author: danw
Date: Tue Jan 27 20:29:17 2009
New Revision: 167
URL: http://svn.gnome.org/viewvc/gnome-shell?rev=167&view=rev
Log:
Make a ClutterActor subclass that wraps a GtkWindow, and use it for the tray.
In particular, this lets us track the actor's location better; the old code
didn't work if the actor was put into a container that got moved around.
Part of #568712.
Added:
trunk/src/shell-gtkwindow-actor.c
trunk/src/shell-gtkwindow-actor.h
Modified:
trunk/src/Makefile.am
trunk/src/shell-tray-manager.c
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Tue Jan 27 20:29:17 2009
@@ -36,6 +36,8 @@
gnome-shell-plugin.c \
shell-app-monitor.c \
shell-app-monitor.h \
+ shell-gtkwindow-actor.c \
+ shell-gtkwindow-actor.h \
shell-process.c \
shell-process.h \
shell-global.c \
@@ -45,6 +47,11 @@
shell-wm.c \
shell-wm.h
+# ClutterGLXTexturePixmap is currently not wrapped
+non_gir_sources = shell-gtkwindow-actor.h
+libgnome_shell_la_gir_sources = \
+ $(filter-out $(non_gir_sources), $(libgnome_shell_la_SOURCES))
+
shell-marshal.h: stamp-shell-marshal.h
@true
stamp-shell-marshal.h: Makefile shell-marshal.list
@@ -86,7 +93,7 @@
--include=Meta-2.25 \
--program=metacity \
--program-arg=--mutter-plugins=$$(pwd)/libgnome-shell.la \
- $(libgnome_shell_la_SOURCES) \
+ $(libgnome_shell_la_gir_sources) \
$(libgnome_shell_la_CPPFLAGS) \
-o $@
CLEANFILES += Shell-1.0.gir
Added: trunk/src/shell-gtkwindow-actor.c
==============================================================================
--- (empty file)
+++ trunk/src/shell-gtkwindow-actor.c Tue Jan 27 20:29:17 2009
@@ -0,0 +1,174 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+#include "shell-gtkwindow-actor.h"
+
+#include <clutter/glx/clutter-glx.h>
+#include <clutter/x11/clutter-x11.h>
+#include <gdk/gdkx.h>
+
+enum {
+ PROP_0,
+
+ PROP_WINDOW
+};
+
+G_DEFINE_TYPE (ShellGtkWindowActor, shell_gtk_window_actor, CLUTTER_GLX_TYPE_TEXTURE_PIXMAP);
+
+struct _ShellGtkWindowActorPrivate {
+ GtkWidget *window;
+};
+
+static void
+shell_gtk_window_actor_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ShellGtkWindowActor *wactor = SHELL_GTK_WINDOW_ACTOR (object);
+
+ switch (prop_id)
+ {
+ case PROP_WINDOW:
+ wactor->priv->window = g_value_dup_object (value);
+
+ /* Here automatic=FALSE means to use CompositeRedirectManual.
+ * That is, the X server shouldn't draw the window onto the
+ * screen.
+ */
+ clutter_x11_texture_pixmap_set_window (CLUTTER_X11_TEXTURE_PIXMAP (wactor),
+ GDK_WINDOW_XWINDOW (wactor->priv->window->window),
+ FALSE);
+ /* Here automatic has a different meaning--whether
+ * ClutterX11TexturePixmap should process damage update and
+ * refresh the pixmap itself.
+ */
+ clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (wactor), TRUE);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+shell_gtk_window_actor_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ShellGtkWindowActor *wactor = SHELL_GTK_WINDOW_ACTOR (object);
+
+ switch (prop_id)
+ {
+ case PROP_WINDOW:
+ g_value_set_object (value, wactor->priv->window);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+shell_gtk_window_actor_allocate (ClutterActor *actor,
+ const ClutterActorBox *box,
+ gboolean absolute_origin_changed)
+{
+ ShellGtkWindowActor *wactor = SHELL_GTK_WINDOW_ACTOR (actor);
+ int wx = 0, wy = 0, x, y, ax, ay;
+
+ CLUTTER_ACTOR_CLASS (shell_gtk_window_actor_parent_class)->
+ allocate (actor, box, absolute_origin_changed);
+
+ /* Find the actor's new coordinates in terms of the stage (which is
+ * priv->window's parent window.
+ */
+ while (actor)
+ {
+ clutter_actor_get_position (actor, &x, &y);
+ clutter_actor_get_anchor_point (actor, &ax, &ay);
+
+ wx += x - ax;
+ wy += y - ay;
+
+ actor = clutter_actor_get_parent (actor);
+ }
+
+ gtk_window_move (GTK_WINDOW (wactor->priv->window), wx, wy);
+}
+
+static void
+shell_gtk_window_actor_show (ClutterActor *actor)
+{
+ ShellGtkWindowActor *wactor = SHELL_GTK_WINDOW_ACTOR (actor);
+
+ gtk_widget_show (wactor->priv->window);
+
+ CLUTTER_ACTOR_CLASS (shell_gtk_window_actor_parent_class)->show (actor);
+}
+
+static void
+shell_gtk_window_actor_hide (ClutterActor *actor)
+{
+ ShellGtkWindowActor *wactor = SHELL_GTK_WINDOW_ACTOR (actor);
+
+ gtk_widget_hide (wactor->priv->window);
+
+ CLUTTER_ACTOR_CLASS (shell_gtk_window_actor_parent_class)->hide (actor);
+}
+
+static void
+shell_gtk_window_actor_dispose (GObject *object)
+{
+ ShellGtkWindowActor *wactor = SHELL_GTK_WINDOW_ACTOR (object);
+
+ if (wactor->priv->window)
+ {
+ gtk_widget_destroy (wactor->priv->window);
+ wactor->priv->window = NULL;
+ }
+
+ G_OBJECT_CLASS (shell_gtk_window_actor_parent_class)->dispose (object);
+}
+
+static void
+shell_gtk_window_actor_class_init (ShellGtkWindowActorClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (ShellGtkWindowActorPrivate));
+
+ object_class->get_property = shell_gtk_window_actor_get_property;
+ object_class->set_property = shell_gtk_window_actor_set_property;
+ object_class->dispose = shell_gtk_window_actor_dispose;
+
+ actor_class->allocate = shell_gtk_window_actor_allocate;
+ actor_class->show = shell_gtk_window_actor_show;
+ actor_class->hide = shell_gtk_window_actor_hide;
+
+ g_object_class_install_property (object_class,
+ PROP_WINDOW,
+ g_param_spec_object ("window",
+ "Window",
+ "GtkWindow to wrap",
+ GTK_TYPE_WINDOW,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+shell_gtk_window_actor_init (ShellGtkWindowActor *actor)
+{
+ actor->priv = G_TYPE_INSTANCE_GET_PRIVATE (actor, SHELL_TYPE_GTK_WINDOW_ACTOR,
+ ShellGtkWindowActorPrivate);
+}
+
+ClutterActor *
+shell_gtk_window_actor_new (GtkWidget *window)
+{
+ return g_object_new (SHELL_TYPE_GTK_WINDOW_ACTOR,
+ "window", window,
+ NULL);
+}
Added: trunk/src/shell-gtkwindow-actor.h
==============================================================================
--- (empty file)
+++ trunk/src/shell-gtkwindow-actor.h Tue Jan 27 20:29:17 2009
@@ -0,0 +1,35 @@
+#ifndef __SHELL_GTK_WINDOW_ACTOR_H__
+#define __SHELL_GTK_WINDOW_ACTOR_H__
+
+#include <clutter/glx/clutter-glx.h>
+#include <gtk/gtk.h>
+
+#define SHELL_TYPE_GTK_WINDOW_ACTOR (shell_gtk_window_actor_get_type ())
+#define SHELL_GTK_WINDOW_ACTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_GTK_WINDOW_ACTOR, ShellGtkWindowActor))
+#define SHELL_GTK_WINDOW_ACTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_GTK_WINDOW_ACTOR, ShellGtkWindowActorClass))
+#define SHELL_IS_GTK_WINDOW_ACTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_GTK_WINDOW_ACTOR))
+#define SHELL_IS_GTK_WINDOW_ACTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_GTK_WINDOW_ACTOR))
+#define SHELL_GTK_WINDOW_ACTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_GTK_WINDOW_ACTOR, ShellGtkWindowActorClass))
+
+typedef struct _ShellGtkWindowActor ShellGtkWindowActor;
+typedef struct _ShellGtkWindowActorClass ShellGtkWindowActorClass;
+
+typedef struct _ShellGtkWindowActorPrivate ShellGtkWindowActorPrivate;
+
+struct _ShellGtkWindowActor
+{
+ ClutterGLXTexturePixmap parent;
+
+ ShellGtkWindowActorPrivate *priv;
+};
+
+struct _ShellGtkWindowActorClass
+{
+ ClutterGLXTexturePixmapClass parent_class;
+
+};
+
+GType shell_gtk_window_actor_get_type (void) G_GNUC_CONST;
+ClutterActor *shell_gtk_window_actor_new (GtkWidget *window);
+
+#endif /* __SHELL_GTK_WINDOW_ACTOR_H__ */
Modified: trunk/src/shell-tray-manager.c
==============================================================================
--- trunk/src/shell-tray-manager.c (original)
+++ trunk/src/shell-tray-manager.c Tue Jan 27 20:29:17 2009
@@ -1,13 +1,14 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include <clutter/clutter.h>
-#include <clutter/glx/clutter-glx.h>
#include <clutter/x11/clutter-x11.h>
#include <gtk/gtk.h>
#include "shell-tray-manager.h"
#include "na-tray-manager.h"
+#include "shell-gtkwindow-actor.h"
+
struct _ShellTrayManagerPrivate {
NaTrayManager *na_manager;
ClutterStage *stage;
@@ -204,30 +205,6 @@
gdk_drawable_get_screen (GDK_DRAWABLE (manager->priv->stage_window)));
}
-static void
-actor_moved (GObject *object, GParamSpec *param, gpointer user_data)
-{
- ShellTrayManagerChild *child = user_data;
- ClutterActor *actor = child->actor;
- int wx = 0, wy = 0, x, y, ax, ay;
-
- /* Find the actor's new coordinates in terms of the stage (which is
- * child->window's parent window.
- */
- while (actor)
- {
- clutter_actor_get_position (actor, &x, &y);
- clutter_actor_get_anchor_point (actor, &ax, &ay);
-
- wx += x - ax;
- wy += y - ay;
-
- actor = clutter_actor_get_parent (actor);
- }
-
- gtk_window_move (GTK_WINDOW (child->window), wx, wy);
-}
-
static GdkPixmap *
create_bg_pixmap (GdkColormap *colormap,
ClutterColor *color)
@@ -291,15 +268,9 @@
gdk_window_reparent (win->window, manager->priv->stage_window, 0, 0);
gtk_widget_show_all (win);
- icon = clutter_glx_texture_pixmap_new ();
- /* Here automatic=FALSE means to use CompositeRedirectManual - that is,
- * the X server shouldn't draw the window onto the screen */
- clutter_x11_texture_pixmap_set_window (CLUTTER_X11_TEXTURE_PIXMAP (icon),
- GDK_WINDOW_XWINDOW (win->window),
- FALSE);
- /* Here automatic has a different meaning - whether ClutterX11TexturePixmap
- * should process damage update and refresh the pixmap itself */
- clutter_x11_texture_pixmap_set_automatic (CLUTTER_X11_TEXTURE_PIXMAP (icon), TRUE);
+ icon = shell_gtk_window_actor_new (win);
+
+ /* Move to ShellGtkWindowActor? FIXME */
clutter_actor_set_size (icon, 24, 24);
child = g_slice_new (ShellTrayManagerChild);
@@ -308,11 +279,6 @@
child->actor = g_object_ref (icon);
g_hash_table_insert (manager->priv->icons, socket, child);
- g_signal_connect (child->actor, "notify::x",
- G_CALLBACK (actor_moved), child);
- g_signal_connect (child->actor, "notify::y",
- G_CALLBACK (actor_moved), child);
-
g_signal_emit (manager,
shell_tray_manager_signals[TRAY_ICON_ADDED], 0,
icon);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]