diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2011-05-23 19:16:16 +0000 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2011-05-23 19:16:16 +0000 |
| commit | 4bea46c1ce07333d06360137991a4ea1aa114f56 (patch) | |
| tree | 865369b52afeea5c77164d38696b22d60498fea9 | |
| parent | 0c8f264df05e6a35e04f0a54b12be7629a2ec5e4 (diff) | |
src/screen_xywh.cxx: Fix STR #2637, part 1.
Fix array bounds error when Xinerama and Xlib disagree about number of screens.
Fix setting vertical resolution (dpi) of different monitors.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8727 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | src/screen_xywh.cxx | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/screen_xywh.cxx b/src/screen_xywh.cxx index 7b373819a..410e4eb9e 100644 --- a/src/screen_xywh.cxx +++ b/src/screen_xywh.cxx @@ -155,11 +155,15 @@ static void screen_init() { if (XineramaIsActive(fl_display)) { screens = XineramaQueryScreens(fl_display, &num_screens); int i; + // Xlib and Xinerama may disagree on the screen count. Sigh... + // Use the minimum of the reported counts. + // Use the previous screen's info for non-existent ones. + int sc = ScreenCount(fl_display); // Xlib screen count for (i=0; i<num_screens; i++) { - int mm = DisplayWidthMM(fl_display, i); - dpi[i][0] = mm ? screens[i].width*25.4f/mm : 0.0f; - mm = DisplayHeightMM(fl_display, fl_screen); - dpi[i][1] = mm ? screens[i].height*25.4f/mm : dpi[i][0]; + int mm = (i < sc) ? DisplayWidthMM(fl_display, i) : 0; + dpi[i][0] = mm ? screens[i].width*25.4f/mm : (i > 0) ? dpi[i-1][0] : 0.0f; + mm = (i < sc) ? DisplayHeightMM(fl_display, i) : 0; + dpi[i][1] = mm ? screens[i].height*25.4f/mm : (i > 0) ? dpi[i-1][1] : 0.0f; } } else { // ! XineramaIsActive() num_screens = 1; |
