gnome-shell r70 - in trunk: js/ui src
- From: danw svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-shell r70 - in trunk: js/ui src
- Date: Fri, 21 Nov 2008 14:02:09 +0000 (UTC)
Author: danw
Date: Fri Nov 21 14:02:09 2008
New Revision: 70
URL: http://svn.gnome.org/viewvc/gnome-shell?rev=70&view=rev
Log:
add the initial framework of a window management interface. #561724
Added:
trunk/js/ui/windowmanager.js
trunk/src/shell-marshal.list
trunk/src/shell-wm.c
trunk/src/shell-wm.h
Modified:
trunk/js/ui/main.js
trunk/src/ (props changed)
trunk/src/Makefile.am
trunk/src/gnome-shell-plugin.c
trunk/src/shell-global.c
trunk/src/shell-global.h
Modified: trunk/js/ui/main.js
==============================================================================
--- trunk/js/ui/main.js (original)
+++ trunk/js/ui/main.js Fri Nov 21 14:02:09 2008
@@ -6,6 +6,7 @@
const Panel = imports.ui.panel;
const Overlay = imports.ui.overlay;
const RunDialog = imports.ui.run_dialog;
+const WindowManager = imports.ui.windowmanager;
const DEFAULT_BACKGROUND_COLOR = new Clutter.Color();
DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff);
@@ -13,6 +14,7 @@
let panel = null;
let overlay = null;
let run_dialog = null;
+let wm = null;
function start() {
let global = Shell.global_get();
@@ -43,8 +45,10 @@
});
panel = new Panel.Panel();
- overlay = new Overlay.Overlay();
global.set_stage_input_area(0, 0, global.screen_width, Panel.PANEL_HEIGHT);
+
+ overlay = new Overlay.Overlay();
+ wm = new WindowManager.WindowManager();
}
function show_overlay() {
Added: trunk/js/ui/windowmanager.js
==============================================================================
--- (empty file)
+++ trunk/js/ui/windowmanager.js Fri Nov 21 14:02:09 2008
@@ -0,0 +1,29 @@
+/* -*- mode: js2; js2-basic-offset: 4; -*- */
+
+const Clutter = imports.gi.Clutter;
+const Mainloop = imports.mainloop;
+const Shell = imports.gi.Shell;
+
+const Main = imports.ui.main;
+
+function WindowManager(shellwm) {
+ this._init(shellwm);
+}
+
+WindowManager.prototype = {
+ _init : function(shellwm) {
+ let global = Shell.global_get();
+ let shellwm = global.window_manager;
+
+ shellwm.connect('switch-workspace',
+ function(o, from, to, direction) {
+ let actors = shellwm.get_switch_workspace_actors();
+ for (let i = 0; i < actors.length; i++) {
+ if (actors[i].get_workspace() == from)
+ actors[i].hide();
+ else if (actors[i].get_workspace() == to)
+ actors[i].show();
+ }
+ });
+ }
+};
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Fri Nov 21 14:02:09 2008
@@ -13,7 +13,17 @@
plugindir = $(libdir)/metacity/plugins/clutter
plugin_LTLIBRARIES = libgnome-shell.la
+shell_built_sources = \
+ shell-marshal.h \
+ shell-marshal.c
+
+BUILT_SOURCES += $(shell_built_sources)
+
+SHELL_STAMP_FILES = stamp-shell-marshal.h
+CLEANFILES += $(SHELL_STAMP_FILES)
+
libgnome_shell_la_SOURCES = \
+ $(shell_built_sources) \
gnome-shell-plugin.c \
shell-app-monitor.c \
shell-app-monitor.h \
@@ -22,7 +32,29 @@
shell-global.c \
shell-global.h \
shell-tray-manager.c \
- shell-tray-manager.h
+ shell-tray-manager.h \
+ shell-wm.c \
+ shell-wm.h
+
+shell-marshal.h: stamp-shell-marshal.h
+ @true
+stamp-shell-marshal.h: Makefile shell-marshal.list
+ $(GLIB_GENMARSHAL) \
+ --prefix=_shell_marshal \
+ --header \
+ $(srcdir)/shell-marshal.list > xgen-tmh && \
+ (cmp -s xgen-tmh shell-marshal.h || cp -f xgen-tmh shell-marshal.h) && \
+ rm -f xgen-tmh && \
+ echo timestamp > $(@F)
+
+shell-marshal.c: Makefile shell-marshal.list
+ (echo "#include \"shell-marshal.h\"" ; \
+ $(GLIB_GENMARSHAL) \
+ --prefix=_shell_marshal \
+ --body \
+ $(srcdir)/shell-marshal.list ) > xgen-tmc && \
+ cp -f xgen-tmc shell-marshal.c && \
+ rm -f xgen-tmc
libgnome_shell_la_LDFLAGS = -avoid-version -module
libgnome_shell_la_LIBADD = \
Modified: trunk/src/gnome-shell-plugin.c
==============================================================================
--- trunk/src/gnome-shell-plugin.c (original)
+++ trunk/src/gnome-shell-plugin.c Fri Nov 21 14:02:09 2008
@@ -84,6 +84,11 @@
/* Event handling */
plugin->xevent_filter = xevent_filter;
+ /* This will also create the ShellWM, which will set the appropriate
+ * window management callbacks in plugin.
+ */
+ _shell_global_set_plugin (shell_global_get(), plugin);
+
return NULL;
}
@@ -125,8 +130,6 @@
plugin_state->gjs_context = gjs_context_new_with_search_path(search_path);
g_strfreev(search_path);
- _shell_global_set_plugin (shell_global_get(), plugin);
-
plugin_state->panel_action = XInternAtom (meta_display_get_xdisplay (display),
"_GNOME_PANEL_ACTION", FALSE);
plugin_state->panel_action_run_dialog = XInternAtom (meta_display_get_xdisplay (display),
Modified: trunk/src/shell-global.c
==============================================================================
--- trunk/src/shell-global.c (original)
+++ trunk/src/shell-global.c Fri Nov 21 14:02:09 2008
@@ -1,6 +1,7 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include "shell-global.h"
+#include "shell-wm.h"
#include "display.h"
#include <clutter/x11/clutter-x11.h>
@@ -9,6 +10,7 @@
GObject parent;
MutterPlugin *plugin;
+ ShellWM *wm;
};
enum {
@@ -19,7 +21,8 @@
PROP_SCREEN_WIDTH,
PROP_SCREEN_HEIGHT,
PROP_STAGE,
- PROP_WINDOW_GROUP
+ PROP_WINDOW_GROUP,
+ PROP_WINDOW_MANAGER
};
/* Signals */
@@ -86,6 +89,9 @@
case PROP_WINDOW_GROUP:
g_value_set_object (value, mutter_plugin_get_window_group (global->plugin));
break;
+ case PROP_WINDOW_MANAGER:
+ g_value_set_object (value, global->wm);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -166,6 +172,13 @@
"Actor holding window actors",
CLUTTER_TYPE_ACTOR,
G_PARAM_READABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_WINDOW_MANAGER,
+ g_param_spec_object ("window-manager",
+ "Window Manager",
+ "Window management interface",
+ SHELL_TYPE_WM,
+ G_PARAM_READABLE));
}
/**
@@ -253,8 +266,10 @@
MutterPlugin *plugin)
{
g_return_if_fail (SHELL_IS_GLOBAL (global));
+ g_return_if_fail (global->plugin == NULL);
global->plugin = plugin;
+ global->wm = shell_wm_new (plugin);
}
/**
@@ -274,3 +289,19 @@
Window stagewin = clutter_x11_get_stage_window (stage);
XSetInputFocus (xdisplay, stagewin, RevertToParent, CurrentTime);
}
+
+ClutterActor *
+shell_global_get_overlay_group (ShellGlobal *global)
+{
+ g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
+
+ return mutter_plugin_get_overlay_group (global->plugin);
+}
+
+ClutterActor *
+shell_global_get_window_group (ShellGlobal *global)
+{
+ g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
+
+ return mutter_plugin_get_window_group (global->plugin);
+}
Modified: trunk/src/shell-global.h
==============================================================================
--- trunk/src/shell-global.h (original)
+++ trunk/src/shell-global.h Fri Nov 21 14:02:09 2008
@@ -42,7 +42,9 @@
int width,
int height);
-GList *shell_global_get_windows (ShellGlobal *global);
+GList *shell_global_get_windows (ShellGlobal *global);
+ClutterActor *shell_global_get_window_group (ShellGlobal *global);
+ClutterActor *shell_global_get_overlay_group (ShellGlobal *global);
void _shell_global_set_plugin (ShellGlobal *global,
MutterPlugin *plugin);
Added: trunk/src/shell-marshal.list
==============================================================================
--- (empty file)
+++ trunk/src/shell-marshal.list Fri Nov 21 14:02:09 2008
@@ -0,0 +1 @@
+VOID:INT,INT,INT
Added: trunk/src/shell-wm.c
==============================================================================
--- (empty file)
+++ trunk/src/shell-wm.c Fri Nov 21 14:02:09 2008
@@ -0,0 +1,194 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+#include "shell-wm.h"
+#include "shell-global.h"
+#include "shell-marshal.h"
+
+struct _ShellWM {
+ GObject parent;
+
+ GList *switch_workspace_actors;
+};
+
+/* Signals */
+enum
+{
+#ifdef NOT_YET
+ MINIMIZE,
+ KILL_MINIMIZE,
+ MAXIMIZE,
+ KILL_MAXIMIZE,
+ UNMAXIMIZE,
+ KILL_UNMAXIMIZE,
+ MAP,
+ KILL_MAP,
+ DESTROY,
+ KILL_DESTROY,
+#endif
+ SWITCH_WORKSPACE,
+ KILL_SWITCH_WORKSPACE,
+
+ LAST_SIGNAL
+};
+
+G_DEFINE_TYPE(ShellWM, shell_wm, G_TYPE_OBJECT);
+
+static void shell_wm_set_switch_workspace_actors (ShellWM *wm,
+ GList *actors);
+
+static guint shell_wm_signals [LAST_SIGNAL] = { 0 };
+
+static void
+shell_wm_init (ShellWM *wm)
+{
+}
+
+static void
+shell_wm_finalize (GObject *object)
+{
+ ShellWM *wm = SHELL_WM (object);
+
+ shell_wm_set_switch_workspace_actors (wm, NULL);
+
+ G_OBJECT_CLASS (shell_wm_parent_class)->finalize (object);
+}
+
+static void
+shell_wm_class_init (ShellWMClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->finalize = shell_wm_finalize;
+
+ shell_wm_signals[SWITCH_WORKSPACE] =
+ g_signal_new ("switch-workspace",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ _shell_marshal_VOID__INT_INT_INT,
+ G_TYPE_NONE, 3,
+ G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
+ shell_wm_signals[KILL_SWITCH_WORKSPACE] =
+ g_signal_new ("kill-switch-workspace",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
+
+static ShellWM *
+shell_wm_get (void)
+{
+ ShellWM *wm;
+
+ g_object_get (shell_global_get (),
+ "window-manager", &wm,
+ NULL);
+ /* drop extra ref added by g_object_get */
+ g_object_unref (wm);
+
+ return wm;
+}
+
+static void
+shell_wm_switch_workspace (const GList **actors,
+ gint from,
+ gint to,
+ MetaMotionDirection direction)
+{
+ ShellWM *wm = shell_wm_get ();
+
+ shell_wm_set_switch_workspace_actors (wm, (GList *)*actors);
+ g_signal_emit (wm, shell_wm_signals[SWITCH_WORKSPACE], 0,
+ from, to, direction);
+ shell_wm_set_switch_workspace_actors (wm, NULL);
+}
+
+static void
+shell_wm_kill_effect (MutterWindow *actor,
+ gulong events)
+{
+ ShellWM *wm = shell_wm_get ();
+
+#ifdef NOT_YET
+ if (events & MUTTER_PLUGIN_MINIMIZE)
+ g_signal_emit (wm, shell_wm_signals[KILL_MINIMIZE], 0);
+ if (events & MUTTER_PLUGIN_MAXIMIZE)
+ g_signal_emit (wm, shell_wm_signals[KILL_MAXIMIZE], 0);
+ if (events & MUTTER_PLUGIN_UNMAXIMIZE)
+ g_signal_emit (wm, shell_wm_signals[KILL_UNMAXIMIZE], 0);
+ if (events & MUTTER_PLUGIN_MAP)
+ g_signal_emit (wm, shell_wm_signals[KILL_MAP], 0);
+ if (events & MUTTER_PLUGIN_DESTROY)
+ g_signal_emit (wm, shell_wm_signals[KILL_DESTROY], 0);
+#endif
+ if (events & MUTTER_PLUGIN_SWITCH_WORKSPACE)
+ g_signal_emit (wm, shell_wm_signals[KILL_SWITCH_WORKSPACE], 0);
+}
+
+
+/**
+ * shell_wm_new:
+ * @plugin: the #MutterPlugin
+ *
+ * Creates a new window management interface by hooking into @plugin.
+ *
+ * Return value: the new window-management interface
+ **/
+ShellWM *
+shell_wm_new (MutterPlugin *plugin)
+{
+#ifdef NOT_YET
+ plugin->minimize = shell_wm_minimize;
+ plugin->maximize = shell_wm_maximize;
+ plugin->unmaximize = shell_wm_unmaximize;
+ plugin->map = shell_wm_map;
+ plugin->destroy = shell_wm_destroy;
+#endif
+ plugin->switch_workspace = shell_wm_switch_workspace;
+ plugin->kill_effect = shell_wm_kill_effect;
+
+ return g_object_new (SHELL_TYPE_WM, NULL);
+}
+
+/**
+ * shell_wm_get_switch_workspace_actors:
+ * @wm: the #ShellWM
+ *
+ * A workaround for a missing feature in gobject-introspection. Returns
+ * the list of windows involved in a switch-workspace operation (which
+ * cannot be passed directly to the signal handler because there's no
+ * way to annotate the element-type of a signal parameter.)
+ *
+ * You must call this from the #ShellWM::switch-workspace signal
+ * handler itself; if you need the value again later, you must save a
+ * copy yourself.
+ *
+ * Return value: (element-type MutterWindow) (transfer full): the list
+ * of windows
+ **/
+GList *
+shell_wm_get_switch_workspace_actors (ShellWM *wm)
+{
+ GList *l;
+
+ for (l = wm->switch_workspace_actors; l; l = l->next)
+ g_object_ref (l->data);
+ return g_list_copy (wm->switch_workspace_actors);
+}
+
+static void
+shell_wm_set_switch_workspace_actors (ShellWM *wm, GList *actors)
+{
+ const GList *l;
+
+ for (l = wm->switch_workspace_actors; l; l = l->next)
+ g_object_unref (l->data);
+ g_list_free (wm->switch_workspace_actors);
+ wm->switch_workspace_actors = g_list_copy (actors);
+ for (l = wm->switch_workspace_actors; l; l = l->next)
+ g_object_ref (l->data);
+}
Added: trunk/src/shell-wm.h
==============================================================================
--- (empty file)
+++ trunk/src/shell-wm.h Fri Nov 21 14:02:09 2008
@@ -0,0 +1,33 @@
+#ifndef __SHELL_WM_H__
+#define __SHELL_WM_H__
+
+#include <glib-object.h>
+#include <mutter-plugin.h>
+
+G_BEGIN_DECLS
+
+typedef struct _ShellWM ShellWM;
+typedef struct _ShellWMClass ShellWMClass;
+
+#define SHELL_TYPE_WM (shell_wm_get_type ())
+#define SHELL_WM(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_WM, ShellWM))
+#define SHELL_WM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_WM, ShellWMClass))
+#define SHELL_IS_WM(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_WM))
+#define SHELL_IS_WM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_WM))
+#define SHELL_WM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_WM, ShellWMClass))
+
+struct _ShellWMClass
+{
+ GObjectClass parent_class;
+
+};
+
+GType shell_wm_get_type (void) G_GNUC_CONST;
+
+ShellWM *shell_wm_new (MutterPlugin *plugin);
+
+GList *shell_wm_get_switch_workspace_actors (ShellWM *wm);
+
+G_END_DECLS
+
+#endif /* __SHELL_WM_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]