Dear all, and Owen, I was able to embed the Global Menu widget into the top panel via the newly added shell-gtkwindow-actor. Although looking crappy, it works. Regards, Yu
Index: configure.ac
===================================================================
--- configure.ac (revision 173)
+++ configure.ac (working copy)
@@ -23,6 +23,8 @@
PKG_CHECK_MODULES(BIG, clutter-cairo-0.8 gtk+-2.0 librsvg-2.0)
PKG_CHECK_MODULES(TRAY, gtk+-2.0)
PKG_CHECK_MODULES(TASKPANEL, libwnck-1.0 dbus-glib-1)
+
+PKG_CHECK_MODULES(GNOMENU, libgnomenu)
# We require libgnomeui for generating thumbnails for recent files with GnomeThumbnailFactory.
# We'll switch to using GnomeDesktopThumbnailFactory once the branch of gnome-desktop that contains
# it becomes stable.
Index: src/shell-globalmenu-actor.c
===================================================================
--- src/shell-globalmenu-actor.c (revision 0)
+++ src/shell-globalmenu-actor.c (revision 0)
@@ -0,0 +1,45 @@
+#include "shell-globalmenu-actor.h"
+#include "shell-gtkwindow-actor.h"
+#include "libgnomenu/globalmenu.h"
+#include "libgnomenu/monitor.h"
+
+static void on_window_changed(GnomenuMonitor * monitor, gulong prev, GnomenuGlobalMenu * gm);
+ClutterActor *shell_globalmenu_actor_new (ClutterStage *stage) {
+
+ GtkWindow * win = gtk_window_new(GTK_WINDOW_POPUP);
+ GnomenuGlobalMenu * gm = gnomenu_global_menu_new();
+ GnomenuMonitor * monitor = gnomenu_monitor_new();
+
+ gtk_container_add(GTK_CONTAINER(win), gm);
+
+ g_object_set_data_full(G_OBJECT(win), "monitor", monitor, g_object_unref);
+
+ Window stage_xwin;
+ GdkWindow * stage_window;
+ stage_xwin = clutter_x11_get_stage_window (stage);
+ stage_window = gdk_window_lookup (stage_xwin);
+ if (stage_window)
+ g_object_ref (stage_window);
+ else
+ stage_window = gdk_window_foreign_new (stage_xwin);
+
+ gtk_widget_realize(win);
+ gtk_widget_set_parent_window (win, stage_window);
+ gdk_window_reparent (((GtkWidget*)win)->window, stage_window, 0, 0);
+ gtk_widget_set_size_request (win, 400, 24);
+ gtk_widget_show_all(win);
+
+ g_signal_connect(monitor, "window-changed", on_window_changed, gm);
+
+ ClutterActor * rt = shell_gtk_window_actor_new(win);
+
+ /** really should modify the gi tags **/
+ g_object_ref(rt);
+ g_assert(rt != NULL);
+ return rt;
+}
+
+static void on_window_changed(GnomenuMonitor * monitor, gulong prev, GnomenuGlobalMenu * gm) {
+ gulong xid = gnomenu_monitor_get_current_xid(monitor);
+ gnomenu_global_menu_switch_to(gm, xid);
+}
Index: src/shell-globalmenu-actor.h
===================================================================
--- src/shell-globalmenu-actor.h (revision 0)
+++ src/shell-globalmenu-actor.h (revision 0)
@@ -0,0 +1,9 @@
+#ifndef __SHELL_GLOBAL_MENU_ACTOR_H__
+#define __SHELL_GLOBAL_MENU_ACTOR_H__
+
+#include <clutter/glx/clutter-glx.h>
+#include <gtk/gtk.h>
+
+ClutterActor *shell_globalmenu_actor_new (ClutterStage * stage);
+
+#endif /* __SHELL_GLOBAL_MENU_ACTOR_H__ */
Index: src/Makefile.am
===================================================================
--- src/Makefile.am (revision 173)
+++ src/Makefile.am (working copy)
@@ -38,6 +38,8 @@
shell-app-monitor.h \
shell-gtkwindow-actor.c \
shell-gtkwindow-actor.h \
+ shell-globalmenu-actor.c \
+ shell-globalmenu-actor.h \
shell-process.c \
shell-process.h \
shell-global.c \
@@ -75,6 +77,7 @@
libgnome_shell_la_LDFLAGS = -avoid-version -module
libgnome_shell_la_LIBADD = \
$(MUTTER_PLUGIN_LIBS) \
+ $(GNOMENU_LIBS) \
$(LIBGNOMEUI_LIBS) \
libbig-1.0.la \
libtidy-1.0.la \
Index: js/ui/panel.js
===================================================================
--- js/ui/panel.js (revision 173)
+++ js/ui/panel.js (working copy)
@@ -8,6 +8,7 @@
const Button = imports.ui.button;
const Main = imports.ui.main;
+const Gnomenu = imports.gi.Gnomenu;
const PANEL_HEIGHT = 32;
const TRAY_HEIGHT = 24;
@@ -65,6 +66,9 @@
});
this._traymanager.manage_stage(global.stage);
+ this._globalmenu = Shell.globalmenu_actor_new(global.stage);
+ this._box.append(this._globalmenu, Big.BoxPackFlags.NONE);
+
// TODO: decide what to do with the rest of the panel in the overlay mode (make it fade-out, become non-reactive, etc.)
// We get into the overlay mode on button-press-event as opposed to button-release-event because eventually we'll probably
// have the overlay act like a menu that allows the user to release the mouse on the activity the user wants
Attachment:
Screenshot-Untitled Window.png
Description: PNG image