< prev index next >

src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c

Print this page

        

@@ -1655,19 +1655,33 @@
                                      Time timestamp);
 typedef Rotation
     (*XRRConfigRotationsType)(XRRScreenConfiguration *config,
                               Rotation *current_rotation);
 
+typedef XRRScreenResources* (*XRRGetScreenResourcesType)(Display *dpy,
+                                                                 Window window);
+
+typedef void (*XRRFreeScreenResourcesType)(XRRScreenResources *resources);
+
+typedef XRROutputInfo * (*XRRGetOutputInfoType)(Display *dpy,
+                                XRRScreenResources *resources, RROutput output);
+
+typedef void (*XRRFreeOutputInfoType)(XRROutputInfo *outputInfo);
+
 static XRRQueryVersionType               awt_XRRQueryVersion;
 static XRRGetScreenInfoType              awt_XRRGetScreenInfo;
 static XRRFreeScreenConfigInfoType       awt_XRRFreeScreenConfigInfo;
 static XRRConfigRatesType                awt_XRRConfigRates;
 static XRRConfigCurrentRateType          awt_XRRConfigCurrentRate;
 static XRRConfigSizesType                awt_XRRConfigSizes;
 static XRRConfigCurrentConfigurationType awt_XRRConfigCurrentConfiguration;
 static XRRSetScreenConfigAndRateType     awt_XRRSetScreenConfigAndRate;
 static XRRConfigRotationsType            awt_XRRConfigRotations;
+static XRRGetScreenResourcesType         awt_XRRGetScreenResources;
+static XRRFreeScreenResourcesType        awt_XRRFreeScreenResources;
+static XRRGetOutputInfoType              awt_XRRGetOutputInfo;
+static XRRFreeOutputInfoType             awt_XRRFreeOutputInfo;
 
 #define LOAD_XRANDR_FUNC(f) \
     do { \
         awt_##f = (f##Type)dlsym(pLibRandR, #f); \
         if (awt_##f == NULL) { \

@@ -1735,10 +1749,14 @@
     LOAD_XRANDR_FUNC(XRRConfigCurrentRate);
     LOAD_XRANDR_FUNC(XRRConfigSizes);
     LOAD_XRANDR_FUNC(XRRConfigCurrentConfiguration);
     LOAD_XRANDR_FUNC(XRRSetScreenConfigAndRate);
     LOAD_XRANDR_FUNC(XRRConfigRotations);
+    LOAD_XRANDR_FUNC(XRRGetScreenResources);
+    LOAD_XRANDR_FUNC(XRRFreeScreenResources);
+    LOAD_XRANDR_FUNC(XRRGetOutputInfo);
+    LOAD_XRANDR_FUNC(XRRFreeOutputInfo);
 
     return JNI_TRUE;
 }
 
 static jobject

@@ -1922,14 +1940,50 @@
 Java_sun_awt_X11GraphicsDevice_enumDisplayModes
     (JNIEnv* env, jclass x11gd,
      jint screen, jobject arrayList)
 {
 #ifndef HEADLESS
-    XRRScreenConfiguration *config;
 
     AWT_LOCK();
 
+    if (usingXinerama && XScreenCount(awt_display) > 0) {
+        XRRScreenResources *res = awt_XRRGetScreenResources(awt_display,
+                                                    RootWindow(awt_display, 0));
+        if (res) {
+           if (res->noutput > screen) {
+                XRROutputInfo *output_info = awt_XRRGetOutputInfo(awt_display,
+                                                     res, res->outputs[screen]);
+                if (output_info) {
+                    int i;
+                    for (i = 0; i < res->nmode; i++) {
+                        RRMode m = output_info->modes[i];
+                        int j;
+                        XRRModeInfo *mode;
+                        for (j = 0; j < res->nmode; j++) {
+                            mode = &res->modes[j];
+                            if (mode->id == m) {
+                                 float rate = 0;
+                                 if (mode->hTotal && mode->vTotal) {
+                                     rate = ((float)mode->dotClock /
+                                                   ((float)mode->hTotal *
+                                                          (float)mode->vTotal));
+                                 }
+                                 X11GD_AddDisplayMode(env, arrayList,
+                                        mode->width, mode->height,
+                                              BIT_DEPTH_MULTI, (int)(rate +.2));
+                                 break;
+                            }
+                        }
+                    }
+                    awt_XRRFreeOutputInfo(output_info);
+                }
+            }
+            awt_XRRFreeScreenResources(res);
+        }
+    } else {
+        XRRScreenConfiguration *config;
+
     config = awt_XRRGetScreenInfo(awt_display,
                                   RootWindow(awt_display, screen));
     if (config != NULL) {
         int nsizes, i, j;
         XRRScreenSize *sizes = awt_XRRConfigSizes(config, &nsizes);

@@ -1953,10 +2007,11 @@
             }
         }
 
         awt_XRRFreeScreenConfigInfo(config);
     }
+    }
 
     AWT_FLUSH_UNLOCK();
 #endif /* !HEADLESS */
 }
 
< prev index next >