2 * gtkopenwithwidget.c: an open-with widget
4 * Copyright (C) 2004 Novell, Inc.
5 * Copyright (C) 2007, 2010 Red Hat, Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with the Gnome Library; see the file COPYING.LIB. If not,
19 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
22 * Authors: Dave Camp <dave@novell.com>
23 * Alexander Larsson <alexl@redhat.com>
24 * Cosimo Cecchi <ccecchi@redhat.com>
29 #include "gtkopenwithwidget.h"
32 #include "gtkmarshalers.h"
33 #include "gtkopenwith.h"
34 #include "gtkopenwithprivate.h"
37 #include <glib/gi18n-lib.h>
41 struct _GtkOpenWithWidgetPrivate {
42 GAppInfo *selected_app_info;
45 GtkOpenWithWidgetShowMode show_mode;
47 GtkWidget *program_list;
49 GtkListStore *program_list_store;
51 GtkCellRenderer *padding_renderer;
53 gboolean show_more_clicked;
71 PROP_CONTENT_TYPE = 1,
78 SIGNAL_APPLICATION_SELECTED,
79 SIGNAL_APPLICATION_ACTIVATED,
83 static guint signals[N_SIGNALS] = { 0, };
85 static void gtk_open_with_widget_iface_init (GtkOpenWithIface *iface);
87 G_DEFINE_TYPE_WITH_CODE (GtkOpenWithWidget, gtk_open_with_widget, GTK_TYPE_BOX,
88 G_IMPLEMENT_INTERFACE (GTK_TYPE_OPEN_WITH,
89 gtk_open_with_widget_iface_init));
92 refresh_and_emit_app_selected (GtkOpenWithWidget *self,
93 GtkTreeSelection *selection)
97 GAppInfo *info = NULL;
98 gboolean should_emit = FALSE;
100 if (gtk_tree_selection_get_selected (selection, &model, &iter))
102 gtk_tree_model_get (model, &iter,
103 COLUMN_APP_INFO, &info,
110 if (self->priv->selected_app_info)
112 if (!g_app_info_equal (self->priv->selected_app_info, info))
115 g_object_unref (self->priv->selected_app_info);
117 self->priv->selected_app_info = info;
123 self->priv->selected_app_info = info;
127 g_signal_emit (self, signals[SIGNAL_APPLICATION_SELECTED], 0,
128 self->priv->selected_app_info);
132 path_is_heading (GtkTreeView *view,
139 model = gtk_tree_view_get_model (view);
140 gtk_tree_model_get_iter (model, &iter, path);
141 gtk_tree_model_get (model, &iter,
142 COLUMN_HEADING, &res,
149 program_list_selection_activated (GtkTreeView *view,
151 GtkTreeViewColumn *column,
154 GtkOpenWithWidget *self = user_data;
155 GtkTreeSelection *selection;
157 if (path_is_heading (view, path))
160 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->program_list));
162 refresh_and_emit_app_selected (self, selection);
164 g_signal_emit (self, signals[SIGNAL_APPLICATION_ACTIVATED], 0,
165 self->priv->selected_app_info);
169 item_forget_association_cb (GtkMenuItem *item,
172 GtkOpenWithWidget *self = user_data;
173 GtkTreePath *path = NULL;
178 gtk_tree_view_get_cursor (GTK_TREE_VIEW (self->priv->program_list), &path, NULL);
179 model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->program_list));
183 gtk_tree_model_get_iter (model, &iter, path);
184 gtk_tree_model_get (model, &iter,
185 COLUMN_APP_INFO, &info,
188 if (info != NULL && g_app_info_can_remove_supports_type (info))
189 g_app_info_remove_supports_type (info, self->priv->content_type, NULL);
192 _gtk_open_with_widget_refilter (self);
196 gtk_open_with_widget_build_popup_menu (GtkOpenWithWidget *self)
201 menu = gtk_menu_new ();
203 item = gtk_menu_item_new_with_label (_("Forget association"));
204 g_signal_connect (item, "activate",
205 G_CALLBACK (item_forget_association_cb), self);
206 gtk_widget_show (item);
208 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
214 should_show_menu (GtkOpenWithWidget *self,
215 GdkEventButton *event)
220 gboolean recommended, retval;
223 gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (self->priv->program_list),
225 &path, NULL, NULL, NULL);
227 model = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->program_list));
228 gtk_tree_model_get_iter (model, &iter, path);
230 gtk_tree_model_get (model, &iter,
231 COLUMN_RECOMMENDED, &recommended,
232 COLUMN_APP_INFO, &info,
235 retval = recommended && (info != NULL);
237 gtk_tree_path_free (path);
240 g_object_unref (info);
246 do_popup_menu (GtkOpenWithWidget *self,
247 GdkEventButton *event)
251 if (!should_show_menu (self, event))
254 menu = gtk_open_with_widget_build_popup_menu (self);
255 gtk_menu_attach_to_widget (GTK_MENU (menu), self->priv->program_list, NULL);
256 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
257 event->button, event->time);
261 program_list_button_press_event_cb (GtkWidget *treeview,
262 GdkEventButton *event,
265 GtkOpenWithWidget *self = user_data;
267 if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
268 do_popup_menu (self, event);
274 gtk_open_with_search_equal_func (GtkTreeModel *model,
280 char *normalized_key;
281 char *name, *normalized_name;
282 char *path, *normalized_path;
283 char *basename, *normalized_basename;
288 normalized_key = g_utf8_casefold (key, -1);
289 g_assert (normalized_key != NULL);
293 gtk_tree_model_get (model, iter,
300 normalized_name = g_utf8_casefold (name, -1);
301 g_assert (normalized_name != NULL);
303 if (strncmp (normalized_name, normalized_key, strlen (normalized_key)) == 0) {
307 g_free (normalized_name);
310 if (ret && path != NULL)
312 normalized_path = g_utf8_casefold (path, -1);
313 g_assert (normalized_path != NULL);
315 basename = g_path_get_basename (path);
316 g_assert (basename != NULL);
318 normalized_basename = g_utf8_casefold (basename, -1);
319 g_assert (normalized_basename != NULL);
321 if (strncmp (normalized_path, normalized_key, strlen (normalized_key)) == 0 ||
322 strncmp (normalized_basename, normalized_key, strlen (normalized_key)) == 0) {
327 g_free (normalized_basename);
328 g_free (normalized_path);
333 g_free (normalized_key);
344 gtk_open_with_sort_func (GtkTreeModel *model,
349 gboolean a_recommended, b_recommended;
350 gboolean a_fallback, b_fallback;
351 gboolean a_heading, b_heading;
352 gchar *a_name, *b_name, *a_casefold, *b_casefold;
356 * - <0 if a should show before b
357 * - =0 if a is the same as b
358 * - >0 if a should show after b
361 gtk_tree_model_get (model, a,
362 COLUMN_NAME, &a_name,
363 COLUMN_RECOMMENDED, &a_recommended,
364 COLUMN_FALLBACK, &a_fallback,
365 COLUMN_HEADING, &a_heading,
368 gtk_tree_model_get (model, b,
369 COLUMN_NAME, &b_name,
370 COLUMN_RECOMMENDED, &b_recommended,
371 COLUMN_FALLBACK, &b_fallback,
372 COLUMN_HEADING, &b_heading,
375 /* the recommended one always wins */
376 if (a_recommended && !b_recommended)
382 if (b_recommended && !a_recommended)
388 /* the recommended one always wins */
389 if (a_fallback && !b_fallback)
395 if (b_fallback && !a_fallback)
401 /* they're both recommended/falback or not, so if one is a heading, wins */
414 a_casefold = a_name != NULL ?
415 g_utf8_casefold (a_name, -1) : NULL;
416 b_casefold = b_name != NULL ?
417 g_utf8_casefold (b_name, -1) : NULL;
419 retval = g_strcmp0 (a_casefold, b_casefold);
432 padding_cell_renderer_func (GtkTreeViewColumn *column,
433 GtkCellRenderer *cell,
440 gtk_tree_model_get (model, iter,
441 COLUMN_HEADING, &heading,
458 gtk_open_with_selection_func (GtkTreeSelection *selection,
461 gboolean path_currently_selected,
467 gtk_tree_model_get_iter (model, &iter, path);
468 gtk_tree_model_get (model, &iter,
469 COLUMN_HEADING, &heading,
476 compare_apps_func (gconstpointer a,
479 return !g_app_info_equal (G_APP_INFO (a), G_APP_INFO (b));
483 gtk_open_with_widget_add_section (GtkOpenWithWidget *self,
484 const gchar *heading_title,
485 gboolean show_headings,
486 gboolean recommended,
491 gboolean heading_added, unref_icon;
494 gchar *app_string, *bold_string;
498 heading_added = FALSE;
499 bold_string = g_strdup_printf ("<b>%s</b>", heading_title);
501 for (l = applications; l != NULL; l = l->next)
505 if (!g_app_info_supports_uris (app) &&
506 !g_app_info_supports_files (app))
509 if (exclude_apps != NULL &&
510 g_list_find_custom (exclude_apps, app,
511 (GCompareFunc) compare_apps_func))
514 if (!heading_added && show_headings)
516 gtk_list_store_append (self->priv->program_list_store, &iter);
517 gtk_list_store_set (self->priv->program_list_store, &iter,
518 COLUMN_HEADING_TEXT, bold_string,
519 COLUMN_HEADING, TRUE,
520 COLUMN_RECOMMENDED, recommended,
521 COLUMN_FALLBACK, fallback,
524 heading_added = TRUE;
527 app_string = g_strdup_printf ("<b>%s</b>\n<i>%s</i>",
528 g_app_info_get_display_name (app) != NULL ?
529 g_app_info_get_display_name (app) : "",
530 g_app_info_get_description (app) != NULL ?
531 g_app_info_get_description (app) : "");
533 icon = g_app_info_get_icon (app);
536 icon = g_themed_icon_new ("application-x-executable");
540 gtk_list_store_append (self->priv->program_list_store, &iter);
541 gtk_list_store_set (self->priv->program_list_store, &iter,
542 COLUMN_APP_INFO, app,
544 COLUMN_NAME, g_app_info_get_display_name (app),
545 COLUMN_DESC, app_string,
546 COLUMN_EXEC, g_app_info_get_executable (app),
547 COLUMN_HEADING, FALSE,
548 COLUMN_RECOMMENDED, recommended,
549 COLUMN_FALLBACK, fallback,
554 g_object_unref (icon);
559 g_free (bold_string);
563 add_no_applications_label (GtkOpenWithWidget *self)
565 gchar *string, *string2, *desc;
568 desc = g_content_type_get_description (self->priv->content_type);
569 string2 = g_strdup_printf (_("No applications available to open \"%s\""),
572 string = g_strdup_printf ("<big><b>%s</b></big>\n<i>%s</i>",
574 _("Click \"Show other applications\" for more options"));
576 gtk_list_store_append (self->priv->program_list_store, &iter);
577 gtk_list_store_set (self->priv->program_list_store, &iter,
578 COLUMN_HEADING_TEXT, string,
579 COLUMN_HEADING, TRUE,
580 COLUMN_RECOMMENDED, TRUE,
589 gtk_open_with_widget_real_add_items (GtkOpenWithWidget *self)
591 GList *all_applications = NULL, *content_type_apps = NULL, *recommended_apps = NULL, *fallback_apps = NULL;
592 gboolean show_recommended, show_headings, show_all;
594 if (self->priv->show_mode == GTK_OPEN_WITH_WIDGET_SHOW_MODE_RECOMMENDED)
597 show_headings = FALSE;
598 show_recommended = TRUE;
600 else if (self->priv->show_mode == GTK_OPEN_WITH_WIDGET_SHOW_MODE_ALL)
603 show_headings = FALSE;
604 show_recommended = FALSE;
608 show_all = self->priv->show_more_clicked;
609 show_headings = TRUE;
610 show_recommended = TRUE;
613 if (show_recommended)
615 recommended_apps = g_app_info_get_recommended_for_type (self->priv->content_type);
616 fallback_apps = g_app_info_get_fallback_for_type (self->priv->content_type);
617 content_type_apps = g_list_concat (g_list_copy (recommended_apps),
618 g_list_copy (fallback_apps));
622 all_applications = g_app_info_get_all ();
624 if (show_recommended)
626 if (recommended_apps != NULL)
627 gtk_open_with_widget_add_section (self, _("Recommended Applications"),
628 show_headings, TRUE, FALSE, recommended_apps, NULL);
629 else if (!self->priv->show_more_clicked)
630 add_no_applications_label (self);
634 gtk_open_with_widget_add_section (self, _("Related Applications"),
635 show_headings, FALSE, TRUE, fallback_apps, recommended_apps);
638 gtk_open_with_widget_add_section (self, _("Other Applications"),
639 show_headings, FALSE, FALSE, all_applications, content_type_apps);
641 if (content_type_apps != NULL)
642 g_list_free_full (content_type_apps, g_object_unref);
644 if (all_applications != NULL)
645 g_list_free_full (all_applications, g_object_unref);
649 gtk_open_with_widget_add_items (GtkOpenWithWidget *self)
651 GtkCellRenderer *renderer;
652 GtkTreeViewColumn *column;
655 /* create list store */
656 self->priv->program_list_store = gtk_list_store_new (NUM_COLUMNS,
666 sort = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (self->priv->program_list_store));
668 /* populate the widget */
669 gtk_open_with_widget_real_add_items (self);
671 gtk_tree_view_set_model (GTK_TREE_VIEW (self->priv->program_list),
672 GTK_TREE_MODEL (sort));
673 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort),
676 gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sort),
678 gtk_open_with_sort_func,
680 gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (self->priv->program_list),
681 gtk_open_with_search_equal_func,
684 column = gtk_tree_view_column_new ();
686 /* initial padding */
687 renderer = gtk_cell_renderer_text_new ();
688 gtk_tree_view_column_pack_start (column, renderer, FALSE);
689 g_object_set (renderer,
690 "xpad", (self->priv->show_mode == GTK_OPEN_WITH_WIDGET_SHOW_MODE_HEADINGS) ? 6 : 0,
692 self->priv->padding_renderer = renderer;
694 /* heading text renderer */
695 renderer = gtk_cell_renderer_text_new ();
696 gtk_tree_view_column_pack_start (column, renderer, FALSE);
697 gtk_tree_view_column_set_attributes (column, renderer,
698 "markup", COLUMN_HEADING_TEXT,
699 "visible", COLUMN_HEADING,
701 g_object_set (renderer,
705 "wrap-mode", PANGO_WRAP_WORD,
708 /* padding renderer for non-heading cells */
709 renderer = gtk_cell_renderer_text_new ();
710 gtk_tree_view_column_pack_start (column, renderer, FALSE);
711 gtk_tree_view_column_set_cell_data_func (column, renderer,
712 padding_cell_renderer_func,
715 /* app icon renderer */
716 renderer = gtk_cell_renderer_pixbuf_new ();
717 gtk_tree_view_column_pack_start (column, renderer, FALSE);
718 gtk_tree_view_column_set_attributes (column, renderer,
719 "gicon", COLUMN_GICON,
721 g_object_set (renderer,
722 "stock-size", GTK_ICON_SIZE_DIALOG,
725 /* app name renderer */
726 renderer = gtk_cell_renderer_text_new ();
727 gtk_tree_view_column_pack_start (column, renderer, TRUE);
728 gtk_tree_view_column_set_attributes (column, renderer,
729 "markup", COLUMN_DESC,
731 g_object_set (renderer,
732 "ellipsize", PANGO_ELLIPSIZE_END,
733 "ellipsize-set", TRUE,
736 gtk_tree_view_column_set_sort_column_id (column, COLUMN_NAME);
737 gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->program_list), column);
741 gtk_open_with_widget_set_property (GObject *object,
746 GtkOpenWithWidget *self = GTK_OPEN_WITH_WIDGET (object);
750 case PROP_CONTENT_TYPE:
751 self->priv->content_type = g_value_dup_string (value);
754 gtk_open_with_widget_set_show_mode (self,
755 g_value_get_enum (value));
758 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
764 gtk_open_with_widget_get_property (GObject *object,
769 GtkOpenWithWidget *self = GTK_OPEN_WITH_WIDGET (object);
773 case PROP_CONTENT_TYPE:
774 g_value_set_string (value, self->priv->content_type);
777 g_value_set_enum (value, self->priv->show_mode);
780 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
786 show_more_button_clicked_cb (GtkButton *button,
789 GtkOpenWithWidget *self = user_data;
791 self->priv->show_more_clicked = TRUE;
792 gtk_widget_hide (GTK_WIDGET (button));
794 _gtk_open_with_widget_refilter (self);
798 gtk_open_with_widget_ensure_show_more_button (GtkOpenWithWidget *self)
800 if (self->priv->show_mode == GTK_OPEN_WITH_WIDGET_SHOW_MODE_HEADINGS)
802 if (!self->priv->show_more_clicked)
803 gtk_widget_show (self->priv->show_more);
807 gtk_widget_hide (self->priv->show_more);
812 gtk_open_with_widget_constructed (GObject *object)
814 GtkOpenWithWidget *self = GTK_OPEN_WITH_WIDGET (object);
816 g_assert (self->priv->content_type != NULL);
818 if (G_OBJECT_CLASS (gtk_open_with_widget_parent_class)->constructed != NULL)
819 G_OBJECT_CLASS (gtk_open_with_widget_parent_class)->constructed (object);
821 gtk_open_with_widget_ensure_show_more_button (self);
822 gtk_open_with_widget_add_items (self);
826 gtk_open_with_widget_finalize (GObject *object)
828 GtkOpenWithWidget *self = GTK_OPEN_WITH_WIDGET (object);
830 g_free (self->priv->content_type);
832 G_OBJECT_CLASS (gtk_open_with_widget_parent_class)->finalize (object);
836 gtk_open_with_widget_dispose (GObject *object)
838 GtkOpenWithWidget *self = GTK_OPEN_WITH_WIDGET (object);
840 if (self->priv->selected_app_info != NULL)
842 g_object_unref (self->priv->selected_app_info);
843 self->priv->selected_app_info = NULL;
846 G_OBJECT_CLASS (gtk_open_with_widget_parent_class)->dispose (object);
850 gtk_open_with_widget_class_init (GtkOpenWithWidgetClass *klass)
852 GObjectClass *gobject_class;
855 gobject_class = G_OBJECT_CLASS (klass);
856 gobject_class->dispose = gtk_open_with_widget_dispose;
857 gobject_class->finalize = gtk_open_with_widget_finalize;
858 gobject_class->set_property = gtk_open_with_widget_set_property;
859 gobject_class->get_property = gtk_open_with_widget_get_property;
860 gobject_class->constructed = gtk_open_with_widget_constructed;
862 g_object_class_override_property (gobject_class, PROP_CONTENT_TYPE, "content-type");
865 * GtkOpenWithWidget::show-mode:
867 * The #GtkOpenWithWidgetShowMode for this widget.
870 g_param_spec_enum ("show-mode",
871 P_("The widget show mode"),
872 P_("The show mode for this widget"),
873 GTK_TYPE_OPEN_WITH_WIDGET_SHOW_MODE,
874 GTK_OPEN_WITH_WIDGET_SHOW_MODE_HEADINGS,
875 G_PARAM_CONSTRUCT | G_PARAM_READWRITE |
876 G_PARAM_STATIC_STRINGS);
877 g_object_class_install_property (gobject_class, PROP_SHOW_MODE, pspec);
879 signals[SIGNAL_APPLICATION_SELECTED] =
880 g_signal_new ("application-selected",
881 GTK_TYPE_OPEN_WITH_WIDGET,
883 G_STRUCT_OFFSET (GtkOpenWithWidgetClass, application_selected),
885 _gtk_marshal_VOID__OBJECT,
889 signals[SIGNAL_APPLICATION_ACTIVATED] =
890 g_signal_new ("application-activated",
891 GTK_TYPE_OPEN_WITH_WIDGET,
893 G_STRUCT_OFFSET (GtkOpenWithWidgetClass, application_activated),
895 _gtk_marshal_VOID__OBJECT,
899 g_type_class_add_private (klass, sizeof (GtkOpenWithWidgetPrivate));
903 gtk_open_with_widget_init (GtkOpenWithWidget *self)
905 GtkWidget *scrolled_window, *button, *w;
906 GtkTreeSelection *selection;
908 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTK_TYPE_OPEN_WITH_WIDGET,
909 GtkOpenWithWidgetPrivate);
910 gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
912 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
913 gtk_widget_set_size_request (scrolled_window, 400, 300);
914 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
916 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
918 GTK_POLICY_AUTOMATIC);
919 gtk_widget_show (scrolled_window);
921 self->priv->program_list = gtk_tree_view_new ();
922 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (self->priv->program_list),
924 gtk_container_add (GTK_CONTAINER (scrolled_window), self->priv->program_list);
925 gtk_box_pack_start (GTK_BOX (self), scrolled_window, TRUE, TRUE, 0);
926 gtk_widget_show (self->priv->program_list);
928 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->program_list));
929 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
930 gtk_tree_selection_set_select_function (selection, gtk_open_with_selection_func,
932 g_signal_connect_swapped (selection, "changed",
933 G_CALLBACK (refresh_and_emit_app_selected),
935 g_signal_connect (self->priv->program_list, "row-activated",
936 G_CALLBACK (program_list_selection_activated),
938 g_signal_connect (self->priv->program_list, "button-press-event",
939 G_CALLBACK (program_list_button_press_event_cb),
942 button = gtk_button_new_with_label (_("Show other applications"));
943 w = gtk_image_new_from_stock (GTK_STOCK_ADD,
944 GTK_ICON_SIZE_BUTTON);
946 gtk_button_set_image (GTK_BUTTON (button), w);
947 gtk_box_pack_start (GTK_BOX (self), button, FALSE, FALSE, 6);
949 g_signal_connect (button, "clicked",
950 G_CALLBACK (show_more_button_clicked_cb), self);
952 self->priv->show_more = button;
956 gtk_open_with_widget_get_app_info (GtkOpenWith *object)
958 GtkOpenWithWidget *self = GTK_OPEN_WITH_WIDGET (object);
960 if (self->priv->selected_app_info == NULL)
963 return g_object_ref (self->priv->selected_app_info);
967 gtk_open_with_widget_iface_init (GtkOpenWithIface *iface)
969 iface->get_app_info = gtk_open_with_widget_get_app_info;
973 _gtk_open_with_widget_refilter (GtkOpenWithWidget *self)
976 gtk_open_with_widget_ensure_show_more_button (self);
978 if (self->priv->program_list_store != NULL)
980 gtk_list_store_clear (self->priv->program_list_store);
982 /* don't add additional xpad if we don't have headings */
983 g_object_set (self->priv->padding_renderer,
984 "visible", self->priv->show_mode == GTK_OPEN_WITH_WIDGET_SHOW_MODE_HEADINGS,
987 gtk_open_with_widget_real_add_items (self);
992 gtk_open_with_widget_new (const gchar *content_type)
994 return g_object_new (GTK_TYPE_OPEN_WITH_WIDGET,
995 "content-type", content_type,
1000 * gtk_open_with_widget_set_show_mode:
1001 * @self: a #GtkOpenWithWidget
1002 * @show_mode: the new show mode for this widget
1004 * Sets the mode for the widget to show the list of applications.
1005 * See #GtkOpenWithWidgetShowMode for more details.
1010 gtk_open_with_widget_set_show_mode (GtkOpenWithWidget *self,
1011 GtkOpenWithWidgetShowMode show_mode)
1013 g_return_if_fail (GTK_IS_OPEN_WITH_WIDGET (self));
1015 if (self->priv->show_mode != show_mode)
1017 self->priv->show_mode = show_mode;
1018 g_object_notify (G_OBJECT (self), "show-mode");
1020 self->priv->show_more_clicked = FALSE;
1021 _gtk_open_with_widget_refilter (self);
1026 * gtk_open_with_widget_get_show_mode:
1027 * @self: a #GtkOpenWithWidget
1029 * Returns the current mode for the widget to show the list of applications.
1030 * See #GtkOpenWithWidgetShowMode for mode details.
1032 * Returns: a #GtkOpenWithWidgetShowMode
1036 GtkOpenWithWidgetShowMode
1037 gtk_open_with_widget_get_show_mode (GtkOpenWithWidget *self)
1039 g_return_val_if_fail (GTK_IS_OPEN_WITH_WIDGET (self), FALSE);
1041 return self->priv->show_mode;