Glynn, w.r.t. the alacarte patch, from what I know it was meant to provide a
mechanism where the
panel could be notified of a change in the menu files - this was necessary due
to a lack of file
monitoring support in GNOME VFS - it should go away once we have the ability to
port libfam or Gamin
to Solaris, but until then it'll be necessary so that the user can see the
changes made reflected in
the launch menu...
>From what I can tell there should be an alacarte patch to match...
Darren.
Glynn Foster wrote:
> Hey,
>
> Just hacked up some changes according to a new UI specification. What it
> basically does is axe the old 'username' menu, and bring back the community
> places. It also re-jigs a few bits and pieces, and fixes up the menu bar.
> It's a
> really hacky patch, and I'd much prefer if this stuff was upstream - Calum's
> going to see if he can push it there.
>
> In the meantime, he's a pretty ugly patch. I've committed this so it can get
> in
> the build as soon as possible and get some user testing. At the moment, patch
> 14
> [alacarte support] is disabled - I need to do some research into what that did
> and why.
>
>
> Glynn
>
>
> ------------------------------------------------------------------------
>
> diff -urN gnome-panel-2.16.1/gnome-panel/menu.c
> gnome-panel-2.16.1-hacked/gnome-panel/menu.c
> --- gnome-panel-2.16.1/gnome-panel/menu.c 2006-11-16 01:36:14.666344000
> +1300
> +++ gnome-panel-2.16.1-hacked/gnome-panel/menu.c 2006-11-16
> 01:39:21.692923000 +1300
> @@ -1799,13 +1799,93 @@
> setup_menuitem (item, icon_size, NULL, title,
> create_invisible_mnemonic);
> }
>
> +void
> +run_applications (GtkWidget *widget, gpointer user_data)
> +{
> + if (!panel_lockdown_get_restrict_application_launching() &&
> + !panel_lockdown_get_disable_command_line()) {
> + panel_run_dialog_present (gtk_widget_get_screen (widget),
> + gtk_get_current_event_time ());
> + }
> +}
> +
> +void
> +applications_menu_append (GtkWidget *main_menu)
> +{
> + GtkWidget *item;
> + GtkWidget *accel_label;
> + GtkWidget *image;
> +
> + if (panel_lockdown_get_disable_command_line())
> + return;
> +
> + if (!g_object_get_data (G_OBJECT (main_menu),
> + "panel-menu-needs-appending"))
> + return;
> +
> + g_object_set_data (G_OBJECT (main_menu),
> + "panel-menu-needs-appending", NULL);
> +
> + add_menu_separator (main_menu);
> +
> + item = gtk_image_menu_item_new ();
> +
> + accel_label = gtk_accel_label_new (_("Run Application..."));
> + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5);
> +
> + gtk_container_add (GTK_CONTAINER (item), accel_label);
> + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label),
> + GTK_WIDGET (item));
> + gtk_widget_show (accel_label);
> +
> + image = gtk_image_new_from_icon_name (PANEL_RUN_ICON,
> panel_menu_icon_get_size ());
> + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
> +
> + g_signal_connect (item, "activate",
> + G_CALLBACK (run_applications), NULL);
> + gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item);
> + gtk_widget_show (item);
> +}
> +
> +GtkWidget *
> +add_xdg_menu (const char *name, const char *path, const char *icon)
> +{
> + GtkWidget *item;
> + GtkWidget *accel_label;
> + GtkWidget *image;
> + GtkWidget *menu;
> +
> + item = gtk_image_menu_item_new ();
> +
> + accel_label = gtk_accel_label_new (name);
> + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5);
> +
> + gtk_container_add (GTK_CONTAINER (item), accel_label);
> + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label),
> + GTK_WIDGET (item));
> + gtk_widget_show (accel_label);
> +
> + image = gtk_image_new_from_icon_name (icon, panel_menu_icon_get_size
> ());
> +
> + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
> + menu = create_applications_menu (path, NULL);
> +
> + if (strcmp (path, "applications.menu") == 0) {
> + g_signal_connect (menu, "show",
> + G_CALLBACK (applications_menu_append),
> NULL);
> + }
> +
> + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
> +
> + return item;
> +}
> +
> static void
> main_menu_append (GtkWidget *main_menu,
> PanelWidget *panel)
> {
> GtkWidget *item;
> - gboolean add_separator;
> - GList *children;
> + GtkRecentManager *recent_view;
>
> if (!g_object_get_data (G_OBJECT (main_menu),
> "panel-menu-needs-appending"))
> @@ -1814,27 +1894,36 @@
> g_object_set_data (G_OBJECT (main_menu),
> "panel-menu-needs-appending", NULL);
>
> - children = gtk_container_get_children (GTK_CONTAINER (main_menu));
> + item = add_xdg_menu (_("All Applications"), "applications.menu",
> "gnome-applications");
> + gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item);
> + gtk_widget_show (item);
>
> - add_separator = FALSE;
> - if (children != NULL) {
> - while (children->next != NULL)
> - children = children->next;
> - add_separator = !GTK_IS_SEPARATOR (GTK_WIDGET (children->data));
> - }
> -
> - if (add_separator)
> - add_menu_separator (main_menu);
> + add_menu_separator (main_menu);
>
> item = panel_place_menu_item_new (TRUE);
> panel_place_menu_item_set_panel (item, panel);
> gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item);
> gtk_widget_show (item);
>
> - item = panel_desktop_menu_item_new (TRUE, FALSE);
> - panel_desktop_menu_item_set_panel (item, panel);
> - gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item);
> - gtk_widget_show (item);
> + recent_view = NULL;
> + panel_recent_append_documents_menu (main_menu, recent_view);
> + panel_menu_items_append_from_desktop (main_menu,
> + "gnome-search-tool.desktop",
> + NULL);
> +
> + add_menu_separator (main_menu);
> +
> + item = add_xdg_menu (_("Preferences"), "preferences.menu",
> "gnome-settings");
> + gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item);
> + gtk_widget_show (item);
> +
> + item = add_xdg_menu (_("Administration"), "settings.menu",
> "gnome-system");
> + gtk_menu_shell_append (GTK_MENU_SHELL (main_menu), item);
> + gtk_widget_show (item);
> +
> + panel_menu_items_append_from_desktop (main_menu,
> + "yelp.desktop",
> + NULL);
>
> panel_menu_items_append_lock_logout (main_menu);
> }
> @@ -1844,12 +1933,12 @@
> {
> GtkWidget *main_menu;
>
> - main_menu = create_applications_menu ("applications.menu", NULL);
> - g_object_set_data (G_OBJECT (main_menu), "menu_panel", panel);
> - /* FIXME need to update the panel on parent_set */
> + main_menu = create_applications_menu ("quickstart.menu", NULL);
> + g_object_set_data (G_OBJECT (main_menu), "menu_panel", panel);
> + /* FIXME need to update the panel on parent_set */
>
> - g_signal_connect (main_menu, "show",
> - G_CALLBACK (main_menu_append), panel);
> + g_signal_connect (main_menu, "show",
> + G_CALLBACK (main_menu_append), panel);
>
> return main_menu;
> }
> diff -urN gnome-panel-2.16.1/gnome-panel/menu.h
> gnome-panel-2.16.1-hacked/gnome-panel/menu.h
> --- gnome-panel-2.16.1/gnome-panel/menu.h 2006-02-13 02:33:11.000000000
> +1300
> +++ gnome-panel-2.16.1-hacked/gnome-panel/menu.h 2006-11-16
> 01:39:24.265211000 +1300
> @@ -66,6 +66,8 @@
>
> gboolean menu_dummy_button_press_event (GtkWidget *menuitem,
> GdkEventButton *event);
> +void run_applications (GtkWidget *widget, gpointer user_data);
> +void applications_menu_append (GtkWidget *main_menu);
>
>
> G_END_DECLS
> diff -urN gnome-panel-2.16.1/gnome-panel/panel-menu-bar.c
> gnome-panel-2.16.1-hacked/gnome-panel/panel-menu-bar.c
> --- gnome-panel-2.16.1/gnome-panel/panel-menu-bar.c 2006-11-16
> 01:36:14.694844000 +1300
> +++ gnome-panel-2.16.1-hacked/gnome-panel/panel-menu-bar.c 2006-11-16
> 01:39:35.074318000 +1300
> @@ -190,6 +190,8 @@
> menubar->priv->info = NULL;
>
> menubar->priv->applications_menu = create_applications_menu
> ("applications.menu", NULL);
> + g_signal_connect (menubar->priv->applications_menu, "show",
> + G_CALLBACK (applications_menu_append), NULL);
>
> menubar->priv->applications_item = gtk_image_menu_item_new_with_label
> (_("Applications"));
> image = gtk_image_new_from_icon_name (PANEL_GNOME_LOGO_ICON,
> diff -urN gnome-panel-2.16.1/gnome-panel/panel-menu-items.c
> gnome-panel-2.16.1-hacked/gnome-panel/panel-menu-items.c
> --- gnome-panel-2.16.1/gnome-panel/panel-menu-items.c 2006-11-16
> 01:36:14.832896000 +1300
> +++ gnome-panel-2.16.1-hacked/gnome-panel/panel-menu-items.c 2006-11-16
> 01:39:41.240794000 +1300
> @@ -120,7 +120,7 @@
> g_free (url);
> }
>
> -static void
> +void
> panel_menu_items_append_from_desktop (GtkWidget *menu,
> char *path,
> char *force_name)
> @@ -562,15 +562,6 @@
>
> places_menu = panel_create_menu ();
>
> - gconf_name = gconf_client_get_string (panel_gconf_get_client (),
> - HOME_NAME_KEY,
> - NULL);
> - panel_menu_items_append_from_desktop (places_menu,
> - "nautilus-home.desktop",
> - gconf_name);
> - if (gconf_name)
> - g_free (gconf_name);
> -
> if (!gconf_client_get_bool (panel_gconf_get_client (),
> DESKTOP_IS_HOME_DIR_KEY,
> NULL)) {
> @@ -625,15 +616,6 @@
> item);
> }
>
> - add_menu_separator (places_menu);
> -
> - panel_menu_items_append_from_desktop (places_menu,
> - "gnome-search-tool.desktop",
> - NULL);
> -
> - panel_recent_append_documents_menu (places_menu,
> - place_item->priv->recent_manager);
> -
> return places_menu;
> }
>
> @@ -682,38 +664,65 @@
> panel_place_menu_item_recreate_menu (place_menu);
> }
>
> +static GtkWidget *
> +add_xdg_menu (const char *name, const char *path, const char *icon)
> +{
> + GtkWidget *item;
> + GtkWidget *accel_label;
> + GtkWidget *image;
> + GtkWidget *menu;
> +
> + item = gtk_image_menu_item_new ();
> +
> + accel_label = gtk_accel_label_new (name);
> + gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5);
> +
> + gtk_container_add (GTK_CONTAINER (item), accel_label);
> + gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label),
> + GTK_WIDGET (item));
> + gtk_widget_show (accel_label);
> +
> + image = gtk_image_new_from_icon_name (icon, panel_menu_icon_get_size
> ());
> +
> + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
> + menu = create_applications_menu (path, NULL);
> +
> + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
> +
> + return item;
> +}
> +
> static void
> panel_desktop_menu_item_append_menu (GtkWidget *menu,
> PanelDesktopMenuItem *parent)
> {
> - gboolean add_separator;
> - GList *children;
> -
> - if (!g_object_get_data (G_OBJECT (menu), "panel-menu-needs-appending"))
> - return;
> + GtkWidget *item;
> + GtkRecentManager *recent_view;
>
> - g_object_set_data (G_OBJECT (menu), "panel-menu-needs-appending", NULL);
> + if (!g_object_get_data (G_OBJECT (menu),
> "panel-menu-needs-appending"))
> + return;
>
> - add_separator = FALSE;
> - children = gtk_container_get_children (GTK_CONTAINER (menu));
> + g_object_set_data (G_OBJECT (menu), "panel-menu-needs-appending",
> NULL);
>
> - if (children != NULL) {
> - GList *child;
> + item = add_xdg_menu (_("Preferences"), "preferences.menu",
> "gnome-settings");
> + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
> + gtk_widget_show (item);
>
> - child = children;
> - while (child->next != NULL)
> - child = child->next;
> + item = add_xdg_menu (_("Administration"), "settings.menu",
> "gnome-system");
> + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
> + gtk_widget_show (item);
>
> - add_separator = !GTK_IS_SEPARATOR (GTK_WIDGET (child->data));
> - }
> + add_menu_separator (menu);
>
> - g_list_free (children);
> + recent_view = NULL;
> + panel_recent_append_documents_menu (menu, recent_view);
> + panel_menu_items_append_from_desktop (menu,
> + "gnome-search-tool.desktop",
> + NULL);
>
> - if (add_separator)
> - add_menu_separator (menu);
> + add_menu_separator (menu);
>
> panel_menu_items_append_from_desktop (menu, "yelp.desktop", NULL);
> - panel_menu_items_append_from_desktop (menu, "gnome-about.desktop",
> NULL);
>
> if (parent->priv->append_lock_logout)
> panel_menu_items_append_lock_logout (menu);
> @@ -724,7 +733,11 @@
> {
> GtkWidget *desktop_menu;
>
> - desktop_menu = create_applications_menu ("settings.menu", NULL);
> + desktop_menu = create_empty_menu ();
> +
> + g_object_set_data (G_OBJECT (desktop_menu),
> + "panel-menu-needs-appending",
> + GUINT_TO_POINTER (TRUE));
>
> g_signal_connect (desktop_menu, "show",
> G_CALLBACK (panel_desktop_menu_item_append_menu),
> diff -urN gnome-panel-2.16.1/gnome-panel/panel-menu-items.h
> gnome-panel-2.16.1-hacked/gnome-panel/panel-menu-items.h
> --- gnome-panel-2.16.1/gnome-panel/panel-menu-items.h 2006-07-25
> 02:50:32.000000000 +1200
> +++ gnome-panel-2.16.1-hacked/gnome-panel/panel-menu-items.h 2006-11-16
> 01:39:44.563411000 +1300
> @@ -90,7 +90,9 @@
> void panel_menu_items_append_lock_logout (GtkWidget *menu);
> void panel_menu_item_activate_desktop_file (GtkWidget *menuitem,
> const char *path);
> -
> +void panel_menu_items_append_from_desktop (GtkWidget *menu,
> + char *path,
> + char *force_name);
> G_END_DECLS
>
> #endif /* __PANEL_MENU_ITEMS_H__ */
> diff -urN gnome-panel-2.16.1/gnome-panel/panel-recent.c
> gnome-panel-2.16.1-hacked/gnome-panel/panel-recent.c
> --- gnome-panel-2.16.1/gnome-panel/panel-recent.c 2006-08-19
> 03:10:10.000000000 +1200
> +++ gnome-panel-2.16.1-hacked/gnome-panel/panel-recent.c 2006-11-16
> 01:39:50.120306000 +1300
> @@ -233,11 +233,12 @@
>
> //FIXME this is not possible with GtkRecent...:
> egg_recent_view_gtk_set_icon_size (view, panel_menu_icon_get_size ());
>
> - g_signal_connect_object (manager, "changed",
> - G_CALLBACK (panel_recent_manager_changed_cb),
> - menu_item, 0);
> -
> - g_object_get (manager, "size", &size, NULL);
> + if (manager) {
> + g_signal_connect_object (manager, "changed",
> + G_CALLBACK
> (panel_recent_manager_changed_cb),
> + menu_item, 0);
> + g_object_get (manager, "size", &size, NULL);
> + }
> gtk_widget_set_sensitive (menu_item, size > 0);
>
> add_menu_separator (recent_menu);