int get_property_page (ThunarxProviderFactory* f, GList *flist, const char *class_name, GtkWidget **pp, char *title, int tlen, GtkWindow *win) { GList *ps, *lp; ps = thunarx_provider_factory_list_providers(f, THUNARX_TYPE_PROPERTY_PAGE_PROVIDER); *pp = NULL; for (lp = ps; lp != NULL; lp = lp->next) { GList *pgs, *lpg; pgs = thunarx_property_page_provider_get_pages(lp->data, flist); for (lpg = pgs; lpg != NULL && *pp == NULL; lpg = lpg->next) { if (strncmp(class_name, G_OBJECT_TYPE_NAME(lpg->data), 256) == 0) { *pp = GTK_WIDGET(g_object_ref(lpg->data)); } } g_list_foreach (pgs, (GFunc) g_object_ref_sink, NULL); g_list_foreach (pgs, (GFunc) g_object_unref, NULL); g_list_free (pgs); } g_list_foreach (ps, (GFunc) g_object_unref, NULL); g_list_free (ps); if (*pp != NULL) { if (g_list_length(flist) == 1) { snprintf(title, tlen, "%s: %s", gtk_label_get_text(GTK_LABEL(thunarx_property_page_get_label_widget(THUNARX_PROPERTY_PAGE(*pp)))), thunarx_file_info_get_name(THUNARX_FILE_INFO(flist->data))); } else { snprintf(title, tlen, "%s", gtk_label_get_text(GTK_LABEL(thunarx_property_page_get_label_widget(THUNARX_PROPERTY_PAGE(*pp))))); } /* Try to adjust some buttons to close the window on click */ gtk_container_foreach (*pp, adjust_destroy, win); } return *pp != NULL; }
static void thunarx_property_page_destroy (GtkObject *object) { ThunarxPropertyPage *property_page = THUNARX_PROPERTY_PAGE (object); /* destroy the label widget (if any) */ if (G_LIKELY (property_page->priv->label_widget != NULL)) { gtk_object_destroy (GTK_OBJECT (property_page->priv->label_widget)); g_object_unref (G_OBJECT (property_page->priv->label_widget)); property_page->priv->label_widget = NULL; } (*GTK_OBJECT_CLASS (thunarx_property_page_parent_class)->destroy) (object); }
static void thunarx_property_page_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ThunarxPropertyPage *property_page = THUNARX_PROPERTY_PAGE (object); switch (prop_id) { case PROP_LABEL: thunarx_property_page_set_label (property_page, g_value_get_string (value)); break; case PROP_LABEL_WIDGET: thunarx_property_page_set_label_widget (property_page, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void thunar_apr_desktop_page_file_changed (ThunarAprAbstractPage *abstract_page, ThunarxFileInfo *file) { ThunarAprDesktopPage *desktop_page = THUNAR_APR_DESKTOP_PAGE (abstract_page); GKeyFile *key_file; gboolean writable; gboolean enabled; GError *error = NULL; gchar *filename; gchar *value; gchar *type; gchar *uri; /* allocate the key file memory */ key_file = g_key_file_new (); /* determine the local path to the file */ uri = thunarx_file_info_get_uri (file); filename = g_filename_from_uri (uri, NULL, NULL); g_free (uri); /* try to load the file contents */ if (filename != NULL && g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL)) { /* determine the type of the .desktop file (default to "Application") */ type = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Type", NULL); if (G_UNLIKELY (type == NULL)) type = g_strdup ("Application"); /* change page title depending on the type */ if (strcmp (type, "Application") == 0) thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), _("Launcher")); else if (strcmp (type, "Link") == 0) thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), _("Link")); else thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), type); /* update the "Description" entry */ value = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "GenericName", NULL, NULL); if (!exo_str_is_equal (value, desktop_page->description_text)) { /* update the entry */ gtk_entry_set_text (GTK_ENTRY (desktop_page->description_entry), (value != NULL) ? value : ""); /* update the saved value */ g_free (desktop_page->description_text); desktop_page->description_text = value; } else { g_free (value); } /* update the "Comment" entry */ value = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Comment", NULL, NULL); if (!exo_str_is_equal (value, desktop_page->comment_text)) { /* update the entry */ gtk_entry_set_text (GTK_ENTRY (desktop_page->comment_entry), (value != NULL) ? value : ""); /* update the saved value */ g_free (desktop_page->comment_text); desktop_page->comment_text = value; } else { g_free (value); } /* update the type dependant entries */ if (strcmp (type, "Application") == 0) { /* update the "Command" entry */ value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Exec", NULL); if (!exo_str_is_equal (value, desktop_page->command_text)) { /* update the entry */ gtk_entry_set_text (GTK_ENTRY (desktop_page->command_entry), (value != NULL) ? value : ""); /* update the saved value */ g_free (desktop_page->command_text); desktop_page->command_text = value; } else { g_free (value); } /* update the "Path" entry */ value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Path", NULL); if (!exo_str_is_equal (value, desktop_page->path_text)) { /* update the entry */ gtk_entry_set_text (GTK_ENTRY (desktop_page->path_entry), (value != NULL) ? value : ""); /* update the saved value */ g_free (desktop_page->path_text); desktop_page->path_text = value; } else { g_free (value); } /* update the "Use startup notification" button */ enabled = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, "StartupNotify", &error); g_signal_handlers_block_by_func (G_OBJECT (desktop_page->snotify_button), thunar_apr_desktop_page_toggled, desktop_page); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (desktop_page->snotify_button), (error == NULL && enabled)); g_signal_handlers_unblock_by_func (G_OBJECT (desktop_page->snotify_button), thunar_apr_desktop_page_toggled, desktop_page); g_clear_error (&error); /* update the "Run in terminal" button */ enabled = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, "Terminal", &error); g_signal_handlers_block_by_func (G_OBJECT (desktop_page->terminal_button), thunar_apr_desktop_page_toggled, desktop_page); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (desktop_page->terminal_button), (error == NULL && enabled)); g_signal_handlers_unblock_by_func (G_OBJECT (desktop_page->terminal_button), thunar_apr_desktop_page_toggled, desktop_page); g_clear_error (&error); /* update visibility of the specific widgets */ gtk_widget_show (desktop_page->command_entry); gtk_widget_show (desktop_page->path_entry); gtk_widget_hide (desktop_page->url_entry); gtk_widget_show (desktop_page->snotify_button); gtk_widget_show (desktop_page->terminal_button); } else if (strcmp (type, "Link") == 0) { /* update the "URL" entry */ value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "URL", NULL); if (!exo_str_is_equal (value, desktop_page->url_text)) { /* update the entry */ gtk_entry_set_text (GTK_ENTRY (desktop_page->url_entry), (value != NULL) ? value : ""); /* update the saved value */ g_free (desktop_page->url_text); desktop_page->url_text = value; } else { g_free (value); } /* update visibility of the specific widgets */ gtk_widget_hide (desktop_page->command_entry); gtk_widget_hide (desktop_page->path_entry); gtk_widget_show (desktop_page->url_entry); gtk_widget_hide (desktop_page->snotify_button); gtk_widget_hide (desktop_page->terminal_button); } else { /* hide the specific widgets */ gtk_widget_hide (desktop_page->command_entry); gtk_widget_hide (desktop_page->path_entry); gtk_widget_hide (desktop_page->url_entry); gtk_widget_hide (desktop_page->snotify_button); gtk_widget_hide (desktop_page->terminal_button); } /* check if the file is writable... */ writable = (g_access (filename, W_OK) == 0); /* ...and update the editability of the entries */ gtk_editable_set_editable (GTK_EDITABLE (desktop_page->description_entry), writable); gtk_editable_set_editable (GTK_EDITABLE (desktop_page->command_entry), writable); gtk_editable_set_editable (GTK_EDITABLE (desktop_page->path_entry), writable); gtk_editable_set_editable (GTK_EDITABLE (desktop_page->url_entry), writable); gtk_editable_set_editable (GTK_EDITABLE (desktop_page->comment_entry), writable); gtk_widget_set_sensitive (desktop_page->snotify_button, writable); gtk_widget_set_sensitive (desktop_page->terminal_button, writable); /* cleanup */ g_free (type); } else { /* reset page title */ thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), _("Unknown")); /* hide all widgets */ gtk_widget_hide (desktop_page->description_entry); gtk_widget_hide (desktop_page->command_entry); gtk_widget_hide (desktop_page->path_entry); gtk_widget_hide (desktop_page->url_entry); gtk_widget_hide (desktop_page->comment_entry); gtk_widget_hide (desktop_page->snotify_button); gtk_widget_hide (desktop_page->terminal_button); } /* cleanup */ g_key_file_free (key_file); g_free (filename); }