static gchar *_cairo_dock_generate_desktop_file_for_file (const gchar *cURI, const gchar *cDockName, double fOrder, GError **erreur) { //\___________________ On recupere le type mime du fichier. gchar *cIconName = NULL, *cName = NULL, *cRealURI = NULL; gboolean bIsDirectory; int iVolumeID; double fUnusedOrder; if (! cairo_dock_fm_get_file_info (cURI, &cName, &cRealURI, &cIconName, &bIsDirectory, &iVolumeID, &fUnusedOrder, mySystem.iFileSortType) || cIconName == NULL) return NULL; cd_message (" -> cIconName : %s; bIsDirectory : %d; iVolumeID : %d\n", cIconName, bIsDirectory, iVolumeID); if (bIsDirectory) { int answer = cairo_dock_ask_general_question_and_wait (_("Do you want to monitor the content of the directory ?")); if (answer != GTK_RESPONSE_YES) bIsDirectory = FALSE; } //\___________________ On ouvre le patron. gchar *cDesktopFileTemplate = cairo_dock_get_launcher_template_conf_file (bIsDirectory ? CAIRO_DOCK_LAUNCHER_FOR_CONTAINER : CAIRO_DOCK_LAUNCHER_FROM_DESKTOP_FILE); GKeyFile *pKeyFile = cairo_dock_open_key_file (cDesktopFileTemplate); g_free (cDesktopFileTemplate); if (pKeyFile == NULL) return NULL; //\___________________ On renseigne ce qu'on peut. g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", fOrder); g_key_file_set_string (pKeyFile, "Desktop Entry", "Container", cDockName); g_key_file_set_string (pKeyFile, "Desktop Entry", "Base URI", cURI); g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cName); g_free (cName); g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cRealURI); g_free (cRealURI); g_key_file_set_string (pKeyFile, "Desktop Entry", "Icon", (cIconName != NULL ? cIconName : "")); g_free (cIconName); g_key_file_set_boolean (pKeyFile, "Desktop Entry", "Is mounting point", (iVolumeID > 0)); //\___________________ On lui choisit un nom de fichier tel qu'il n'y ait pas de collision. gchar *cNewDesktopFileName = cairo_dock_generate_desktop_filename ("file-launcher.desktop", g_cCurrentLaunchersPath); //\___________________ On ecrit tout. gchar *cNewDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, cNewDesktopFileName); cairo_dock_write_keys_to_file (pKeyFile, cNewDesktopFilePath); g_free (cNewDesktopFilePath); g_key_file_free (pKeyFile); return cNewDesktopFileName; }
static gboolean _cd_do_fill_file_entry (CDEntry *pEntry) { gchar *cName = NULL, *cURI = NULL, *cIconName = NULL; gboolean bIsDirectory; int iVolumeID; double fOrder; cairo_dock_fm_get_file_info (pEntry->cPath, &cName, &cURI, &cIconName, &bIsDirectory, &iVolumeID, &fOrder, 0); g_free (cName); g_free (cURI); if (cIconName != NULL && pEntry->pIconSurface == NULL) { cairo_t* pSourceContext = cairo_dock_create_context_from_container (CAIRO_CONTAINER (g_pMainDock)); pEntry->pIconSurface = cairo_dock_create_surface_from_icon (cIconName, pSourceContext, myDialogs.dialogTextDescription.iSize, myDialogs.dialogTextDescription.iSize); g_free (cIconName); cairo_destroy (pSourceContext); return TRUE; } return FALSE; }
static void _fill_submenu_with_items (CDQuickBrowserItem *pRootItem, int iNbSubItemsAtOnce) { GldiModuleInstance *myApplet = pRootItem->pApplet; GtkWidget *pMenu = pRootItem->pSubMenu; GList *pFirstItem = pRootItem->pCurrentItem; // static GtkTargetEntry s_pMenuItemTargets[] = { {(gchar*) "text/uri-list", 0, 0} }; // for drag and drop support CDQuickBrowserItem *pItem; gchar *cFileName; GtkWidget *pMenuItem; gchar *cName = NULL, *cURI = NULL, *cIconName = NULL; gboolean bIsDirectory; int iVolumeID; double fOrder; GList *l; int i; for (l = pFirstItem, i = 0; l != NULL && i < iNbSubItemsAtOnce; l = l->next, i ++) { pItem = l->data; //\______________ On cree l'entree avec son icone si necessaire. if (myConfig.bHasIcons) { cairo_dock_fm_get_file_info (pItem->cPath, &cName, &cURI, &cIconName, &bIsDirectory, &iVolumeID, &fOrder, 0); g_free (cName); cName = NULL; g_free (cURI); cURI = NULL; } cFileName = strrchr (pItem->cPath, '/'); if (cFileName) cFileName ++; if (cIconName != NULL) { gchar *cPath = cairo_dock_search_icon_s_path (cIconName, cairo_dock_search_icon_size (GTK_ICON_SIZE_MENU)); pMenuItem = gldi_menu_item_new (cFileName, cPath); g_free (cPath); g_free (cIconName); cIconName = NULL; } else { pMenuItem = gldi_menu_item_new (cFileName, ""); } //\______________ On l'insere dans le menu. gtk_menu_shell_append (GTK_MENU_SHELL (pMenu), pMenuItem); if (pItem->pSubMenu != NULL) { gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pItem->pSubMenu); } else { //\______________ Add drag and drop support for files only gtk_drag_source_set (pMenuItem, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK); gtk_drag_source_add_text_targets (pMenuItem); gtk_drag_source_add_uri_targets (pMenuItem); g_signal_connect (G_OBJECT (pMenuItem), "button-release-event", G_CALLBACK(_on_click_item), pItem); // left and right click g_signal_connect (G_OBJECT (pMenuItem), "drag-begin", G_CALLBACK (_drag_begin), pMenuItem); // to create pixbuf g_signal_connect (G_OBJECT (pMenuItem), "drag-data-get", G_CALLBACK (_drag_data_get), pItem); // when the item is dropped } g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK(_on_activate_item), pItem); // select or over (submenu) } pRootItem->pCurrentItem = l; }
static Icon * _cd_shortcuts_get_icon (gchar *cFileName, const gchar *cUserName, double fCurrentOrder) { cd_debug ("New icon: %s, %s, %f", cFileName, cUserName, fCurrentOrder); /* Nautilus adds custom prefixes which are not supported by gvfs... * gvfs-integration plugin can read x-nautilus-desktop but not others, e.g.: * x-nautilus-search://0/ => specific to Nautilus: open these URI with it. * Note that all these URI have a user-name */ if (g_str_has_prefix (cFileName, "x-nautilus-") && ! g_str_has_prefix (cFileName, "x-nautilus-desktop://")) { Icon *pNewIcon = cairo_dock_create_dummy_launcher ( cUserName ? g_strdup (cUserName) : g_strdup (cFileName), cairo_dock_search_icon_s_path ( CD_SHORTCUT_DEFAULT_DIRECTORY_ICON_FILENAME, CAIRO_DOCK_DEFAULT_ICON_SIZE), g_strdup_printf ("nautilus %s", cFileName), NULL, fCurrentOrder); pNewIcon->iGroup = CD_BOOKMARK_GROUP; pNewIcon->cBaseURI = cFileName; pNewIcon->iVolumeID = CD_VOLUME_ID_BOOKMARK_CMD; return pNewIcon; } gchar *cName, *cRealURI, *cIconName; gboolean bIsDirectory; gint iVolumeID; gdouble fOrder; if (! cairo_dock_fm_get_file_info (cFileName, &cName, &cRealURI, &cIconName, &bIsDirectory, &iVolumeID, &fOrder, CAIRO_DOCK_FM_SORT_BY_NAME)) return NULL; if (cUserName != NULL) { g_free (cName); if (cName == NULL) // a bookmark on a unmounted system or a folder that doesn't exist any more cName = g_strdup_printf ("%s\n[%s]", cUserName, D_("Unmounted")); else cName = g_strdup (cUserName); } else if (cName == NULL) // a bookmark on a unmounted system { gchar *cGuessedName = g_path_get_basename (cFileName); cairo_dock_remove_html_spaces (cGuessedName); // or: g_uri_unescape_string cName = g_strdup_printf ("%s\n[%s]", cGuessedName, D_("Unmounted")); g_free (cGuessedName); } if (cRealURI == NULL) cRealURI = g_strdup (cFileName); if (cIconName == NULL) cIconName = cairo_dock_search_icon_s_path ( CD_SHORTCUT_DEFAULT_DIRECTORY_ICON_FILENAME, CAIRO_DOCK_DEFAULT_ICON_SIZE); // should be the default icon Icon *pNewIcon = cairo_dock_create_dummy_launcher (cName, cIconName, cRealURI, NULL, fCurrentOrder); pNewIcon->iGroup = CD_BOOKMARK_GROUP; pNewIcon->cBaseURI = cFileName; pNewIcon->iVolumeID = iVolumeID; return pNewIcon; }
void cd_shortcuts_on_drive_event (CairoDockFMEventType iEventType, const gchar *cURI, GldiModuleInstance *myApplet) { g_return_if_fail (cURI != NULL); CD_APPLET_ENTER; //\________________ Manage event about this mount point GList *pIconsList = CD_APPLET_MY_ICONS_LIST; GldiContainer *pContainer = CD_APPLET_MY_ICONS_LIST_CONTAINER; CD_APPLET_LEAVE_IF_FAIL (pContainer != NULL); _manage_event_on_drive (iEventType, cURI, pIconsList, pContainer, myApplet); //\________________ Update bookmarks which are linked to this mount point if (!myConfig.bListBookmarks || pIconsList == NULL) { CD_APPLET_LEAVE(); } GList *ic; Icon *icon; gboolean bIsMounted; gchar *cTargetURI = cairo_dock_fm_is_mounted (cURI, &bIsMounted); if (cTargetURI != NULL) // optimized version. { //g_print ("test bookmarks in '%s'...\n", cTargetURI); pIconsList = CD_APPLET_MY_ICONS_LIST; for (ic = pIconsList; ic != NULL; ic = ic->next) { icon = ic->data; if (icon->iGroup == (CairoDockIconGroup) CD_BOOKMARK_GROUP) { if (strncmp (cTargetURI, icon->cBaseURI, strlen (cTargetURI)) == 0) { //g_print ("bookmark '%s' is located in a mount point which has changed (%s)\n", icon->cBaseURI, cTargetURI); gchar *cName = NULL, *cRealURI = NULL, *cIconName = NULL; int iVolumeID = 0; gboolean bIsDirectory = FALSE; double fOrder; if (cairo_dock_fm_get_file_info (icon->cBaseURI, &cName, &cRealURI, &cIconName, &bIsDirectory, &iVolumeID, &fOrder, CAIRO_DOCK_FM_SORT_BY_NAME)) { //g_print (" -> %s (%d)\n", cIconName, bIsMounted); if (bIsMounted/** || cIconName == NULL*/) { gchar *str; /* if it was previously an unmounted bookmark, just * remove the 'unmounted' part to avoid changing the * name (when mounted, gvfs returns the path whereas * we want to display the bookmark name). Note that * the icon might also changes (it was NULL when the * bookmark was not mounted), and we can use this * new one which is probably more accurate. */ if ((str = strchr (icon->cName, '\n')) != NULL) *str = '\0'; else { g_free (icon->cName); icon->cName = cName; } } else { g_free (icon->cName); icon->cName = g_strdup_printf ("%s\n[%s]", cName, D_("Unmounted")); g_free (cName); } g_free (icon->cCommand); icon->cCommand = cRealURI; g_free (icon->cFileName); icon->cFileName = cIconName; icon->iVolumeID = iVolumeID; cairo_dock_load_icon_buffers (icon, pContainer); } } } } g_free (cTargetURI); } CD_APPLET_LEAVE(); }
static void _on_got_events (ZeitgeistResultSet *pEvents, GtkListStore *pModel) { int i, n; ZeitgeistEvent *event; ZeitgeistSubject *subject; gint64 iTimeStamp; const gchar *cEventURI; guint id; gchar *cName = NULL, *cURI = NULL, *cIconName = NULL, *cIconPath, *cPath = NULL; double fOrder; int iVolumeID; gboolean bIsDirectory; GdkPixbuf *pixbuf; GtkTreeIter iter; GHashTable *pHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); // used to prevent doubles //\_____________ parse all the events. while (zeitgeist_result_set_has_next (pEvents)) { #ifdef ZEITGEIST_1_0 event = zeitgeist_result_set_next (pEvents); #else event = zeitgeist_result_set_next_value (pEvents); #endif iTimeStamp = zeitgeist_event_get_timestamp (event) / 1e3; id = zeitgeist_event_get_id (event); n = zeitgeist_event_num_subjects (event); if (n > 1) cd_debug (" +++ %s, %s, %d", zeitgeist_event_get_interpretation (event), zeitgeist_event_get_manifestation (event), n); for (i = 0; i < n; i++) { subject = zeitgeist_event_get_subject (event, i); //\_____________ prevent doubles. cEventURI = zeitgeist_subject_get_uri (subject); if (g_hash_table_lookup_extended (pHashTable, cEventURI, NULL, NULL)) continue; //g_print (" %s:\n %s, %s\n", cEventURI, zeitgeist_subject_get_interpretation (subject), zeitgeist_subject_get_manifestation (subject)); //\_____________ ignore files that have been deleted cPath = g_filename_from_uri (cEventURI, NULL, NULL); // NULL for anything else than file://* if (strncmp (cEventURI, "file://", 7) == 0 && ! g_file_test (cPath, G_FILE_TEST_EXISTS)) { g_hash_table_insert (pHashTable, (gchar*)cEventURI, NULL); // since we've checked it, insert it, even if we don't display it. g_free (cPath); continue; } //\_____________ get the text to display. const gchar *cText = zeitgeist_subject_get_text (subject); if (cText == NULL) // skip empty texts (they are most of the times web page that redirect to another page, which is probably in the next event anyway). continue; //\_____________ find the icon. if (strncmp (cEventURI, "http", 4) == 0) // gvfs is deadly slow to get info on distant URI... { cIconName = cairo_dock_search_icon_s_path ("text-html", myData.iDesiredIconSize); } else if (strncmp (cEventURI, "application://", 14) == 0) // application URL { gchar *cClass = cairo_dock_register_class (cEventURI+14); cIconName = g_strdup (cairo_dock_get_class_icon (cClass)); cText = cairo_dock_get_class_name (cClass); // use the translated name g_free (cClass); } else { cairo_dock_fm_get_file_info (cEventURI, &cName, &cURI, &cIconName, &bIsDirectory, &iVolumeID, &fOrder, CAIRO_DOCK_FM_SORT_BY_DATE); } if (cIconName != NULL) { cIconPath = cairo_dock_search_icon_s_path (cIconName, myData.iDesiredIconSize); pixbuf = gdk_pixbuf_new_from_file_at_size (cIconPath, myData.iDesiredIconSize, myData.iDesiredIconSize, NULL); g_free (cIconPath); } else pixbuf = NULL; //\_____________ build the path to display. const gchar *cDisplayedPath = (cPath ? cPath : cEventURI); // need to escape the '&' (and ', etc.) because gtk-tooltips use markups by default. gchar *cEscapedPath = g_markup_escape_text (cDisplayedPath, -1); //\_____________ store in the model. memset (&iter, 0, sizeof (GtkTreeIter)); gtk_list_store_append (GTK_LIST_STORE (pModel), &iter); gtk_list_store_set (GTK_LIST_STORE (pModel), &iter, CD_MODEL_NAME, cText, CD_MODEL_URI, cEventURI, CD_MODEL_PATH, cEscapedPath, CD_MODEL_ICON, pixbuf, CD_MODEL_DATE, iTimeStamp, CD_MODEL_ID, id, -1); g_free (cIconName); cIconName = NULL; g_free (cName); cName = NULL; g_free (cURI); cURI = NULL; if (pixbuf) g_object_unref (pixbuf); g_free (cPath); g_free (cEscapedPath); g_hash_table_insert (pHashTable, (gchar*)cEventURI, NULL); // cEventURI stays valid in this function. } } g_hash_table_destroy (pHashTable); }