[gtk+/wip/matthiasc/monitor] x11: fill in refresh rate



commit 7901fbfcf5da07933d4255187af8d5a6edf4d261
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Apr 3 20:22:54 2016 -0400

    x11: fill in refresh rate

 gdk/gdkmonitor.c        |    1 -
 gdk/x11/gdkscreen-x11.c |   33 +++++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletions(-)
---
diff --git a/gdk/gdkmonitor.c b/gdk/gdkmonitor.c
index c7190d6..6d04e7d 100644
--- a/gdk/gdkmonitor.c
+++ b/gdk/gdkmonitor.c
@@ -30,7 +30,6 @@
  * - monitor type (laptop, projector, ...)
  * - consider vfuncs instead of baseclass storage
  * - provide a persistent id (if the backend allows)
- * - x11: refresh rate
  * - x11: hidpi scaling
  * - convert win32
  * - convert quartz
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index a022213..4dd68cc 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -525,6 +525,7 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
       GdkX11Monitor *monitor;
       GdkRectangle geometry;
       char *name;
+      int refresh_rate = 0;
 
       gdk_x11_display_error_trap_push (display);
       output_info = XRRGetOutputInfo (x11_screen->xdisplay, resources, output);
@@ -546,6 +547,24 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
       if (first_output == None)
         first_output = output;
 
+      if (output_info->crtc)
+        {
+          XRRCrtcInfo *crtc = XRRGetCrtcInfo (x11_screen->xdisplay, resources, output_info->crtc);
+          int j;
+
+          for (j = 0; j < resources->nmode; j++)
+            {
+              XRRModeInfo *xmode = &resources->modes[j];
+              if (xmode->id == crtc->mode)
+                {
+                  refresh_rate = (1000 * xmode->dotClock) / (xmode->hTotal *xmode->vTotal);
+                  break;
+                }
+            }
+
+          XRRFreeCrtcInfo (crtc);
+        }
+
       monitor = find_monitor_by_output (x11_screen, output);
       if (monitor)
         monitor->remove = FALSE;
@@ -582,6 +601,7 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
                                      rr_monitors[i].mheight);
       gdk_monitor_set_subpixel_layout (GDK_MONITOR (monitor),
                                        translate_subpixel_order (output_info->subpixel_order));
+      gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh_rate);
       gdk_monitor_set_model (GDK_MONITOR (monitor), name);
       g_free (name);
 
@@ -708,6 +728,18 @@ init_randr13 (GdkScreen *screen, gboolean *changed)
          XRRCrtcInfo *crtc = XRRGetCrtcInfo (x11_screen->xdisplay, resources, output_info->crtc);
           char *name;
           GdkRectangle geometry;
+          int j;
+          int refresh_rate = 0;
+
+          for (j = 0; j < resources->nmode; j++)
+            {
+              XRRModeInfo *xmode = &resources->modes[j];
+              if (xmode->id == crtc->mode)
+                {
+                  refresh_rate = (1000 * xmode->dotClock) / (xmode->hTotal *xmode->vTotal);
+                  break;
+                }
+            }
 
           monitor = find_monitor_by_output (x11_screen, output);
           if (monitor)
@@ -742,6 +774,7 @@ init_randr13 (GdkScreen *screen, gboolean *changed)
                                          output_info->mm_height);
           gdk_monitor_set_subpixel_layout (GDK_MONITOR (monitor),
                                            translate_subpixel_order (output_info->subpixel_order));
+          gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh_rate);
           gdk_monitor_set_model (GDK_MONITOR (monitor), name);
 
           g_free (name);


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