static GtkWidget * panel_applet_get_menu (AppletInfo *info) { GtkWidget *menu; GList *l; gboolean added_anything = FALSE; if (info->menu) return info->menu; menu = panel_applet_create_bare_menu (info); for (l = info->user_menu; l; l = l->next) { AppletUserMenu *user_menu = l->data; if (user_menu->is_enabled_func && !user_menu->is_enabled_func ()) continue; add_to_submenus (info, "", user_menu->name, user_menu, menu, info->user_menu); added_anything = TRUE; } if ( ! added_anything) { g_signal_handlers_disconnect_by_func (menu, G_CALLBACK (applet_menu_show), info); g_signal_handlers_disconnect_by_func (menu, G_CALLBACK (applet_menu_deactivate), info); g_object_unref (menu); return NULL; } info->menu = menu; panel_lockdown_on_notify (panel_lockdown_get (), NULL, G_OBJECT (info->menu), panel_applet_menu_lockdown_changed, info); return info->menu; }
static GtkWidget * panel_applet_get_menu (AppletInfo *info) { GtkWidget *menu; GList *l; gboolean added_anything = FALSE; /** * Separator to split the menu * * APPLET ITEMS * ------------- * Move * Remove From Panel */ GtkSeparatorMenuItem *separator; /** * Variables for the edit menu */ GtkWidget *menuitem; GtkWidget *image; gboolean movable; gboolean removable; if (info->menu) return info->menu; menu = panel_applet_create_bare_menu (info); /** * Moved the panel_applet_get_edit_menu code to here * to recombine the menu as seen in the traditional * Gnome 2 setup */ movable = panel_applet_can_freely_move (info); removable = panel_layout_is_writable (); // Hack. We always added something now :P added_anything = TRUE; for (l = info->user_menu; l; l = l->next) { AppletUserMenu *user_menu = l->data; if (user_menu->is_enabled_func && !user_menu->is_enabled_func ()) continue; add_to_submenus (info, "", user_menu->name, user_menu, menu, info->user_menu); added_anything = TRUE; } // Add the separator before we add the move/remove items (less confusion) separator = gtk_separator_menu_item_new (); gtk_widget_show (separator); gtk_menu_shell_append (GTK_MENU_SHELL(menu), separator); menuitem = gtk_menu_item_new_with_mnemonic (_("_Move")); g_signal_connect (menuitem, "activate", G_CALLBACK (move_applet_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, movable); // TODO: Add a seperator menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Remove From Panel")); image = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); g_signal_connect (menuitem, "activate", G_CALLBACK (applet_remove_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, removable); if ( ! added_anything) { g_signal_handlers_disconnect_by_func (menu, G_CALLBACK (applet_menu_show), info); g_signal_handlers_disconnect_by_func (menu, G_CALLBACK (applet_menu_deactivate), info); g_object_unref (menu); return NULL; } info->menu = menu; panel_lockdown_on_notify (panel_lockdown_get (), NULL, G_OBJECT (info->menu), panel_applet_menu_lockdown_changed, info); return info->menu; }
static void add_to_submenus (AppletInfo *info, const char *path, const char *name, AppletUserMenu *menu, GtkWidget *submenu, GList *user_menu) { char *n = g_strdup (name); char *p = strchr (n, '/'); char *t; AppletUserMenu *s_menu; /*this is the last one*/ if (p == NULL) { g_free (n); setup_an_item (menu, submenu, FALSE); return; } /*this is the last one and we are a submenu, we have already been set up*/ if(p==(n + strlen(n) - 1)) { g_free(n); return; } *p = '\0'; p++; t = g_strconcat (path, n, "/", NULL); s_menu = panel_applet_get_callback (user_menu, t); /*the user did not give us this sub menu, whoops, will create an empty one then*/ if (s_menu == NULL) { s_menu = g_new0 (AppletUserMenu,1); s_menu->name = g_strdup (t); s_menu->stock_item = NULL; s_menu->text = g_strdup (_("???")); s_menu->sensitive = TRUE; s_menu->info = info; s_menu->menuitem = NULL; s_menu->submenu = NULL; info->user_menu = g_list_append (info->user_menu,s_menu); user_menu = info->user_menu; } if (s_menu->submenu == NULL) { s_menu->submenu = gtk_menu_new (); /*a more elegant way to do this should be done when I don't want to go to sleep */ if (s_menu->menuitem != NULL) { gtk_widget_destroy (s_menu->menuitem); s_menu->menuitem = NULL; } } if (s_menu->menuitem == NULL) setup_an_item (s_menu, submenu, TRUE); add_to_submenus (info, t, p, menu, s_menu->submenu, user_menu); g_free(t); g_free(n); }
GtkWidget * mate_panel_applet_create_menu (AppletInfo *info) { GtkWidget *menu; GtkWidget *menuitem; GList *l; PanelWidget *panel_widget; gboolean added_anything = FALSE; panel_widget = mate_panel_applet_get_panel_widget (info); menu = g_object_ref_sink (gtk_menu_new ()); /* connect the show & deactivate signal, so that we can "disallow" and * "re-allow" autohide when the menu is shown/deactivated. */ g_signal_connect (menu, "show", G_CALLBACK (applet_menu_show), info); g_signal_connect (menu, "deactivate", G_CALLBACK (applet_menu_deactivate), info); for (l = info->user_menu; l; l = l->next) { AppletUserMenu *user_menu = l->data; if (user_menu->is_enabled_func && !user_menu->is_enabled_func ()) continue; add_to_submenus (info, "", user_menu->name, user_menu, menu, info->user_menu); added_anything = TRUE; } if (!panel_lockdown_get_locked_down ()) { GtkWidget *image; gboolean locked; gboolean lockable; gboolean movable; gboolean removable; lockable = mate_panel_applet_lockable (info); movable = mate_panel_applet_can_freely_move (info); removable = panel_profile_id_lists_are_writable (); locked = panel_widget_get_applet_locked (panel_widget, info->widget); if (added_anything) { menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); } menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Remove From Panel")); image = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); g_signal_connect (menuitem, "activate", G_CALLBACK (applet_remove_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, (!locked || lockable) && removable); menuitem = gtk_menu_item_new_with_mnemonic (_("_Move")); g_signal_connect (menuitem, "activate", G_CALLBACK (move_applet_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, !locked && movable); g_assert (info->move_item == NULL); info->move_item = menuitem; g_object_add_weak_pointer (G_OBJECT (menuitem), (gpointer *) &info->move_item); menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_check_menu_item_new_with_mnemonic (_("Loc_k To Panel")); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), locked); g_signal_connect (menuitem, "toggled", G_CALLBACK (mate_panel_applet_lock), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, lockable); added_anything = TRUE; } if ( ! added_anything) { g_object_unref (menu); return NULL; } return menu; }
GtkWidget * mate_panel_applet_create_menu (AppletInfo *info) { GtkWidget *menu; GtkWidget *menuitem; GList *l; PanelWidget *panel_widget; gboolean added_anything = FALSE; panel_widget = mate_panel_applet_get_panel_widget (info); menu = g_object_ref_sink (gtk_menu_new ()); gtk_menu_set_reserve_toggle_size (GTK_MENU (menu), FALSE); /* connect the show & deactivate signal, so that we can "disallow" and * "re-allow" autohide when the menu is shown/deactivated. */ g_signal_connect (menu, "show", G_CALLBACK (applet_menu_show), info); g_signal_connect (menu, "deactivate", G_CALLBACK (applet_menu_deactivate), info); for (l = info->user_menu; l; l = l->next) { AppletUserMenu *user_menu = l->data; if (user_menu->is_enabled_func && !user_menu->is_enabled_func ()) continue; add_to_submenus (info, "", user_menu->name, user_menu, menu, info->user_menu); added_anything = TRUE; } if (!panel_lockdown_get_locked_down ()) { gboolean locked; gboolean lockable; gboolean movable; gboolean removable; lockable = mate_panel_applet_lockable (info); movable = mate_panel_applet_can_freely_move (info); removable = panel_profile_id_lists_are_writable (); locked = panel_widget_get_applet_locked (panel_widget, info->widget); if (added_anything) { menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); } menuitem = panel_image_menu_item_new_from_icon ("list-remove", _("_Remove From Panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (applet_remove_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, (!locked || lockable) && removable); menuitem = panel_image_menu_item_new_from_icon (NULL, _("_Move")); g_signal_connect (menuitem, "activate", G_CALLBACK (move_applet_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, !locked && movable); g_assert (info->move_item == NULL); info->move_item = menuitem; g_object_add_weak_pointer (G_OBJECT (menuitem), (gpointer *) &info->move_item); menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_check_menu_item_new_with_mnemonic (_("Loc_k To Panel")); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), locked); g_signal_connect (menuitem, "map", G_CALLBACK (checkbox_status), info); menuitem = panel_check_menu_item_new (menuitem); g_signal_connect (menuitem, "activate", G_CALLBACK (mate_panel_applet_lock), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, lockable); added_anything = TRUE; } if ( ! added_anything) { g_object_unref (menu); return NULL; } /* Set up theme and transparency support */ GtkWidget *toplevel = gtk_widget_get_toplevel (menu); /* Fix any failures of compiz/other wm's to communicate with gtk for transparency */ GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(toplevel)); GdkVisual *visual = gdk_screen_get_rgba_visual(screen); gtk_widget_set_visual(GTK_WIDGET(toplevel), visual); /* Set menu and it's toplevel window to follow panel theme */ GtkStyleContext *context; context = gtk_widget_get_style_context (GTK_WIDGET(toplevel)); gtk_style_context_add_class(context,"gnome-panel-menu-bar"); gtk_style_context_add_class(context,"mate-panel-menu-bar"); return menu; }