[PATCH] Drag main window by using the menubar on Gtk

Arnaud Versini (via Code Review) gerrit at gerrit.libreoffice.org
Sun Feb 3 11:19:24 PST 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/1976

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/76/1976/1

Drag main window by using the menubar on Gtk

Change-Id: I04a5864120f44cf987312bb41b9cbb1f9c71b248
---
M vcl/headless/svpframe.cxx
M vcl/inc/headless/svpframe.hxx
M vcl/inc/salframe.hxx
M vcl/inc/unx/gtk/gtkframe.hxx
M vcl/inc/unx/salframe.h
M vcl/inc/vcl/window.hxx
M vcl/inc/win/salframe.h
M vcl/source/window/menu.cxx
M vcl/source/window/window.cxx
M vcl/unx/generic/window/salframe.cxx
M vcl/unx/gtk/window/gtkframe.cxx
M vcl/unx/kde4/KDESalFrame.cxx
M vcl/unx/kde4/KDESalFrame.hxx
M vcl/win/source/window/salframe.cxx
14 files changed, 67 insertions(+), 3 deletions(-)



diff --git a/vcl/headless/svpframe.cxx b/vcl/headless/svpframe.cxx
index 0d4e466..c9dc95c 100644
--- a/vcl/headless/svpframe.cxx
+++ b/vcl/headless/svpframe.cxx
@@ -470,4 +470,8 @@
 {
 }
 
+void SvpSalFrame::StartDragFrame (long /*x*/, long /*y*/, sal_uInt16 /*button*/, sal_uLong /*nTime*/)
+{
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/headless/svpframe.hxx b/vcl/inc/headless/svpframe.hxx
index c48d602..c96116c 100644
--- a/vcl/inc/headless/svpframe.hxx
+++ b/vcl/inc/headless/svpframe.hxx
@@ -127,7 +127,7 @@
     bool IsVisible() { return m_bVisible; }
 
     static SvpSalFrame*         GetFocusFrame() { return s_pFocusFrame; }
-
+    void StartDragFrame (long x, long y, sal_uInt16 button, sal_uLong nTime) ;
 };
 #endif // _SVP_SVPFRAME_HXX
 
diff --git a/vcl/inc/salframe.hxx b/vcl/inc/salframe.hxx
index 63096e0..fbbd9a2 100644
--- a/vcl/inc/salframe.hxx
+++ b/vcl/inc/salframe.hxx
@@ -22,6 +22,7 @@
 
 #include <tools/solar.h>
 #include <vcl/dllapi.h>
+#include <vcl/event.hxx>
 
 #ifdef __cplusplus
 
@@ -248,6 +249,9 @@
     // done setting up the clipregion
     virtual void                    EndSetClipRegion() = 0;
 
+    // start dragging the frame on the desktop
+    virtual void StartDragFrame     (long x, long y, sal_uInt16 button, sal_uLong nTime) = 0;
+
     // Callbacks (indepent part in vcl/source/window/winproc.cxx)
     // for default message handling return 0
     void                        SetCallback( Window* pWindow, SALFRAMEPROC pProc )
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index a33a558..8f454df 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -328,6 +328,7 @@
     SalX11Screen getXScreenNumber() const { return m_nXScreen; }
     int          GetDisplayScreen() const { return maGeometry.nDisplayScreenNumber; }
     void updateScreenNumber();
+    void StartDragFrame (long x, long y, sal_uInt16 button, sal_uLong nTime);
 
 #if GTK_CHECK_VERSION(3,0,0)
     // only for gtk3 ...
diff --git a/vcl/inc/unx/salframe.h b/vcl/inc/unx/salframe.h
index c6a8cc3..541d75e 100644
--- a/vcl/inc/unx/salframe.h
+++ b/vcl/inc/unx/salframe.h
@@ -251,6 +251,8 @@
     virtual void                SetScreenNumber( unsigned int );
     virtual void                SetApplicationID( const rtl::OUString &rWMClass );
 
+    void StartDragFrame (long x, long y, sal_uInt16 button, sal_uLong nTime) ;
+
     // shaped system windows
     // set clip region to none (-> rectangular windows, normal state)
     virtual void                    ResetClipRegion();
@@ -265,6 +267,7 @@
 
     /// @internal
     void setPendingSizeEvent();
+
 };
 
 #ifdef _SV_SALDISP_HXX
diff --git a/vcl/inc/vcl/window.hxx b/vcl/inc/vcl/window.hxx
index ccd599a..811a8ee 100644
--- a/vcl/inc/vcl/window.hxx
+++ b/vcl/inc/vcl/window.hxx
@@ -980,6 +980,8 @@
     void                StartAutoScroll( sal_uInt16 nFlags );
     void                EndAutoScroll();
 
+    void                StartDragWindow( const MouseEvent& rMouseEvent );
+
     sal_Bool                HandleScrollCommand( const CommandEvent& rCmd,
                                              ScrollBar* pHScrl = NULL,
                                              ScrollBar* pVScrl = NULL );
diff --git a/vcl/inc/win/salframe.h b/vcl/inc/win/salframe.h
index 54e10bd..d48563d 100644
--- a/vcl/inc/win/salframe.h
+++ b/vcl/inc/win/salframe.h
@@ -133,6 +133,7 @@
     virtual void                BeginSetClipRegion( sal_uIntPtr nRects );
     virtual void                UnionClipRegion( long nX, long nY, long nWidth, long nHeight );
     virtual void                EndSetClipRegion();
+    virtual void StartDragFrame (long x, long y, sal_uInt16 button, sal_uLong nTime) ;
 };
 
 void ImplSalGetWorkArea( HWND hWnd, RECT *pRect, const RECT *pParentRect );
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index a163041..1a4c45e 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -5395,11 +5395,15 @@
     {
         ChangeHighlightItem( nEntry, sal_False );
     }
-    else
+    else if (pActivePopup)
     {
         KillActivePopup();
         ChangeHighlightItem( ITEMPOS_INVALID, sal_False );
     }
+    else
+    {
+        StartDragWindow(rMEvt);
+    }
 }
 
 void MenuBarWindow::MouseButtonUp( const MouseEvent& )
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 6767fde..8868628 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -9663,6 +9663,17 @@
     mnDPIY = nOldDPIY;
 }
 
+void Window::StartDragWindow( const MouseEvent& rMouseEvent )
+{
+    SalFrame* frame = ImplGetFrame();
+    if (frame)
+    {
+        long x = rMouseEvent.GetPosPixel().X();
+        long y = rMouseEvent.GetPosPixel().Y();
+        frame->StartDragFrame(x, y, rMouseEvent.GetButtons(), mpWindowImpl->mpFrameData->mnMouseDownTime);
+    }
+}
+
 void Window::PaintToDevice( OutputDevice* pDev, const Point& rPos, const Size& /*rSize*/ )
 {
     // FIXME: scaling: currently this is for pixel copying only
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index a30c32f..4413ba1 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -4219,4 +4219,9 @@
 
 }
 
+void X11SalFrame::StartDragFrame ( long /*x*/, long /*y*/, sal_uInt16 /*button*/, sal_uLong /*nTime*/)
+{
+
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index 6343f5b..6bc80e3 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -125,7 +125,7 @@
 
 static sal_uInt16 GetMouseModCode( guint state )
 {
-    sal_uInt16 nCode = GetKeyModCode( state );
+    sal_uInt16 nCode = GetKeyModCode(state);
     if( (state & GDK_BUTTON1_MASK) )
         nCode |= MOUSE_LEFT;
     if( (state & GDK_BUTTON2_MASK) )
@@ -134,6 +134,18 @@
         nCode |= MOUSE_RIGHT;
 
     return nCode;
+}
+
+static gint GetGdkMouseButton( sal_uInt16 code )
+{
+    gint gdkMouseCode = 0;
+    if (code & MOUSE_LEFT)
+        gdkMouseCode |= GDK_BUTTON1_MASK;
+    if (code & MOUSE_MIDDLE)
+        gdkMouseCode |= GDK_BUTTON2_MASK;
+    if (code & MOUSE_RIGHT)
+        gdkMouseCode |= GDK_BUTTON3_MASK;
+    return gdkMouseCode;
 }
 
 static sal_uInt16 GetKeyCode( guint keyval )
@@ -4271,4 +4283,12 @@
     return Size( aRect.GetWidth(), aRect.GetHeight() );
 }
 
+void GtkSalFrame::StartDragFrame (long x, long y, sal_uInt16 button, sal_uLong nTime)
+{
+    if( ! isChild() && m_pWindow)
+    {
+        gtk_window_begin_move_drag( GTK_WINDOW(m_pWindow), GetGdkMouseButton(button), x + maGeometry.nX, y + maGeometry.nY, nTime);
+    }
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalFrame.cxx b/vcl/unx/kde4/KDESalFrame.cxx
index 6f3fe53..7d128c6 100644
--- a/vcl/unx/kde4/KDESalFrame.cxx
+++ b/vcl/unx/kde4/KDESalFrame.cxx
@@ -387,4 +387,9 @@
     return NULL;
 }
 
+void KDESalFrame::StartDragFrame ( long /*x*/, long /*y*/, sal_uInt16 /*button*/, sal_uLong /*nTime*/)
+{
+
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/kde4/KDESalFrame.hxx b/vcl/unx/kde4/KDESalFrame.hxx
index 739aacd..832c786 100644
--- a/vcl/unx/kde4/KDESalFrame.hxx
+++ b/vcl/unx/kde4/KDESalFrame.hxx
@@ -47,6 +47,7 @@
         virtual void updateGraphics( bool bClear );
         virtual void UpdateSettings( AllSettings& rSettings );
         virtual void Show( sal_Bool bVisible, sal_Bool bNoActivate );
+        virtual void StartDragFrame (long x, long y, sal_uInt16 button, sal_uLong nTime) ;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx
index 235436f..0c64f7b 100644
--- a/vcl/win/source/window/salframe.cxx
+++ b/vcl/win/source/window/salframe.cxx
@@ -6126,6 +6126,9 @@
         return TRUE;
 }
 
+void WinSalFrameStartDragFrame (long /*x*/, long /*y*/, sal_uInt16 /*button*/, sal_uLong /*nTime*/) {
+
+}
 // -----------------------------------------------------------------------
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

-- 
To view, visit https://gerrit.libreoffice.org/1976
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I04a5864120f44cf987312bb41b9cbb1f9c71b248
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Arnaud Versini <arnaud.versini at gmail.com>


More information about the LibreOffice mailing list