rev 6711 - in trunk/packages/qt4-x11/debian: . patches

Fathi Boudra fboudra-guest at alioth.debian.org
Sat Jul 7 12:07:17 UTC 2007


Author: fboudra-guest
Date: 2007-07-07 12:07:17 +0000 (Sat, 07 Jul 2007)
New Revision: 6711

Added:
   trunk/packages/qt4-x11/debian/patches/00_0178-transparency-window-types.dpatch
   trunk/packages/qt4-x11/debian/patches/00_0179-transient-hack.dpatch
Modified:
   trunk/packages/qt4-x11/debian/changelog
   trunk/packages/qt4-x11/debian/patches/00list
Log:
* Update Qt support for new window types used for compositing patch.
  Fix crashes when 'w' is null. (Closes: #431322)


Modified: trunk/packages/qt4-x11/debian/changelog
===================================================================
--- trunk/packages/qt4-x11/debian/changelog	2007-07-07 10:53:44 UTC (rev 6710)
+++ trunk/packages/qt4-x11/debian/changelog	2007-07-07 12:07:17 UTC (rev 6711)
@@ -14,9 +14,9 @@
       (Closes: #408639)
   * Revert Qt handling argb visuals on X11 patch. There are dependencies
     not fixed in Qt. They cause a few regressions when this patch is applied.
-    (Closes: #430907)
-  * Revert Qt support for new window types used for compositing.
-    (Closes: #431322)
+    (Closes: #430907, #431436, #431943)
+  * Update Qt support for new window types used for compositing patch.
+    Fix crashes when 'w' is null. (Closes: #431322)
   * Apply qt-copy patches:
     * 00_0172-prefer-xrandr-over-xinerama: only trust libxinerama if it is not
       the emulated information coming from xrandr 1.2.

Added: trunk/packages/qt4-x11/debian/patches/00_0178-transparency-window-types.dpatch
===================================================================
--- trunk/packages/qt4-x11/debian/patches/00_0178-transparency-window-types.dpatch	                        (rev 0)
+++ trunk/packages/qt4-x11/debian/patches/00_0178-transparency-window-types.dpatch	2007-07-07 12:07:17 UTC (rev 6711)
@@ -0,0 +1,342 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 00_0178-transparency-window-types.dpatch by Lubos Lunak <l.lunak at kde.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: This patch adds Qt support for new window types used for compositing.
+
+ at DPATCH@
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qapplication_x11.cpp qt4-x11-4.3.0/src/gui/kernel/qapplication_x11.cpp
+--- qt4-x11-4.3.0~/src/gui/kernel/qapplication_x11.cpp	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qapplication_x11.cpp	2007-07-05 21:04:23.000000000 +0200
+@@ -199,6 +199,11 @@
+     "_NET_WM_WINDOW_TYPE_SPLASH\0"
+     "_NET_WM_WINDOW_TYPE_TOOLBAR\0"
+     "_NET_WM_WINDOW_TYPE_UTILITY\0"
++    "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU\0"
++    "_NET_WM_WINDOW_TYPE_POPUP_MENU\0"
++    "_NET_WM_WINDOW_TYPE_COMBO\0"
++    "_NET_WM_WINDOW_TYPE_DND\0"
++    "_NET_WM_WINDOW_TYPE_TOOLTIP\0"
+ 
+     "_KDE_NET_WM_FRAME_STRUT\0"
+ 
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qdnd_x11.cpp qt4-x11-4.3.0/src/gui/kernel/qdnd_x11.cpp
+--- qt4-x11-4.3.0~/src/gui/kernel/qdnd_x11.cpp	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qdnd_x11.cpp	2007-07-05 21:04:23.000000000 +0200
+@@ -254,6 +254,7 @@
+         QWidget(QApplication::desktop()->screen(screen),
+                 Qt::Tool | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint)
+     {
++    x11SetWindowType( X11WindowTypeDND );
+     }
+ 
+     void setPixmap(const QPixmap &pm)
+@@ -1392,6 +1393,7 @@
+         // recreate the pixmap on the new screen...
+         delete xdnd_data.deco;
+         xdnd_data.deco = new QShapedPixmapWidget(screen);
++        xdnd_data.deco->x11SetWindowTransient( object->source()->topLevelWidget());
+         if (!QWidget::mouseGrabber()) {
+             updatePixmap();
+             xdnd_data.deco->grabMouse();
+@@ -1852,6 +1854,7 @@
+     object = o;
+     object->d_func()->target = 0;
+     xdnd_data.deco = new QShapedPixmapWidget();
++    xdnd_data.deco->x11SetWindowTransient( object->source()->topLevelWidget());
+ 
+     willDrop = false;
+ 
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qt_x11_p.h qt4-x11-4.3.0/src/gui/kernel/qt_x11_p.h
+--- qt4-x11-4.3.0~/src/gui/kernel/qt_x11_p.h	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qt_x11_p.h	2007-07-05 21:04:23.000000000 +0200
+@@ -514,6 +514,11 @@
+         _NET_WM_WINDOW_TYPE_SPLASH,
+         _NET_WM_WINDOW_TYPE_TOOLBAR,
+         _NET_WM_WINDOW_TYPE_UTILITY,
++        _NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
++        _NET_WM_WINDOW_TYPE_POPUP_MENU,
++        _NET_WM_WINDOW_TYPE_COMBO,
++        _NET_WM_WINDOW_TYPE_DND,
++        _NET_WM_WINDOW_TYPE_TOOLTIP,
+ 
+         _KDE_NET_WM_FRAME_STRUT,
+ 
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qtooltip.cpp qt4-x11-4.3.0/src/gui/kernel/qtooltip.cpp
+--- qt4-x11-4.3.0~/src/gui/kernel/qtooltip.cpp	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qtooltip.cpp	2007-07-05 21:04:23.000000000 +0200
+@@ -134,6 +134,9 @@
+     setMouseTracking(true);
+     fadingOut = false;
+     reuseTip(text);
++#ifdef Q_WS_X11
++    x11SetWindowType( X11WindowTypeTooltip );
++#endif
+ }
+ 
+ void QTipLabel::restartHideTimer()
+@@ -351,6 +354,10 @@
+             // that is showing (removes flickering)
+             if (QTipLabel::instance->tipChanged(pos, text, w)){
+                 QTipLabel::instance->reuseTip(text);
++#ifdef Q_WS_X11
++                if (w)
++                    QTipLabel::instance->x11SetWindowTransient( w->topLevelWidget());
++#endif
+                 QTipLabel::instance->setTipRect(w, rect);
+                 QTipLabel::instance->placeTip(pos, w);
+             }
+@@ -360,6 +367,10 @@
+ 
+     if (!text.isEmpty()){ // no tip can be reused, create new tip:
+         new QTipLabel(pos, text, w); // sets QTipLabel::instance to itself
++#ifdef Q_WS_X11
++        if (w)
++            QTipLabel::instance->x11SetWindowTransient( w->topLevelWidget());
++#endif
+         QTipLabel::instance->setTipRect(w, rect);
+         QTipLabel::instance->placeTip(pos, w);
+         QTipLabel::instance->setObjectName(QLatin1String("qtooltip_label"));
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qwidget.h qt4-x11-4.3.0/src/gui/kernel/qwidget.h
+--- qt4-x11-4.3.0~/src/gui/kernel/qwidget.h	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qwidget.h	2007-07-05 21:04:23.000000000 +0200
+@@ -339,6 +339,19 @@
+ 
+     void setWindowOpacity(qreal level);
+     qreal windowOpacity() const;
++#if defined(Q_WS_X11)
++    enum X11WindowType {
++        X11WindowTypeSelect,
++        X11WindowTypeCombo,
++        X11WindowTypeDND,
++        X11WindowTypeTooltip,
++        X11WindowTypeMenu, // torn-off
++        X11WindowTypeDropdown,
++        X11WindowTypePopup
++    };
++    void x11SetWindowType( X11WindowType type = X11WindowTypeSelect );
++    void x11SetWindowTransient( QWidget* parent );
++#endif
+ 
+     bool isWindowModified() const;
+ #ifndef QT_NO_TOOLTIP
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qwidget_x11.cpp qt4-x11-4.3.0/src/gui/kernel/qwidget_x11.cpp
+--- qt4-x11-4.3.0~/src/gui/kernel/qwidget_x11.cpp	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qwidget_x11.cpp	2007-07-05 21:04:23.000000000 +0200
+@@ -510,10 +510,6 @@
+     }
+ #endif // QT_NO_XRENDER
+ 
+-    // NET window types
+-    long net_wintypes[7] = { 0, 0, 0, 0, 0, 0, 0 };
+-    int curr_wintype = 0;
+-
+     QtMWMHints mwmhints;
+     mwmhints.flags = 0L;
+     mwmhints.functions = MWM_FUNC_ALL;
+@@ -524,15 +520,11 @@
+     if (topLevel) {
+         ulong wsa_mask = 0;
+         if (type == Qt::SplashScreen) {
+-            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_SPLASH);
+         } else { //       if (customize) {
+             mwmhints.decorations = 0L;
+             mwmhints.flags |= MWM_HINTS_DECORATIONS;
+ 
+-            if (flags & Qt::FramelessWindowHint) {
+-                // override netwm type - quick and easy for KDE noborder
+-                net_wintypes[curr_wintype++] = ATOM(_KDE_NET_WM_WINDOW_TYPE_OVERRIDE);
+-            } else {
++            if ((flags & Qt::FramelessWindowHint) == 0 ) {
+                 mwmhints.decorations |= MWM_DECOR_BORDER;
+                 mwmhints.decorations |= MWM_DECOR_RESIZEH;
+ 
+@@ -554,22 +546,6 @@
+             wsa.save_under = True;
+             wsa_mask |= CWSaveUnder;
+         }
+-        // ### need a better way to do this
+-        if (q->inherits("QMenu")) {
+-            // menu netwm type
+-            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_MENU);
+-        } else if (q->inherits("QToolBar")) {
+-            // toolbar netwm type
+-            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_TOOLBAR);
+-        } else if (type == Qt::Tool || type == Qt::Drawer) {
+-            // utility netwm type
+-            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_UTILITY);
+-        }
+-
+-        if (dialog) // dialog netwm type
+-            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_DIALOG);
+-        // normal netwm type - default
+-        net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_NORMAL);
+ 
+         if (flags & Qt::X11BypassWindowManagerHint) {
+             wsa.override_redirect = True;
+@@ -588,6 +564,7 @@
+         wsa.save_under = True;
+         XChangeWindowAttributes(dpy, id, CWOverrideRedirect | CWSaveUnder,
+                                 &wsa);
++        q->x11SetWindowType();
+     } else if (topLevel && !desktop) {        // top-level widget
+         if (!X11->wm_client_leader)
+             create_wm_client_leader();
+@@ -632,12 +609,7 @@
+         // set mwm hints
+         SetMWMHints(dpy, id, mwmhints);
+ 
+-        // set _NET_WM_WINDOW_TYPE
+-        if (curr_wintype > 0)
+-            XChangeProperty(dpy, id, ATOM(_NET_WM_WINDOW_TYPE), XA_ATOM, 32, PropModeReplace,
+-                            (unsigned char *) net_wintypes, curr_wintype);
+-        else
+-            XDeleteProperty(dpy, id, ATOM(_NET_WM_WINDOW_TYPE));
++        q->x11SetWindowType(); // set _NET_WM_WINDOW_TYPE
+ 
+         // set _NET_WM_PID
+         long curr_pid = getpid();
+@@ -733,6 +705,63 @@
+         q->setAttribute(Qt::WA_OutsideWSRange, true);
+ }
+ 
++// Sets the EWMH (netwm) window type. Needed as a separate function
++// because create() may be too soon in some cases.
++void QWidget::x11SetWindowType( X11WindowType type )
++{
++    Display* dpy = X11->display;
++    // NET window types
++    long net_wintypes[7] = { 0, 0, 0, 0, 0, 0, 0 };
++    int curr_wintype = 0;
++    if( type == X11WindowTypeSelect ) {
++        if ( windowType() == Qt::SplashScreen ) {
++            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_SPLASH);
++        } else if (inherits("QToolBar")) {
++	    // toolbar netwm type
++	    net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_TOOLBAR);
++        } else if (windowType() == Qt::Tool || windowType() == Qt::Drawer) {
++	    // utility netwm type
++	    net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_UTILITY);
++        } else if (windowType() == Qt::Dialog || windowType() == Qt::Sheet
++            || (windowFlags() & Qt::MSWindowsFixedSizeDialogHint)) {
++            // dialog netwm type
++            net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_DIALOG);
++        }
++    } else if( type == X11WindowTypeCombo ) {
++        // combo netwm type
++	net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_COMBO);
++    } else if( type == X11WindowTypeDND ) {
++        // dnd netwm type
++    	net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_DND);
++    } else if( type == X11WindowTypeDropdown ) {
++        // dropdown netwm type
++    	net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_DROPDOWN_MENU);
++    } else if( type == X11WindowTypePopup ) {
++        // popup netwm type
++    	net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_POPUP_MENU);
++    } else if( type == X11WindowTypeMenu ) {
++        // menu netwm type
++	net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_MENU);
++    } else if( type == X11WindowTypeTooltip ) {
++        // tooltip netwm type
++    	net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_TOOLTIP);
++    }
++
++    // normal netwm type - default
++    net_wintypes[curr_wintype++] = ATOM(_NET_WM_WINDOW_TYPE_NORMAL);
++    // set _NET_WM_WINDOW_TYPE
++    if (curr_wintype > 0)
++        XChangeProperty(dpy, winId(), ATOM(_NET_WM_WINDOW_TYPE), XA_ATOM, 32, PropModeReplace,
++			(unsigned char *) net_wintypes, curr_wintype);
++    else
++        XDeleteProperty(dpy, winId(), ATOM(_NET_WM_WINDOW_TYPE));
++}
++
++void QWidget::x11SetWindowTransient( QWidget* parent )
++{
++    XSetTransientForHint( X11->display, winId(), parent->window()->winId());
++}
++
+ /*!
+     Frees up window system resources. Destroys the widget window if \a
+     destroyWindow is true.
+diff -urNad qt4-x11-4.3.0~/src/gui/widgets/qcombobox.cpp qt4-x11-4.3.0/src/gui/widgets/qcombobox.cpp
+--- qt4-x11-4.3.0~/src/gui/widgets/qcombobox.cpp	2007-05-25 15:24:15.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/widgets/qcombobox.cpp	2007-07-05 21:04:23.000000000 +0200
+@@ -370,6 +370,10 @@
+         layout->insertSpacing(0, verticalMargin);
+         layout->addSpacing(verticalMargin);
+     }
++#ifdef Q_WS_X11
++    x11SetWindowType( X11WindowTypeCombo );
++    x11SetWindowTransient( combo->topLevelWidget());
++#endif
+ }
+ 
+ void QComboBoxPrivateContainer::scrollItemView(int action)
+diff -urNad qt4-x11-4.3.0~/src/gui/widgets/qmenu.cpp qt4-x11-4.3.0/src/gui/widgets/qmenu.cpp
+--- qt4-x11-4.3.0~/src/gui/widgets/qmenu.cpp	2007-05-25 15:24:16.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/widgets/qmenu.cpp	2007-07-05 21:04:23.000000000 +0200
+@@ -84,6 +84,9 @@
+     QTornOffMenu(QMenu *p) : QMenu(*(new QTornOffMenuPrivate(p)))
+     {
+         setParent(p, Qt::Window | Qt::Tool);
++#ifdef Q_WS_X11
++        x11SetWindowType( X11WindowTypeMenu );
++#endif
+ 	setAttribute(Qt::WA_DeleteOnClose, true);
+         setWindowTitle(p->windowTitle());
+         setEnabled(p->isEnabled());
+@@ -130,6 +133,9 @@
+     }
+     defaultMenuAction = menuAction = new QAction(q);
+     menuAction->d_func()->menu = q;
++#ifdef Q_WS_X11
++    q->x11SetWindowType( QWidget::X11WindowTypePopup );
++#endif
+ }
+ 
+ //Windows and KDE allows menus to cover the taskbar, while GNOME and Mac don't
+@@ -1611,6 +1617,32 @@
+     }
+     setGeometry(QRect(pos, size));
+ 
++#ifdef Q_WS_X11
++    QWidget* top = this;
++    for(;;) {
++        if( QMenu* m = qobject_cast< QMenu* >( top )) {
++            if( m->d_func()->causedPopup.widget == NULL )
++                break; // --->
++            top = m->d_func()->causedPopup.widget;
++        } else
++            break; // -->
++    }
++    if( QMenu* m = qobject_cast< QMenu* >( top ))
++        x11SetWindowType( X11WindowTypePopup );
++    else
++        x11SetWindowType( X11WindowTypeDropdown );
++    // hackish ... try to find the main window related to this popup
++    QWidget* parent = d_func()->causedPopup.widget;
++    if( parent == NULL )
++        parent = parentWidget() ? parentWidget()->topLevelWidget() : NULL;
++    if( parent == NULL )
++        parent = QApplication::widgetAt( pos );
++    if( parent == NULL )
++        parent = qApp->activeWindow();
++    if( parent != NULL )
++        x11SetWindowTransient( parent );
++#endif
++
+ #ifndef QT_NO_EFFECTS
+     int hGuess = qApp->layoutDirection() == Qt::RightToLeft ? QEffects::LeftScroll : QEffects::RightScroll;
+     int vGuess = QEffects::DownScroll;
+@@ -1807,6 +1839,9 @@
+     if (QMenuBar *mb = qobject_cast<QMenuBar*>(d->causedPopup.widget))
+         mb->d_func()->setCurrentAction(0);
+ #endif
++#ifdef Q_WS_X11
++    x11SetWindowType( X11WindowTypePopup ); // reset
++#endif
+     d->mouseDown = 0;
+     d->hasHadMouse = false;
+     d->causedPopup.widget = 0;


Property changes on: trunk/packages/qt4-x11/debian/patches/00_0178-transparency-window-types.dpatch
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/packages/qt4-x11/debian/patches/00_0179-transient-hack.dpatch
===================================================================
--- trunk/packages/qt4-x11/debian/patches/00_0179-transient-hack.dpatch	                        (rev 0)
+++ trunk/packages/qt4-x11/debian/patches/00_0179-transient-hack.dpatch	2007-07-07 12:07:17 UTC (rev 6711)
@@ -0,0 +1,22 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 00_0179-transient-hack.dpatch by Lubos Lunak <l.lunak at kde.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: qt-bugs issue : 166027
+## DP: This patch is just a hackish workaround that makes setting of WM_TRANSIENT_FOR
+## DP: work with some window types (needed basically by the 0178 patch).
+## DP: It is not a proper solution, waiting for TT to come up with something.
+
+ at DPATCH@
+diff -urNad qt4-x11-4.3.0~/src/gui/kernel/qwidget_x11.cpp qt4-x11-4.3.0/src/gui/kernel/qwidget_x11.cpp
+--- qt4-x11-4.3.0~/src/gui/kernel/qwidget_x11.cpp	2007-05-25 15:24:19.000000000 +0200
++++ qt4-x11-4.3.0/src/gui/kernel/qwidget_x11.cpp	2007-07-05 21:05:27.000000000 +0200
+@@ -1569,7 +1569,7 @@
+         do_size_hints(q, extra);
+ 
+         // udpate WM_TRANSIENT_FOR
+-        if (isTransient(q)) {
++        if (isTransient(q) && !( q->windowFlags() & Qt::X11BypassWindowManagerHint)) {
+             QWidget *p = q->parentWidget();
+             if (p)
+                 p = p->window();


Property changes on: trunk/packages/qt4-x11/debian/patches/00_0179-transient-hack.dpatch
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/packages/qt4-x11/debian/patches/00list
===================================================================
--- trunk/packages/qt4-x11/debian/patches/00list	2007-07-07 10:53:44 UTC (rev 6710)
+++ trunk/packages/qt4-x11/debian/patches/00list	2007-07-07 12:07:17 UTC (rev 6711)
@@ -4,6 +4,8 @@
 00_0175-fix-s390-qatomic
 00_0176-coverity-fixes
 00_0177-qurl-clear-fix
+00_0178-transparency-window-types
+00_0179-transient-hack
 00_0180-window-role
 00_0181-qdnd-x11-fix
 00_0183-qprocess-corruption




More information about the pkg-kde-commits mailing list