X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkappchooserwidget.c;h=36875dfb0df3b3fa580a4d2dd79f366f1d2215a8;hb=d484721b5ca9e82d6422cca8a3a40f001208f87b;hp=2b276e7db196d73af69d31eb4ee42e509c1ba0fe;hpb=d4add8cefa6fa5c29bdb50f18e31cbfbfb38cc2b;p=~andy%2Fgtk diff --git a/gtk/gtkappchooserwidget.c b/gtk/gtkappchooserwidget.c index 2b276e7db..36875dfb0 100644 --- a/gtk/gtkappchooserwidget.c +++ b/gtk/gtkappchooserwidget.c @@ -15,9 +15,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with the Gnome Library; see the file COPYING.LIB. If not, - * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . * * Authors: Dave Camp * Alexander Larsson @@ -54,6 +52,19 @@ * It is the main building block for #GtkAppChooserDialog. Most * applications only need to use the latter; but you can use * this widget as part of a larger widget if you have special needs. + * + * #GtkAppChooserWidget offers detailed control over what applications + * are shown, using the + * #GtkAppChooserWidget:show-default, + * #GtkAppChooserWidget:show-recommended, + * #GtkAppChooserWidget:show-fallback, + * #GtkAppChooserWidget:show-other and + * #GtkAppChooserWidget:show-all + * properties. See the #GtkAppChooser documentation for more information + * about these groups of applications. + * + * To keep track of the selected application, use the + * #GtkAppChooserWidget::application-selected and #GtkAppChooserWidget::application-activated signals. */ struct _GtkAppChooserWidgetPrivate { @@ -61,11 +72,12 @@ struct _GtkAppChooserWidgetPrivate { gchar *content_type; gchar *default_text; - gboolean show_default; - gboolean show_recommended; - gboolean show_fallback; - gboolean show_other; - gboolean show_all; + + guint show_default : 1; + guint show_recommended : 1; + guint show_fallback : 1; + guint show_other : 1; + guint show_all : 1; GtkWidget *program_list; GtkListStore *program_list_store; @@ -194,7 +206,7 @@ widget_button_press_event_cb (GtkWidget *widget, { GtkAppChooserWidget *self = user_data; - if (event->button == 3 && event->type == GDK_BUTTON_PRESS) + if (event->button == GDK_BUTTON_SECONDARY && event->type == GDK_BUTTON_PRESS) { GAppInfo *info; GtkWidget *menu; @@ -524,6 +536,9 @@ gtk_app_chooser_widget_add_section (GtkAppChooserWidget *self, !g_app_info_supports_files (app)) continue; + if (!g_app_info_should_show (app)) + continue; + if (g_list_find_custom (exclude_apps, app, (GCompareFunc) compare_apps_func)) continue; @@ -630,13 +645,15 @@ gtk_app_chooser_add_default (GtkAppChooserWidget *self, static void add_no_applications_label (GtkAppChooserWidget *self) { - gchar *text = NULL, *desc; + gchar *text = NULL, *desc = NULL; const gchar *string; GtkTreeIter iter; if (self->priv->default_text == NULL) { - desc = g_content_type_get_description (self->priv->content_type); + if (self->priv->content_type) + desc = g_content_type_get_description (self->priv->content_type); + string = text = g_strdup_printf (_("No applications available to open \"%s\""), desc); g_free (desc); @@ -706,7 +723,7 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self) if (self->priv->show_all) show_headings = FALSE; - if (self->priv->show_default) + if (self->priv->show_default && self->priv->content_type) { default_app = g_app_info_get_default_for_type (self->priv->content_type, FALSE); @@ -719,9 +736,10 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self) } #ifndef G_OS_WIN32 - if (self->priv->show_recommended || self->priv->show_all) + if ((self->priv->content_type && self->priv->show_recommended) || self->priv->show_all) { - recommended_apps = g_app_info_get_recommended_for_type (self->priv->content_type); + if (self->priv->content_type) + recommended_apps = g_app_info_get_recommended_for_type (self->priv->content_type); apps_added |= gtk_app_chooser_widget_add_section (self, _("Recommended Applications"), show_headings, @@ -733,9 +751,10 @@ gtk_app_chooser_widget_real_add_items (GtkAppChooserWidget *self) g_list_copy (recommended_apps)); } - if (self->priv->show_fallback || self->priv->show_all) + if ((self->priv->content_type && self->priv->show_fallback) || self->priv->show_all) { - fallback_apps = g_app_info_get_fallback_for_type (self->priv->content_type); + if (self->priv->content_type) + fallback_apps = g_app_info_get_fallback_for_type (self->priv->content_type); apps_added |= gtk_app_chooser_widget_add_section (self, _("Related Applications"), show_headings, @@ -953,8 +972,6 @@ gtk_app_chooser_widget_constructed (GObject *object) { GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); - g_assert (self->priv->content_type != NULL); - if (G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->constructed != NULL) G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->constructed (object); @@ -977,11 +994,7 @@ gtk_app_chooser_widget_dispose (GObject *object) { GtkAppChooserWidget *self = GTK_APP_CHOOSER_WIDGET (object); - if (self->priv->selected_app_info != NULL) - { - g_object_unref (self->priv->selected_app_info); - self->priv->selected_app_info = NULL; - } + g_clear_object (&self->priv->selected_app_info); G_OBJECT_CLASS (gtk_app_chooser_widget_parent_class)->dispose (object); } @@ -1019,9 +1032,10 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) /** * GtkAppChooserWidget:show-recommended: * - * The #GtkAppChooserWidget:show-recommended property determines whether the app chooser - * should show a section for recommended applications. If %FALSE, the - * recommended applications are listed among the other applications. + * The #GtkAppChooserWidget:show-recommended property determines + * whether the app chooser should show a section for recommended + * applications. If %FALSE, the recommended applications are listed + * among the other applications. */ pspec = g_param_spec_boolean ("show-recommended", P_("Show recommended apps"), @@ -1033,9 +1047,10 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) /** * GtkAppChooserWidget:show-fallback: * - * The #GtkAppChooserWidget:show-fallback property determines whether the app chooser - * should show a section for related applications. If %FALSE, the - * related applications are listed among the other applications. + * The #GtkAppChooserWidget:show-fallback property determines whether + * the app chooser should show a section for fallback applications. + * If %FALSE, the fallback applications are listed among the other + * applications. */ pspec = g_param_spec_boolean ("show-fallback", P_("Show fallback apps"), @@ -1047,8 +1062,8 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) /** * GtkAppChooserWidget:show-other: * - * The #GtkAppChooserWidget:show-other property determines whether the app chooser - * should show a section for other applications. + * The #GtkAppChooserWidget:show-other property determines whether + * the app chooser should show a section for other applications. */ pspec = g_param_spec_boolean ("show-other", P_("Show other apps"), @@ -1060,9 +1075,9 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) /** * GtkAppChooserWidget:show-all: * - * If the #GtkAppChooserWidget:show-all property is %TRUE, the app chooser presents - * all applications in a single list, without subsections for - * default, recommended or related applications. + * If the #GtkAppChooserWidget:show-all property is %TRUE, the app + * chooser presents all applications in a single list, without + * subsections for default, recommended or related applications. */ pspec = g_param_spec_boolean ("show-all", P_("Show all apps"), @@ -1074,8 +1089,9 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) /** * GtkAppChooserWidget:default-text: * - * The #GtkAppChooserWidget:default-text property determines the text that appears - * in the widget when there are no applications for the given content type. + * The #GtkAppChooserWidget:default-text property determines the text + * that appears in the widget when there are no applications for the + * given content type. * See also gtk_app_chooser_widget_set_default_text(). */ pspec = g_param_spec_string ("default-text", @@ -1108,6 +1124,7 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) * @application: the activated #GAppInfo * * Emitted when an application item is activated from the widget's list. + * * This usually happens when the user double clicks an item, or an item * is selected and the user presses one of the keys Space, Shift+Space, * Return or Enter. @@ -1130,8 +1147,8 @@ gtk_app_chooser_widget_class_init (GtkAppChooserWidgetClass *klass) * * Emitted when a context menu is about to popup over an application item. * Clients can insert menu items into the provided #GtkMenu object in the - * callback of this signal; the context menu will be shown over the item if - * at least one item has been added to the menu. + * callback of this signal; the context menu will be shown over the item + * if at least one item has been added to the menu. */ signals[SIGNAL_POPULATE_POPUP] = g_signal_new ("populate-popup", @@ -1173,7 +1190,7 @@ gtk_app_chooser_widget_init (GtkAppChooserWidget *self) gtk_widget_show (self->priv->program_list); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->program_list)); - gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE); gtk_tree_selection_set_select_function (selection, gtk_app_chooser_selection_func, self, NULL); g_signal_connect_swapped (selection, "changed",