Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2012
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.33 KB | None | 0 0
  1. /*
  2. BUILD:
  3. gcc -shared -fPIC `pkg-config gtk+-x11-2.0 --cflags --libs` -o libwinmenu.so main.c
  4. gcc -shared -fPIC `pkg-config gtk+-x11-3.0 --cflags --libs` -o libwinmenu3.so main.c
  5. INSTALLATION:
  6. cp libwinmenu.so /usr/lib/gtk-2.0/modules/libwinmenu.so
  7. cp libwinmenu3.so /usr/lib/gtk-3.0/modules/libwinmenu.so
  8. echo 'export GTK_MODULES=winmenu' >> ~/.xinitrc or similar
  9. */
  10.  
  11. #include <string.h>
  12. #include <gtk/gtk.h>
  13. #include <gdk/gdkkeysyms.h>
  14. #include <gdk/gdkkeysyms-compat.h>
  15.  
  16. #define _gtk_marshal_VOID__VOID g_cclosure_marshal_VOID__VOID
  17. #define _gtk_marshal_NONE__NONE _gtk_marshal_VOID__VOID
  18.  
  19. static GObject* (*old_gtk_menu_bar_constructor)(GType type, guint n_construct_properties, GObjectConstructParam *construct_params) = NULL;
  20. static GObject* (*old_gtk_window_constructor)(GType type, guint n_construct_properties, GObjectConstructParam *construct_params) = NULL;
  21. static void     (*old_widget_show) (GtkWidget * widget) = NULL;
  22.  
  23. static void toggle_menu_bar (GtkWidget *widget, gpointer user_data)
  24. {
  25.    GtkWidget * wdg = GTK_WIDGET(user_data);
  26.    GTK_WIDGET_GET_CLASS(wdg)->show = old_widget_show;
  27.    if (gtk_widget_get_visible (wdg))
  28.       gtk_widget_hide(wdg);
  29.    else
  30.       gtk_widget_show(wdg);
  31. }
  32.  
  33. static void anchor_event (GtkWidget *widget, GtkWidget *previous_toplevel, gpointer   user_data)
  34. {
  35.    GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
  36.    if (gtk_widget_is_toplevel (toplevel)) {
  37.       if (previous_toplevel)
  38.           g_signal_handlers_disconnect_by_func(previous_toplevel, G_CALLBACK(toggle_menu_bar), widget);
  39.       g_signal_connect (toplevel, "toggle-menu-bar", G_CALLBACK(toggle_menu_bar), widget);
  40.     }
  41. }
  42.  
  43. static void show (GtkWidget *widget)
  44. {
  45.    if (GTK_IS_MENU_BAR(widget))
  46.       return;
  47.    old_widget_show(widget);
  48. }
  49.  
  50. GObject* new_gtk_menu_bar_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params)
  51. {
  52.    GObject * ret = old_gtk_menu_bar_constructor(type,n_construct_properties,construct_params);
  53.    g_signal_connect (ret, "hierarchy-changed", G_CALLBACK(anchor_event), NULL);
  54.    g_signal_connect (ret, "can_activate_accel", G_CALLBACK(gtk_true), NULL);
  55.  
  56.    return ret;
  57. }
  58.  
  59. G_MODULE_EXPORT void
  60. gtk_module_init (gint * argc, gchar *** argv)
  61. {
  62.    GtkWidget *fc;
  63.    GObjectClass *klass;
  64.    const gchar *app_whitelist = "terminal, gnome-terminal, gimp, mousepad";
  65.  
  66.    if (strstr (app_whitelist, g_get_prgname()) != NULL)
  67.     return;
  68.  
  69.    g_signal_new ("toggle-menu-bar",
  70.                  GTK_TYPE_WINDOW,
  71.                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
  72.                  0,
  73.                  NULL, NULL,
  74.                  _gtk_marshal_VOID__VOID,
  75.                  G_TYPE_NONE,
  76.                  0);
  77.  
  78.    fc = gtk_menu_bar_new();
  79.    klass = GTK_MENU_BAR_GET_CLASS(fc);
  80.    old_gtk_menu_bar_constructor = klass->constructor;
  81.    klass->constructor = new_gtk_menu_bar_constructor;
  82.    old_widget_show = GTK_WIDGET_CLASS(klass)->show;
  83.    GTK_WIDGET_CLASS(klass)->show = show;
  84.  
  85.    fc = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  86.    klass = GTK_WINDOW_GET_CLASS(fc);
  87.  
  88.    gtk_binding_entry_add_signal (gtk_binding_set_by_class (klass), GDK_m, GDK_CONTROL_MASK,
  89.                                 "toggle-menu-bar", 0);
  90.    gtk_binding_entry_add_signal (gtk_binding_set_by_class (klass), GDK_m, GDK_MOD1_MASK,
  91.                                 "toggle-menu-bar", 0);
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement