[gnome-software/eula-dialog] temp commit
- From: Jonathan Kang <jonathankang src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/eula-dialog] temp commit
- Date: Fri, 25 Oct 2019 07:13:24 +0000 (UTC)
commit 46e4726232d0c206f43440cc0ecb737eca21267f
Author: Jonathan Kang <jonathankang gnome org>
Date: Fri Oct 25 08:44:00 2019 +0800
temp commit
src/gnome-software.gresource.xml | 1 +
src/gs-eula-dialog.c | 117 ++++++++++++++++++++++++++++
src/gs-eula-dialog.h | 21 ++++++
src/gs-eula-dialog.ui | 51 +++++++++++++
src/gs-shell.c | 43 +++++++++++
src/gs-task.c | 159 +++++++++++++++++++++++++++++++++++++++
src/gs-task.h | 28 +++++++
src/meson.build | 2 +
8 files changed, 422 insertions(+)
---
diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml
index 2a523021..b5142750 100644
--- a/src/gnome-software.gresource.xml
+++ b/src/gnome-software.gresource.xml
@@ -8,6 +8,7 @@
<file preprocess="xml-stripblanks">gs-category-page.ui</file>
<file preprocess="xml-stripblanks">gs-category-tile.ui</file>
<file preprocess="xml-stripblanks">gs-details-page.ui</file>
+ <file preprocess="xml-stripblanks">gs-eula-dialog.ui</file>
<file preprocess="xml-stripblanks">gs-extras-page.ui</file>
<file preprocess="xml-stripblanks">gs-feature-tile.ui</file>
<file preprocess="xml-stripblanks">gs-first-run-dialog.ui</file>
diff --git a/src/gs-eula-dialog.c b/src/gs-eula-dialog.c
new file mode 100644
index 00000000..edd4ea66
--- /dev/null
+++ b/src/gs-eula-dialog.c
@@ -0,0 +1,117 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <gtk/gtk.h>
+
+#include "gs-eula-dialog.h"
+#include "gs-task.h"
+
+enum
+{
+ CANCEL,
+ AGREE,
+ LAST_SIGNAL
+};
+
+struct _GsEulaDialog
+{
+ /*< private >*/
+ GtkDialog parent_instance;
+};
+
+typedef struct
+{
+ GtkWidget *agree_button;
+ GtkWidget *cancel_button;
+ GtkWidget *details_textview;
+} GsEulaDialogPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsEulaDialog, gs_eula_dialog, GTK_TYPE_DIALOG)
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+void
+gs_eula_dialog_populate_license_agreement (GsEulaDialog *self,
+ const gchar *license_agreement)
+{
+ g_autoptr(GtkTextBuffer) buffer = NULL;
+ GsEulaDialogPrivate *priv;
+
+ priv = gs_eula_dialog_get_instance_private (self);
+
+ buffer = gtk_text_buffer_new (NULL);
+ gtk_text_buffer_insert_at_cursor (buffer,
+ license_agreement, strlen (license_agreement));
+ gtk_text_view_set_buffer (GTK_TEXT_VIEW (priv->details_textview), buffer);
+}
+
+static void
+gs_eula_dialog_response_cb (GtkDialog *dialog,
+ gint response_id,
+ gpointer user_data)
+{
+ GsEulaDialog *self = GS_EULA_DIALOG (dialog);
+
+ if (response_id == GTK_RESPONSE_CANCEL)
+ {
+ g_signal_emit (self, signals[CANCEL], 0);
+ }
+
+ if (response_id == GTK_RESPONSE_ACCEPT)
+ {
+ g_signal_emit (self, signals[AGREE], 0);
+ }
+}
+
+static void
+gs_eula_dialog_class_init (GsEulaDialogClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ signals[CANCEL] = g_signal_new ("cancel",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 0);
+
+ signals[CANCEL] = g_signal_new ("agree",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 0);
+
+ gtk_widget_class_set_template_from_resource (widget_class,
+ "/org/gnome/Software/gs-eula-window.ui");
+ gtk_widget_class_bind_template_child_private (widget_class, GsEulaDialog,
+ agree_button);
+ gtk_widget_class_bind_template_child_private (widget_class, GsEulaDialog,
+ cancel_button);
+ gtk_widget_class_bind_template_child_private (widget_class, GsEulaDialog,
+ details_textview);
+ gtk_widget_class_bind_template_callback (widget_class, gs_eula_dialog_response_cb);
+}
+
+static void
+gs_eula_dialog_init (GsEulaDialog *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+GsEulaDialog *
+gs_eula_dialog_new (void)
+{
+ g_print ("newing a eula dialog\n");
+ return g_object_new (GS_TYPE_EULA_DIALOG, NULL);
+}
diff --git a/src/gs-eula-dialog.h b/src/gs-eula-dialog.h
new file mode 100644
index 00000000..9cd17389
--- /dev/null
+++ b/src/gs-eula-dialog.h
@@ -0,0 +1,21 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_EULA_DIALOG (gs_eula_dialog_get_type ())
+G_DECLARE_FINAL_TYPE (GsEulaDialog, gs_eula_dialog, GS, EULA_DIALOG, GtkWindow)
+
+void gs_eula_dialog_populate_license_agreement (GsEulaDialog *dialog,
+ const gchar *license_agreement);
+GsEulaDialog *gs_eula_dialog_new (void);
+
+G_END_DECLS
diff --git a/src/gs-eula-dialog.ui b/src/gs-eula-dialog.ui
new file mode 100644
index 00000000..b0e93fc6
--- /dev/null
+++ b/src/gs-eula-dialog.ui
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GtkDialog" parent="GtkDialog">
+ <property name="width-request">100</property>
+ <property name="height-request">200</property>
+ <signal name="response" handler="gs_eula_dialog_response_cb"/>
+ <child type="action">
+ <object class="GtkButton" id="cancel_button">
+ <property name="label">Cancel</property>
+ <property name="title" translatable="yes">License Agreement Required</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child type="action">
+ <object class="GtkButton" id="agree_button">
+ <property name="can-default">True</property>
+ <property name="label" translatable="yes">_Accept Agreement</property>
+ <property name="sensitive">False</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="can-focus">False</property>
+ <property name="shadow-type">in</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkTextView" id="details_textview">
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="border-width">6</property>
+ <property name="editable">False</property>
+ <property name="wrap-mode">word</property>
+ <property name="cursor-visible">False</property>
+ <property name="accepts-tab">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="cancel">cancel_button</action-widget>
+ <action-widget response="agree">agree_button</action-widget>
+ </action-widgets>
+ </template>
+</interface>
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 918b794f..84e76da5 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -13,6 +13,7 @@
#include <glib/gi18n.h>
#include "gs-common.h"
+#include "gs-eula-dialog.h"
#include "gs-shell.h"
#include "gs-details-page.h"
#include "gs-installed-page.h"
@@ -25,6 +26,7 @@
#include "gs-extras-page.h"
#include "gs-repos-dialog.h"
#include "gs-prefs-dialog.h"
+#include "gs-task.h"
#include "gs-update-dialog.h"
#include "gs-update-monitor.h"
#include "gs-utils.h"
@@ -66,6 +68,7 @@ typedef struct
gchar *events_info_uri;
gboolean in_mode_change;
GsPage *page;
+ GsTask *task;
} GsShellPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GsShell, gs_shell, G_TYPE_OBJECT)
@@ -127,6 +130,41 @@ gs_shell_get_window (GsShell *shell)
return priv->main_window;
}
+static void
+eula_question_cb (GsTask *task,
+ gpointer user_data)
+{
+ const gchar *package_id;
+ const gchar *vendor_name;
+ const gchar *license_agreement;
+ g_autofree gchar *printable = NULL;
+ g_auto(GStrv) split = NULL;
+ GsEulaDialog *eula_dialog;
+ GsShell *shell;
+ GsShellPrivate *priv;
+
+ g_warning ("eula question cb in gs-shell\n");
+ shell = GS_SHELL (user_data);
+ priv = gs_shell_get_instance_private (shell);
+
+ /* Get needed data from GsTask and populate them to GsEulaDialog. */
+ package_id = gs_task_get_package_id (task);
+ vendor_name = gs_task_get_vendor_name (task);
+ license_agreement = gs_task_get_license_agreement (task);
+ split = pk_package_id_split (package_id);
+ printable = g_markup_printf_escaped ("<b><big>License required for %s by %s</big></b>",
+ split[0], vendor_name);
+
+ eula_dialog = gs_eula_dialog_new ();
+ /* gs_eula_dialog_set_label here. */
+ gs_eula_dialog_populate_license_agreement (eula_dialog,
+ license_agreement);
+
+ gtk_window_set_transient_for (GTK_WINDOW (eula_dialog),
+ priv->main_window);
+ gtk_widget_show (GTK_WIDGET (eula_dialog));
+}
+
void
gs_shell_activate (GsShell *shell)
{
@@ -2040,6 +2078,10 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
/* show loading page, which triggers the initial refresh */
gs_shell_change_mode (shell, GS_SHELL_MODE_LOADING, NULL, TRUE);
+
+ priv->task = gs_task_new ();
+ g_signal_connect (priv->task, "eula-question",
+ G_CALLBACK (eula_question_cb), shell);
}
void
@@ -2224,6 +2266,7 @@ gs_shell_dispose (GObject *object)
g_clear_object (&priv->header_start_widget);
g_clear_object (&priv->header_end_widget);
g_clear_object (&priv->page);
+ g_clear_object (&priv->task);
g_clear_pointer (&priv->pages, g_hash_table_unref);
g_clear_pointer (&priv->events_info_uri, g_free);
g_clear_pointer (&priv->modal_dialogs, g_ptr_array_unref);
diff --git a/src/gs-task.c b/src/gs-task.c
new file mode 100644
index 00000000..bf643e1f
--- /dev/null
+++ b/src/gs-task.c
@@ -0,0 +1,159 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <packagekit-glib2/packagekit.h>
+
+#include "gs-task.h"
+
+enum
+{
+ EULA_QUESTION,
+ LAST_SIGNAL
+};
+
+struct _GsTask
+{
+ /*< private >*/
+ PkTask parent_instance;
+};
+
+typedef struct
+{
+ gchar *package_id;
+ gchar *vendor_name;
+ gchar *license_agreement;
+ guint request;
+} GsTaskPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsTask, gs_task, PK_TYPE_TASK)
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+const gchar *
+gs_task_get_package_id (GsTask *self)
+{
+ GsTaskPrivate *priv;
+
+ g_return_val_if_fail (GS_IS_TASK (self), NULL);
+
+ priv = gs_task_get_instance_private (self);
+
+ return priv->package_id;
+}
+
+const gchar *
+gs_task_get_vendor_name (GsTask *self)
+{
+ GsTaskPrivate *priv;
+
+ g_return_val_if_fail (GS_IS_TASK (self), NULL);
+
+ priv = gs_task_get_instance_private (self);
+
+ return priv->vendor_name;
+}
+
+const gchar *
+gs_task_get_license_agreement (GsTask *self)
+{
+ GsTaskPrivate *priv;
+
+ g_return_val_if_fail (GS_IS_TASK (self), NULL);
+
+ priv = gs_task_get_instance_private (self);
+
+ return priv->license_agreement;
+}
+
+static void
+gs_task_eula_question (PkTask *task,
+ guint request,
+ PkResults *results)
+{
+ PkEulaRequired *item;
+ g_autoptr(GPtrArray) array = NULL;
+ GsTask *self;
+ GsTaskPrivate *priv;
+
+ g_warning ("eula question\n");
+
+ self = GS_TASK (task);
+ priv = gs_task_get_instance_private (self);
+
+ /* Save the current request. */
+ priv->request = request;
+
+ array = pk_results_get_eula_required_array (results);
+ if (array->len != 1)
+ {
+ g_warning ("array length %u, aborting", array->len);
+ }
+
+ item = g_ptr_array_index (array, 0);
+ g_object_get (item,
+ "package-id", &priv->package_id,
+ "vendor-name", &priv->vendor_name,
+ "license-agreement", &priv->license_agreement,
+ NULL);
+
+ /* Show the eula window here. Emit a signal? */
+ g_signal_emit (GS_TASK (task), signals[EULA_QUESTION], 0);
+}
+
+static void
+gs_task_finalize (GObject *object)
+{
+ GsTask *self;
+ GsTaskPrivate *priv;
+
+ self = GS_TASK (object);
+ priv = gs_task_get_instance_private (self);
+
+ g_free (priv->package_id);
+ g_free (priv->vendor_name);
+ g_free (priv->license_agreement);
+
+ G_OBJECT_CLASS (gs_task_parent_class)->finalize (object);
+}
+
+static void
+gs_task_class_init (GsTaskClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ PkTaskClass *task_class = PK_TASK_CLASS (klass);
+
+ g_warning ("gs task class init\n");
+ object_class->finalize = gs_task_finalize;
+ task_class->eula_question = gs_task_eula_question;
+
+ signals[EULA_QUESTION] = g_signal_new ("eula-question",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 0);
+}
+
+static void
+gs_task_init (GsTask *self)
+{
+ GsTaskPrivate *priv = gs_task_get_instance_private (self);
+
+ priv->package_id = NULL;
+ priv->vendor_name = NULL;
+ priv->license_agreement = NULL;
+}
+
+GsTask *
+gs_task_new (void)
+{
+ g_warning ("newing GsTask \n");
+ return g_object_new (GS_TYPE_TASK, NULL);
+}
diff --git a/src/gs-task.h b/src/gs-task.h
new file mode 100644
index 00000000..e550b99f
--- /dev/null
+++ b/src/gs-task.h
@@ -0,0 +1,28 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <packagekit-glib2/packagekit.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_TASK (gs_task_get_type ())
+G_DECLARE_FINAL_TYPE (GsTask, gs_task, GS, TASK, PkTask)
+
+struct _GsTaskClass
+{
+ PkTaskClass parent_class;
+};
+
+const gchar *gs_task_get_package_id (GsTask *task);
+const gchar *gs_task_get_vendor_name (GsTask *task);
+const gchar *gs_task_get_license_agreement (GsTask *task);
+GsTask *gs_task_new (void);
+
+G_END_DECLS
diff --git a/src/meson.build b/src/meson.build
index 5e18c750..cb438d7f 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -27,6 +27,7 @@ gnome_software_sources = [
'gs-css.c',
'gs-content-rating.c',
'gs-details-page.c',
+ 'gs-eula-dialog.c',
'gs-extras-page.c',
'gs-feature-tile.c',
'gs-first-run-dialog.c',
@@ -59,6 +60,7 @@ gnome_software_sources = [
'gs-shell-search-provider.c',
'gs-star-widget.c',
'gs-summary-tile.c',
+ 'gs-task.c',
'gs-third-party-repo-row.c',
'gs-update-dialog.c',
'gs-update-list.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]