From 5421cf487aa56b80911f7f83cda1ff68ab9c3d1e Mon Sep 17 00:00:00 2001 From: Taiki Kim Date: Mon, 20 Jun 2016 15:49:50 -0700 Subject: [PATCH 1/8] Correctly load parameters for Change Pitch effect Partial fix for Bug 73. Partial fix for Bug 1207. --- src/effects/ChangePitch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/effects/ChangePitch.cpp b/src/effects/ChangePitch.cpp index 669b4273a..31bd496be 100644 --- a/src/effects/ChangePitch.cpp +++ b/src/effects/ChangePitch.cpp @@ -138,6 +138,7 @@ bool EffectChangePitch::SetAutomationParameters(EffectAutomationParameters & par ReadAndVerifyDouble(Percentage); m_dPercentChange = Percentage; + Calc_SemitonesChange_fromPercentChange(); return true; } From 5a9fcd1ca5ab38f28461300fa00534ab1424d97d Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 11 Jul 2016 10:35:00 -0400 Subject: [PATCH 2/8] fix Windows build --- src/widgets/wxPanelWrapper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/wxPanelWrapper.h b/src/widgets/wxPanelWrapper.h index f694d5655..5c2b1d215 100644 --- a/src/widgets/wxPanelWrapper.h +++ b/src/widgets/wxPanelWrapper.h @@ -9,7 +9,7 @@ #ifndef __AUDACITY_WXPANEL_WRAPPER__ #define __AUDACITY_WXPANEL_WRAPPER__ -#include +#include "../MemoryX.h" #include #include From 5648023cf37978a7108c3773e43c111372b58394 Mon Sep 17 00:00:00 2001 From: Gale Andrews Date: Mon, 11 Jul 2016 18:45:47 +0100 Subject: [PATCH 3/8] Further fix for Windows build --- src/effects/Contrast.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/Contrast.h b/src/effects/Contrast.h index 88263533b..c3d28db3c 100644 --- a/src/effects/Contrast.h +++ b/src/effects/Contrast.h @@ -9,7 +9,7 @@ #ifndef __AUDACITY_CONTRAST_DIALOG__ #define __AUDACITY_CONTRAST_DIALOG__ -#include "widgets/wxPanelWrapper.h" +#include "../widgets/wxPanelWrapper.h" class wxButton; class wxSizer; From cb3e5e6d4fe484132b7dae246e52614fedb758de Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 11 Jul 2016 13:59:29 -0400 Subject: [PATCH 4/8] Bug1443: Various odd behavior of label text editor, fixed... ... And label track selection code is simpler to understand, without delayed side effects happening during drawing. Left and right arrow keys collapse text range selection correctly Shift-click adjusts the end of selection nearest the pick Right (and middle) click and drag do not affect the selection Copying empty selection has no effect on the clipboard Left-drag behaves independently of previous selection state --- src/LabelTrack.cpp | 166 ++++++++++++++++----------------------------- src/LabelTrack.h | 8 +-- 2 files changed, 60 insertions(+), 114 deletions(-) diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index 47066f0b6..0badcdabd 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -269,7 +269,6 @@ void LabelTrack::WarpLabels(const TimeWarper &warper) { void LabelTrack::ResetFlags() { - mDragXPos = -1; mInitialCursorPos = 1; mCurrentCursorPos = 1; mRightDragging = false; @@ -522,8 +521,6 @@ LabelStruct::LabelStruct(const SelectedRegion ®ion, : selectedRegion(region) , title(aTitle) { - changeInitialMouseXPos = true; - highlighted = false; updated = false; width = 0; x = 0; @@ -541,8 +538,6 @@ LabelStruct::LabelStruct(const SelectedRegion ®ion, // Overwrite the times selectedRegion.setTimes(t0, t1); - changeInitialMouseXPos = true; - highlighted = false; updated = false; width = 0; x = 0; @@ -694,9 +689,6 @@ void LabelStruct::DrawTextBox(wxDC & dc, const wxRect & r) const void LabelStruct::DrawHighlight ( wxDC & dc, int xPos1, int xPos2, int charHeight) const { - highlighted = true; - changeInitialMouseXPos = false; - wxPen curPen = dc.GetPen(); curPen.SetColour(wxString(wxT("BLUE"))); wxBrush curBrush = dc.GetBrush(); @@ -826,7 +818,7 @@ void LabelTrack::Draw(wxDC & dc, const wxRect & r, }} // Draw highlights - if ((mDragXPos != -1) && (mSelIndex >= 0 )) + if ((mInitialCursorPos != mCurrentCursorPos) && (mSelIndex >= 0 )) { int xpos1, xpos2; CalcHighlightXs(&xpos1, &xpos2); @@ -866,11 +858,11 @@ void LabelTrack::Draw(wxDC & dc, const wxRect & r, } } -/// Set the cursor position according to x position of mouse /// uses GetTextExtent to find the character position /// corresponding to the x pixel position. -void LabelTrack::SetCurrentCursorPosition(int xPos) +int LabelTrack::FindCurrentCursorPosition(int xPos) { + int result = -1; wxMemoryDC dc; if(msFont.Ok()) dc.SetFont(msFont); @@ -898,7 +890,7 @@ void LabelTrack::SetCurrentCursorPosition(int xPos) if (xPos <= bound) { // Found - mCurrentCursorPos = charIndex - 1; + result = charIndex - 1; finished = true; } else @@ -908,10 +900,16 @@ void LabelTrack::SetCurrentCursorPosition(int xPos) } } if (!finished) - { // Cursor should be in the last position - mCurrentCursorPos = length; - } + result = length; + + return result; +} + +/// Set the cursor position according to x position of mouse +void LabelTrack::SetCurrentCursorPosition(int xPos) +{ + mCurrentCursorPos = FindCurrentCursorPosition(xPos); } void LabelTrack::calculateFontHeight(wxDC & dc) const @@ -936,8 +934,6 @@ bool LabelTrack::IsTextSelected() { if (mSelIndex == -1) return false; - if (!mLabels[mSelIndex].highlighted) - return false; if (mCurrentCursorPos == mInitialCursorPos) return false; return true; @@ -993,14 +989,15 @@ bool LabelTrack::CopySelectedText() return false; const auto &labelStruct = mLabels[mSelIndex]; - if (!labelStruct.highlighted) - return false; int init = mInitialCursorPos; int cur = mCurrentCursorPos; if (init > cur) std::swap(init, cur); + if (init == cur) + return false; + // data for copying wxString data = labelStruct.title.Mid(init, cur-init); @@ -1043,12 +1040,9 @@ bool LabelTrack::PasteSelectedText(double sel0, double sel1) auto &labelStruct = mLabels[mSelIndex]; auto &title = labelStruct.title; - int cur = mCurrentCursorPos, init = cur; - if (labelStruct.highlighted) { - init = mInitialCursorPos; - if (init > cur) - std::swap(init, cur); - } + int cur = mCurrentCursorPos, init = mInitialCursorPos; + if (init > cur) + std::swap(init, cur); left = title.Left(init); if (cur < (int)title.Length()) right = title.Mid(cur); @@ -1493,20 +1487,9 @@ void LabelTrack::HandleTextDragRelease(const wxMouseEvent & evt) if(evt.Dragging()) { - // if dragging happens in text box - // end dragging x position in pixels - // set flag to update current cursor position - mDragXPos = evt.m_x; - - // for preventing dragging glygh from changing current cursor position - // set end dragging position to current cursor position - SetCurrentCursorPosition(mDragXPos); - - // if it's an invalid dragging, disable displaying - if (mRightDragging) { - mDragXPos = -1; - mRightDragging = false; - } + if (!mRightDragging) + // Update drag end + SetCurrentCursorPosition(evt.m_x); return; } @@ -1573,20 +1556,33 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, return; } - // disable displaying if left button is down - if (evt.LeftDown()) - mDragXPos = -1; - mSelIndex = OverATextBox(evt.m_x, evt.m_y); if (mSelIndex != -1) { auto &labelStruct = mLabels[mSelIndex]; *newSel = labelStruct.selectedRegion; - SetCurrentCursorPosition(evt.m_x); - // for preventing from resetting by shift+mouse left button - if (labelStruct.changeInitialMouseXPos) - mInitialCursorPos = mCurrentCursorPos; - mDrawCursor = true; + if (evt.LeftDown()) { + // Find the NEW drag end + auto position = FindCurrentCursorPosition(evt.m_x); + + if (evt.ShiftDown()) { + // Set the drag anchor at the end of the previous selection + // that is farther from the NEW drag end + if (abs(position - mCurrentCursorPos) > + abs(position - mInitialCursorPos)) + mInitialCursorPos = mCurrentCursorPos; + } + else + mInitialCursorPos = position; + + mCurrentCursorPos = position; + + mDrawCursor = true; + mRightDragging = false; + } + else + // Actually this might be right or middle down + mRightDragging = true; // reset the highlight indicator wxRect highlightedRect; @@ -1600,28 +1596,8 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, xpos1, labelStruct.y - mFontHeight / 2, (int)(xpos2 - xpos1 + 0.5), mFontHeight }; - - // reset when left button is down - if (evt.LeftDown()) - labelStruct.highlighted = false; - // reset when right button is down outside text box - if (evt.RightDown()) - { - if (!highlightedRect.Contains(evt.m_x, evt.m_y)) - { - mCurrentCursorPos = mInitialCursorPos = 0; - labelStruct.highlighted = false; - } - } - // set changeInitialMouseXPos flag - labelStruct.changeInitialMouseXPos = true; } - // disable displaying if right button is down outside text box - if (evt.RightDown() - && !highlightedRect.Contains(evt.m_x, evt.m_y)) - mDragXPos = -1; - // Middle click on GTK: paste from primary selection #if defined(__WXGTK__) && (HAVE_GTK) if (evt.MiddleDown()) { @@ -1634,16 +1610,6 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, *newSel = SelectedRegion(t, t); } #endif - - // handle shift+mouse left button - if (evt.ShiftDown()) { - // if the mouse is clicked in text box, set flags - mDragXPos = evt.m_x; - - // for preventing dragging glygh from changing current cursor position - // set end dragging position to current cursor position - SetCurrentCursorPosition(evt.m_x); - } } #if defined(__WXGTK__) && (HAVE_GTK) @@ -1732,9 +1698,8 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (len > 0) { // IF there are some highlighted letters, THEN DELETE them - if (labelStruct.highlighted) { + if (mInitialCursorPos != mCurrentCursorPos) RemoveSelectedText(); - } else { // DELETE one letter @@ -1763,9 +1728,8 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (len > 0) { // if there are some highlighted letters, DELETE them - if (labelStruct.highlighted) { + if (mInitialCursorPos != mCurrentCursorPos) RemoveSelectedText(); - } else { // DELETE one letter @@ -1789,11 +1753,9 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) // Move cursor to beginning of label mCurrentCursorPos = 0; if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; + ; + else mInitialCursorPos = mCurrentCursorPos; - } break; case WXK_END: @@ -1801,11 +1763,9 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) // Move cursor to end of label mCurrentCursorPos = (int)title.length(); if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; + ; + else mInitialCursorPos = mCurrentCursorPos; - } break; case WXK_LEFT: @@ -1814,11 +1774,10 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (mCurrentCursorPos > 0) { mCurrentCursorPos--; if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; - mInitialCursorPos = mCurrentCursorPos; - } + ; + else + mInitialCursorPos = mCurrentCursorPos = + std::min(mInitialCursorPos, mCurrentCursorPos); } break; @@ -1828,11 +1787,10 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (mCurrentCursorPos < (int)title.length()) { mCurrentCursorPos++; if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; - mInitialCursorPos = mCurrentCursorPos; - } + ; + else + mInitialCursorPos = mCurrentCursorPos = + std::max(mInitialCursorPos, mCurrentCursorPos); } break; @@ -1984,9 +1942,8 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event) auto &title = labelStruct.title; // Test if cursor is in the end of string or not - if (labelStruct.highlighted) { + if (mInitialCursorPos != mCurrentCursorPos) RemoveSelectedText(); - } if (mCurrentCursorPos < (int)title.length()) { // Get substring on the righthand side of cursor @@ -2048,9 +2005,6 @@ void LabelTrack::ShowContextMenu() parent->PopupMenu(&menu, x, ls->y + (mIconHeight / 2) - 1); } - - // it's an invalid dragging event - SetWrongDragging(true); } void LabelTrack::OnContextMenu(wxCommandEvent & evt) @@ -2126,8 +2080,6 @@ void LabelTrack::RemoveSelectedText() title = left + right; mInitialCursorPos = mCurrentCursorPos = left.Length(); - labelStruct.highlighted = false; - mDragXPos = -1; } void LabelTrack::Unselect() diff --git a/src/LabelTrack.h b/src/LabelTrack.h index b1ef18a92..ee747074d 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -96,8 +96,6 @@ public: mutable int xText; /// Pixel position of left hand side of text box mutable int y; /// Pixel position of label. - mutable bool highlighted; /// if the text is highlighted - mutable bool changeInitialMouseXPos; /// flag to change initial mouse X pos bool updated; /// flag to tell if the label times were updated }; @@ -180,9 +178,6 @@ class AUDACITY_DLL_API LabelTrack final : public Track bool PasteSelectedText(double sel0, double sel1); static bool IsTextClipSupported(); - // methods to set flags - void SetWrongDragging(bool rightFlag) { mRightDragging = rightFlag; } - void HandleClick(const wxMouseEvent & evt, const wxRect & r, const ZoomInfo &zoomInfo, SelectedRegion *newSel); bool HandleGlyphDragRelease(const wxMouseEvent & evt, wxRect & r, const ZoomInfo &zoomInfo, @@ -263,8 +258,6 @@ class AUDACITY_DLL_API LabelTrack final : public Track static int mFontHeight; int mCurrentCursorPos; /// current cursor position int mInitialCursorPos; /// initial cursor position - int mDragXPos; /// end X pos of dragging - /// in text box bool mRightDragging; /// flag to tell if it's a valid dragging bool mDrawCursor; /// flag to tell if drawing the @@ -279,6 +272,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track void ComputeTextPosition(const wxRect & r, int index) const; public: + int FindCurrentCursorPosition(int xPos); void SetCurrentCursorPosition(int xPos); private: From e97568db1b01a659d6085119a901da8bd1643ba0 Mon Sep 17 00:00:00 2001 From: windinthew Date: Tue, 12 Jul 2016 15:05:48 +0100 Subject: [PATCH 5/8] More access key fixes. Better Pinned tooltip. --- src/Menus.cpp | 8 ++++---- src/widgets/Ruler.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Menus.cpp b/src/Menus.cpp index d7680c033..8832fbb0e 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -325,7 +325,7 @@ void AudacityProject::CreateMenusAndCommands() AudioIONotBusyFlag | UnsavedChangesFlag); c->AddItem(wxT("SaveAs"), _("Save Project &As..."), FN(OnSaveAs)); #ifdef USE_LIBVORBIS - c->AddItem(wxT("SaveCompressed"), _("Save Compressed Copy of Project..."), FN(OnSaveCompressed)); + c->AddItem(wxT("SaveCompressed"), _("Sa&ve Compressed Copy of Project..."), FN(OnSaveCompressed)); #endif c->AddItem(wxT("CheckDeps"), _("Chec&k Dependencies..."), FN(OnCheckDependencies)); @@ -371,7 +371,7 @@ void AudacityProject::CreateMenusAndCommands() AudioIONotBusyFlag | WaveTracksExistFlag, AudioIONotBusyFlag | WaveTracksExistFlag); #if defined(USE_MIDI) - c->AddItem(wxT("ExportMIDI"), _("Export MIDI..."), FN(OnExportMIDI), + c->AddItem(wxT("ExportMIDI"), _("Export MI&DI..."), FN(OnExportMIDI), AudioIONotBusyFlag | NoteTracksSelectedFlag, AudioIONotBusyFlag | NoteTracksSelectedFlag); #endif @@ -733,7 +733,7 @@ void AudacityProject::CreateMenusAndCommands() c->AddSeparator(); /* i18n-hint: (verb)*/ - c->AddItem(wxT("ResetToolbars"), _("&Reset Toolbars"), FN(OnResetToolBars), 0, AlwaysEnabledFlag, AlwaysEnabledFlag); + c->AddItem(wxT("ResetToolbars"), _("Reset Toolb&ars"), FN(OnResetToolBars), 0, AlwaysEnabledFlag, AlwaysEnabledFlag); c->EndSubMenu(); @@ -776,7 +776,7 @@ void AudacityProject::CreateMenusAndCommands() c->AddSeparator(); - c->AddCheck(wxT("PinnedHead"), _("Pinned Recording/Playback Head"), + c->AddCheck(wxT("PinnedHead"), _("Pinned Recording/Playback &Head"), FN(OnTogglePinnedHead), 0, // Switching of scrolling on and off is permitted even during transport AlwaysEnabledFlag, AlwaysEnabledFlag); diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 4fe3899b5..e64feac1b 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2811,8 +2811,8 @@ void AdornedRulerPanel::UpdateButtonStates() const auto label = state // Label descibes the present state, not what the click does // (which is, to toggle the state) - ? _("Pinned play/record Head") - : _("Unpinned play/record Head"); + ? _("Pinned Record/Play head") + : _("Unpinned Record/Play head"); common(*pinButton, wxT("PinnedHead"), label); } } From 26676652d7f54de518ed348a3c672afcd71b7c3e Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 12 Jul 2016 12:13:08 -0400 Subject: [PATCH 6/8] Bug1443 again: Mac label shift-click should differ, per David Bailes --- src/LabelTrack.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index 0badcdabd..60baf0b96 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -1565,12 +1565,20 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, // Find the NEW drag end auto position = FindCurrentCursorPosition(evt.m_x); + // Anchor shift-drag at the farther end of the previous highlight + // that is farther from the click, on Mac, for consistency with + // its text editors, but on the others, re-use the previous + // anchor. if (evt.ShiftDown()) { +#ifdef __WXMAC__ // Set the drag anchor at the end of the previous selection // that is farther from the NEW drag end if (abs(position - mCurrentCursorPos) > abs(position - mInitialCursorPos)) mInitialCursorPos = mCurrentCursorPos; +#else + // mInitialCursorPos remains as before +#endif } else mInitialCursorPos = position; From d91f82542458ac9fbcc67e0aa69b1f486e317b01 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 12 Jul 2016 15:26:40 -0400 Subject: [PATCH 7/8] Restore correct resizing of the time ruler for the scrub bar button This was broken at ae14cb0dbccf9587b7a13f5ddc49c2b27acfec1e --- src/widgets/Ruler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index e64feac1b..b54d94bc4 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2782,7 +2782,7 @@ void AdornedRulerPanel::OnToggleScrubBar(/*wxCommandEvent&*/) wxSize size { GetSize().GetWidth(), GetRulerHeight(mShowScrubbing) }; SetSize(size); SetMinSize(size); - PostSizeEventToParent(); + GetParent()->PostSizeEventToParent(); } void AdornedRulerPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event)) From b6b9840d0649e0ab2bdf1375cf72d47f86a6ca13 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 12 Jul 2016 20:31:55 -0400 Subject: [PATCH 8/8] Enh1444 and Bug1435 fixed by CHANGED MAC BUILD PROCEURE... Enh1444 is to make pinch and spread gestures work. Bug1435 is to bring focus rings back for types of controls that lost them in version 2.1.2. This importantly includes pushbuttons and choice controls (drop-down menus). Less importantly, date picker (as in the Timer Record dialog) and Listbox (as in the dialog to choose label font). There is one more type of control that lost focus rings, and is not fixed: List controls (distinct from list boxes), such as in the Manage Curves dialog that opens from Equalization. --- mac/Build.txt | 2 + mac/wxMac_additions/focusrings.patch | 123 +++++++++++++++ mac/wxMac_additions/pinch-spread.patch | 206 +++++++++++++++++++++++++ 3 files changed, 331 insertions(+) create mode 100644 mac/wxMac_additions/focusrings.patch create mode 100644 mac/wxMac_additions/pinch-spread.patch diff --git a/mac/Build.txt b/mac/Build.txt index 36d10dda0..db7901e1c 100644 --- a/mac/Build.txt +++ b/mac/Build.txt @@ -37,6 +37,8 @@ http://forum.audacityteam.org/viewtopic.php?p=303835#p303835 . cd wxWidgets-3.0.2 patch -p0 -i /mac/wxMac_additions/wxMac-3.0.2-fixes.patch . patch -p0 -i /mac/wxMac_additions/eventloops.patch . + patch -p0 -i /mac/wxMac_additions/pinch-spread.patch . + patch -p0 -i /mac/wxMac_additions/focusrings.patch . 10) And finally build/install wxWidgets: diff --git a/mac/wxMac_additions/focusrings.patch b/mac/wxMac_additions/focusrings.patch new file mode 100644 index 000000000..648b56133 --- /dev/null +++ b/mac/wxMac_additions/focusrings.patch @@ -0,0 +1,123 @@ +From 148b0ed936b023b9b87d7703ecb86c4279f1182a Mon Sep 17 00:00:00 2001 +From: Paul Licameli +Date: Wed, 6 Jul 2016 14:18:17 -0400 +Subject: [PATCH 2/2] Focus rings are back for buttons, choice, listbox, + dateTimePicker controls + +--- + include/wx/button.h | 2 ++ + include/wx/choice.h | 2 ++ + include/wx/datetimectrl.h | 2 ++ + include/wx/listbox.h | 2 ++ + include/wx/window.h | 2 ++ + src/osx/cocoa/window.mm | 22 +++++++++++++++++++++- + 6 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/include/wx/button.h b/include/wx/button.h +index 71dbee4..6aa75d3 100644 +--- include/wx/button.h ++++ include/wx/button.h +@@ -42,6 +42,8 @@ public: + // returns the default button size for this platform + static wxSize GetDefaultSize(); + ++ virtual bool NeedsFocusRing() const { return true; } ++ + protected: + wxDECLARE_NO_COPY_CLASS(wxButtonBase); + }; +diff --git a/include/wx/choice.h b/include/wx/choice.h +index 3a848f9..421a9a7 100644 +--- include/wx/choice.h ++++ include/wx/choice.h +@@ -57,6 +57,8 @@ public: + // override wxItemContainer::IsSorted + virtual bool IsSorted() const { return HasFlag(wxCB_SORT); } + ++ virtual bool NeedsFocusRing() const { return true; } ++ + protected: + // The generic implementation doesn't determine the height correctly and + // doesn't account for the width of the arrow but does take into account +diff --git a/include/wx/datetimectrl.h b/include/wx/datetimectrl.h +index 30f23df..d51c6c1 100644 +--- include/wx/datetimectrl.h ++++ include/wx/datetimectrl.h +@@ -32,6 +32,8 @@ public: + // Set/get the date or time (in the latter case, time part is ignored). + virtual void SetValue(const wxDateTime& dt) = 0; + virtual wxDateTime GetValue() const = 0; ++ ++ virtual bool NeedsFocusRing() const { return true; } + }; + + #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) +diff --git a/include/wx/listbox.h b/include/wx/listbox.h +index afb0220..b9d47f0 100644 +--- include/wx/listbox.h ++++ include/wx/listbox.h +@@ -94,6 +94,8 @@ public: + int HitTest(const wxPoint& point) const { return DoListHitTest(point); } + int HitTest(int x, int y) const { return DoListHitTest(wxPoint(x, y)); } + ++ virtual bool NeedsFocusRing() const { return true; } ++ + + protected: + virtual void DoSetFirstItem(int n) = 0; +diff --git a/include/wx/window.h b/include/wx/window.h +index 7dffad4..bbe727d 100644 +--- include/wx/window.h ++++ include/wx/window.h +@@ -260,6 +260,8 @@ public: + // moving/resizing + // --------------- + ++ virtual bool NeedsFocusRing() const { return false; } ++ + // set the window size and/or position + void SetSize( int x, int y, int width, int height, + int sizeFlags = wxSIZE_AUTO ) +diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm +index d9fa4ae..881d0e9 100644 +--- src/osx/cocoa/window.mm ++++ src/osx/cocoa/window.mm +@@ -17,6 +17,7 @@ + #include "wx/textctrl.h" + #include "wx/combobox.h" + #include "wx/radiobut.h" ++ #include "wx/button.h" + #endif + + #ifdef __WXMAC__ +@@ -1660,7 +1661,26 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) + // call super + SEL _cmd = @selector(drawRect:); + wxOSX_DrawRectHandlerPtr superimpl = (wxOSX_DrawRectHandlerPtr) [[slf superclass] instanceMethodForSelector:_cmd]; +- superimpl(slf, _cmd, *(NSRect*)rect); ++ ++ wxWindow *peer = GetWXPeer(); ++ bool hasFocus = peer->HasFocus(); ++ if (hasFocus && ++ peer->NeedsFocusRing()) { ++ superimpl(slf, _cmd, *(NSRect*)rect); ++ ++ // Paint it again, without text, causing focus halo to be ++ // superimposed about all else ++ HIThemeBeginFocus( context, kHIThemeFocusRingOnly, NULL ); ++ CGContextSetTextDrawingMode( context, kCGTextInvisible ); ++ superimpl(slf, _cmd, *(NSRect*)rect); ++ HIThemeEndFocus( context ); ++ ++ CGContextRestoreGState( context ); ++ CGContextSaveGState( context ); ++ } ++ else ++ superimpl(slf, _cmd, *(NSRect*)rect); ++ + CGContextRestoreGState( context ); + CGContextSaveGState( context ); + } +-- +2.3.2 (Apple Git-55) + diff --git a/mac/wxMac_additions/pinch-spread.patch b/mac/wxMac_additions/pinch-spread.patch new file mode 100644 index 000000000..f8ad200b9 --- /dev/null +++ b/mac/wxMac_additions/pinch-spread.patch @@ -0,0 +1,206 @@ +From 74a186065ad04a1ed3d43baeccec9083910ec623 Mon Sep 17 00:00:00 2001 +From: Paul Licameli +Date: Sun, 3 Jul 2016 10:16:12 -0400 +Subject: [PATCH 1/2] Add wxEVT_MAGNIFY mouse event. + +Currently this is implemented for wxOSX only. + +Closes #14322. + +git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78274 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 +--- + docs/changes.txt | 1 + + include/wx/event.h | 9 ++++++++- + interface/wx/event.h | 29 +++++++++++++++++++++++++++++ + src/common/event.cpp | 4 ++++ + src/osx/cocoa/window.mm | 10 ++++++++++ + 5 files changed, 52 insertions(+), 1 deletion(-) + +diff --git a/docs/changes.txt b/docs/changes.txt +index 72e7d42..6436bfb 100644 +--- docs/changes.txt ++++ docs/changes.txt +@@ -585,6 +585,7 @@ All: + + All (GUI): + ++- Add wxEVT_MAGNIFY mouse event (Joost Nieuwenhuijse). + - Add wxGenericListCtrl::EndEditLabel() (Tim Kosse). + - Implement bounding box computation in wxGCDC (Toni Ruža). + - Fix saving GIF animations with 2.5s+ delays between frames (elvissteinjr). +diff --git a/include/wx/event.h b/include/wx/event.h +index 61ec19c..26af365 100644 +--- include/wx/event.h ++++ include/wx/event.h +@@ -716,6 +716,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX1_DCLICK, wxMouseEvent); + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_DOWN, wxMouseEvent); + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_UP, wxMouseEvent); + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_DCLICK, wxMouseEvent); ++wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MAGNIFY, wxMouseEvent); + + // Character input event type + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHAR, wxKeyEvent); +@@ -1751,6 +1752,8 @@ public: + bool Aux1DClick() const { return (m_eventType == wxEVT_AUX1_DCLICK); } + bool Aux2DClick() const { return (m_eventType == wxEVT_AUX2_DCLICK); } + ++ bool Magnify() const { return (m_eventType == wxEVT_MAGNIFY); } ++ + // True if a button is down and the mouse is moving + bool Dragging() const + { +@@ -1805,6 +1808,7 @@ public: + // Is the system set to do page scrolling? + bool IsPageScroll() const { return ((unsigned int)m_linesPerAction == UINT_MAX); } + ++ float GetMagnification() const { return m_magnification; } + virtual wxEvent *Clone() const { return new wxMouseEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_USER_INPUT; } + +@@ -1823,6 +1827,7 @@ public: + int m_wheelDelta; + int m_linesPerAction; + int m_columnsPerAction; ++ float m_magnification; + + protected: + void Assign(const wxMouseEvent& evt); +@@ -4218,6 +4223,7 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& + #define EVT_MOUSE_AUX2_DOWN(func) wx__DECLARE_EVT0(wxEVT_AUX2_DOWN, wxMouseEventHandler(func)) + #define EVT_MOUSE_AUX2_UP(func) wx__DECLARE_EVT0(wxEVT_AUX2_UP, wxMouseEventHandler(func)) + #define EVT_MOUSE_AUX2_DCLICK(func) wx__DECLARE_EVT0(wxEVT_AUX2_DCLICK, wxMouseEventHandler(func)) ++#define EVT_MAGNIFY(func) wx__DECLARE_EVT0(wxEVT_MAGNIFY, wxMouseEventHandler(func)) + + // All mouse events + #define EVT_MOUSE_EVENTS(func) \ +@@ -4239,7 +4245,8 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& + EVT_MOTION(func) \ + EVT_LEAVE_WINDOW(func) \ + EVT_ENTER_WINDOW(func) \ +- EVT_MOUSEWHEEL(func) ++ EVT_MOUSEWHEEL(func) \ ++ EVT_MAGNIFY(func) + + // Scrolling from wxWindow (sent to wxScrolledWindow) + #define EVT_SCROLLWIN_TOP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_TOP, wxScrollWinEventHandler(func)) +diff --git a/interface/wx/event.h b/interface/wx/event.h +index 52bb609..7fe007a 100644 +--- interface/wx/event.h ++++ interface/wx/event.h +@@ -2626,6 +2626,8 @@ enum wxMouseWheelAxis + Process a @c wxEVT_MOUSEWHEEL event. + @event{EVT_MOUSE_EVENTS(func)} + Process all mouse events. ++ @event{EVT_MAGNIFY(func)} ++ Process a @c wxEVT_MAGNIFY event (new since wxWidgets 3.1.0). + @endEventTable + + @library{wxcore} +@@ -2659,6 +2661,7 @@ public: + @li @c wxEVT_AUX2_DCLICK + @li @c wxEVT_MOTION + @li @c wxEVT_MOUSEWHEEL ++ @li @c wxEVT_MAGNIFY + */ + wxMouseEvent(wxEventType mouseEventType = wxEVT_NULL); + +@@ -2785,6 +2788,21 @@ public: + wxPoint GetLogicalPosition(const wxDC& dc) const; + + /** ++ For magnify (pinch to zoom) events: returns the change in magnification. ++ ++ A value of 0 means no change, a positive value means we should enlarge ++ (or zoom in), a negative value means we should shrink (or zoom out). ++ ++ This method is only valid to call for @c wxEVT_MAGNIFY events which are ++ currently only generated under OS X. ++ ++ @see Magnify() ++ ++ @since 3.1.0 ++ */ ++ float GetMagnification() const; ++ ++ /** + Get wheel delta, normally 120. + + This is the threshold for action to be taken, and one such action +@@ -2851,6 +2869,17 @@ public: + bool LeftUp() const; + + /** ++ Returns @true if the event is a magnify (i.e.\ pinch to zoom) event. ++ ++ Such events are currently generated only under OS X. ++ ++ @see GetMagnification() ++ ++ @since 3.1.0 ++ */ ++ bool Magnify() const; ++ ++ /** + Returns @true if the Meta key was down at the time of the event. + */ + bool MetaDown() const; +diff --git a/src/common/event.cpp b/src/common/event.cpp +index d92a4ac..1015c84 100644 +--- src/common/event.cpp ++++ src/common/event.cpp +@@ -208,6 +208,7 @@ wxDEFINE_EVENT( wxEVT_AUX1_DCLICK, wxMouseEvent ); + wxDEFINE_EVENT( wxEVT_AUX2_DOWN, wxMouseEvent ); + wxDEFINE_EVENT( wxEVT_AUX2_UP, wxMouseEvent ); + wxDEFINE_EVENT( wxEVT_AUX2_DCLICK, wxMouseEvent ); ++wxDEFINE_EVENT( wxEVT_MAGNIFY, wxMouseEvent ); + + // Character input event type + wxDEFINE_EVENT( wxEVT_CHAR, wxKeyEvent ); +@@ -576,6 +577,7 @@ wxMouseEvent::wxMouseEvent(wxEventType commandType) + m_wheelDelta = 0; + m_linesPerAction = 0; + m_columnsPerAction = 0; ++ m_magnification = 0.0f; + } + + void wxMouseEvent::Assign(const wxMouseEvent& event) +@@ -600,6 +602,8 @@ void wxMouseEvent::Assign(const wxMouseEvent& event) + m_linesPerAction = event.m_linesPerAction; + m_columnsPerAction = event.m_columnsPerAction; + m_wheelAxis = event.m_wheelAxis; ++ ++ m_magnification = event.m_magnification; + } + + // return true if was a button dclick event +diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm +index ede8ebf..d9fa4ae 100644 +--- src/osx/cocoa/window.mm ++++ src/osx/cocoa/window.mm +@@ -741,6 +741,12 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve + case NSMouseMoved : + wxevent.SetEventType( wxEVT_MOTION ) ; + break; ++ ++ case NSEventTypeMagnify: ++ wxevent.SetEventType( wxEVT_MAGNIFY ); ++ wxevent.m_magnification = [nsEvent magnification]; ++ break; ++ + default : + break ; + } +@@ -1772,6 +1778,10 @@ void wxOSXCocoaClassAddWXMethods(Class c) + wxOSX_CLASS_ADD_METHOD(c, @selector(scrollWheel:), (IMP) wxOSX_mouseEvent, "v@:@" ) + wxOSX_CLASS_ADD_METHOD(c, @selector(mouseEntered:), (IMP) wxOSX_mouseEvent, "v@:@" ) + wxOSX_CLASS_ADD_METHOD(c, @selector(mouseExited:), (IMP) wxOSX_mouseEvent, "v@:@" ) ++ ++#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ++ wxOSX_CLASS_ADD_METHOD(c, @selector(magnifyWithEvent:), (IMP)wxOSX_mouseEvent, "v@:@") ++#endif + + wxOSX_CLASS_ADD_METHOD(c, @selector(cursorUpdate:), (IMP) wxOSX_cursorUpdate, "v@:@" ) + +-- +2.3.2 (Apple Git-55) +