summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-libs/gtk+/files/gtk+-2.10-gtkmenubar.diff')
-rw-r--r--x11-libs/gtk+/files/gtk+-2.10-gtkmenubar.diff193
1 files changed, 193 insertions, 0 deletions
diff --git a/x11-libs/gtk+/files/gtk+-2.10-gtkmenubar.diff b/x11-libs/gtk+/files/gtk+-2.10-gtkmenubar.diff
new file mode 100644
index 0000000..84f82c4
--- /dev/null
+++ b/x11-libs/gtk+/files/gtk+-2.10-gtkmenubar.diff
@@ -0,0 +1,193 @@
+--- gtk/gtkmenubar.c.old 2006-07-03 08:25:06.000000000 +0800
++++ gtk/gtkmenubar.c 2006-11-04 23:18:50.000000000 +0800
+@@ -38,6 +38,18 @@
+ #include "gtkwindow.h"
+ #include "gtkprivate.h"
+ #include "gtkalias.h"
++// For mac menubar
++#include "gdk/x11/gdkx.h"
++#include "gdk/x11/gdkwindow-x11.h"
++#include "gtkbox.h"
++#include "gtkdrawingarea.h"
++#include "gtkhbox.h"
++#include "gtklabel.h"
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <X11/Xatom.h>
++#include <X11/Xlib.h>
+
+
+ #define BORDER_SPACING 0
+@@ -55,6 +67,8 @@
+ {
+ GtkPackDirection pack_direction;
+ GtkPackDirection child_pack_direction;
++ GtkWindow* orig_toplevel_win; // original window, obtained in map()
++ GtkWindow* mbar_toplevel_win; // could be NULL, if disabled
+ };
+
+ #define GTK_MENU_BAR_GET_PRIVATE(o) \
+@@ -89,9 +103,154 @@
+
+ G_DEFINE_TYPE (GtkMenuBar, gtk_menu_bar, GTK_TYPE_MENU_SHELL)
+
++
++/*
++ * Mac Menubar options
++ */
++
++static gboolean option_no_mac()
++{
++ static gboolean no_mac_set = FALSE;
++ static gboolean no_mac = FALSE;
++ char* env = NULL;
++ if (no_mac_set) return no_mac;
++ env = getenv("GTK_MENUBAR_NO_MAC");
++ if (env == NULL)
++ env = "acroread gnome-macmenu-applet gnome-panel xfce4-macmenu-plugin xfce4-panel";
++ if (strcmp(env, "1") == 0)
++ no_mac = TRUE;
++ else
++ {
++ // check for GTK_MENUBAR_NO_MAC
++ gchar** no_mac_prgs = g_strsplit(env, " ", 0);
++ gchar** p = no_mac_prgs;
++ gchar* prg = g_get_prgname();
++ while (*p != NULL)
++ {
++ if (strcmp(*p, prg) == 0)
++ {
++ no_mac = TRUE;
++ break;
++ }
++ p ++;
++ }
++ g_strfreev(no_mac_prgs);
++ }
++ if (! no_mac)
++ {
++ // check for mozplugger
++ char scmd[255];
++ char buffer[1024];
++ sprintf(scmd, "ps -o comm= -p `ps -o ppid= -p %d`", getpid());
++ FILE* f = popen(scmd, "r");
++ int len = fread(buffer, 1, 1023, f);
++ if (len > 0)
++ {
++ char* p;
++ buffer[len] = 0;
++ if ((p = index(buffer, '\n')) != NULL)
++ *p = 0;
++ if (strcmp(buffer, "mozplugger-help") == 0)
++ no_mac = TRUE;
++ }
++ else
++ {
++ fprintf(stderr, "failed to check for mozplugger by \"%s\"\n", scmd);
++ }
++ pclose(f);
++ }
++ no_mac_set = TRUE;
++ return no_mac;
++}
++
++/*
++ * Mac Menubar event handlers/callbacks
++ */
++
++static gboolean orig_toplevel_on_destroy (GtkWidget *widget, gpointer my_data)
++{
++ GtkMenuBar* menubar = (GtkMenuBar*) my_data;
++ GtkMenuBarPrivate* priv = GTK_MENU_BAR_GET_PRIVATE (menubar);
++ if (priv->mbar_toplevel_win)
++ {
++ gtk_widget_destroy (GTK_WIDGET (priv->mbar_toplevel_win));
++ priv->mbar_toplevel_win = NULL;
++ priv->orig_toplevel_win = NULL;
++ }
++ return FALSE;
++}
++
++static void orig_toplevel_on_event_after (GtkWidget* widget,
++ GdkEvent* event,
++ gpointer my_data)
++{
++ GtkMenuBar* menubar = (GtkMenuBar*) my_data;
++ GtkMenuBarPrivate* priv = GTK_MENU_BAR_GET_PRIVATE (menubar);
++ if (! priv->mbar_toplevel_win) return;
++ if (event->type == GDK_FOCUS_CHANGE && event->focus_change.in)
++ gtk_widget_show (GTK_WIDGET (priv->mbar_toplevel_win));
++}
++
++static void gtk_menu_bar_map (GtkWidget *widget)
++{
++ GtkMenuBar* menubar = GTK_MENU_BAR (widget);
++ GtkMenuBarPrivate* priv = GTK_MENU_BAR_GET_PRIVATE (menubar);
++
++ if (!priv->mbar_toplevel_win && !option_no_mac())
++ {
++ Atom typehints[2];
++ GdkGeometry geometry;
++ GtkRcStyle *mbarstyle;
++ // Setup menubar's original top-level window
++ priv->orig_toplevel_win
++ = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (menubar)));
++ g_signal_connect (GTK_WIDGET (priv->orig_toplevel_win), "destroy",
++ G_CALLBACK (orig_toplevel_on_destroy), menubar);
++ g_signal_connect (GTK_WIDGET (priv->orig_toplevel_win), "event-after",
++ G_CALLBACK (orig_toplevel_on_event_after), menubar);
++ // Create new top-level window for menubar
++ priv->mbar_toplevel_win
++ = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
++ gtk_window_set_transient_for (priv->mbar_toplevel_win, priv->orig_toplevel_win);
++ gtk_window_set_title (priv->mbar_toplevel_win, "GTK MENUBAR");
++ gtk_window_set_resizable (priv->mbar_toplevel_win, FALSE);
++ gtk_window_set_decorated (priv->mbar_toplevel_win, FALSE);
++ gtk_window_set_type_hint (priv->mbar_toplevel_win,
++ GDK_WINDOW_TYPE_HINT_DOCK);
++ // Set geometry hints
++ geometry.max_width = geometry.min_width = -1;
++ geometry.max_height = geometry.min_height = -1;
++ gtk_window_set_geometry_hints (priv->mbar_toplevel_win,
++ GTK_WIDGET (priv->mbar_toplevel_win),
++ &geometry,
++ GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
++ gtk_window_stick (priv->mbar_toplevel_win);
++ g_signal_connect (GTK_WIDGET (priv->mbar_toplevel_win), "delete-event",
++ G_CALLBACK (gtk_widget_hide_on_delete), menubar);
++ // Menubar
++ gtk_widget_reparent (GTK_WIDGET (menubar),
++ GTK_WIDGET (priv->mbar_toplevel_win));
++ // Show everything!
++ gtk_widget_show_all (GTK_WIDGET (priv->mbar_toplevel_win));
++ typehints[0] = XInternAtom (gdk_display, "_KDE_NET_WM_WINDOW_TYPE_TOPMENU", FALSE);
++ typehints[1] = XInternAtom (gdk_display, "_NET_WM_WINDOW_TYPE_DOCK", FALSE);
++ XChangeProperty (gdk_display,
++ GDK_WINDOW_XID(GTK_WIDGET (priv->mbar_toplevel_win)->window),
++ XInternAtom (gdk_display, "_NET_WM_WINDOW_TYPE", FALSE),
++ XA_ATOM, 32, PropModeReplace,
++ (const guchar *) typehints, 2);
++ gtk_window_move (priv->mbar_toplevel_win, 0, 0);
++ }
++
++ (* GTK_WIDGET_CLASS (gtk_menu_bar_parent_class)->map) (GTK_WIDGET (menubar));
++}
++
+ static void
+ gtk_menu_bar_init (GtkMenuBar *object)
+ {
++ GtkMenuBarPrivate* priv = GTK_MENU_BAR_GET_PRIVATE (object);
++ priv->mbar_toplevel_win = 0;
++ priv->orig_toplevel_win = 0;
+ }
+
+ static void
+@@ -114,6 +273,7 @@
+ widget_class->size_allocate = gtk_menu_bar_size_allocate;
+ widget_class->expose_event = gtk_menu_bar_expose;
+ widget_class->hierarchy_changed = gtk_menu_bar_hierarchy_changed;
++ widget_class->map = gtk_menu_bar_map;
+
+ menu_shell_class->submenu_placement = GTK_TOP_BOTTOM;
+ menu_shell_class->get_popup_delay = gtk_menu_bar_get_popup_delay;