]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkappchooserwidget.c
Change FSF Address
[~andy/gtk] / gtk / gtkappchooserwidget.c
index 2b276e7db196d73af69d31eb4ee42e509c1ba0fe..ea4ac44a6374c40103c820ac155e34fe4326a629 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
  *
  * Authors: Dave Camp <dave@novell.com>
  *          Alexander Larsson <alexl@redhat.com>
  * 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;
@@ -630,13 +642,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 +720,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 +733,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 +748,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 +969,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 +991,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 +1029,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 +1044,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 +1059,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 +1072,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 +1086,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 +1121,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 +1144,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 +1187,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",