Blob Blame History Raw
From 2efa35a812a6f1e35e4959a357f50feff7e598f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Tue, 6 Nov 2012 23:21:06 +0000
Subject: [PATCH] Resolves: fdo#56198 collect scrollbar click preference
 settings

for gtk and merge with aqua equivalent so as to alternate "jump to here"
behavior for primary button vs primary means scroll by single page. Secondary
button takes the alternative behaviour

Change-Id: I0a96f3131f41ec87052da39cbe96bfd895ca53f6
---
 vcl/aqua/source/window/salframe.cxx           |  6 +++---
 vcl/inc/svdata.hxx                            |  1 -
 vcl/inc/vcl/settings.hxx                      | 17 ++++++++++++-----
 vcl/source/app/settings.cxx                   | 15 +++++++++------
 vcl/source/control/scrbar.cxx                 | 24 ++++++++++++++++--------
 vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx      | 10 +++++++---
 vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx | 10 +++++++---
 7 files changed, 54 insertions(+), 29 deletions(-)

diff --git a/vcl/aqua/source/window/salframe.cxx b/vcl/aqua/source/window/salframe.cxx
index 924210d..cf7c048 100644
--- a/vcl/aqua/source/window/salframe.cxx
+++ b/vcl/aqua/source/window/salframe.cxx
@@ -1146,7 +1146,7 @@ rtl::OUString AquaSalFrame::GetKeyName( sal_uInt16 nKeyCode )
 
 // -----------------------------------------------------------------------
 
-static void getAppleScrollBarVariant(void)
+static void getAppleScrollBarVariant(StyleSettings &rSettings)
 {
     bool bIsScrollbarDoubleMax = true; // default is DoubleMax
 
@@ -1183,7 +1183,7 @@ static void getAppleScrollBarVariant(void)
         if( jumpStr )
         {
             if( CFGetTypeID( jumpStr ) == CFBooleanGetTypeID() )
-                ImplGetSVData()->maNWFData.mbScrollbarJumpPage = (jumpStr == kCFBooleanTrue);
+                rSettings.SetPrimaryButtonWarpsSlider(jumpStr == kCFBooleanTrue);
             CFRelease( jumpStr );
         }
         CFRelease( jumpScroll );
@@ -1324,7 +1324,7 @@ void AquaSalFrame::UpdateSettings( AllSettings& rSettings )
     // no mnemonics on aqua
     aStyleSettings.SetOptions( aStyleSettings.GetOptions() | STYLE_OPTION_NOMNEMONICS );
 
-    getAppleScrollBarVariant();
+    getAppleScrollBarVariant(aStyleSettings);
 
     // set scrollbar size
     aStyleSettings.SetScrollBarSize( static_cast<long int>([NSScroller scrollerWidth]) );
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index af547e9..974a67f 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -294,7 +294,6 @@ struct ImplSVNWFData
     bool                    mbCheckBoxNeedsErase:1;         // set true for platforms that should draw the
                                                             // window background before drawing the native
                                                             // checkbox
-    bool                    mbScrollbarJumpPage:1;          // true for "jump to here" behavior
     bool                    mbCanDrawWidgetAnySize:1;       // set to true currently on gtk
 };
 
diff --git a/vcl/inc/vcl/settings.hxx b/vcl/inc/vcl/settings.hxx
index 9a0a856..1052b49 100644
--- a/vcl/inc/vcl/settings.hxx
+++ b/vcl/inc/vcl/settings.hxx
@@ -323,7 +323,10 @@
     sal_uLong                           mnPreferredSymbolsStyle;
     sal_uInt16                          mnSkipDisabledInMenus;
     sal_Bool                            mbHideDisabledMenuItems;
-    sal_Bool                            mnAcceleratorsInContextMenus;
+    sal_Bool                            mbAcceleratorsInContextMenus;
+    //mbPrimaryButtonWarpsSlider == true for "jump to here" behavior for primary button, otherwise
+    //primary means scroll by single page. Secondary button takes the alternative behaviour
+    sal_Bool                        mbPrimaryButtonWarpsSlider;
     Wallpaper                       maWorkspaceGradient;
     const void*                     mpFontOptions;
 };
@@ -628,10 +631,14 @@
                                         { CopyData(); mpData->mbHideDisabledMenuItems = bHideDisabledMenuItems; }
     sal_Bool                            GetHideDisabledMenuItems() const
                                         { return mpData->mbHideDisabledMenuItems; }
-    void                                                       SetAcceleratorsInContextMenus( sal_Bool bAcceleratorsInContextMenus )
-                                        { CopyData(); mpData->mnAcceleratorsInContextMenus = bAcceleratorsInContextMenus; }
-    sal_Bool                            GetAcceleratorsInContextMenus() const
-                                        { return mpData->mnAcceleratorsInContextMenus; }
+    void                            SetAcceleratorsInContextMenus( sal_Bool bAcceleratorsInContextMenus )
+                                        { CopyData(); mpData->mbAcceleratorsInContextMenus = bAcceleratorsInContextMenus; }
+    sal_Bool                        GetAcceleratorsInContextMenus() const
+                                        { return mpData->mbAcceleratorsInContextMenus; }
+    void                            SetPrimaryButtonWarpsSlider( sal_Bool bPrimaryButtonWarpsSlider )
+                                        { CopyData(); mpData->mbPrimaryButtonWarpsSlider = bPrimaryButtonWarpsSlider; }
+    sal_Bool                        GetPrimaryButtonWarpsSlider() const
+                                        { return mpData->mbPrimaryButtonWarpsSlider; }
 
     void                            SetCairoFontOptions( const void *pOptions )
                                         { CopyData(); mpData->mpFontOptions = pOptions;  }
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
index 273e118..a2acdad 100644
--- a/vcl/source/app/settings.cxx
+++ b/vcl/source/app/settings.cxx
@@ -337,11 +337,12 @@ ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
     mnUseImagesInMenus          = rData.mnUseImagesInMenus;
     mbPreferredUseImagesInMenus = rData.mbPreferredUseImagesInMenus;
     mnSkipDisabledInMenus       = rData.mnSkipDisabledInMenus;
-    mbHideDisabledMenuItems              = rData.mbHideDisabledMenuItems;
-    mnAcceleratorsInContextMenus    = rData.mnAcceleratorsInContextMenus;
+    mbHideDisabledMenuItems     = rData.mbHideDisabledMenuItems;
+    mbAcceleratorsInContextMenus = rData.mbAcceleratorsInContextMenus;
+    mbPrimaryButtonWarpsSlider  = rData.mbPrimaryButtonWarpsSlider;
     mnToolbarIconSize           = rData.mnToolbarIconSize;
     mnSymbolsStyle              = rData.mnSymbolsStyle;
-    mnPreferredSymbolsStyle         = rData.mnPreferredSymbolsStyle;
+    mnPreferredSymbolsStyle     = rData.mnPreferredSymbolsStyle;
     mpFontOptions               = rData.mpFontOptions;
 }
 
@@ -425,10 +426,11 @@ void ImplStyleData::SetStandardStyles()
     mnUseSystemUIFonts          = 1;
     mnUseFlatBorders            = 0;
     mnUseFlatMenues             = 0;
-    mbPreferredUseImagesInMenus         = sal_True;
+    mbPreferredUseImagesInMenus = sal_True;
     mnSkipDisabledInMenus       = (sal_uInt16)sal_False;
     mbHideDisabledMenuItems     = sal_False;
-    mnAcceleratorsInContextMenus    = sal_True;
+    mbAcceleratorsInContextMenus = sal_True;
+    mbPrimaryButtonWarpsSlider = sal_False;
 
     Gradient aGrad( GradientStyle_LINEAR, DEFAULT_WORKSPACE_GRADIENT_START_COLOR, DEFAULT_WORKSPACE_GRADIENT_END_COLOR );
     maWorkspaceGradient = Wallpaper( aGrad );
@@ -852,7 +854,8 @@ sal_Bool StyleSettings::operator ==( const StyleSettings& rSet ) const
          (mpData->mbPreferredUseImagesInMenus == rSet.mpData->mbPreferredUseImagesInMenus) &&
          (mpData->mnSkipDisabledInMenus     == rSet.mpData->mnSkipDisabledInMenus)      &&
          (mpData->mbHideDisabledMenuItems   == rSet.mpData->mbHideDisabledMenuItems)    &&
-         (mpData->mnAcceleratorsInContextMenus  == rSet.mpData->mnAcceleratorsInContextMenus)       &&
+         (mpData->mbAcceleratorsInContextMenus  == rSet.mpData->mbAcceleratorsInContextMenus)&&
+         (mpData->mbPrimaryButtonWarpsSlider == rSet.mpData->mbPrimaryButtonWarpsSlider) &&
          (mpData->maFontColor               == rSet.mpData->maFontColor ))
         return sal_True;
     else
diff --git a/vcl/source/control/scrbar.cxx b/vcl/source/control/scrbar.cxx
index dad66f6..9e90362 100644
--- a/vcl/source/control/scrbar.cxx
+++ b/vcl/source/control/scrbar.cxx
@@ -948,7 +948,12 @@
 
 void ScrollBar::MouseButtonDown( const MouseEvent& rMEvt )
 {
-    if ( rMEvt.IsLeft() || rMEvt.IsMiddle() )
+    bool bPrimaryWarps = GetSettings().GetStyleSettings().GetPrimaryButtonWarpsSlider();
+    bool bWarp = bPrimaryWarps ? rMEvt.IsLeft() : rMEvt.IsMiddle();
+    bool bPrimaryWarping = bWarp && rMEvt.IsLeft();
+    bool bPage = bPrimaryWarps ? rMEvt.IsRight() : rMEvt.IsLeft();
+
+    if (rMEvt.IsLeft() || rMEvt.IsMiddle() || rMEvt.IsRight())
     {
         const Point&    rMousePos = rMEvt.GetPosPixel();
         sal_uInt16          nTrackFlags = 0;
@@ -964,7 +969,7 @@
                 bIsInside:
                 maBtn1Rect.IsInside( rMousePos ) )
         {
-            if ( !(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
+            if (rMEvt.IsLeft() && !(mnStateFlags & SCRBAR_STATE_BTN1_DISABLE) )
             {
                 nTrackFlags     = STARTTRACK_BUTTONREPEAT;
                 meScrollType    = SCROLL_LINEUP;
@@ -978,7 +983,7 @@
                 bIsInside:
                 maBtn2Rect.IsInside( rMousePos ) )
         {
-            if ( !(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
+            if (rMEvt.IsLeft() && !(mnStateFlags & SCRBAR_STATE_BTN2_DISABLE) )
             {
                 nTrackFlags     = STARTTRACK_BUTTONREPEAT;
                 meScrollType    = SCROLL_LINEDOWN;
@@ -992,7 +997,10 @@
             bool bThumbHit = HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_THUMB_HORZ : PART_THUMB_VERT,
                                                    maThumbRect, rMousePos, bIsInside )
                              ? bIsInside : maThumbRect.IsInside( rMousePos );
-            bool bDragHandling = rMEvt.IsMiddle() || bThumbHit || ImplGetSVData()->maNWFData.mbScrollbarJumpPage;
+
+            bool bThumbAction = bWarp || bPage;
+
+            bool bDragHandling = bWarp || (bThumbHit && bThumbAction);
             if( bDragHandling )
             {
                 if( mpData )
@@ -1009,7 +1017,7 @@
                     mnDragDraw      = SCRBAR_DRAW_THUMB;
 
                     // calculate mouse offset
-                    if( rMEvt.IsMiddle() || (ImplGetSVData()->maNWFData.mbScrollbarJumpPage && !bThumbHit) )
+                    if (bWarp && (!bThumbHit || !bPrimaryWarping))
                     {
                         bDragToMouse = sal_True;
                         if ( GetStyle() & WB_HORZ )
@@ -1031,9 +1039,9 @@
                 else
                     Sound::Beep( SOUND_DISABLE, this );
             }
-            else if( HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_AREA : PART_TRACK_VERT_AREA,
+            else if(bPage && (HitTestNativeControl( CTRL_SCROLLBAR, bHorizontal? PART_TRACK_HORZ_AREA : PART_TRACK_VERT_AREA,
                                            aControlRegion, rMousePos, bIsInside )?
-                bIsInside : sal_True )
+                bIsInside : sal_True) )
             {
                 nTrackFlags = STARTTRACK_BUTTONREPEAT;
 
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index 65df181..1451476 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -3987,9 +3987,13 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings )
     aMouseSettings.SetMenuDelay( iMenuPopupDelay );
     rSettings.SetMouseSettings( aMouseSettings );
 
-    gboolean showmenuicons = true;
-    g_object_get( pSettings, "gtk-menu-images", &showmenuicons, (char *)NULL );
-    aStyleSet.SetPreferredUseImagesInMenus( showmenuicons );
+    gboolean showmenuicons = true, primarybuttonwarps = false;
+    g_object_get( pSettings,
+        "gtk-menu-images", &showmenuicons,
+        "gtk-primary-button-warps-slider", &primarybuttonwarps,
+        (char *)NULL );
+    aStyleSet.SetPreferredUseImagesInMenus(showmenuicons);
+    aStyleSet.SetPrimaryButtonWarpsSlider(primarybuttonwarps);
 
     // set scrollbar settings
     gint slider_width = 14;
diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
index 0774699f..1037d9d 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -1376,9 +1376,13 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings )
     aMouseSettings.SetMenuDelay( iMenuPopupDelay );
     rSettings.SetMouseSettings( aMouseSettings );
 
-    gboolean showmenuicons = true;
-    g_object_get( pSettings, "gtk-menu-images", &showmenuicons, (char *)NULL );
-    aStyleSet.SetPreferredUseImagesInMenus( showmenuicons );
+    gboolean showmenuicons = true, primarybuttonwarps = false;
+    g_object_get( pSettings,
+        "gtk-menu-images", &showmenuicons,
+        "gtk-primary-button-warps-slider", &primarybuttonwarps,
+        (char *)NULL );
+    aStyleSet.SetPreferredUseImagesInMenus(showmenuicons);
+    aStyleSet.SetPrimaryButtonWarpsSlider(primarybuttonwarps);
 
     // set scrollbar settings
     gint slider_width = 14;
-- 
1.7.11.7