[gnome-software/wip/kalev/source_selection_drop_down: 1/2] details page: Add source selection drop down
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/kalev/source_selection_drop_down: 1/2] details page: Add source selection drop down
- Date: Thu, 27 Sep 2018 12:46:45 +0000 (UTC)
commit 0c9b5180c8bbd5b0dd5697f0928e7b31733a0040
Author: Kalev Lember <klember redhat com>
Date: Wed Sep 26 15:45:24 2018 +0200
details page: Add source selection drop down
... to choose between e.g. flatpak and distro packages.
po/POTFILES.in | 1 +
src/gnome-software.gresource.xml | 1 +
src/gnome-software.ui | 77 ++++++++++++++++++++
src/gs-details-page.c | 108 +++++++++++++++++++++++++++
src/gs-origin-popover-row.c | 153 +++++++++++++++++++++++++++++++++++++++
src/gs-origin-popover-row.h | 48 ++++++++++++
src/gs-origin-popover-row.ui | 127 ++++++++++++++++++++++++++++++++
src/gs-shell.c | 2 +
src/meson.build | 1 +
9 files changed, 518 insertions(+)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ad900c43..eae167e2 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -37,6 +37,7 @@ src/gs-loading-page.c
src/gs-loading-page.ui
src/gs-main.c
src/gs-moderate-page.ui
+src/gs-origin-popover-row.ui
src/gs-overview-page.c
src/gs-overview-page.ui
src/gs-page.c
diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml
index 59821733..a8efa6a9 100644
--- a/src/gnome-software.gresource.xml
+++ b/src/gnome-software.gresource.xml
@@ -18,6 +18,7 @@
<file preprocess="xml-stripblanks">gs-loading-page.ui</file>
<file preprocess="xml-stripblanks">gs-moderate-page.ui</file>
<file preprocess="xml-stripblanks">gs-overview-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-origin-popover-row.ui</file>
<file preprocess="xml-stripblanks">gs-popular-tile.ui</file>
<file preprocess="xml-stripblanks">gs-prefs-dialog.ui</file>
<file preprocess="xml-stripblanks">gs-removal-dialog.ui</file>
diff --git a/src/gnome-software.ui b/src/gnome-software.ui
index b613cfc1..a96284fa 100644
--- a/src/gnome-software.ui
+++ b/src/gnome-software.ui
@@ -340,6 +340,60 @@
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <object class="GtkBox" id="origin_box">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+ <property name="halign">fill</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Source</property>
+ <property name="valign">GTK_ALIGN_CENTER</property>
+ <property name="vexpand">1</property>
+ <property name="visible">1</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="origin_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="sensitive">True</property>
+ <property name="popover">origin_popover</property>
+ <child>
+ <object class="GtkGrid">
+ <property name="column-spacing">12</property>
+ <property name="visible">1</property>
+ <child>
+ <object class="GtkLabel" id="origin_button_label">
+ <property name="label">Fedora</property>
+ <property name="valign">GTK_ALIGN_CENTER</property>
+ <property name="vexpand">1</property>
+ <property name="visible">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">pan-down-symbolic</property>
+ <property name="pixel-size">16</property>
+ <property name="valign">GTK_ALIGN_CENTER</property>
+ <property name="vexpand">1</property>
+ <property name="visible">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack-type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
@@ -589,4 +643,27 @@
</object>
</child>
</object>
+ <object class="GtkPopover" id="origin_popover">
+ <child>
+ <object class="GtkBox" id="origin_popover_box">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="propagate-natural-height">true</property>
+ <property name="propagate-natural-width">true</property>
+ <property name="max-content-height">600</property>
+ <property name="visible">true</property>
+ <child>
+ <object class="GtkListBox" id="origin_popover_list_box">
+ <property name="selection-mode">none</property>
+ <property name="visible">true</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
</interface>
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 68cde5a9..f09e5f7d 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -34,6 +34,7 @@
#include "gs-app-addon-row.h"
#include "gs-auth-dialog.h"
#include "gs-history-dialog.h"
+#include "gs-origin-popover-row.h"
#include "gs-screenshot-image.h"
#include "gs-star-widget.h"
#include "gs-review-histogram.h"
@@ -876,6 +877,105 @@ gs_details_page_refresh_size (GsDetailsPage *self)
}
}
+static void
+gs_details_page_get_alternates_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GsDetailsPage *self = GS_DETAILS_PAGE (user_data);
+ GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source_object);
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GsAppList) list = NULL;
+ g_autoptr(GsOsRelease) os_release = NULL;
+ GtkWidget *origin_box;
+ GtkWidget *origin_button_label;
+ GtkWidget *origin_popover_list_box;
+ const gchar *origin_ui = NULL;
+
+ origin_box = GTK_WIDGET (gtk_builder_get_object (self->builder, "origin_box"));
+ origin_button_label = GTK_WIDGET (gtk_builder_get_object (self->builder, "origin_button_label"));
+ origin_popover_list_box = GTK_WIDGET (gtk_builder_get_object (self->builder,
"origin_popover_list_box"));
+
+ gs_container_remove_all (GTK_CONTAINER (origin_popover_list_box));
+
+ list = gs_plugin_loader_job_process_finish (plugin_loader,
+ res,
+ &error);
+ if (list == NULL) {
+ if (!g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED))
+ g_warning ("failed to get alternates: %s", error->message);
+ gtk_widget_hide (origin_box);
+ return;
+ }
+
+ /* no alternates to show */
+ if (gs_app_list_length (list) < 2) {
+ gtk_widget_hide (origin_box);
+ return;
+ }
+
+ for (guint i = 0; i < gs_app_list_length (list); i++) {
+ GsApp *app = gs_app_list_index (list, i);
+ GtkWidget *row = gs_origin_popover_row_new (app);
+ gtk_widget_show (row);
+ if (app == self->app)
+ gs_origin_popover_row_set_selected (GS_ORIGIN_POPOVER_ROW (row), TRUE);
+ gtk_container_add (GTK_CONTAINER (origin_popover_list_box), row);
+ }
+
+ /* use the distro name for official packages */
+ if (gs_app_has_quirk (self->app, AS_APP_QUIRK_PROVENANCE)) {
+ os_release = gs_os_release_new (NULL);
+ if (os_release != NULL)
+ origin_ui = gs_os_release_get_name (os_release);
+ }
+
+ /* fall back to origin */
+ if (origin_ui == NULL)
+ origin_ui = gs_app_get_origin (self->app);
+
+ if (origin_ui != NULL)
+ gtk_label_set_text (GTK_LABEL (origin_button_label), origin_ui);
+ else
+ gtk_label_set_text (GTK_LABEL (origin_button_label), "");
+
+ gtk_widget_show (origin_box);
+}
+
+static void
+origin_popover_row_activated_cb (GtkListBox *list_box,
+ GtkListBoxRow *row,
+ gpointer user_data)
+{
+ GsDetailsPage *self = GS_DETAILS_PAGE (user_data);
+ GsApp *app;
+ GtkWidget *popover;
+
+ popover = GTK_WIDGET (gtk_builder_get_object (self->builder, "origin_popover"));
+ gtk_popover_popdown (GTK_POPOVER (popover));
+
+ app = gs_origin_popover_row_get_app (GS_ORIGIN_POPOVER_ROW (row));
+ if (app != self->app)
+ gs_details_page_set_app (self, app);
+}
+
+static void
+gs_details_page_set_alternates (GsDetailsPage *self)
+{
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_GET_ALTERNATES,
+ "interactive", TRUE,
+ "app", self->app,
+ NULL);
+ gs_plugin_loader_job_process_async (self->plugin_loader,
+ plugin_job,
+ self->cancellable,
+ gs_details_page_get_alternates_cb,
+ self);
+}
+
+
static void
gs_details_page_refresh_all (GsDetailsPage *self)
{
@@ -911,6 +1011,9 @@ gs_details_page_refresh_all (GsDetailsPage *self)
gtk_widget_set_visible (self->application_details_summary, FALSE);
}
+ /* set the alternates shown in the header bar */
+ gs_details_page_set_alternates (self);
+
/* set the description */
tmp = gs_app_get_description (self->app);
gs_details_page_set_description (self, tmp);
@@ -2299,6 +2402,7 @@ gs_details_page_setup (GsPage *page,
{
GsDetailsPage *self = GS_DETAILS_PAGE (page);
GtkAdjustment *adj;
+ GtkWidget *origin_popover_list_box;
g_return_val_if_fail (GS_IS_DETAILS_PAGE (self), TRUE);
@@ -2367,6 +2471,10 @@ gs_details_page_setup (GsPage *page,
g_signal_connect (self->label_license_nonfree_details, "activate-link",
G_CALLBACK (gs_details_page_activate_link_cb),
self);
+ origin_popover_list_box = GTK_WIDGET (gtk_builder_get_object (self->builder,
"origin_popover_list_box"));
+ g_signal_connect (origin_popover_list_box, "row-activated",
+ G_CALLBACK (origin_popover_row_activated_cb),
+ self);
adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_details));
gtk_container_set_focus_vadjustment (GTK_CONTAINER (self->box_details), adj);
diff --git a/src/gs-origin-popover-row.c b/src/gs-origin-popover-row.c
new file mode 100644
index 00000000..ba75f502
--- /dev/null
+++ b/src/gs-origin-popover-row.c
@@ -0,0 +1,153 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2018 Kalev Lember <klember redhat com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include "gs-origin-popover-row.h"
+
+#include <glib/gi18n.h>
+
+typedef struct
+{
+ GsApp *app;
+ GtkWidget *name_label;
+ GtkWidget *url_box;
+ GtkWidget *url_label;
+ GtkWidget *format_box;
+ GtkWidget *format_label;
+ GtkWidget *selected_image;
+} GsOriginPopoverRowPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsOriginPopoverRow, gs_origin_popover_row, GTK_TYPE_LIST_BOX_ROW)
+
+static void
+refresh_ui (GsOriginPopoverRow *row)
+{
+ GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row);
+ const gchar *origin_ui = NULL;
+ const gchar *url;
+ AsBundleKind bundle_kind;
+ g_autoptr(GsOsRelease) os_release = NULL;
+
+ g_assert (GS_IS_ORIGIN_POPOVER_ROW (row));
+ g_assert (GS_IS_APP (priv->app));
+
+ /* use the distro name for official packages */
+ if (gs_app_has_quirk (priv->app, AS_APP_QUIRK_PROVENANCE)) {
+ os_release = gs_os_release_new (NULL);
+ if (os_release != NULL)
+ origin_ui = gs_os_release_get_name (os_release);
+ }
+
+ /* fall back to origin */
+ if (origin_ui == NULL)
+ origin_ui = gs_app_get_origin (priv->app);
+
+ if (origin_ui != NULL) {
+ gtk_label_set_text (GTK_LABEL (priv->name_label), origin_ui);
+ }
+
+ url = gs_app_get_origin_hostname (priv->app);
+ if (url != NULL) {
+ gtk_label_set_text (GTK_LABEL (priv->url_label), url);
+ gtk_widget_show (priv->url_box);
+ } else {
+ gtk_widget_hide (priv->url_box);
+ }
+
+ bundle_kind = gs_app_get_bundle_kind (priv->app);
+ if (bundle_kind != AS_BUNDLE_KIND_UNKNOWN) {
+ gtk_label_set_text (GTK_LABEL (priv->format_label), as_bundle_kind_to_string (bundle_kind));
+ gtk_widget_show (priv->format_box);
+ } else {
+ gtk_widget_hide (priv->format_box);
+ }
+}
+
+static void
+gs_origin_popover_row_set_app (GsOriginPopoverRow *row, GsApp *app)
+{
+ GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row);
+
+ g_assert (priv->app == NULL);
+
+ priv->app = g_object_ref (app);
+ refresh_ui (row);
+}
+
+GsApp *
+gs_origin_popover_row_get_app (GsOriginPopoverRow *row)
+{
+ GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row);
+ return priv->app;
+}
+
+void
+gs_origin_popover_row_set_selected (GsOriginPopoverRow *row, gboolean selected)
+{
+ GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row);
+
+ gtk_widget_set_visible (priv->selected_image, selected);
+}
+
+static void
+gs_origin_popover_row_destroy (GtkWidget *object)
+{
+ GsOriginPopoverRow *row = GS_ORIGIN_POPOVER_ROW (object);
+ GsOriginPopoverRowPrivate *priv = gs_origin_popover_row_get_instance_private (row);
+
+ g_clear_object (&priv->app);
+
+ GTK_WIDGET_CLASS (gs_origin_popover_row_parent_class)->destroy (object);
+}
+
+static void
+gs_origin_popover_row_init (GsOriginPopoverRow *row)
+{
+ gtk_widget_init_template (GTK_WIDGET (row));
+}
+
+static void
+gs_origin_popover_row_class_init (GsOriginPopoverRowClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ widget_class->destroy = gs_origin_popover_row_destroy;
+
+ gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/Software/gs-origin-popover-row.ui");
+
+ gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, name_label);
+ gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, url_box);
+ gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, url_label);
+ gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, format_box);
+ gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, format_label);
+ gtk_widget_class_bind_template_child_private (widget_class, GsOriginPopoverRow, selected_image);
+}
+
+GtkWidget *
+gs_origin_popover_row_new (GsApp *app)
+{
+ GsOriginPopoverRow *row = g_object_new (GS_TYPE_ORIGIN_POPOVER_ROW, NULL);
+ gs_origin_popover_row_set_app (row, app);
+ return GTK_WIDGET (row);
+}
+
+/* vim: set noexpandtab: */
diff --git a/src/gs-origin-popover-row.h b/src/gs-origin-popover-row.h
new file mode 100644
index 00000000..3c721fbf
--- /dev/null
+++ b/src/gs-origin-popover-row.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2018 Kalev Lember <klember redhat com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef GS_ORIGIN_POPOVER_ROW_H
+#define GS_ORIGIN_POPOVER_ROW_H
+
+#include "gnome-software-private.h"
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_ORIGIN_POPOVER_ROW (gs_origin_popover_row_get_type ())
+
+G_DECLARE_DERIVABLE_TYPE (GsOriginPopoverRow, gs_origin_popover_row, GS, ORIGIN_POPOVER_ROW, GtkListBoxRow)
+
+struct _GsOriginPopoverRowClass
+{
+ GtkListBoxRowClass parent_class;
+};
+
+GtkWidget *gs_origin_popover_row_new (GsApp *app);
+GsApp *gs_origin_popover_row_get_app (GsOriginPopoverRow *row);
+void gs_origin_popover_row_set_selected (GsOriginPopoverRow *row,
+ gboolean selected);
+
+G_END_DECLS
+
+#endif /* GS_ORIGIN_POPOVER_ROW_H */
+
+/* vim: set noexpandtab: */
diff --git a/src/gs-origin-popover-row.ui b/src/gs-origin-popover-row.ui
new file mode 100644
index 00000000..90171f52
--- /dev/null
+++ b/src/gs-origin-popover-row.ui
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GsOriginPopoverRow" parent="GtkListBoxRow">
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="margin-top">18</property>
+ <property name="margin-bottom">18</property>
+ <property name="margin-start">18</property>
+ <property name="margin-end">18</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">16</property>
+ <child>
+ <object class="GtkBox" id="vbox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="name_label">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">end</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="url_box">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">URL</property>
+ <style>
+ <class name="app-row-origin-text"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="url_label">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="app-row-origin-text"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="format_box">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" comments="Translators: The packaging format of
the app being installed, e.g. 'RPM' or 'Flatpak'">Format</property>
+ <style>
+ <class name="app-row-origin-text"/>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="format_label">
+ <property name="visible">True</property>
+ <property name="halign">start</property>
+ <property name="ellipsize">end</property>
+ <style>
+ <class name="app-row-origin-text"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="selected_image">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="pixel_size">16</property>
+ <property name="icon_name">object-select-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/gs-shell.c b/src/gs-shell.c
index b5cceede..ca826714 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -264,6 +264,8 @@ gs_shell_change_mode (GsShell *shell,
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "header_selection_menu_button"));
gtk_widget_hide (widget);
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "origin_box"));
+ gtk_widget_hide (widget);
priv->in_mode_change = TRUE;
/* only show the search button in overview and search pages */
diff --git a/src/meson.build b/src/meson.build
index 2ea8f755..ebcaaa98 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -42,6 +42,7 @@ gnome_software_sources = [
'gs-main.c',
'gs-moderate-page.c',
'gs-overview-page.c',
+ 'gs-origin-popover-row.c',
'gs-page.c',
'gs-popular-tile.c',
'gs-prefs-dialog.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]