[gnome-initial-setup/shell/4765: 134/362] Add a "Display" page to the FBE



commit 35a6d8e55eb8180ab1e41a099c9343a41868200c
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Thu Aug 7 22:15:41 2014 +0100

    Add a "Display" page to the FBE
    
    Currently, it only allows to toggle overscan/underscan.
    
    [endlessm/eos-shell#3020]

 configure.ac                                       |    1 +
 gnome-initial-setup/Makefile.am                    |    1 +
 gnome-initial-setup/gnome-initial-setup.c          |    3 +
 gnome-initial-setup/pages/Makefile.am              |    1 +
 gnome-initial-setup/pages/display/.gitignore       |    1 +
 gnome-initial-setup/pages/display/Makefile.am      |   27 +++
 .../pages/display/display.gresource.xml            |    7 +
 .../pages/display/gis-display-page.c               |  215 ++++++++++++++++++++
 .../pages/display/gis-display-page.h               |   57 +++++
 .../pages/display/gis-display-page.ui              |   83 ++++++++
 10 files changed, 396 insertions(+), 0 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index a18b192..3d2ead7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -136,6 +136,7 @@ data/Makefile
 gnome-initial-setup/Makefile
 gnome-initial-setup/pages/Makefile
 gnome-initial-setup/pages/language/Makefile
+gnome-initial-setup/pages/display/Makefile
 gnome-initial-setup/pages/endless-eula/Makefile
 gnome-initial-setup/pages/eulas/Makefile
 gnome-initial-setup/pages/account/Makefile
diff --git a/gnome-initial-setup/Makefile.am b/gnome-initial-setup/Makefile.am
index 571b1e0..9b59681 100644
--- a/gnome-initial-setup/Makefile.am
+++ b/gnome-initial-setup/Makefile.am
@@ -33,6 +33,7 @@ gnome_initial_setup_SOURCES = \
 gnome_initial_setup_LDADD =    \
        pages/language/libgislanguage.la \
        pages/keyboard/libgiskeyboard.la \
+       pages/display/libgisdisplay.la \
        pages/endless-eula/libgisendlesseula.la \
        pages/eulas/libgiseulas.la \
        pages/network/libgisnetwork.la \
diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c
index 9b706b2..3fb676f 100644
--- a/gnome-initial-setup/gnome-initial-setup.c
+++ b/gnome-initial-setup/gnome-initial-setup.c
@@ -42,6 +42,7 @@
 
 #include "pages/language/gis-language-page.h"
 #include "pages/keyboard/gis-keyboard-page.h"
+#include "pages/display/gis-display-page.h"
 #include "pages/endless-eula/gis-endless-eula-page.h"
 #include "pages/eulas/gis-eula-pages.h"
 #include "pages/network/gis-network-page.h"
@@ -55,6 +56,7 @@
 static gboolean force_new_user_mode;
 static const gchar *system_setup_pages[] = {
     "account",
+    "display",
     "endless_eula",
     "location"
 };
@@ -71,6 +73,7 @@ typedef struct {
 static PageData page_table[] = {
   PAGE (language),
   PAGE (keyboard),
+  PAGE (display),
   PAGE (eula),
   PAGE (endless_eula),
   PAGE (network),
diff --git a/gnome-initial-setup/pages/Makefile.am b/gnome-initial-setup/pages/Makefile.am
index 033a9c1..17286db 100644
--- a/gnome-initial-setup/pages/Makefile.am
+++ b/gnome-initial-setup/pages/Makefile.am
@@ -2,6 +2,7 @@
 SUBDIRS = \
        language \
        keyboard \
+       display \
        endless-eula \
        eulas \
        network \
diff --git a/gnome-initial-setup/pages/display/.gitignore b/gnome-initial-setup/pages/display/.gitignore
new file mode 100644
index 0000000..c8443cc
--- /dev/null
+++ b/gnome-initial-setup/pages/display/.gitignore
@@ -0,0 +1 @@
+display-resources.[ch]
diff --git a/gnome-initial-setup/pages/display/Makefile.am b/gnome-initial-setup/pages/display/Makefile.am
new file mode 100644
index 0000000..e3fade8
--- /dev/null
+++ b/gnome-initial-setup/pages/display/Makefile.am
@@ -0,0 +1,27 @@
+
+noinst_LTLIBRARIES = libgisdisplay.la
+
+AM_CPPFLAGS = \
+       $(INITIAL_SETUP_CFLAGS) \
+       -DGNOME_DESKTOP_USE_UNSTABLE_API=1 \
+       -DLOCALSTATEDIR="\"$(localstatedir)\"" \
+       -DUIDIR="\"$(uidir)\""
+
+BUILT_SOURCES =
+
+resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) --generate-dependencies 
$(srcdir)/display.gresource.xml)
+display-resources.c: display.gresource.xml $(resource_files)
+       $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-source $<
+display-resources.h: display.gresource.xml $(resource_files)
+       $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-header $<
+BUILT_SOURCES += display-resources.c display-resources.h
+
+libgisdisplay_la_SOURCES =                     \
+       gis-display-page.c gis-display-page.h   \
+       $(BUILT_SOURCES)
+
+libgisdisplay_la_CFLAGS = $(INITIAL_SETUP_CFLAGS) -I "$(srcdir)/../.."
+libgisdisplay_la_LIBADD = $(INITIAL_SETUP_LIBS)
+libgisdisplay_la_LDFLAGS = -export_dynamic -avoid-version -module -no-undefined
+
+EXTRA_DIST = display.gresource.xml $(resource_files)
diff --git a/gnome-initial-setup/pages/display/display.gresource.xml 
b/gnome-initial-setup/pages/display/display.gresource.xml
new file mode 100644
index 0000000..c502aef
--- /dev/null
+++ b/gnome-initial-setup/pages/display/display.gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/initial-setup">
+    <file preprocess="xml-stripblanks" alias="gis-display-page.ui">gis-display-page.ui</file>
+  </gresource>
+</gresources>
+
diff --git a/gnome-initial-setup/pages/display/gis-display-page.c 
b/gnome-initial-setup/pages/display/gis-display-page.c
new file mode 100644
index 0000000..37c3da0
--- /dev/null
+++ b/gnome-initial-setup/pages/display/gis-display-page.c
@@ -0,0 +1,215 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2014 Endless Mobile, Inc.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ *     Emmanuele Bassi <emmanuele endlessm com>
+ */
+
+/* Display page {{{1 */
+
+#define PAGE_ID "display"
+
+#include "config.h"
+#include "gis-display-page.h"
+
+#include "display-resources.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <libgnome-desktop/gnome-rr.h>
+#include <libgnome-desktop/gnome-rr-config.h>
+
+typedef struct {
+  GnomeRRScreen *screen;
+  GnomeRRConfig *current_config;
+  GnomeRROutputInfo *current_output;
+} GisDisplayPagePrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GisDisplayPage, gis_display_page, GIS_TYPE_PAGE);
+
+#define OBJ(type,name) ((type)gtk_builder_get_object(GIS_PAGE(page)->builder,(name)))
+#define WID(name) OBJ(GtkWidget*,name)
+
+static void
+read_screen_config (GisDisplayPage *page)
+{
+  GisDisplayPagePrivate *priv = gis_display_page_get_instance_private (page);
+  GnomeRRConfig *current;
+  GnomeRROutputInfo **outputs;
+  GnomeRROutputInfo *output;
+  GtkWidget *check_button;
+  int i;
+
+  gnome_rr_screen_refresh (priv->screen, NULL);
+
+  g_clear_object (&priv->current_config);
+
+  current = gnome_rr_config_new_current (priv->screen, NULL);
+  gnome_rr_config_ensure_primary (current);
+  priv->current_config = current;
+
+  outputs = gnome_rr_config_get_outputs (current);
+  output = NULL;
+
+  /* we take the primary and active display */
+  for (i = 0; outputs[i] != NULL; i++)
+    {
+      if (gnome_rr_output_info_is_active (outputs[i]) &&
+          gnome_rr_output_info_get_primary (outputs[i]))
+        {
+          output = outputs[i];
+          break;
+        }
+    }
+
+  check_button = WID ("overscan_checkbutton");
+
+  priv->current_output = output;
+  if (priv->current_output == NULL)
+    {
+      GtkWidget *label, *widget;
+
+      gtk_widget_hide (check_button);
+
+      /* Translators note: this is the same label we use in the
+       * Display page of the system settings
+       */
+      label = gtk_label_new (_("Could not get screen information"));
+      widget = WID ("box2");
+      gtk_container_add (GTK_CONTAINER (widget), label);
+      gtk_widget_show (label);
+
+      return;
+    }
+
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
+                                gnome_rr_output_info_get_underscanning (output));
+
+
+}
+
+static void
+toggle_overscan (GisDisplayPage *page)
+{
+  GisDisplayPagePrivate *priv = gis_display_page_get_instance_private (page);
+  GtkWidget *check = WID ("overscan_checkbutton");
+  gboolean value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check));
+  GError *error;
+
+  gnome_rr_output_info_set_underscanning (priv->current_output, value);
+
+  gnome_rr_config_sanitize (priv->current_config);
+  gnome_rr_config_ensure_primary (priv->current_config);
+
+  error = NULL;
+  gnome_rr_config_apply_persistent (priv->current_config, priv->screen, &error);
+
+  if (error != NULL)
+    {
+      g_warning ("Error applying configuration: %s", error->message);
+      g_error_free (error);
+    }
+}
+
+static void
+gis_display_page_dispose (GObject *gobject)
+{
+  GisDisplayPage *page = GIS_DISPLAY_PAGE (gobject);
+  GisDisplayPagePrivate *priv = gis_display_page_get_instance_private (page);
+
+  g_clear_object (&priv->current_config);
+  g_clear_object (&priv->screen);
+
+  G_OBJECT_CLASS (gis_display_page_parent_class)->dispose (gobject);
+}
+
+static void
+gis_display_page_constructed (GObject *object)
+{
+  GisDisplayPage *page = GIS_DISPLAY_PAGE (object);
+  GisDisplayPagePrivate *priv = gis_display_page_get_instance_private (page);
+  GError *error = NULL;
+  GtkWidget *widget;
+
+  G_OBJECT_CLASS (gis_display_page_parent_class)->constructed (object);
+
+  gtk_container_add (GTK_CONTAINER (page), WID ("display-page"));
+  gtk_widget_show (GTK_WIDGET (page));
+
+  /* the page is always complete */
+  gis_page_set_complete (GIS_PAGE (page), TRUE);
+
+  priv->screen = gnome_rr_screen_new (gdk_screen_get_default (), NULL);
+  if (priv->screen == NULL)
+    {
+      GtkWidget *label;
+
+      widget = WID ("overscan_checkbutton");
+      gtk_widget_hide (widget);
+
+      /* Translators note: this is the same label we use in the
+       * Display page of the system settings
+       */
+      label = gtk_label_new (_("Could not get screen information"));
+      widget = WID ("box2");
+      gtk_container_add (GTK_CONTAINER (widget), label);
+      gtk_widget_show (label);
+
+      return;
+    }
+
+  read_screen_config (page);
+
+  widget = WID ("overscan_checkbutton");
+  g_signal_connect_swapped (widget, "toggled",
+                            G_CALLBACK (toggle_overscan),
+                            page);
+}
+
+static void
+gis_display_page_locale_changed (GisPage *page)
+{
+  gis_page_set_title (page, _("Display"));
+}
+
+static void
+gis_display_page_class_init (GisDisplayPageClass *klass)
+{
+  GisPageClass *page_class = GIS_PAGE_CLASS (klass);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  page_class->page_id = PAGE_ID;
+  page_class->locale_changed = gis_display_page_locale_changed;
+  object_class->constructed = gis_display_page_constructed;
+  object_class->dispose = gis_display_page_dispose;
+}
+
+static void
+gis_display_page_init (GisDisplayPage *page)
+{
+}
+
+void
+gis_prepare_display_page (GisDriver *driver)
+{
+  gis_driver_add_page (driver,
+                       g_object_new (GIS_TYPE_DISPLAY_PAGE,
+                                     "driver", driver,
+                                     NULL));
+}
diff --git a/gnome-initial-setup/pages/display/gis-display-page.h 
b/gnome-initial-setup/pages/display/gis-display-page.h
new file mode 100644
index 0000000..6fba18a
--- /dev/null
+++ b/gnome-initial-setup/pages/display/gis-display-page.h
@@ -0,0 +1,57 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2014 Endless Mobile, Inc
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ *     Emmanuele Bassi <emmanuele endlessm com>
+ */
+
+#ifndef __GIS_DISPLAY_PAGE_H__
+#define __GIS_DISPLAY_PAGE_H__
+
+#include "gnome-initial-setup.h"
+
+G_BEGIN_DECLS
+
+#define GIS_TYPE_DISPLAY_PAGE                   (gis_display_page_get_type ())
+#define GIS_DISPLAY_PAGE(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIS_TYPE_DISPLAY_PAGE, 
GisDisplayPage))
+#define GIS_DISPLAY_PAGE_CLASS(klass)           (G_TYPE_CHECK_CLASS_CAST ((klass),  GIS_TYPE_DISPLAY_PAGE, 
GisDisplayPageClass))
+#define GIS_IS_DISPLAY_PAGE(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIS_TYPE_DISPLAY_PAGE))
+#define GIS_IS_DISPLAY_PAGE_CLASS(klass)        (G_TYPE_CHECK_CLASS_TYPE ((klass),  GIS_TYPE_DISPLAY_PAGE))
+#define GIS_DISPLAY_PAGE_GET_CLASS(obj)         (G_TYPE_INSTANCE_GET_CLASS ((obj),  GIS_TYPE_DISPLAY_PAGE, 
GisDisplayPageClass))
+
+typedef struct _GisDisplayPage        GisDisplayPage;
+typedef struct _GisDisplayPageClass   GisDisplayPageClass;
+
+struct _GisDisplayPage
+{
+  GisPage parent;
+};
+
+struct _GisDisplayPageClass
+{
+  GisPageClass parent_class;
+};
+
+GType gis_display_page_get_type (void);
+
+void gis_prepare_display_page (GisDriver *driver);
+
+G_END_DECLS
+
+#endif /* __GIS_DISPLAY_PAGE_H__ */
diff --git a/gnome-initial-setup/pages/display/gis-display-page.ui 
b/gnome-initial-setup/pages/display/gis-display-page.ui
new file mode 100644
index 0000000..9f1c700
--- /dev/null
+++ b/gnome-initial-setup/pages/display/gis-display-page.ui
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+  <requires lib="gtk+" version="3.0"/>
+  <object class="GtkGrid" id="display-page">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="halign">center</property>
+    <property name="vexpand">True</property>
+    <property name="orientation">vertical</property>
+    <property name="row_spacing">6</property>
+    <child>
+      <object class="GtkBox" id="box2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="halign">baseline</property>
+        <property name="valign">start</property>
+        <property name="vexpand">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">6</property>
+        <child>
+          <object class="GtkLabel" id="label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="halign">start</property>
+            <property name="valign">start</property>
+            <property name="label" translatable="yes">Display</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+              <attribute name="scale" value="1.2"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="halign">start</property>
+            <property name="label" translatable="yes">Endless can be used with computer monitors or 
television sets. If you have a television set you may need to adjust it to see the full contents of the 
screen.</property>
+            <property name="wrap">True</property>
+            <property name="width_chars">50</property>
+            <property name="max_width_chars">50</property>
+            <attributes>
+              <attribute name="scale" value="0.82999999999999996"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkCheckButton" id="overscan_checkbutton">
+            <property name="label" translatable="yes">Are you using Endless with a television set?</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">False</property>
+            <property name="xalign">0</property>
+            <property name="draw_indicator">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="left_attach">0</property>
+        <property name="top_attach">0</property>
+      </packing>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+  </object>
+</interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]