diff options
Diffstat (limited to 'x11-toolkits/qt33/files/0032-fix_rotated_randr.diff')
-rw-r--r-- | x11-toolkits/qt33/files/0032-fix_rotated_randr.diff | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/x11-toolkits/qt33/files/0032-fix_rotated_randr.diff b/x11-toolkits/qt33/files/0032-fix_rotated_randr.diff new file mode 100644 index 000000000000..276e5994cc0b --- /dev/null +++ b/x11-toolkits/qt33/files/0032-fix_rotated_randr.diff @@ -0,0 +1,94 @@ +qt-bugs@ issue : N34454 +bugs.kde.org number : 67101 +applied: no +author: Hamish Rodda <rodda@kde.org> + +Qt doesn't take screen rotation into account when determining desktop width +and height + +Qt doesn't detect a change in desktop size when the rotation of the screen +changes to be at right angles (90 and 270 degrees) to the normal rotation (0 +degrees). The xlib functions DisplayWidth / DisplayHeight and WidthOfScreen / +HeightOfScreen do not take into account the rotation of the screen. + +This causes KDE not to reconfigure itself when the rotation of the screen is +changed. + +This patch switches width and height of the desktop when the screen is rotated +to 90 or 270 degrees. I've only done this for the non-xinerama case, and only +for QDesktopWidget. I imagine that xinerama needs to have this change made +too. + +Index: src/kernel/qapplication_x11.cpp +=================================================================== +RCS file: /home/kde/qt-copy/src/kernel/qapplication_x11.cpp,v +retrieving revision 1.95 +diff -u -p -r1.95 qapplication_x11.cpp +--- src/kernel/qapplication_x11.cpp 20 Oct 2003 13:53:50 -0000 1.95 ++++ src/kernel/qapplication_x11.cpp 8 Nov 2003 03:05:57 -0000 +@@ -3493,10 +3493,23 @@ int QApplication::x11ProcessEvent( XEven + + // update the size for desktop widget + int scr = XRRRootToScreen( appDpy, event->xany.window ); ++ ++ // Determine if we're at right-angles & thus DisplayWidth/DisplayHeight should be switched ++ XRRScreenConfiguration* xrrconfig; ++ xrrconfig = XRRGetScreenInfo( appDpy, event->xany.window ); ++ Rotation rotation; ++ XRRConfigCurrentConfiguration( xrrconfig, &rotation ); ++ XRRFreeScreenConfigInfo( xrrconfig ); ++ + QWidget *w = desktop()->screen( scr ); + QSize oldSize( w->size() ); +- w->crect.setWidth( DisplayWidth( appDpy, scr ) ); +- w->crect.setHeight( DisplayHeight( appDpy, scr ) ); ++ if (rotation & (RR_Rotate_90 | RR_Rotate_270)) { ++ w->crect.setWidth( DisplayHeight( appDpy, scr ) ); ++ w->crect.setHeight( DisplayWidth( appDpy, scr ) ); ++ } else { ++ w->crect.setWidth( DisplayWidth( appDpy, scr ) ); ++ w->crect.setHeight( DisplayHeight( appDpy, scr ) ); ++ } + if ( w->size() != oldSize ) { + QResizeEvent e( w->size(), oldSize ); + QApplication::sendEvent( w, &e ); +Index: src/kernel/qdesktopwidget_x11.cpp +=================================================================== +RCS file: /home/kde/qt-copy/src/kernel/qdesktopwidget_x11.cpp,v +retrieving revision 1.19 +diff -u -p -r1.19 qdesktopwidget_x11.cpp +--- src/kernel/qdesktopwidget_x11.cpp 16 May 2003 13:02:39 -0000 1.19 ++++ src/kernel/qdesktopwidget_x11.cpp 8 Nov 2003 03:05:58 -0000 +@@ -44,6 +44,9 @@ extern int qt_x11_create_desktop_on_scre + // defined in qapplication_x11.cpp + extern Atom qt_net_workarea; + extern bool qt_net_supports(Atom atom); ++#ifndef QT_NO_XRANDR ++extern bool qt_use_xrandr; ++#endif + + // function to update the workarea of the screen + static bool qt_desktopwidget_workarea_dirty = TRUE; +@@ -154,6 +157,22 @@ void QDesktopWidgetPrivate::init() + y = 0; + w = WidthOfScreen(ScreenOfDisplay(QPaintDevice::x11AppDisplay(), i)); + h = HeightOfScreen(ScreenOfDisplay(QPaintDevice::x11AppDisplay(), i)); ++ ++#ifndef QT_NO_XRANDR ++ if (qt_use_xrandr) { ++ XRRScreenConfiguration* xrrconfig; ++ xrrconfig = XRRGetScreenInfo(QPaintDevice::x11AppDisplay(), QPaintDevice::x11AppRootWindow( i )); ++ Rotation rotation; ++ XRRConfigCurrentConfiguration(xrrconfig, &rotation); ++ XRRFreeScreenConfigInfo(xrrconfig); ++ ++ if (rotation & (RR_Rotate_90 | RR_Rotate_270)) { ++ int tmp = h; ++ h = w; ++ w = tmp; ++ } ++ } ++#endif + } + + rects[i].setRect(x, y, w, h); |