static gboolean drop_nautilus_desktop_uri (PanelWidget *panel, PanelObjectPackType pack_type, int pack_index, const char *uri) { gboolean success; const char *basename; if (g_ascii_strncasecmp (uri, "x-nautilus-desktop:///", strlen ("x-nautilus-desktop:///")) != 0) return FALSE; success = TRUE; basename = uri + strlen ("x-nautilus-desktop:///"); if (strncmp (basename, "trash", strlen ("trash")) == 0) panel_applet_frame_create (panel->toplevel, pack_type, pack_index, "OAFIID:GNOME_Panel_TrashApplet"); else if (strncmp (basename, "home", strlen ("home")) == 0) { char *name; char *uri; GFile *file; file = g_file_new_for_path (g_get_home_dir ()); uri = g_file_get_uri (file); name = panel_util_get_label_for_uri (uri); g_free (uri); g_object_unref (file); panel_launcher_create_from_info (panel->toplevel, pack_type, pack_index, TRUE, /* is_exec? */ "nautilus --no-desktop", /* exec */ name, /* name */ _("Open your personal folder"), /* comment */ PANEL_ICON_HOME); /* icon name */ g_free (name); } else if (strncmp (basename, "computer", strlen ("computer")) == 0) panel_launcher_create_from_info (panel->toplevel, pack_type, pack_index, TRUE, /* is_exec? */ "nautilus --no-desktop computer://", /* exec */ _("Computer"), /* name */ _("Browse all local and remote disks and folders accessible from this computer"), /* comment */ PANEL_ICON_COMPUTER); /* icon name */ else if (strncmp (basename, "network", strlen ("network")) == 0) panel_launcher_create_from_info (panel->toplevel, pack_type, pack_index, TRUE, /* is_exec? */ "nautilus --no-desktop network://", /* exec */ _("Network"), /* name */ _("Browse bookmarked and local network locations"), /* comment */ PANEL_ICON_NETWORK); /* icon name */ else success = FALSE; return success; }
static gboolean drop_uri (PanelWidget *panel, PanelObjectPackType pack_type, int pack_index, const char *uri, const char *fallback_icon) { char *name; char *comment; char *buf; char *icon; GFile *file; if (!panel_layout_is_writable ()) return FALSE; name = panel_util_get_label_for_uri (uri); icon = panel_util_get_icon_for_uri (uri); if (!icon) icon = g_strdup (fallback_icon); /* FIXME: we might get icons like "folder-music" that might not exist in * the icon theme. This would usually be okay if we could use fallback * icons (and get "folder" this way). However, this is not possible for * launchers: this could be an application that uses an icon named * folder-magic-app, for which we don't want fallbacks. We just want to * go to hicolor. */ file = g_file_new_for_uri (uri); buf = g_file_get_parse_name (file); g_object_unref (file); /* Translators: %s is a URI */ comment = g_strdup_printf (_("Open '%s'"), buf); g_free (buf); panel_launcher_create_from_info (panel->toplevel, pack_type, pack_index, FALSE, uri, name, comment, icon); g_free (name); g_free (comment); g_free (icon); return TRUE; }
static void panel_place_menu_item_append_gtk_bookmarks (GtkWidget *menu) { typedef struct { char *full_uri; char *label; } PanelBookmark; GtkWidget *add_menu; char *filename; GIOChannel *io_channel; GHashTable *table; int i; GSList *lines = NULL; GSList *add_bookmarks, *l; PanelBookmark *bookmark; filename = g_build_filename (g_get_home_dir (), BOOKMARKS_FILENAME, NULL); io_channel = g_io_channel_new_file (filename, "r", NULL); g_free (filename); if (!io_channel) return; /* We use a hard limit to avoid having users shooting their * own feet, and to avoid crashing the system if a misbehaving * application creates a big bookmars file. */ for (i = 0; i < MAX_BOOKMARK_ITEMS; i++) { char *contents; gsize length; gsize terminator_pos; GIOStatus status; status = g_io_channel_read_line (io_channel, &contents, &length, &terminator_pos, NULL); if (status != G_IO_STATUS_NORMAL) break; if (length == 0) break; /* Clear the line terminator (\n), if any */ if (terminator_pos > 0) contents[terminator_pos] = '\0'; lines = g_slist_prepend (lines, contents); } g_io_channel_shutdown (io_channel, FALSE, NULL); g_io_channel_unref (io_channel); if (!lines) return; lines = g_slist_reverse (lines); table = g_hash_table_new (g_str_hash, g_str_equal); add_bookmarks = NULL; for (l = lines; l; l = l->next) { char *line = (char*) l->data; if (line[0] && !g_hash_table_lookup (table, line)) { GFile *file; char *space; char *label; gboolean keep; g_hash_table_insert (table, line, line); space = strchr (line, ' '); if (space) { *space = '\0'; label = g_strdup (space + 1); } else { label = NULL; } keep = FALSE; if (g_str_has_prefix (line, "x-caja-search:")) keep = TRUE; if (!keep) { file = g_file_new_for_uri (line); keep = !g_file_is_native (file) || g_file_query_exists (file, NULL); g_object_unref (file); } if (!keep) { if (label) g_free (label); continue; } bookmark = g_malloc (sizeof (PanelBookmark)); bookmark->full_uri = g_strdup (line); bookmark->label = label; add_bookmarks = g_slist_prepend (add_bookmarks, bookmark); } } g_hash_table_destroy (table); g_slist_foreach (lines, (GFunc) g_free, NULL); g_slist_free (lines); add_bookmarks = g_slist_reverse (add_bookmarks); if (g_slist_length (add_bookmarks) <= MAX_ITEMS_OR_SUBMENU) { add_menu = menu; } else { GtkWidget *item; item = gtk_image_menu_item_new (); setup_menu_item_with_icon (item, panel_menu_icon_get_size (), PANEL_ICON_BOOKMARKS, NULL, NULL, _("Bookmarks")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); add_menu = create_empty_menu (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), add_menu); } for (l = add_bookmarks; l; l = l->next) { char *display_name; char *tooltip; char *label; char *icon; GFile *file; GIcon *gicon; bookmark = l->data; file = g_file_new_for_uri (bookmark->full_uri); display_name = g_file_get_parse_name (file); g_object_unref (file); /* Translators: %s is a URI */ tooltip = g_strdup_printf (_("Open '%s'"), display_name); g_free (display_name); label = NULL; if (bookmark->label) { label = g_strdup (g_strstrip (bookmark->label)); if (!label [0]) { g_free (label); label = NULL; } } if (!label) { label = panel_util_get_label_for_uri (bookmark->full_uri); if (!label) { g_free (tooltip); g_free (bookmark->full_uri); if (bookmark->label) g_free (bookmark->label); g_free (bookmark); continue; } } icon = panel_util_get_icon_for_uri (bookmark->full_uri); /*FIXME: we should probably get a GIcon if possible, so that we * have customized icons for cd-rom, eg */ if (!icon) icon = g_strdup (PANEL_ICON_FOLDER); gicon = g_themed_icon_new_with_default_fallbacks (icon); //FIXME: drag and drop will be broken for x-caja-search uris panel_menu_items_append_place_item (icon, gicon, label, tooltip, add_menu, G_CALLBACK (activate_uri), bookmark->full_uri); g_free (icon); g_object_unref (gicon); g_free (tooltip); g_free (label); g_free (bookmark->full_uri); if (bookmark->label) g_free (bookmark->label); g_free (bookmark); } g_slist_free (add_bookmarks); }
static GtkWidget * panel_place_menu_item_create_menu (PanelPlaceMenuItem *place_item) { GtkWidget *places_menu; GtkWidget *item; char *gsettings_name; char *name; char *uri; GFile *file; places_menu = panel_create_menu (); file = g_file_new_for_path (g_get_home_dir ()); uri = g_file_get_uri (file); name = panel_util_get_label_for_uri (uri); g_object_unref (file); panel_menu_items_append_place_item (PANEL_ICON_HOME, NULL, name, _("Open your personal folder"), places_menu, G_CALLBACK (activate_home_uri), uri); g_free (name); g_free (uri); if (!g_settings_get_boolean (place_item->priv->caja_prefs_settings, CAJA_PREFS_DESKTOP_IS_HOME_DIR_KEY)) { file = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)); uri = g_file_get_uri (file); g_object_unref (file); panel_menu_items_append_place_item ( PANEL_ICON_DESKTOP, NULL, /* Translators: Desktop is used here as in * "Desktop Folder" (this is not the Desktop * environment). */ C_("Desktop Folder", "Desktop"), _("Open the contents of your desktop in a folder"), places_menu, G_CALLBACK (activate_desktop_uri), /* FIXME: if the dir changes, we'd need to update the drag data since the uri is not the same */ uri); g_free (uri); } panel_place_menu_item_append_gtk_bookmarks (places_menu); add_menu_separator (places_menu); gsettings_name = g_settings_get_string (place_item->priv->caja_desktop_settings, CAJA_DESKTOP_COMPUTER_ICON_NAME_KEY); panel_menu_items_append_from_desktop (places_menu, "caja-computer.desktop", gsettings_name, TRUE); if (gsettings_name) g_free (gsettings_name); panel_place_menu_item_append_local_gio (place_item, places_menu); add_menu_separator (places_menu); panel_menu_items_append_from_desktop (places_menu, "mate-network-scheme.desktop", NULL, TRUE); panel_place_menu_item_append_remote_gio (place_item, places_menu); if (panel_is_program_in_path ("caja-connect-server")) { item = panel_menu_items_create_action_item (PANEL_ACTION_CONNECT_SERVER); if (item != NULL) gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); } add_menu_separator (places_menu); panel_menu_items_append_from_desktop (places_menu, "mate-search-tool.desktop", NULL, FALSE); panel_recent_append_documents_menu (places_menu, place_item->priv->recent_manager); return places_menu; }
static void panel_place_menu_item_append_gtk_bookmarks (GtkWidget *menu) { typedef struct { char *full_uri; char *label; } PanelBookmark; GtkWidget *add_menu; char *filename; char *contents; gchar **lines; GHashTable *table; int i; GSList *add_bookmarks, *l; PanelBookmark *bookmark; filename = g_build_filename (g_get_home_dir (), BOOKMARKS_FILENAME, NULL); if (!g_file_get_contents (filename, &contents, NULL, NULL)) { g_free (filename); return; } g_free (filename); lines = g_strsplit (contents, "\n", -1); g_free (contents); table = g_hash_table_new (g_str_hash, g_str_equal); add_bookmarks = NULL; for (i = 0; lines[i]; i++) { if (lines[i][0] && !g_hash_table_lookup (table, lines[i])) { GFile *file; char *space; char *label; gboolean keep; g_hash_table_insert (table, lines[i], lines[i]); space = strchr (lines[i], ' '); if (space) { *space = '\0'; label = g_strdup (space + 1); } else { label = NULL; } keep = FALSE; if (g_str_has_prefix (lines[i], "x-nautilus-search:")) keep = TRUE; if (!keep) { file = g_file_new_for_uri (lines[i]); keep = !g_file_is_native (file) || g_file_query_exists (file, NULL); g_object_unref (file); } if (!keep) { if (label) g_free (label); continue; } bookmark = g_malloc (sizeof (PanelBookmark)); bookmark->full_uri = g_strdup (lines[i]); bookmark->label = label; add_bookmarks = g_slist_prepend (add_bookmarks, bookmark); } } g_hash_table_destroy (table); g_strfreev (lines); add_bookmarks = g_slist_reverse (add_bookmarks); if (g_slist_length (add_bookmarks) <= MAX_ITEMS_OR_SUBMENU) { add_menu = menu; } else { GtkWidget *item; item = gtk_image_menu_item_new (); setup_menu_item_with_icon (item, panel_menu_icon_get_size (), PANEL_ICON_BOOKMARKS, NULL, NULL, _("Bookmarks")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); add_menu = create_empty_menu (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), add_menu); } for (l = add_bookmarks; l; l = l->next) { char *display_name; char *tooltip; char *label; char *icon; GFile *file; bookmark = l->data; file = g_file_new_for_uri (bookmark->full_uri); display_name = g_file_get_parse_name (file); g_object_unref (file); /* Translators: %s is a URI */ tooltip = g_strdup_printf (_("Open '%s'"), display_name); g_free (display_name); label = NULL; if (bookmark->label) { label = g_strdup (g_strstrip (bookmark->label)); if (!label [0]) { g_free (label); label = NULL; } } if (!label) { label = panel_util_get_label_for_uri (bookmark->full_uri); if (!label) { g_free (tooltip); g_free (bookmark->full_uri); if (bookmark->label) g_free (bookmark->label); g_free (bookmark); continue; } } icon = panel_util_get_icon_for_uri (bookmark->full_uri); /*FIXME: we should probably get a GIcon if possible, so that we * have customized icons for cd-rom, eg */ if (!icon) icon = g_strdup (PANEL_ICON_FOLDER); //FIXME: drag and drop will be broken for x-nautilus-search uris panel_menu_items_append_place_item (icon, NULL, label, tooltip, add_menu, G_CALLBACK (activate_uri), bookmark->full_uri); g_free (icon); g_free (tooltip); g_free (label); g_free (bookmark->full_uri); if (bookmark->label) g_free (bookmark->label); g_free (bookmark); } g_slist_free (add_bookmarks); }
static GtkWidget * panel_place_menu_item_create_menu (PanelPlaceMenuItem *place_item) { GtkWidget *places_menu; GtkWidget *item; char *gsettings_name = NULL; char *name; char *uri; GFile *file; places_menu = panel_create_menu (); file = g_file_new_for_path (g_get_home_dir ()); uri = g_file_get_uri (file); name = panel_util_get_label_for_uri (uri); g_object_unref (file); panel_menu_items_append_place_item (PANEL_ICON_HOME, NULL, name, _("Open your personal folder"), places_menu, G_CALLBACK (activate_home_uri), uri); g_free (name); g_free (uri); if (!place_item->priv->caja_prefs_settings || !g_settings_get_boolean (place_item->priv->caja_prefs_settings, CAJA_PREFS_DESKTOP_IS_HOME_DIR_KEY)) { file = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)); uri = g_file_get_uri (file); g_object_unref (file); panel_menu_items_append_place_item ( PANEL_ICON_DESKTOP, NULL, /* Translators: Desktop is used here as in * "Desktop Folder" (this is not the Desktop * environment). */ C_("Desktop Folder", "Desktop"), _("Open the contents of your desktop in a folder"), places_menu, G_CALLBACK (activate_desktop_uri), /* FIXME: if the dir changes, we'd need to update the drag data since the uri is not the same */ uri); g_free (uri); } panel_place_menu_item_append_gtk_bookmarks (places_menu, g_settings_get_uint (place_item->priv->menubar_settings, PANEL_MENU_BAR_MAX_ITEMS_OR_SUBMENU)); add_menu_separator (places_menu); if (place_item->priv->caja_desktop_settings != NULL) gsettings_name = g_settings_get_string (place_item->priv->caja_desktop_settings, CAJA_DESKTOP_COMPUTER_ICON_NAME_KEY); if (PANEL_GLIB_STR_EMPTY (gsettings_name)) gsettings_name = g_strdup (_("Computer")); panel_menu_items_append_place_item ( PANEL_ICON_COMPUTER, NULL, gsettings_name, _("Browse all local and remote disks and folders accessible from this computer"), places_menu, G_CALLBACK (activate_uri), "computer://"); if (gsettings_name) g_free (gsettings_name); panel_place_menu_item_append_local_gio (place_item, places_menu); add_menu_separator (places_menu); panel_menu_items_append_place_item ( PANEL_ICON_NETWORK, NULL, _("Network"), _("Browse bookmarked and local network locations"), places_menu, G_CALLBACK (activate_uri), "network://"); panel_place_menu_item_append_remote_gio (place_item, places_menu); if (panel_is_program_in_path ("caja-connect-server") || panel_is_program_in_path ("nautilus-connect-server") || panel_is_program_in_path ("nemo-connect-server")) { item = panel_menu_items_create_action_item (PANEL_ACTION_CONNECT_SERVER); if (item != NULL) gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); } add_menu_separator (places_menu); if (panel_is_program_in_path ("mate-search-tool")) panel_menu_items_append_from_desktop (places_menu, "mate-search-tool.desktop", NULL, FALSE); else panel_menu_items_append_from_desktop (places_menu, "gnome-search-tool.desktop", NULL, FALSE); panel_recent_append_documents_menu (places_menu, place_item->priv->recent_manager); /* Fix any failures of compiz/other wm's to communicate with gtk for transparency */ GtkWidget *toplevel = gtk_widget_get_toplevel (places_menu); 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); return places_menu; }
static GtkWidget * panel_place_menu_item_create_menu (PanelPlaceMenuItem *place_item) { GtkWidget *places_menu; GtkWidget *item; char *gconf_name; char *name; char *uri; GFile *file; places_menu = panel_create_menu (); file = g_file_new_for_path (g_get_home_dir ()); uri = g_file_get_uri (file); name = panel_util_get_label_for_uri (uri); g_object_unref (file); item = panel_menu_item_uri_new (uri, PANEL_ICON_HOME, NULL, name, _("Open your personal folder"), G_CALLBACK (activate_home_uri)); gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); g_free (name); g_free (uri); if (!gconf_client_get_bool (panel_gconf_get_client (), DESKTOP_IS_HOME_DIR_KEY, NULL)) { file = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)); uri = g_file_get_uri (file); g_object_unref (file); item = panel_menu_item_uri_new ( /* FIXME: if the dir changes, we'd need to update the drag data since the uri is not the same */ uri, PANEL_ICON_DESKTOP, NULL, /* Translators: Desktop is used here as in * "Desktop Folder" (this is not the Desktop * environment). */ C_("Desktop Folder", "Desktop"), _("Open the contents of your desktop in a folder"), G_CALLBACK (activate_desktop_uri)); gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); g_free (uri); } panel_place_menu_item_append_gtk_bookmarks (places_menu); add_menu_separator (places_menu); gconf_name = gconf_client_get_string (panel_gconf_get_client (), COMPUTER_NAME_KEY, NULL); if (gconf_name == NULL) { gconf_name = g_strdup (_("Computer")); } item = panel_menu_item_uri_new ("computer://", PANEL_ICON_COMPUTER, NULL, gconf_name, _("Browse all local and remote disks and folders accessible from this computer"), G_CALLBACK (activate_uri)); gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); g_free (gconf_name); panel_place_menu_item_append_local_gio (place_item, places_menu); add_menu_separator (places_menu); item = panel_menu_item_uri_new ("network://", PANEL_ICON_NETWORK, NULL, _("Network"), _("Browse bookmarked and local network locations"), G_CALLBACK (activate_uri)); gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); panel_place_menu_item_append_remote_gio (place_item, places_menu); if (panel_is_program_in_path ("nautilus-connect-server")) { item = panel_menu_items_create_action_item (PANEL_ACTION_CONNECT_SERVER); if (item != NULL) gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); } add_menu_separator (places_menu); item = panel_menu_item_desktop_new ("gnome-search-tool.desktop", NULL, FALSE); if (item) gtk_menu_shell_append (GTK_MENU_SHELL (places_menu), item); panel_recent_append_documents_menu (places_menu, place_item->priv->recent_manager); return places_menu; }