g_object_set (object, property, text, NULL);
}
+static void
+proxy_combo_box_apps_changed_cb (GtkComboBox* button,
+ GObject* object)
+{
+ guint active = gtk_combo_box_get_active (button);
+ GtkTreeModel* model = gtk_combo_box_get_model (button);
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_iter_nth_child (model, &iter, NULL, active))
+ {
+ GAppInfo* info;
+ const gchar* exe;
+ const gchar* property = g_object_get_data (G_OBJECT (button), "property");
+
+ gtk_tree_model_get (model, &iter, 0, &info, -1);
+
+ if (info)
+ {
+ #if 0 /* GLIB_CHECK_VERSION (2, 20, 0) */
+ /* FIXME: Implement non-trivial command lines */
+ exe = g_app_info_get_commandline (info);
+ #else
+ exe = g_app_info_get_executable (info);
+ #endif
+ g_object_set (object, property, exe, NULL);
+ g_object_unref (info);
+ }
+ else
+ g_object_set (object, property, "", NULL);
+ }
+}
+
static void
proxy_entry_activate_cb (GtkEntry* entry,
GObject* object)
proxy_object_notify_string_cb, proxy);
}
+static GList*
+katze_app_info_get_all_for_category (const gchar* category)
+{
+ GList* all_apps = g_app_info_get_all ();
+ GList* apps = NULL;
+ guint i = 0;
+ GAppInfo* info;
+ while ((info = g_list_nth_data (all_apps, i++)))
+ {
+ #ifdef GDK_WINDOWING_X11
+ gchar* filename = g_strconcat ("applications/", g_app_info_get_id (info), NULL);
+ GKeyFile* file = g_key_file_new ();
+
+ if (g_key_file_load_from_data_dirs (file, filename, NULL, G_KEY_FILE_NONE, NULL))
+ {
+ gchar* cat = g_key_file_get_string (file, "Desktop Entry",
+ "Categories", NULL);
+ if (cat && g_strrstr (cat, category))
+ apps = g_list_append (apps, info);
+
+ g_free (cat);
+ }
+ g_key_file_free (file);
+ g_free (filename);
+ #else
+ apps = g_list_append (apps, info);
+ #endif
+ }
+ g_list_free (all_apps);
+ return apps;
+}
+
/**
* katze_property_proxy:
* @object: a #GObject
* Since 0.2.0 the following hints are also supported:
* "font-monospace": the widget created will be particularly suitable for
* choosing a fixed-width font from installed fonts.
+ * Since 0.2.1 the following hints are also supported:
+ * "application-TYPE": the widget created will be particularly suitable
+ * for choosing an application to open TYPE files, ie. "text/plain".
+ * "application-CATEGORY": the widget created will be particularly suitable
+ * for choosing an application to open CATEGORY files, ie. "Network".
*
* Any other values for @hint are silently ignored.
*
G_CALLBACK (proxy_combo_box_text_changed_cb), object);
g_free (families);
}
+ else if (type == G_TYPE_PARAM_STRING && hint && g_str_has_prefix (hint, "application-"))
+ {
+ GtkListStore* model;
+ GtkCellRenderer* renderer;
+ GtkComboBox* combo;
+ GList* apps;
+ const gchar* type = &hint[12];
+
+ model = gtk_list_store_new (3, G_TYPE_APP_INFO, G_TYPE_STRING, G_TYPE_STRING);
+ widget = gtk_combo_box_new_with_model (GTK_TREE_MODEL (model));
+ renderer = gtk_cell_renderer_pixbuf_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, FALSE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (widget), renderer, "icon-name", 1);
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
+ gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (widget), renderer, "text", 2);
+ combo = GTK_COMBO_BOX (widget);
+ apps = g_app_info_get_all_for_type (type);
+ if (!apps)
+ apps = katze_app_info_get_all_for_category (type);
+
+ string = katze_object_get_string (object, property);
+ if (!g_strcmp0 (string, ""))
+ katze_assign (string, NULL);
+
+ if (apps)
+ {
+ GtkTreeIter iter_none;
+ gint i = 0;
+ GAppInfo* info;
+
+ gtk_list_store_insert_with_values (model, &iter_none, 0,
+ 0, NULL, 1, NULL, 2, _("None"), -1);
+
+ while ((info = g_list_nth_data (apps, i++)))
+ {
+ const gchar* name = g_app_info_get_name (info);
+ GIcon* icon = g_app_info_get_icon (info);
+ gchar* icon_name = g_icon_to_string (icon);
+ GtkTreeIter iter;
+
+ gtk_list_store_insert_with_values (model, &iter, G_MAXINT,
+ 0, info, 1, icon_name, 2, name, -1);
+ if (string && g_strrstr (g_app_info_get_executable (info), string))
+ gtk_combo_box_set_active_iter (combo, &iter);
+
+ g_free (icon_name);
+ }
+
+ if (gtk_combo_box_get_active (combo) == -1)
+ {
+ if (string)
+ /* FIXME: Support custom command */;
+ else
+ gtk_combo_box_set_active_iter (combo, &iter_none);
+ }
+ }
+ g_list_free (apps);
+ g_signal_connect (widget, "changed",
+ G_CALLBACK (proxy_combo_box_apps_changed_cb), object);
+ }
else if (type == G_TYPE_PARAM_STRING)
{
gchar* notify_property;
GTK_ICON_SIZE_MENU, &icon_width, &icon_height);
gtk_widget_set_size_request (button, icon_width, icon_height);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4);
- entry = katze_property_proxy (settings, "text-editor", NULL);
+ entry = katze_property_proxy (settings, "text-editor", "application-text/plain");
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
- proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button));
- g_signal_connect (entry, "focus-out-event",
- G_CALLBACK (proxy_download_manager_icon_cb), button);
FILLED_ADD (hbox, 1, 2, 0, 1);
label = katze_property_label (settings, "download-manager");
INDENTED_ADD (label, 0, 1, 1, 2);
GTK_ICON_SIZE_MENU, &icon_width, &icon_height);
gtk_widget_set_size_request (button, icon_width, icon_height);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4);
- entry = katze_property_proxy (settings, "download-manager", NULL);
+ entry = katze_property_proxy (settings, "download-manager", "application-Network");
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
- proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button));
- g_signal_connect (entry, "focus-out-event",
- G_CALLBACK (proxy_download_manager_icon_cb), button);
FILLED_ADD (hbox, 1, 2, 1, 2);
label = katze_property_label (settings, "news-aggregator");
INDENTED_ADD (label, 0, 1, 2, 3);
GTK_ICON_SIZE_MENU, &icon_width, &icon_height);
gtk_widget_set_size_request (button, icon_width, icon_height);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 4);
- entry = katze_property_proxy (settings, "news-aggregator", NULL);
+ entry = katze_property_proxy (settings, "news-aggregator", "application-Network");
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
- proxy_download_manager_icon_cb (entry, NULL, GTK_IMAGE (button));
- g_signal_connect (entry, "focus-out-event",
- G_CALLBACK (proxy_download_manager_icon_cb), button);
FILLED_ADD (hbox, 1, 2, 2, 3);
/* Page "Network" */