[gtk+/resolution-independence: 7/24] add "Resolution Independence" item to gtk-demo and turn on RI



commit 151e5c58a8b8e7d56175b8a9cbc715e1928fde16
Author: David Zeuthen <davidz redhat com>
Date:   Tue Aug 12 18:33:02 2008 -0400

    add "Resolution Independence" item to gtk-demo and turn on RI
    
    Now that most core widgets support RI, add a demo so it's easy to test
    RI.
---
 demos/gtk-demo/Makefile.am               |    1 +
 demos/gtk-demo/main.c                    |    1 +
 demos/gtk-demo/resolution_independence.c |  216 ++++++++++++++++++++++++++++++
 3 files changed, 218 insertions(+), 0 deletions(-)

diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am
index 46ebc03..d11c7ec 100644
--- a/demos/gtk-demo/Makefile.am
+++ b/demos/gtk-demo/Makefile.am
@@ -29,6 +29,7 @@ demos =						\
 	pickers.c				\
 	pixbufs.c				\
 	printing.c				\
+	resolution_independence.c		\
 	rotated_text.c				\
 	search_entry.c				\
 	sizegroup.c				\
diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c
index c7492ef..bfdf69f 100644
--- a/demos/gtk-demo/main.c
+++ b/demos/gtk-demo/main.c
@@ -946,6 +946,7 @@ main (int argc, char **argv)
     }
   /* -- End of hack -- */
   
+  gtk_enable_resolution_independence ();
   gtk_init (&argc, &argv);
 
   setup_default_icon ();
diff --git a/demos/gtk-demo/resolution_independence.c b/demos/gtk-demo/resolution_independence.c
new file mode 100644
index 0000000..09f9252
--- /dev/null
+++ b/demos/gtk-demo/resolution_independence.c
@@ -0,0 +1,216 @@
+/* Resolution Independence
+ *
+ * This demonstates resolution independence features available since
+ * version 2.14 of GTK+. Use the slider to change the effective DPI
+ * per monitor. Note that the changes will only affect windows from
+ * this process.
+ */
+#include <gtk/gtk.h>
+#include "config.h"
+#include "demo-common.h"
+
+static GtkWidget *window = NULL;
+static GtkWindowGroup *window_group = NULL;
+static GtkWidget *hscale;
+static GtkWidget *label;
+
+#define MIN_DPI 24.0
+#define MAX_DPI 480.0
+#define STEP_DPI 1.0
+
+static void
+update (void)
+{
+  GdkScreen *screen;
+  gint monitor_num;
+  char *plug_name;
+  char *s;
+  gdouble dpi;
+  char *font_name;
+  GtkSettings *settings;
+  int width_mm;
+  int height_mm;
+  GdkRectangle geometry;
+
+  plug_name = NULL;
+  font_name = NULL;
+  width_mm = -1;
+  height_mm = -1;
+  geometry.x = -1;
+  geometry.y = -1;
+  geometry.width = -1;
+  geometry.height = -1;
+
+  screen = gtk_window_get_screen (GTK_WINDOW (window));
+  monitor_num = gtk_widget_get_monitor_num (window);
+  if (screen != NULL && monitor_num >= 0)
+    {
+      plug_name = gdk_screen_get_monitor_plug_name (screen, monitor_num);
+      width_mm = gdk_screen_get_monitor_width_mm (screen, monitor_num);
+      height_mm = gdk_screen_get_monitor_width_mm (screen, monitor_num);
+      gdk_screen_get_monitor_geometry (screen, monitor_num, &geometry);
+    }
+  if (screen != NULL)
+    settings = gtk_settings_get_for_screen (screen);
+  else
+    settings = gtk_settings_get_default ();
+  g_object_get (settings, "gtk-font-name", &font_name, NULL);
+
+  s = g_strdup_printf ("Monitor %d (%s) @ %dx%d+%d+%d\n"
+                       "%d mm x %d mm\n"
+                       "Font \"%s\"\n"
+                       "1 em -> %g pixels\n"
+                       "1 mm -> %g pixels",
+                       monitor_num,
+                       plug_name != NULL ? plug_name : "unknown name",
+                       geometry.width, geometry.height, geometry.x, geometry.y,
+                       width_mm, height_mm,
+                       font_name,
+                       gtk_size_to_pixel_double (screen, monitor_num, gtk_size_em (1.0)),
+                       gtk_size_to_pixel_double (screen, monitor_num, gtk_size_mm (1.0)));
+  gtk_label_set_text (GTK_LABEL (label), s);
+  g_free (s);
+
+  dpi = -1;
+  if (screen != NULL)
+    {
+      dpi = gdk_screen_get_resolution_for_monitor (screen, monitor_num);
+      gtk_range_set_value (GTK_RANGE (hscale), dpi);
+    }
+
+  g_free (plug_name);
+  g_free (font_name);
+}
+
+static void
+window_mapped (GtkWidget *widget, gpointer user_data)
+{
+  update ();
+}
+
+static void
+unit_changed (GtkWidget *widget, gpointer user_data)
+{
+  update ();
+}
+
+static void
+monitor_num_notify (GtkWindow *window, GParamSpec *psec, gpointer user_data)
+{
+  g_debug ("notify::monitor-num");
+  update ();
+}
+
+static void
+update_value (void)
+{
+  gdouble slider_value;
+
+  slider_value = gtk_range_get_value (GTK_RANGE (hscale));
+  if (slider_value >= MIN_DPI && slider_value <= MAX_DPI)
+    {
+      GdkScreen *screen;
+      gint monitor_num;
+
+      screen = gtk_window_get_screen (GTK_WINDOW (window));
+      monitor_num = gtk_widget_get_monitor_num (window);
+      if (screen != NULL && monitor_num >= 0)
+        {
+          gdk_screen_set_resolution_for_monitor (screen, monitor_num, slider_value);
+          g_signal_emit_by_name (screen, "monitors-changed");
+        }
+    }
+}
+
+static gboolean is_pressed = FALSE;
+
+static gboolean
+hscale_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+  is_pressed = TRUE;
+  return FALSE;
+}
+
+static gboolean
+hscale_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+  is_pressed = FALSE;
+  update_value ();
+  return FALSE;
+}
+
+static void
+hscale_value_changed (GtkRange *range, gpointer user_data)
+{
+  if (!is_pressed)
+    update_value ();
+}
+
+static char *
+hscale_format_value (GtkScale *scale, gdouble value, gpointer user_data)
+{
+  return g_strdup_printf ("%g DPI", value);
+}
+
+GtkWidget *
+do_resolution_independence (GtkWidget *do_widget)
+{
+  GtkWidget *vbox;
+
+  if (window != NULL)
+    goto have_window;
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (do_widget));
+  gtk_window_set_title (GTK_WINDOW (window), "Resolution Independence");
+  gtk_window_set_icon_name (GTK_WINDOW (window), "gtk-fullscreen");
+
+  g_signal_connect (G_OBJECT (window), "map", G_CALLBACK (window_mapped), NULL);
+  g_signal_connect (G_OBJECT (window), "notify::monitor-num", G_CALLBACK (monitor_num_notify), NULL);
+  g_signal_connect (G_OBJECT (window), "unit-changed", G_CALLBACK (unit_changed), NULL);
+
+  g_signal_connect (window, "destroy",
+                    G_CALLBACK (gtk_widget_destroyed),
+                    &window);
+
+  vbox = gtk_vbox_new (FALSE, gtk_size_em (1));
+
+  label = gtk_label_new (NULL);
+  gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+  hscale = gtk_hscale_new_with_range (MIN_DPI, MAX_DPI, STEP_DPI);
+  gtk_box_pack_start (GTK_BOX (vbox), hscale, FALSE, FALSE, 0);
+
+  g_signal_connect (G_OBJECT (hscale), "value-changed", G_CALLBACK (hscale_value_changed), NULL);
+  g_signal_connect (G_OBJECT (hscale), "button-press-event", G_CALLBACK (hscale_button_press_event), NULL);
+  g_signal_connect (G_OBJECT (hscale), "button-release-event", G_CALLBACK (hscale_button_release_event), NULL);
+  g_signal_connect (G_OBJECT (hscale), "format-value", G_CALLBACK (hscale_format_value), NULL);
+
+  gtk_container_add (GTK_CONTAINER (window), vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (window), gtk_size_em (1));
+  gtk_widget_set_size_request (window, GTK_SIZE_ONE_TWELFTH_EM (500), -1);
+  gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
+
+  /* avoid dialogs (e.g. printing) grabbing focus from us */
+  if (window_group == NULL)
+    window_group = gtk_window_group_new ();
+  gtk_window_group_add_window (window_group, GTK_WINDOW (window));
+
+  /* make sure we're on top */
+  gtk_window_set_keep_above (GTK_WINDOW (window), TRUE);
+
+ have_window:
+
+  if (!GTK_WIDGET_VISIBLE (window))
+    {
+      gtk_widget_show_all (window);
+    }
+  else
+    {
+      gtk_widget_destroy (window);
+      window = NULL;
+    }
+
+  return window;
+}



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