[metacity] theme-viewer: add option to change scale



commit fa3ae8ef2bca601e6fdc0c2e4edd3265b0aca665
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Apr 2 19:12:35 2017 +0300

    theme-viewer: add option to change scale

 data/ui/theme-viewer-window.ui     |  157 +++++++++++++++++++++++-------------
 theme-viewer/theme-viewer-window.c |   66 +++++++++++++++-
 2 files changed, 167 insertions(+), 56 deletions(-)
---
diff --git a/data/ui/theme-viewer-window.ui b/data/ui/theme-viewer-window.ui
index 133892d..79637ad 100644
--- a/data/ui/theme-viewer-window.ui
+++ b/data/ui/theme-viewer-window.ui
@@ -2,6 +2,68 @@
 <!-- Generated with glade 3.20.0 -->
 <interface domain="metacity">
   <requires lib="gtk+" version="3.20"/>
+  <object class="GtkHeaderBar" id="header_bar">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="show_close_button">True</property>
+    <child type="title">
+      <object class="GtkBox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkComboBoxText" id="type_combo_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="active">0</property>
+            <items>
+              <item>GTK+</item>
+              <item>Metacity</item>
+            </items>
+            <signal name="changed" handler="type_combo_box_changed_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkComboBoxText" id="theme_combo_box">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <signal name="changed" handler="theme_combo_box_changed_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton" id="reload_button">
+            <property name="label" translatable="yes">Reload</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <signal name="clicked" handler="reload_button_clicked_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkAdjustment" id="scale_adjustment">
+    <property name="lower">1</property>
+    <property name="upper">4</property>
+    <property name="value">1</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">1</property>
+  </object>
   <template class="ThemeViewerWindow" parent="GtkWindow">
     <property name="can_focus">False</property>
     <property name="default_width">1024</property>
@@ -305,6 +367,46 @@
                         <property name="position">4</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">3</property>
+                        <child>
+                          <object class="GtkLabel">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="halign">start</property>
+                            <property name="label" translatable="yes">Scale:</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkSpinButton" id="scale_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="adjustment">scale_adjustment</property>
+                            <property name="value">1</property>
+                            <signal name="value-changed" handler="scale_changed_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">5</property>
+                      </packing>
+                    </child>
                   </object>
                 </child>
               </object>
@@ -520,59 +622,4 @@
       <placeholder/>
     </child>
   </template>
-  <object class="GtkHeaderBar" id="header_bar">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="show_close_button">True</property>
-    <child type="title">
-      <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="spacing">10</property>
-        <child>
-          <object class="GtkComboBoxText" id="type_combo_box">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="active">0</property>
-            <items>
-              <item>GTK+</item>
-              <item>Metacity</item>
-            </items>
-            <signal name="changed" handler="type_combo_box_changed_cb" swapped="no"/>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkComboBoxText" id="theme_combo_box">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <signal name="changed" handler="theme_combo_box_changed_cb" swapped="no"/>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkButton" id="reload_button">
-            <property name="label" translatable="yes">Reload</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <signal name="clicked" handler="reload_button_clicked_cb" swapped="no"/>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-  </object>
 </interface>
diff --git a/theme-viewer/theme-viewer-window.c b/theme-viewer/theme-viewer-window.c
index 6d526d7..56b8d7f 100644
--- a/theme-viewer/theme-viewer-window.c
+++ b/theme-viewer/theme-viewer-window.c
@@ -56,6 +56,9 @@ struct _ThemeViewerWindow
   const gchar      *theme_variant;
   gboolean          composited;
 
+  GtkWidget        *scale_button;
+  gint              scale;
+
   MetaFrameType     frame_type;
   MetaFrameFlags    frame_flags;
 
@@ -76,6 +79,22 @@ struct _ThemeViewerWindow
 
 G_DEFINE_TYPE (ThemeViewerWindow, theme_viewer_window, GTK_TYPE_WINDOW)
 
+static gint
+get_screen_scale (void)
+{
+  GValue value = G_VALUE_INIT;
+  GdkScreen *screen;
+
+  screen = gdk_screen_get_default ();
+
+  g_value_init (&value, G_TYPE_INT);
+
+  if (gdk_screen_get_setting (screen, "gdk-window-scaling-factor", &value))
+    return g_value_get_int (&value);
+  else
+    return 1;
+}
+
 static void
 benchmark_load_time (ThemeViewerWindow *window,
                      MetaTheme         *theme,
@@ -301,12 +320,16 @@ get_icon (gint size)
 static void
 get_client_width_and_height (GtkWidget         *widget,
                              ThemeViewerWindow *window,
+                             gint               screen_scale,
                              gint              *width,
                              gint              *height)
 {
   *width = gtk_widget_get_allocated_width (widget) - PADDING * 2;
   *height = gtk_widget_get_allocated_height (widget) - PADDING * 2;
 
+  *width /= 1.0 / screen_scale;
+  *height /= 1.0 / screen_scale;
+
   *width -= window->borders.total.left + window->borders.total.right;
   *height -= window->borders.total.top + window->borders.total.bottom;
 }
@@ -323,6 +346,7 @@ update_button_state (MetaButtonType type,
   GdkDevice *device;
   gint x;
   gint y;
+  gint screen_scale;
 
   window = THEME_VIEWER_WINDOW (user_data);
   state = META_BUTTON_STATE_NORMAL;
@@ -337,6 +361,10 @@ update_button_state (MetaButtonType type,
   x -= PADDING;
   y -= PADDING;
 
+  screen_scale = get_screen_scale ();
+  x /= 1.0 / screen_scale;
+  y /= 1.0 / screen_scale;
+
   if (x >= rect.x && x < (rect.x + rect.width) &&
       y >= rect.y && y < (rect.y + rect.height))
     {
@@ -662,6 +690,7 @@ theme_combo_box_changed_cb (GtkComboBox       *combo_box,
 
   meta_theme_load (window->theme, theme, NULL);
   meta_theme_set_composited (window->theme, window->composited);
+  meta_theme_set_scale (window->theme, window->scale);
 
   update_frame_flags (window);
   update_button_layout (window);
@@ -700,6 +729,7 @@ theme_box_draw_cb (GtkWidget         *widget,
                    cairo_t           *cr,
                    ThemeViewerWindow *window)
 {
+  gint screen_scale;
   gint client_width;
   gint client_height;
 
@@ -710,7 +740,9 @@ theme_box_draw_cb (GtkWidget         *widget,
   cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
   theme_box_draw_grid (widget, cr);
 
-  get_client_width_and_height (widget, window, &client_width, &client_height);
+  screen_scale = get_screen_scale ();
+  get_client_width_and_height (widget, window, screen_scale,
+                               &client_width, &client_height);
 
   if (!window->mini_icon)
     window->mini_icon = get_icon (MINI_ICON_SIZE);
@@ -719,12 +751,18 @@ theme_box_draw_cb (GtkWidget         *widget,
     window->icon = get_icon (ICON_SIZE);
 
   cairo_translate (cr, PADDING, PADDING);
+
+  cairo_save (cr);
+  cairo_scale (cr, 1.0 / screen_scale, 1.0 / screen_scale);
+
   meta_theme_draw_frame (window->theme, window->theme_variant, cr,
                          window->frame_type, window->frame_flags,
                          client_width, client_height, "Metacity Theme Viewer",
                          update_button_state, window,
                          window->mini_icon, window->icon);
 
+  cairo_restore (cr);
+
   return TRUE;
 }
 
@@ -827,6 +865,26 @@ composited_state_set_cb (GtkSwitch         *widget,
 }
 
 static void
+scale_changed_cb (GtkSpinButton     *spin_button,
+                  ThemeViewerWindow *window)
+{
+  gint scale;
+
+  scale = (gint) gtk_spin_button_get_value (spin_button);
+
+  if (window->scale == scale)
+    return;
+
+  window->scale = scale;
+
+  meta_theme_set_scale (window->theme, scale);
+
+  update_frame_borders (window);
+
+  gtk_widget_queue_draw (window->theme_box);
+}
+
+static void
 notebook_switch_page_cb (GtkNotebook       *notebook,
                          GtkWidget         *page,
                          guint              page_num,
@@ -897,6 +955,9 @@ theme_viewer_window_class_init (ThemeViewerWindowClass *window_class)
   gtk_widget_class_bind_template_callback (widget_class, frame_type_combo_box_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, composited_state_set_cb);
 
+  gtk_widget_class_bind_template_child (widget_class, ThemeViewerWindow, scale_button);
+  gtk_widget_class_bind_template_callback (widget_class, scale_changed_cb);
+
   gtk_widget_class_bind_template_callback (widget_class, notebook_switch_page_cb);
 
   gtk_widget_class_bind_template_child (widget_class, ThemeViewerWindow, benchmark_frame);
@@ -912,12 +973,15 @@ static void
 theme_viewer_window_init (ThemeViewerWindow *window)
 {
   window->composited = TRUE;
+  window->scale = get_screen_scale ();
 
   gtk_widget_init_template (GTK_WIDGET (window));
   gtk_window_set_titlebar (GTK_WINDOW (window), window->header_bar);
 
   gtk_widget_add_events (window->theme_box, GDK_POINTER_MOTION_MASK);
 
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON (window->scale_button), window->scale);
+
   type_combo_box_changed_cb (GTK_COMBO_BOX (window->type_combo_box), window);
 
   gtk_label_set_xalign (GTK_LABEL (window->load_time), 0.0);


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