diff --git a/Externals/wxWidgets3/CMakeLists.txt b/Externals/wxWidgets3/CMakeLists.txt index 6629d0865e..b2a74d4afd 100644 --- a/Externals/wxWidgets3/CMakeLists.txt +++ b/Externals/wxWidgets3/CMakeLists.txt @@ -1,4 +1,4 @@ -# gtk, msw, osx and shared files as of r74856 +# gtk, msw, osx and shared files as of r75363 set(SRCS_AUI "src/aui/auibar.cpp" @@ -906,6 +906,7 @@ add_definitions(-Wno-shadow) add_definitions(-Wno-parentheses-equality) add_definitions(-Wno-self-assign) add_definitions(-Wno-null-conversion) +add_definitions(-Wno-sign-compare) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++98") enable_precompiled_headers(include/wx/wxprec.h src/common/dummy.cpp SRCS) diff --git a/Externals/wxWidgets3/build_wx.sh b/Externals/wxWidgets3/build_wx.sh index 39c7d97d29..89281b442c 100755 --- a/Externals/wxWidgets3/build_wx.sh +++ b/Externals/wxWidgets3/build_wx.sh @@ -1,6 +1,6 @@ #!/bin/bash -svn co -r 74856 http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets +svn co -r 75363 http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk wxWidgets cd wxWidgets case $OSTYPE in diff --git a/Externals/wxWidgets3/include/msvc/wx/setup.h b/Externals/wxWidgets3/include/msvc/wx/setup.h index 31c5efc42f..7a8d472c78 100644 --- a/Externals/wxWidgets3/include/msvc/wx/setup.h +++ b/Externals/wxWidgets3/include/msvc/wx/setup.h @@ -148,6 +148,9 @@ #pragma comment(lib, wxWX_LIB_NAME("base", "")) #ifndef wxNO_NET_LIB + #ifndef WXUSINGDLL + #pragma comment(lib, "wsock32") + #endif #pragma comment(lib, wxBASE_LIB_NAME("net")) #endif #ifndef wxNO_XML_LIB @@ -235,7 +238,6 @@ #pragma comment(lib, "uuid") #pragma comment(lib, "rpcrt4") #pragma comment(lib, "advapi32") - #pragma comment(lib, "wsock32") #if wxUSE_URL_NATIVE #pragma comment(lib, "wininet") #endif diff --git a/Externals/wxWidgets3/include/wx/bitmap.h b/Externals/wxWidgets3/include/wx/bitmap.h index 506ef6983d..bcb189c5d3 100644 --- a/Externals/wxWidgets3/include/wx/bitmap.h +++ b/Externals/wxWidgets3/include/wx/bitmap.h @@ -175,7 +175,7 @@ public: virtual bool Create(int width, int height, int depth = wxBITMAP_SCREEN_DEPTH) = 0; virtual bool Create(const wxSize& sz, int depth = wxBITMAP_SCREEN_DEPTH) = 0; virtual bool CreateScaled(int w, int h, int d, double logicalScale) - { return Create(w*logicalScale,h*logicalScale,d); } + { return Create(wxRound(w*logicalScale), wxRound(h*logicalScale), d); } virtual int GetHeight() const = 0; virtual int GetWidth() const = 0; @@ -189,7 +189,7 @@ public: virtual double GetScaledWidth() const { return GetWidth() / GetScaleFactor(); } virtual double GetScaledHeight() const { return GetHeight() / GetScaleFactor(); } virtual wxSize GetScaledSize() const - { return wxSize(GetScaledWidth(), GetScaledHeight()); } + { return wxSize(wxRound(GetScaledWidth()), wxRound(GetScaledHeight())); } #if wxUSE_IMAGE virtual wxImage ConvertToImage() const = 0; diff --git a/Externals/wxWidgets3/include/wx/buffer.h b/Externals/wxWidgets3/include/wx/buffer.h index c88e160270..9891494d97 100644 --- a/Externals/wxWidgets3/include/wx/buffer.h +++ b/Externals/wxWidgets3/include/wx/buffer.h @@ -268,9 +268,22 @@ public: wxCharTypeBuffer(size_t len) { - this->m_data = - new Data((CharType *)malloc((len + 1)*sizeof(CharType)), len); - this->m_data->Get()[len] = (CharType)0; + CharType* const str = (CharType *)malloc((len + 1)*sizeof(CharType)); + if ( str ) + { + str[len] = (CharType)0; + + // There is a potential memory leak here if new throws because it + // fails to allocate Data, we ought to use new(nothrow) here, but + // this might fail to compile under some platforms so until this + // can be fully tested, just live with this (rather unlikely, as + // Data is a small object) potential leak. + this->m_data = new Data(str, len); + } + else + { + this->m_data = this->GetNullData(); + } } wxCharTypeBuffer(const wxCharTypeBuffer& src) diff --git a/Externals/wxWidgets3/include/wx/choicdlg.h b/Externals/wxWidgets3/include/wx/choicdlg.h index 863b880aff..0ab4c076d6 100644 --- a/Externals/wxWidgets3/include/wx/choicdlg.h +++ b/Externals/wxWidgets3/include/wx/choicdlg.h @@ -11,11 +11,12 @@ #ifndef _WX_CHOICDLG_H_BASE_ #define _WX_CHOICDLG_H_BASE_ +#include "wx/defs.h" + #if wxUSE_CHOICEDLG #include "wx/generic/choicdgg.h" #endif -#endif - // _WX_CHOICDLG_H_BASE_ +#endif // _WX_CHOICDLG_H_BASE_ diff --git a/Externals/wxWidgets3/include/wx/combo.h b/Externals/wxWidgets3/include/wx/combo.h index 4bae2cfea6..6a040b3d22 100644 --- a/Externals/wxWidgets3/include/wx/combo.h +++ b/Externals/wxWidgets3/include/wx/combo.h @@ -560,7 +560,7 @@ protected: // just recalculate. void CalculateAreas( int btnWidth = 0 ); - // Standard textctrl positioning routine. Just give it platform-dependant + // Standard textctrl positioning routine. Just give it platform-dependent // textctrl coordinate adjustment. virtual void PositionTextCtrl( int textCtrlXAdjust = 0, int textCtrlYAdjust = 0); @@ -701,7 +701,7 @@ protected: // area used by the button wxSize m_btnSize; - // platform-dependant customization and other flags + // platform-dependent customization and other flags wxUint32 m_iFlags; // custom style for m_text diff --git a/Externals/wxWidgets3/include/wx/compiler.h b/Externals/wxWidgets3/include/wx/compiler.h index e633ca158e..5ad4df8561 100644 --- a/Externals/wxWidgets3/include/wx/compiler.h +++ b/Externals/wxWidgets3/include/wx/compiler.h @@ -19,7 +19,7 @@ /* Notice that Intel compiler can be used as Microsoft Visual C++ add-on and so we should define both __INTELC__ and __VISUALC__ for it. - */ +*/ #ifdef __INTEL_COMPILER # define __INTELC__ #endif @@ -135,15 +135,40 @@ #endif /* - This macro can be used to check that the version of mingw32 compiler is - at least maj.min + This macro can be used to check that the version of mingw32 CRT is at least + maj.min */ /* Check for Mingw runtime version: */ -#if defined(__MINGW32_MAJOR_VERSION) && defined(__MINGW32_MINOR_VERSION) +#ifdef __MINGW32__ + /* Include the header defining __MINGW32_{MAJ,MIN}OR_VERSION */ + #include <_mingw.h> + #define wxCHECK_MINGW32_VERSION( major, minor ) \ ( ( ( __MINGW32_MAJOR_VERSION > (major) ) \ || ( __MINGW32_MAJOR_VERSION == (major) && __MINGW32_MINOR_VERSION >= (minor) ) ) ) + +/* + MinGW-w64 project provides compilers for both Win32 and Win64 but only + defines the same __MINGW32__ symbol for the former as MinGW32 toolchain + which is quite different (notably doesn't provide many SDK headers that + MinGW-w64 does include). So we define a separate symbol which, unlike the + predefined __MINGW64__, can be used to detect this toolchain in both 32 and + 64 bit builds. + + And define __MINGW32_TOOLCHAIN__ for consistency and also because it's + convenient as we often want to have some workarounds only for the (old) + MinGW32 but not (newer) MinGW-w64, which still predefines __MINGW32__. + */ +# ifdef __MINGW64_VERSION_MAJOR +# ifndef __MINGW64_TOOLCHAIN__ +# define __MINGW64_TOOLCHAIN__ +# endif +# else +# ifndef __MINGW32_TOOLCHAIN__ +# define __MINGW32_TOOLCHAIN__ +# endif +# endif #else #define wxCHECK_MINGW32_VERSION( major, minor ) (0) #endif diff --git a/Externals/wxWidgets3/include/wx/dataview.h b/Externals/wxWidgets3/include/wx/dataview.h index 298ab7f979..2aa4a60d7d 100644 --- a/Externals/wxWidgets3/include/wx/dataview.h +++ b/Externals/wxWidgets3/include/wx/dataview.h @@ -972,6 +972,7 @@ public: void InsertItem( unsigned int row, const wxVector &values, wxUIntPtr data = 0 ); void DeleteItem( unsigned int pos ); void DeleteAllItems(); + void ClearColumns(); unsigned int GetItemCount() const; @@ -1040,6 +1041,7 @@ public: virtual bool PrependColumn( wxDataViewColumn *col ); virtual bool InsertColumn( unsigned int pos, wxDataViewColumn *col ); virtual bool AppendColumn( wxDataViewColumn *col ); + virtual bool ClearColumns(); wxDataViewColumn *AppendTextColumn( const wxString &label, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, diff --git a/Externals/wxWidgets3/include/wx/defs.h b/Externals/wxWidgets3/include/wx/defs.h index 00c6427636..a15f7cc576 100644 --- a/Externals/wxWidgets3/include/wx/defs.h +++ b/Externals/wxWidgets3/include/wx/defs.h @@ -310,8 +310,10 @@ typedef short int WXTYPE; inline T wx_truncate_cast_impl(X x) { #pragma warning(push) - /* conversion from 'X' to 'T', possible loss of data */ + /* conversion from 'size_t' to 'type', possible loss of data */ #pragma warning(disable: 4267) + /* conversion from 'type1' to 'type2', possible loss of data */ + #pragma warning(disable: 4242) return x; @@ -951,6 +953,10 @@ typedef wxUint16 wxWord; #define SIZEOF_LONG 4 #endif + #ifndef SIZEOF_LONG_LONG + #define SIZEOF_LONG_LONG 8 + #endif + #ifndef SIZEOF_WCHAR_T /* Windows uses UTF-16 */ #define SIZEOF_WCHAR_T 2 @@ -2287,8 +2293,13 @@ enum wxStandardID wxID_OSX_HIDE = wxID_OSX_MENU_FIRST, wxID_OSX_HIDEOTHERS, wxID_OSX_SHOWALL, +#if wxABI_VERSION >= 30001 + wxID_OSX_SERVICES, + wxID_OSX_MENU_LAST = wxID_OSX_SERVICES, +#else wxID_OSX_MENU_LAST = wxID_OSX_SHOWALL, - +#endif + /* IDs used by generic file dialog (13 consecutive starting from this value) */ wxID_FILEDLGG = 5900, diff --git a/Externals/wxWidgets3/include/wx/dialog.h b/Externals/wxWidgets3/include/wx/dialog.h index e32cabb018..7110151356 100644 --- a/Externals/wxWidgets3/include/wx/dialog.h +++ b/Externals/wxWidgets3/include/wx/dialog.h @@ -13,6 +13,7 @@ #include "wx/toplevel.h" #include "wx/containr.h" +#include "wx/sharedptr.h" class WXDLLIMPEXP_FWD_CORE wxSizer; class WXDLLIMPEXP_FWD_CORE wxStdDialogButtonSizer; @@ -402,24 +403,29 @@ class wxWindowModalDialogEventFunctor { public: wxWindowModalDialogEventFunctor(const Functor& f) - : m_f(f), m_wasCalled(false) + : m_f(new Functor(f)) {} void operator()(wxWindowModalDialogEvent& event) { - if ( m_wasCalled ) + if ( m_f ) + { + // We only want to call this handler once. Also, by deleting + // the functor here, its data (such as wxWindowPtr pointing to + // the dialog) are freed immediately after exiting this operator(). + wxSharedPtr functor(m_f); + m_f.reset(); + + (*functor)(event.GetReturnCode()); + } + else // was already called once { event.Skip(); - return; } - - m_wasCalled = true; - m_f(event.GetReturnCode()); } private: - Functor m_f; - bool m_wasCalled; + wxSharedPtr m_f; }; template @@ -428,7 +434,7 @@ void wxDialogBase::ShowWindowModalThenDo(const Functor& onEndModal) Bind(wxEVT_WINDOW_MODAL_DIALOG_CLOSED, wxWindowModalDialogEventFunctor(onEndModal)); ShowWindowModal(); -}; +} #endif // wxHAS_EVENT_BIND #endif diff --git a/Externals/wxWidgets3/include/wx/docview.h b/Externals/wxWidgets3/include/wx/docview.h index 44fbe90639..78bf44d4b4 100644 --- a/Externals/wxWidgets3/include/wx/docview.h +++ b/Externals/wxWidgets3/include/wx/docview.h @@ -279,6 +279,9 @@ public: // destroyed void SetDocChildFrame(wxDocChildFrameAnyBase *docChildFrame); + // get the associated frame, may be NULL during destruction + wxDocChildFrameAnyBase* GetDocChildFrame() const { return m_docChildFrame; } + protected: // hook the document into event handlers chain here virtual bool TryBefore(wxEvent& event); @@ -597,9 +600,10 @@ public: m_childDocument = NULL; m_childView = NULL; m_win = NULL; + m_lastEvent = NULL; } - // full ctor equivalent to using the default one and Create(0 + // full ctor equivalent to using the default one and Create() wxDocChildFrameAnyBase(wxDocument *doc, wxView *view, wxWindow *win) { Create(doc, view, win); @@ -638,6 +642,14 @@ public: wxWindow *GetWindow() const { return m_win; } + // implementation only + + // Check if this event had been just processed in this frame. + bool HasAlreadyProcessed(wxEvent& event) const + { + return m_lastEvent == &event; + } + protected: // we're not a wxEvtHandler but we provide this wxEvtHandler-like function // which is called from TryBefore() of the derived classes to give our view @@ -656,6 +668,10 @@ protected: // allows us to avoid having any virtual functions in this class wxWindow* m_win; +private: + // Pointer to the last processed event used to avoid sending the same event + // twice to wxDocManager, from here and from wxDocParentFrameAnyBase. + wxEvent* m_lastEvent; wxDECLARE_NO_COPY_CLASS(wxDocChildFrameAnyBase); }; @@ -894,7 +910,11 @@ protected: // hook the document manager into event handling chain here virtual bool TryBefore(wxEvent& event) { - return TryProcessEvent(event) || BaseFrame::TryBefore(event); + // It is important to send the event to the base class first as + // wxMDIParentFrame overrides its TryBefore() to send the menu events + // to the currently active child frame and the child must get them + // before our own TryProcessEvent() is executed, not afterwards. + return BaseFrame::TryBefore(event) || TryProcessEvent(event); } private: diff --git a/Externals/wxWidgets3/include/wx/dvrenderers.h b/Externals/wxWidgets3/include/wx/dvrenderers.h index 3f623cf6a6..775bc1a2d8 100644 --- a/Externals/wxWidgets3/include/wx/dvrenderers.h +++ b/Externals/wxWidgets3/include/wx/dvrenderers.h @@ -163,9 +163,7 @@ public: virtual bool IsCustomRenderer() const { return false; } -protected: - // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl - void DestroyEditControl(); + // Implementation only from now on. // Return the alignment of this renderer if it's specified (i.e. has value // different from the default wxDVR_DEFAULT_ALIGNMENT) or the alignment of @@ -176,6 +174,10 @@ protected: // wxDVR_DEFAULT_ALIGNMENT. int GetEffectiveAlignment() const; +protected: + // Called from {Cancel,Finish}Editing() to cleanup m_editorCtrl + void DestroyEditControl(); + wxString m_variantType; wxDataViewColumn *m_owner; wxWeakRef m_editorCtrl; diff --git a/Externals/wxWidgets3/include/wx/event.h b/Externals/wxWidgets3/include/wx/event.h index 1dcdf333dc..61ec19c5b3 100644 --- a/Externals/wxWidgets3/include/wx/event.h +++ b/Externals/wxWidgets3/include/wx/event.h @@ -2275,19 +2275,36 @@ private: class WXDLLIMPEXP_CORE wxActivateEvent : public wxEvent { public: - wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = true, int Id = 0) - : wxEvent(Id, type) - { m_active = active; } + // Type of activation. For now we can only detect if it was by mouse or by + // some other method and even this is only available under wxMSW. + enum Reason + { + Reason_Mouse, + Reason_Unknown + }; + + wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = true, + int Id = 0, Reason activationReason = Reason_Unknown) + : wxEvent(Id, type), + m_activationReason(activationReason) + { + m_active = active; + } wxActivateEvent(const wxActivateEvent& event) : wxEvent(event) - { m_active = event.m_active; } + { + m_active = event.m_active; + m_activationReason = event.m_activationReason; + } bool GetActive() const { return m_active; } + Reason GetActivationReason() const { return m_activationReason;} virtual wxEvent *Clone() const { return new wxActivateEvent(*this); } private: bool m_active; + Reason m_activationReason; private: DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxActivateEvent) diff --git a/Externals/wxWidgets3/include/wx/features.h b/Externals/wxWidgets3/include/wx/features.h index 84a6c35c9d..765f0f7f1f 100644 --- a/Externals/wxWidgets3/include/wx/features.h +++ b/Externals/wxWidgets3/include/wx/features.h @@ -116,7 +116,8 @@ */ #if wxCHECK_GCC_VERSION(3, 2) || wxCHECK_VISUALC_VERSION(7) \ || (defined(__SUNCC__) && __SUNCC__ >= 0x5100) \ - || (defined(__xlC__) && __xlC__ >= 0x700) + || (defined(__xlC__) && __xlC__ >= 0x700) \ + || defined(__INTELC__) #define wxHAS_EVENT_BIND #endif diff --git a/Externals/wxWidgets3/include/wx/filefn.h b/Externals/wxWidgets3/include/wx/filefn.h index a5bcd7e3fc..95b3051c05 100644 --- a/Externals/wxWidgets3/include/wx/filefn.h +++ b/Externals/wxWidgets3/include/wx/filefn.h @@ -77,7 +77,7 @@ // constants // ---------------------------------------------------------------------------- -#if defined(__VISUALC__) || defined(__INTELC__) || defined(__DIGITALMARS__) +#if defined(__VISUALC__) || defined(__DIGITALMARS__) typedef int mode_t; #endif @@ -204,7 +204,7 @@ enum wxPosixPermissions #if defined(__VISUALC__) #define wxHAS_HUGE_FILES 1 #elif defined(__MINGW32__) || defined(__MINGW64__) - #define wxHAS_HUGE_FILES 1 + #define wxHAS_HUGE_FILES 1f #elif defined(_LARGE_FILES) #define wxHAS_HUGE_FILES 1 #endif @@ -476,7 +476,6 @@ enum wxPosixPermissions #define wxSeek lseek #define wxFsync fsync #define wxEof eof - #define wxCRT_MkDir mkdir #define wxCRT_RmDir rmdir diff --git a/Externals/wxWidgets3/include/wx/fontutil.h b/Externals/wxWidgets3/include/wx/fontutil.h index caad365473..a4e0a7d4d5 100644 --- a/Externals/wxWidgets3/include/wx/fontutil.h +++ b/Externals/wxWidgets3/include/wx/fontutil.h @@ -142,9 +142,7 @@ public: return *this; } -#if wxOSX_USE_CORE_TEXT void Init(CTFontDescriptorRef descr); -#endif void Init(const wxNativeFontInfo& info); void Init(int size, wxFontFamily family, diff --git a/Externals/wxWidgets3/include/wx/fswatcher.h b/Externals/wxWidgets3/include/wx/fswatcher.h index 2955407864..056780d348 100644 --- a/Externals/wxWidgets3/include/wx/fswatcher.h +++ b/Externals/wxWidgets3/include/wx/fswatcher.h @@ -66,6 +66,13 @@ enum wxFSWPathType wxFSWPath_Tree // Watch a directory and all its children recursively. }; +// Type of the warning for the events notifying about them. +enum wxFSWWarningType +{ + wxFSW_WARNING_NONE, + wxFSW_WARNING_GENERAL, + wxFSW_WARNING_OVERFLOW +}; /** * Event containing information about file system change. @@ -77,24 +84,36 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE, wxEVT_FSWATCHER, class WXDLLIMPEXP_BASE wxFileSystemWatcherEvent: public wxEvent { public: + // Constructor for any kind of events, also used as default ctor. wxFileSystemWatcherEvent(int changeType = 0, int watchid = wxID_ANY) : wxEvent(watchid, wxEVT_FSWATCHER), - m_changeType(changeType) + m_changeType(changeType), + m_warningType(wxFSW_WARNING_NONE) { } - wxFileSystemWatcherEvent(int changeType, const wxString& errorMsg, + // Constructor for the error or warning events. + wxFileSystemWatcherEvent(int changeType, + wxFSWWarningType warningType, + const wxString& errorMsg = wxString(), int watchid = wxID_ANY) : wxEvent(watchid, wxEVT_FSWATCHER), - m_changeType(changeType), m_errorMsg(errorMsg) + m_changeType(changeType), + m_warningType(warningType), + m_errorMsg(errorMsg) { } + // Constructor for the normal events carrying information about the changes. wxFileSystemWatcherEvent(int changeType, const wxFileName& path, const wxFileName& newPath, int watchid = wxID_ANY) : wxEvent(watchid, wxEVT_FSWATCHER), - m_changeType(changeType), m_path(path), m_newPath(newPath) + m_changeType(changeType), + m_warningType(wxFSW_WARNING_NONE), + m_path(path), + m_newPath(newPath) + { } @@ -146,6 +165,7 @@ public: evt->m_errorMsg = m_errorMsg.Clone(); evt->m_path = wxFileName(m_path.GetFullPath().Clone()); evt->m_newPath = wxFileName(m_newPath.GetFullPath().Clone()); + evt->m_warningType = m_warningType; return evt; } @@ -168,6 +188,11 @@ public: return m_errorMsg; } + wxFSWWarningType GetWarningType() const + { + return m_warningType; + } + /** * Returns a wxString describing an event useful for debugging or testing */ @@ -175,6 +200,7 @@ public: protected: int m_changeType; + wxFSWWarningType m_warningType; wxFileName m_path; wxFileName m_newPath; wxString m_errorMsg; diff --git a/Externals/wxWidgets3/include/wx/generic/dataview.h b/Externals/wxWidgets3/include/wx/generic/dataview.h index 396c81ba6c..f3ac8ee598 100644 --- a/Externals/wxWidgets3/include/wx/generic/dataview.h +++ b/Externals/wxWidgets3/include/wx/generic/dataview.h @@ -227,6 +227,9 @@ public: // utility functions not part of the API // return the index of the given column in m_cols int GetColumnIndex(const wxDataViewColumn *column) const; + // Return the index of the column having the given model index. + int GetModelColumnIndex(unsigned int model_column) const; + // return the column displayed at the given position in the control wxDataViewColumn *GetColumnAt(unsigned int pos) const; diff --git a/Externals/wxWidgets3/include/wx/generic/grideditors.h b/Externals/wxWidgets3/include/wx/generic/grideditors.h index a81ab84c47..c45106d3e8 100644 --- a/Externals/wxWidgets3/include/wx/generic/grideditors.h +++ b/Externals/wxWidgets3/include/wx/generic/grideditors.h @@ -15,6 +15,8 @@ #if wxUSE_GRID +#include "wx/scopedptr.h" + class wxGridCellEditorEvtHandler : public wxEvtHandler { public: diff --git a/Externals/wxWidgets3/include/wx/generic/infobar.h b/Externals/wxWidgets3/include/wx/generic/infobar.h index 781698ccc9..4a6bf2b3c1 100644 --- a/Externals/wxWidgets3/include/wx/generic/infobar.h +++ b/Externals/wxWidgets3/include/wx/generic/infobar.h @@ -79,6 +79,9 @@ public: // (default font is a larger and bold version of the normal one) virtual bool SetFont(const wxFont& font); + // same thing with the colour: this affects the text colour + virtual bool SetForegroundColour(const wxColor& colour); + protected: // info bar shouldn't have any border by default, the colour difference // between it and the main window separates it well enough diff --git a/Externals/wxWidgets3/include/wx/generic/statbmpg.h b/Externals/wxWidgets3/include/wx/generic/statbmpg.h index 8a8fa15dfd..f3d198df4e 100644 --- a/Externals/wxWidgets3/include/wx/generic/statbmpg.h +++ b/Externals/wxWidgets3/include/wx/generic/statbmpg.h @@ -60,8 +60,8 @@ public: private: wxSize GetBitmapSize() { - return m_bitmap.IsOk() ? wxSize(m_bitmap.GetWidth(), m_bitmap.GetHeight()) - : wxSize(16, 16); // this is completely arbitrary + return m_bitmap.IsOk() ? m_bitmap.GetScaledSize() + : wxSize(16, 16); // this is completely arbitrary } void OnPaint(wxPaintEvent& event); diff --git a/Externals/wxWidgets3/include/wx/gtk/bitmap.h b/Externals/wxWidgets3/include/wx/gtk/bitmap.h index 42e2d4d4d3..d035f2c2c1 100644 --- a/Externals/wxWidgets3/include/wx/gtk/bitmap.h +++ b/Externals/wxWidgets3/include/wx/gtk/bitmap.h @@ -103,7 +103,6 @@ public: wxMask *GetMask() const; void SetMask( wxMask *mask ); - wxBitmap GetMaskBitmap() const; wxBitmap GetSubBitmap( const wxRect& rect ) const; diff --git a/Externals/wxWidgets3/include/wx/gtk/dialog.h b/Externals/wxWidgets3/include/wx/gtk/dialog.h index bc6e8625bd..fcd7cd3db8 100644 --- a/Externals/wxWidgets3/include/wx/gtk/dialog.h +++ b/Externals/wxWidgets3/include/wx/gtk/dialog.h @@ -39,15 +39,13 @@ public: virtual void EndModal( int retCode ); virtual bool IsModal() const; - // implementation - // -------------- - - bool m_modalShowing; - private: // common part of all ctors void Init(); + + bool m_modalShowing; wxGUIEventLoop *m_modalLoop; + DECLARE_DYNAMIC_CLASS(wxDialog) }; diff --git a/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h b/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h index 21ee1b04b2..e69de29bb2 100644 --- a/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h +++ b/Externals/wxWidgets3/include/wx/gtk/gnome/gprint.h @@ -1,351 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: wx/gtk/gnome/gprint.h -// Author: Robert Roebling -// Purpose: GNOME printing support -// Created: 09/20/04 -// Copyright: Robert Roebling -// Licence: wxWindows Licence -///////////////////////////////////////////////////////////////////////////// - -#ifndef _WX_GTK_GPRINT_H_ -#define _WX_GTK_GPRINT_H_ - -#include "wx/defs.h" - -#if wxUSE_LIBGNOMEPRINT - -#include "wx/print.h" -#include "wx/printdlg.h" -#include "wx/dc.h" -#include "wx/module.h" - -typedef struct _GnomePrintJob GnomePrintJob; -typedef struct _GnomePrintContext GnomePrintContext; -typedef struct _GnomePrintConfig GnomePrintConfig; - -// ---------------------------------------------------------------------------- -// wxGnomePrintModule -// ---------------------------------------------------------------------------- - -class wxGnomePrintModule: public wxModule -{ -public: - wxGnomePrintModule() {} - bool OnInit(); - void OnExit(); - -private: - DECLARE_DYNAMIC_CLASS(wxGnomePrintModule) -}; - -//---------------------------------------------------------------------------- -// wxGnomePrintNativeData -//---------------------------------------------------------------------------- - -class wxGnomePrintNativeData: public wxPrintNativeDataBase -{ -public: - wxGnomePrintNativeData(); - virtual ~wxGnomePrintNativeData(); - - virtual bool TransferTo( wxPrintData &data ); - virtual bool TransferFrom( const wxPrintData &data ); - - virtual bool Ok() const { return IsOk(); } - virtual bool IsOk() const { return true; } - - GnomePrintConfig* GetPrintConfig() { return m_config; } - void SetPrintJob( GnomePrintJob *job ) { m_job = job; } - GnomePrintJob* GetPrintJob() { return m_job; } - - -private: - GnomePrintConfig *m_config; - GnomePrintJob *m_job; - - DECLARE_DYNAMIC_CLASS(wxGnomePrintNativeData) -}; - -//---------------------------------------------------------------------------- -// wxGnomePrintFactory -//---------------------------------------------------------------------------- - -class wxGnomePrintFactory: public wxPrintFactory -{ -public: - virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data ); - - virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, - wxPrintout *printout = NULL, - wxPrintDialogData *data = NULL ); - virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview, - wxPrintout *printout, - wxPrintData *data ); - - virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, - wxPrintDialogData *data = NULL ); - virtual wxPrintDialogBase *CreatePrintDialog( wxWindow *parent, - wxPrintData *data ); - - virtual wxPageSetupDialogBase *CreatePageSetupDialog( wxWindow *parent, - wxPageSetupDialogData * data = NULL ); - -#if wxUSE_NEW_DC - virtual wxDCImpl* CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); -#else - virtual wxDC* CreatePrinterDC( const wxPrintData& data ); -#endif - - virtual bool HasPrintSetupDialog(); - virtual wxDialog *CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data ); - virtual bool HasOwnPrintToFile(); - virtual bool HasPrinterLine(); - virtual wxString CreatePrinterLine(); - virtual bool HasStatusLine(); - virtual wxString CreateStatusLine(); - - virtual wxPrintNativeDataBase *CreatePrintNativeData(); -}; - -//---------------------------------------------------------------------------- -// wxGnomePrintDialog -//---------------------------------------------------------------------------- - -class wxGnomePrintDialog: public wxPrintDialogBase -{ -public: - wxGnomePrintDialog( wxWindow *parent, - wxPrintDialogData* data = NULL ); - wxGnomePrintDialog( wxWindow *parent, wxPrintData* data); - virtual ~wxGnomePrintDialog(); - - wxPrintData& GetPrintData() - { return m_printDialogData.GetPrintData(); } - wxPrintDialogData& GetPrintDialogData() - { return m_printDialogData; } - - wxDC *GetPrintDC(); - - virtual int ShowModal(); - - virtual bool Validate(); - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - -protected: - // Implement some base class methods to do nothing to avoid asserts and - // GTK warnings, since this is not a real wxDialog. - virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), - int WXUNUSED(width), int WXUNUSED(height), - int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} - virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), - int WXUNUSED(width), int WXUNUSED(height)) {} - -private: - void Init(); - wxPrintDialogData m_printDialogData; - - DECLARE_DYNAMIC_CLASS(wxGnomePrintDialog) -}; - -//---------------------------------------------------------------------------- -// wxGnomePageSetupDialog -//---------------------------------------------------------------------------- - -class wxGnomePageSetupDialog: public wxPageSetupDialogBase -{ -public: - wxGnomePageSetupDialog( wxWindow *parent, - wxPageSetupDialogData* data = NULL ); - virtual ~wxGnomePageSetupDialog(); - - virtual wxPageSetupDialogData& GetPageSetupDialogData(); - - virtual int ShowModal(); - - virtual bool Validate(); - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - -protected: - // Implement some base class methods to do nothing to avoid asserts and - // GTK warnings, since this is not a real wxDialog. - virtual void DoSetSize(int WXUNUSED(x), int WXUNUSED(y), - int WXUNUSED(width), int WXUNUSED(height), - int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {} - virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), - int WXUNUSED(width), int WXUNUSED(height)) {} - -private: - wxPageSetupDialogData m_pageDialogData; - - DECLARE_DYNAMIC_CLASS(wxGnomePageSetupDialog) -}; - -//---------------------------------------------------------------------------- -// wxGnomePrinter -//---------------------------------------------------------------------------- - -class wxGnomePrinter: public wxPrinterBase -{ -public: - wxGnomePrinter(wxPrintDialogData *data = NULL); - virtual ~wxGnomePrinter(); - - virtual bool Print(wxWindow *parent, - wxPrintout *printout, - bool prompt = true); - virtual wxDC* PrintDialog(wxWindow *parent); - virtual bool Setup(wxWindow *parent); - -private: - bool m_native_preview; - -private: - DECLARE_DYNAMIC_CLASS(wxGnomePrinter) - wxDECLARE_NO_COPY_CLASS(wxGnomePrinter); -}; - -//----------------------------------------------------------------------------- -// wxGnomePrinterDC -//----------------------------------------------------------------------------- - -#if wxUSE_NEW_DC -class wxGnomePrinterDCImpl : public wxDCImpl -#else -#define wxGnomePrinterDCImpl wxGnomePrinterDC -class wxGnomePrinterDC : public wxDC -#endif -{ -public: -#if wxUSE_NEW_DC - wxGnomePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ); -#else - wxGnomePrinterDC( const wxPrintData& data ); -#endif - virtual ~wxGnomePrinterDCImpl(); - - bool Ok() const { return IsOk(); } - bool IsOk() const; - - bool CanDrawBitmap() const { return true; } - void Clear(); - void SetFont( const wxFont& font ); - void SetPen( const wxPen& pen ); - void SetBrush( const wxBrush& brush ); - void SetLogicalFunction( wxRasterOperationMode function ); - void SetBackground( const wxBrush& brush ); - void DestroyClippingRegion(); - bool StartDoc(const wxString& message); - void EndDoc(); - void StartPage(); - void EndPage(); - wxCoord GetCharHeight() const; - wxCoord GetCharWidth() const; - bool CanGetTextExtent() const { return true; } - wxSize GetPPI() const; - virtual int GetDepth() const { return 24; } - void SetBackgroundMode(int WXUNUSED(mode)) { } - void SetPalette(const wxPalette& WXUNUSED(palette)) { } - -protected: - bool DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, - wxFloodFillStyle style=wxFLOOD_SURFACE ); - bool DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const; - void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); - void DoCrossHair(wxCoord x, wxCoord y); - void DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc); - void DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea); - void DoDrawPoint(wxCoord x, wxCoord y); - void DoDrawLines(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0); - void DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); - void DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, wxPolygonFillMode fillStyle=wxODDEVEN_RULE); - void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); - void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius = 20.0); - void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); -#if wxUSE_SPLINES - void DoDrawSpline(const wxPointList *points); -#endif - bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, - wxDC *source, wxCoord xsrc, wxCoord ysrc, - wxRasterOperationMode = wxCOPY, bool useMask = false, - wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); - void DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y ); - void DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask = false ); - void DoDrawText(const wxString& text, wxCoord x, wxCoord y ); - void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle); - void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); - void DoSetDeviceClippingRegion( const wxRegion &WXUNUSED(clip) ) - { - wxFAIL_MSG( "not implemented" ); - } - void DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, - wxCoord *descent = NULL, - wxCoord *externalLeading = NULL, - const wxFont *theFont = NULL ) const; - void DoGetSize(int* width, int* height) const; - void DoGetSizeMM(int *width, int *height) const; - - void SetPrintData(const wxPrintData& data); - wxPrintData& GetPrintData() { return m_printData; } - - // overridden for wxPrinterDC Impl - virtual wxRect GetPaperRect() const; - virtual int GetResolution() const; - - virtual void* GetHandle() const { return (void*)m_gpc; } - -private: - wxPrintData m_printData; - PangoContext *m_context; - PangoLayout *m_layout; - PangoFontDescription *m_fontdesc; - - unsigned char m_currentRed; - unsigned char m_currentGreen; - unsigned char m_currentBlue; - - double m_pageHeight; - - GnomePrintContext *m_gpc; - GnomePrintJob* m_job; - - void makeEllipticalPath(wxCoord x, wxCoord y, wxCoord width, wxCoord height); - -private: - DECLARE_DYNAMIC_CLASS(wxGnomePrinterDCImpl) - wxDECLARE_NO_COPY_CLASS(wxGnomePrinterDCImpl); -}; - -// ---------------------------------------------------------------------------- -// wxGnomePrintPreview: programmer creates an object of this class to preview a -// wxPrintout. -// ---------------------------------------------------------------------------- - -class wxGnomePrintPreview : public wxPrintPreviewBase -{ -public: - wxGnomePrintPreview(wxPrintout *printout, - wxPrintout *printoutForPrinting = NULL, - wxPrintDialogData *data = NULL); - wxGnomePrintPreview(wxPrintout *printout, - wxPrintout *printoutForPrinting, - wxPrintData *data); - - virtual ~wxGnomePrintPreview(); - - virtual bool Print(bool interactive); - virtual void DetermineScaling(); - -private: - void Init(wxPrintout *printout, wxPrintout *printoutForPrinting); - -private: - DECLARE_CLASS(wxGnomePrintPreview) -}; - - -#endif - // wxUSE_LIBGNOMEPRINT - -#endif diff --git a/Externals/wxWidgets3/include/wx/gtk/private.h b/Externals/wxWidgets3/include/wx/gtk/private.h index dfe8889798..4c52f53c50 100644 --- a/Externals/wxWidgets3/include/wx/gtk/private.h +++ b/Externals/wxWidgets3/include/wx/gtk/private.h @@ -16,6 +16,11 @@ #include "wx/gtk/private/string.h" #include "wx/gtk/private/gtk2-compat.h" +#ifndef G_VALUE_INIT + // introduced in GLib 2.30 + #define G_VALUE_INIT { 0, { { 0 } } } +#endif + // pango_version_check symbol is quite recent ATM (4/2007)... so we // use our own wrapper which implements a smart trick. // Use this function as you'd use pango_version_check: diff --git a/Externals/wxWidgets3/include/wx/gtk/spinbutt.h b/Externals/wxWidgets3/include/wx/gtk/spinbutt.h index 4a9d20461e..4bd71f4746 100644 --- a/Externals/wxWidgets3/include/wx/gtk/spinbutt.h +++ b/Externals/wxWidgets3/include/wx/gtk/spinbutt.h @@ -47,8 +47,6 @@ public: virtual bool Enable( bool enable = true ); // implementation - void OnSize( wxSizeEvent &event ); - int m_pos; protected: @@ -61,9 +59,7 @@ protected: private: typedef wxSpinButtonBase base_type; - DECLARE_EVENT_TABLE() DECLARE_DYNAMIC_CLASS(wxSpinButton) }; -#endif - // _WX_GTK_SPINBUTT_H_ +#endif // _WX_GTK_SPINBUTT_H_ diff --git a/Externals/wxWidgets3/include/wx/gtk/textentry.h b/Externals/wxWidgets3/include/wx/gtk/textentry.h index 5df686cf24..3d9da824ec 100644 --- a/Externals/wxWidgets3/include/wx/gtk/textentry.h +++ b/Externals/wxWidgets3/include/wx/gtk/textentry.h @@ -48,6 +48,11 @@ public: virtual void SetMaxLength(unsigned long len); +#ifdef __WXGTK3__ + virtual bool SetHint(const wxString& hint); + virtual wxString GetHint() const; +#endif + // implementation only from now on void SendMaxLenEvent(); bool GTKEntryOnInsertText(const char* text); diff --git a/Externals/wxWidgets3/include/wx/listbase.h b/Externals/wxWidgets3/include/wx/listbase.h index 80f65f2a33..5e6fb7cae3 100644 --- a/Externals/wxWidgets3/include/wx/listbase.h +++ b/Externals/wxWidgets3/include/wx/listbase.h @@ -510,7 +510,7 @@ public: const wxString& GetLabel() const { return m_item.m_text; } const wxString& GetText() const { return m_item.m_text; } int GetImage() const { return m_item.m_image; } - long GetData() const { return static_cast(m_item.m_data); } + wxUIntPtr GetData() const { return m_item.m_data; } long GetMask() const { return m_item.m_mask; } const wxListItem& GetItem() const { return m_item; } diff --git a/Externals/wxWidgets3/include/wx/math.h b/Externals/wxWidgets3/include/wx/math.h index 2787163f78..89a1b94473 100644 --- a/Externals/wxWidgets3/include/wx/math.h +++ b/Externals/wxWidgets3/include/wx/math.h @@ -60,7 +60,7 @@ #elif defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) #include #define wxFinite(x) _finite(x) -#elif defined(__MINGW64__) || defined(__clang__) +#elif defined(__MINGW64_TOOLCHAIN__) || defined(__clang__) /* add more compilers with C99 support here: using C99 isfinite() is preferable to using BSD-ish finite() diff --git a/Externals/wxWidgets3/include/wx/msw/combobox.h b/Externals/wxWidgets3/include/wx/msw/combobox.h index 8649187c09..5fc7cc5cf1 100644 --- a/Externals/wxWidgets3/include/wx/msw/combobox.h +++ b/Externals/wxWidgets3/include/wx/msw/combobox.h @@ -133,6 +133,9 @@ protected: virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; + // Override this one to avoid eating events from our popup listbox. + virtual wxWindow *MSWFindItem(long id, WXHWND hWnd) const; + // this is the implementation of GetEditHWND() which can also be used when // we don't have the edit control, it simply returns NULL then // diff --git a/Externals/wxWidgets3/include/wx/msw/control.h b/Externals/wxWidgets3/include/wx/msw/control.h index 29897ad9c3..35bf74e9fe 100644 --- a/Externals/wxWidgets3/include/wx/msw/control.h +++ b/Externals/wxWidgets3/include/wx/msw/control.h @@ -121,6 +121,9 @@ protected: // one virtual WXHBRUSH DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd); + // Look in our GetSubcontrols() for the windows with the given ID. + virtual wxWindow *MSWFindItem(long id, WXHWND hWnd) const; + // for controls like radiobuttons which are really composite this array // holds the ids (not HWNDs!) of the sub controls wxArrayLong m_subControls; diff --git a/Externals/wxWidgets3/include/wx/msw/datectrl.h b/Externals/wxWidgets3/include/wx/msw/datectrl.h index e3f95e880e..7ec52f0349 100644 --- a/Externals/wxWidgets3/include/wx/msw/datectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/datectrl.h @@ -54,7 +54,9 @@ public: virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; protected: +#if wxUSE_INTL virtual wxLocaleInfo MSWGetFormat() const; +#endif // wxUSE_INTL virtual bool MSWAllowsNone() const { return HasFlag(wxDP_ALLOWNONE); } virtual bool MSWOnDateTimeChange(const tagNMDATETIMECHANGE& dtch); diff --git a/Externals/wxWidgets3/include/wx/msw/datetimectrl.h b/Externals/wxWidgets3/include/wx/msw/datetimectrl.h index eb93f26ae1..dcb4d4ee19 100644 --- a/Externals/wxWidgets3/include/wx/msw/datetimectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/datetimectrl.h @@ -55,12 +55,14 @@ protected: // override these methods anyhow, it does work -- but is definitely ugly // and need to be changed (but how?) in the future. +#if wxUSE_INTL // Override to return the date/time format used by this control. virtual wxLocaleInfo MSWGetFormat() const /* = 0 */ { wxFAIL_MSG( "Unreachable" ); return wxLOCALE_TIME_FMT; } +#endif // wxUSE_INTL // Override to indicate whether we can have no date at all. virtual bool MSWAllowsNone() const /* = 0 */ diff --git a/Externals/wxWidgets3/include/wx/msw/genrcdefs.h b/Externals/wxWidgets3/include/wx/msw/genrcdefs.h index 8bab95b077..809419b3f9 100644 --- a/Externals/wxWidgets3/include/wx/msw/genrcdefs.h +++ b/Externals/wxWidgets3/include/wx/msw/genrcdefs.h @@ -19,7 +19,7 @@ EMIT(#define wxUSE_RC_MANIFEST 1) EMIT(#define wxUSE_RC_MANIFEST 1) #endif -#ifdef _M_AMD64 +#if defined _M_AMD64 || defined __x86_64__ EMIT(#define WX_CPU_AMD64) #endif @@ -27,7 +27,7 @@ EMIT(#define WX_CPU_AMD64) EMIT(#define WX_CPU_ARM) #endif -#ifdef _M_IA64 +#if defined _M_IA64 || defined __ia64__ EMIT(#define WX_CPU_IA64) #endif diff --git a/Externals/wxWidgets3/include/wx/msw/missing.h b/Externals/wxWidgets3/include/wx/msw/missing.h index d2782ef5d5..e7522ee753 100644 --- a/Externals/wxWidgets3/include/wx/msw/missing.h +++ b/Externals/wxWidgets3/include/wx/msw/missing.h @@ -664,7 +664,7 @@ typedef struct #include <_mingw.h> #endif -#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) +#ifdef __MINGW32_TOOLCHAIN__ typedef enum CommandStateChangeConstants { CSC_UPDATECOMMANDS = (int) 0xFFFFFFFF, CSC_NAVIGATEFORWARD = 0x1, diff --git a/Externals/wxWidgets3/include/wx/msw/msvcrt.h b/Externals/wxWidgets3/include/wx/msw/msvcrt.h index 692f19ef35..e92a88d841 100644 --- a/Externals/wxWidgets3/include/wx/msw/msvcrt.h +++ b/Externals/wxWidgets3/include/wx/msw/msvcrt.h @@ -37,7 +37,12 @@ #endif #include - #ifndef _CRTBLD + + // Defining _CRTBLD should never be necessary at all, but keep it for now + // as there is no time to retest all the compilers before 3.0 release. + // Definitely do not use it with MSVS 2013 as defining it results in errors + // if the standard is included afterwards. + #if !defined(_CRTBLD) && !wxCHECK_VISUALC_VERSION(12) // Needed when building with pure MS SDK #define _CRTBLD #endif diff --git a/Externals/wxWidgets3/include/wx/msw/ole/automtn.h b/Externals/wxWidgets3/include/wx/msw/ole/automtn.h index a7c5f62a6b..1d1eb33af3 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/automtn.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/automtn.h @@ -115,11 +115,22 @@ public: // this object. The default is LOCALE_SYSTEM_DEFAULT. void SetLCID(WXLCID lcid); + // Returns the flags used for conversions between wxVariant and OLE + // VARIANT, see wxOleConvertVariantFlags. The default value is + // wxOleConvertVariant_Default but all the objects obtained by GetObject() + // inherit the flags from the one that created them. + long GetConvertVariantFlags() const; + + // Sets the flags used for conversions between wxVariant and OLE VARIANT, + // see wxOleConvertVariantFlags (default is wxOleConvertVariant_Default. + void SetConvertVariantFlags(long flags); + public: // public for compatibility only, don't use m_dispatchPtr directly. WXIDISPATCH* m_dispatchPtr; private: WXLCID m_lcid; + long m_convertVariantFlags; wxDECLARE_NO_COPY_CLASS(wxAutomationObject); }; diff --git a/Externals/wxWidgets3/include/wx/msw/ole/dataform.h b/Externals/wxWidgets3/include/wx/msw/ole/dataform.h index 8ad64542d2..26959099f7 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/dataform.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/dataform.h @@ -39,14 +39,10 @@ public: // default copy ctor/assignment operators ok // comparison (must have both versions) - bool operator==(wxDataFormatId format) const - { return m_format == (NativeFormat)format; } - bool operator!=(wxDataFormatId format) const - { return m_format != (NativeFormat)format; } - bool operator==(const wxDataFormat& format) const - { return m_format == format.m_format; } - bool operator!=(const wxDataFormat& format) const - { return m_format != format.m_format; } + bool operator==(wxDataFormatId format) const; + bool operator!=(wxDataFormatId format) const; + bool operator==(const wxDataFormat& format) const; + bool operator!=(const wxDataFormat& format) const; // explicit and implicit conversions to NativeFormat which is one of // standard data types (implicit conversion is useful for preserving the diff --git a/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h b/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h index 1c25d36926..c9f7eb88c8 100644 --- a/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h +++ b/Externals/wxWidgets3/include/wx/msw/ole/oleutils.h @@ -316,9 +316,25 @@ private: SAFEARRAY* m_value; }; +// Used by wxAutomationObject for its wxConvertOleToVariant() calls. +enum wxOleConvertVariantFlags +{ + wxOleConvertVariant_Default = 0, + + // If wxOleConvertVariant_ReturnSafeArrays flag is set, SAFEARRAYs + // contained in OLE VARIANTs will be returned as wxVariants + // with wxVariantDataSafeArray type instead of wxVariants + // with the list type containing the (flattened) SAFEARRAY's elements. + wxOleConvertVariant_ReturnSafeArrays = 1 +}; + +WXDLLIMPEXP_CORE +bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant); + +WXDLLIMPEXP_CORE +bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant, + long flags = wxOleConvertVariant_Default); -WXDLLIMPEXP_CORE bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant); -WXDLLIMPEXP_CORE bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant); #endif // wxUSE_VARIANT // Convert string to Unicode diff --git a/Externals/wxWidgets3/include/wx/msw/timectrl.h b/Externals/wxWidgets3/include/wx/msw/timectrl.h index e39528a4e0..c5bc83aec6 100644 --- a/Externals/wxWidgets3/include/wx/msw/timectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/timectrl.h @@ -50,7 +50,9 @@ public: virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const; protected: +#if wxUSE_INTL virtual wxLocaleInfo MSWGetFormat() const; +#endif // wxUSE_INTL virtual bool MSWAllowsNone() const { return false; } virtual bool MSWOnDateTimeChange(const tagNMDATETIMECHANGE& dtch); diff --git a/Externals/wxWidgets3/include/wx/msw/treectrl.h b/Externals/wxWidgets3/include/wx/msw/treectrl.h index 5eeede8598..341f31b528 100644 --- a/Externals/wxWidgets3/include/wx/msw/treectrl.h +++ b/Externals/wxWidgets3/include/wx/msw/treectrl.h @@ -304,6 +304,9 @@ private: // item visually spans the entire breadth of the window then bool MSWIsOnItem(unsigned flags) const; + // Delete the given item from the native control. + bool MSWDeleteItem(const wxTreeItemId& item); + // the hash storing the items attributes (indexed by item ids) wxMapTreeAttr m_attrs; diff --git a/Externals/wxWidgets3/include/wx/msw/window.h b/Externals/wxWidgets3/include/wx/msw/window.h index 3475f3d6b7..bd793e143b 100644 --- a/Externals/wxWidgets3/include/wx/msw/window.h +++ b/Externals/wxWidgets3/include/wx/msw/window.h @@ -206,7 +206,7 @@ public: // to understand why does it work, look at SubclassWin() code and comments bool IsOfStandardClass() const { return m_oldWndProc != NULL; } - wxWindow *FindItem(long id) const; + wxWindow *FindItem(long id, WXHWND hWnd = NULL) const; wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = false) const; // MSW only: true if this control is part of the main control @@ -663,6 +663,15 @@ protected: bool MSWEnableHWND(WXHWND hWnd, bool enable); + // Return the pointer to this window or one of its sub-controls if this ID + // and HWND combination belongs to one of them. + // + // This is used by FindItem() and is overridden in wxControl, see there. + virtual wxWindow* MSWFindItem(long WXUNUSED(id), WXHWND WXUNUSED(hWnd)) const + { + return NULL; + } + private: // common part of all ctors void Init(); diff --git a/Externals/wxWidgets3/include/wx/osx/app.h b/Externals/wxWidgets3/include/wx/osx/app.h index 723841913c..0eba951444 100644 --- a/Externals/wxWidgets3/include/wx/osx/app.h +++ b/Externals/wxWidgets3/include/wx/osx/app.h @@ -129,18 +129,24 @@ public: virtual short MacHandleAERApp(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ; #endif // in response of an openFiles message with Cocoa and an - // open-document apple event with Carbon + // open-document apple event virtual void MacOpenFiles(const wxArrayString &fileNames) ; // called by MacOpenFiles for each file. virtual void MacOpenFile(const wxString &fileName) ; // in response of a get-url apple event virtual void MacOpenURL(const wxString &url) ; // in response of a print-document apple event + virtual void MacPrintFiles(const wxArrayString &fileNames) ; + // called by MacPrintFiles for each file virtual void MacPrintFile(const wxString &fileName) ; // in response of a open-application apple event virtual void MacNewFile() ; // in response of a reopen-application apple event virtual void MacReopenApp() ; + + // override this to return false from a non-bundled console app in order to stay in background ... + virtual bool OSXIsGUIApplication() { return true; } + #if wxOSX_USE_COCOA_OR_IPHONE // immediately before the native event loop launches virtual void OSXOnWillFinishLaunching(); @@ -153,9 +159,16 @@ public: private: bool m_onInitResult; + bool m_inited; + wxArrayString m_openFiles; + wxArrayString m_printFiles; + wxString m_getURL; public: - + bool OSXInitWasCalled() { return m_inited; } + void OSXStoreOpenFiles(const wxArrayString &files ) { m_openFiles = files ; } + void OSXStorePrintFiles(const wxArrayString &files ) { m_printFiles = files ; } + void OSXStoreOpenURL(const wxString &url ) { m_getURL = url ; } #endif // Hide the application windows the same as the system hide command would do it. diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h b/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h index 68e395429d..9c6bc30508 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/chkconf.h @@ -30,22 +30,7 @@ * text rendering system */ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - - #define wxOSX_USE_CORE_TEXT 1 - // MLTE-TextControl uses ATSU - #define wxOSX_USE_ATSU_TEXT 1 - -#else // platform < 10.5 - - #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - #define wxOSX_USE_CORE_TEXT 1 - #else - #define wxOSX_USE_CORE_TEXT 0 - #endif - #define wxOSX_USE_ATSU_TEXT 1 - -#endif +#define wxOSX_USE_ATSU_TEXT 1 /* * Audio System diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h b/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h index 6f7b05acdc..75185b092c 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/dataview.h @@ -155,9 +155,7 @@ public: OSStatus EnableCellSizeModification(bool enableHeight=true, bool enableWidth=true); // enables or disables the column width and row height modification (default: false) -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 OSStatus GetAttributes (OptionBits* attributes); -#endif OSStatus GetColumnWidth (DataBrowserPropertyID column, UInt16 *width ) const; // returns the column width in pixels OSStatus GetDefaultColumnWidth(UInt16 *width ) const; // returns the default column width in pixels OSStatus GetDefaultRowHeight (UInt16 * height ) const; @@ -166,9 +164,7 @@ public: OSStatus GetRowHeight (DataBrowserItemID item , UInt16 *height) const; OSStatus GetScrollPosition (UInt32* top, UInt32 *left) const; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 OSStatus SetAttributes (OptionBits attributes); -#endif OSStatus SetColumnWidth(DataBrowserPropertyID column, UInt16 width); // sets the column width in pixels OSStatus SetDefaultColumnWidth( UInt16 width ); OSStatus SetDefaultRowHeight( UInt16 height ); diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h b/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h index b20c9dd512..6edb3921d4 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/drawer.h @@ -22,8 +22,6 @@ // near future // -#if ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 ) - class WXDLLIMPEXP_ADV wxDrawerWindow : public wxTopLevelWindow { DECLARE_DYNAMIC_CLASS(wxDrawerWindow) @@ -64,7 +62,4 @@ public: wxDirection GetCurrentEdge() const; // not necessarily the preferred, due to screen constraints }; -#endif // defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 ) - -#endif - // _WX_DRAWERWINDOW_H_ +#endif // _WX_DRAWERWINDOW_H_ diff --git a/Externals/wxWidgets3/include/wx/osx/carbon/private.h b/Externals/wxWidgets3/include/wx/osx/carbon/private.h index 82db9b98e5..64fa447e14 100644 --- a/Externals/wxWidgets3/include/wx/osx/carbon/private.h +++ b/Externals/wxWidgets3/include/wx/osx/carbon/private.h @@ -13,11 +13,6 @@ #ifndef _WX_PRIVATE_H_ #define _WX_PRIVATE_H_ -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 -typedef UInt32 URefCon; -typedef SInt32 SRefCon; -#endif - #if wxUSE_GUI #include "wx/osx/uma.h" @@ -29,10 +24,6 @@ typedef SInt32 SRefCon; // app.h -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 -bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec); -#endif - #endif // wxUSE_GUI // filefn.h @@ -269,12 +260,6 @@ ControlActionUPP GetwxMacLiveScrollbarActionProc(); // additional optional event defines -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 -enum { - kEventControlFocusPartChanged = 164 -}; -#endif - class WXDLLIMPEXP_CORE wxMacControl : public wxWidgetImpl { public : diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h b/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h index 9789e77d54..03fd501925 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/chkconf.h @@ -41,33 +41,14 @@ * text rendering system */ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - - #define wxOSX_USE_CORE_TEXT 1 - #define wxOSX_USE_ATSU_TEXT 0 - -#else // platform < 10.5 - - #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - #define wxOSX_USE_CORE_TEXT 1 - #else - #define wxOSX_USE_CORE_TEXT 0 - #endif - #define wxOSX_USE_ATSU_TEXT 1 - -#endif +#define wxOSX_USE_ATSU_TEXT 0 /* * Audio System */ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - #define wxOSX_USE_QUICKTIME 0 - #define wxOSX_USE_AUDIOTOOLBOX 1 -#else // platform < 10.5 - #define wxOSX_USE_QUICKTIME 1 - #define wxOSX_USE_AUDIOTOOLBOX 0 -#endif +#define wxOSX_USE_QUICKTIME 0 +#define wxOSX_USE_AUDIOTOOLBOX 1 /* * turning off capabilities that don't work under cocoa yet diff --git a/Externals/wxWidgets3/include/wx/osx/cocoa/private.h b/Externals/wxWidgets3/include/wx/osx/cocoa/private.h index 9dcbf365b7..e92df39539 100644 --- a/Externals/wxWidgets3/include/wx/osx/cocoa/private.h +++ b/Externals/wxWidgets3/include/wx/osx/cocoa/private.h @@ -19,12 +19,6 @@ #import #endif -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 -// available in 10.4 but not in the headers -enum { - kEventMouseScroll = 11 -}; -#endif // // shared between Cocoa and Carbon // @@ -160,6 +154,7 @@ public : virtual void cursorUpdate(WX_NSEvent event, WXWidget slf, void* _cmd); virtual void keyEvent(WX_NSEvent event, WXWidget slf, void* _cmd); virtual void insertText(NSString* text, WXWidget slf, void* _cmd); + virtual void doCommandBySelector(void* sel, WXWidget slf, void* _cmd); virtual bool performKeyEquivalent(WX_NSEvent event, WXWidget slf, void* _cmd); virtual bool acceptsFirstResponder(WXWidget slf, void* _cmd); virtual bool becomeFirstResponder(WXWidget slf, void* _cmd); diff --git a/Externals/wxWidgets3/include/wx/osx/config_xcode.h b/Externals/wxWidgets3/include/wx/osx/config_xcode.h index e293e90aea..510eb9f0b4 100644 --- a/Externals/wxWidgets3/include/wx/osx/config_xcode.h +++ b/Externals/wxWidgets3/include/wx/osx/config_xcode.h @@ -45,11 +45,7 @@ #define WX_GMTOFF_IN_TM 1 #define HAVE_PW_GECOS 1 #define HAVE_DLOPEN 1 -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 -/* #undef HAVE_CXA_DEMANGLE */ -#else #define HAVE_CXA_DEMANGLE 1 -#endif #define HAVE_GETTIMEOFDAY 1 #define HAVE_FSYNC 1 #define HAVE_ROUND 1 @@ -108,11 +104,7 @@ #define HAVE_WCHAR_H 1 /* better to use the built-in CF conversions, also avoid iconv versioning problems */ /* #undef HAVE_ICONV */ -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 -#define ICONV_CONST const -#else #define ICONV_CONST -#endif #define HAVE_LANGINFO_H 1 #define HAVE_WCSRTOMBS 1 #define HAVE_FPUTWS 1 @@ -131,9 +123,9 @@ #define WXWIN_OS_DESCRIPTION "Darwin 7.9.0 Power Macintosh" #define PACKAGE_BUGREPORT "wx-dev@lists.wxwidgets.org" #define PACKAGE_NAME "wxWidgets" -#define PACKAGE_STRING "wxWidgets 3.0.0" +#define PACKAGE_STRING "wxWidgets 3.1.0" #define PACKAGE_TARNAME "wxwidgets" -#define PACKAGE_VERSION "3.0.0" +#define PACKAGE_VERSION "3.1.0" // for regex #define WX_NO_REGEX_ADVANCED 1 diff --git a/Externals/wxWidgets3/include/wx/osx/evtloop.h b/Externals/wxWidgets3/include/wx/osx/evtloop.h index 995a713701..98772dd97f 100644 --- a/Externals/wxWidgets3/include/wx/osx/evtloop.h +++ b/Externals/wxWidgets3/include/wx/osx/evtloop.h @@ -30,7 +30,9 @@ public: #ifdef __WXOSX_COCOA__ // skip wxGUIEventLoop to avoid missing Enter/Exit notifications - int Run() { return wxCFEventLoop::Run(); } + virtual int Run() { return wxCFEventLoop::Run(); } + + virtual bool ProcessIdle(); #endif protected: virtual void OSXDoRun(); diff --git a/Externals/wxWidgets3/include/wx/osx/font.h b/Externals/wxWidgets3/include/wx/osx/font.h index 3bec30a891..2c31c2daa7 100644 --- a/Externals/wxWidgets3/include/wx/osx/font.h +++ b/Externals/wxWidgets3/include/wx/osx/font.h @@ -152,9 +152,7 @@ public: CGFontRef OSXGetCGFont() const; #endif -#if wxOSX_USE_CORE_TEXT CTFontRef OSXGetCTFont() const; -#endif #if wxOSX_USE_ATSU_TEXT // Returns an ATSUStyle not ATSUStyle* diff --git a/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h b/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h index ffdc6b90ab..cd86c72f45 100644 --- a/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h +++ b/Externals/wxWidgets3/include/wx/osx/iphone/chkconf.h @@ -19,7 +19,6 @@ * under a certain platform */ -#define wxOSX_USE_CORE_TEXT 1 #define wxOSX_USE_ATSU_TEXT 0 #define wxHAS_OPENGL_ES @@ -362,6 +361,11 @@ #define wxUSE_RICHTOOLTIP 0 #endif +#if wxUSE_WEBVIEW +#undef wxUSE_WEBVIEW +#define wxUSE_WEBVIEW 0 +#endif + #endif /* _WX_OSX_IPHONE_CHKCONF_H_ */ diff --git a/Externals/wxWidgets3/include/wx/osx/menu.h b/Externals/wxWidgets3/include/wx/osx/menu.h index 3ef7699599..9eded8593b 100644 --- a/Externals/wxWidgets3/include/wx/osx/menu.h +++ b/Externals/wxWidgets3/include/wx/osx/menu.h @@ -146,6 +146,10 @@ public: // call this function to update it (m_menuBarFrame should be !NULL) void Refresh(bool eraseBackground = true, const wxRect *rect = NULL); +#if wxABI_VERSION >= 30001 + wxMenu *OSXGetAppleMenu() const { return m_appleMenu; } +#endif + static void SetAutoWindowMenu( bool enable ) { s_macAutoWindowMenu = enable ; } static bool GetAutoWindowMenu() { return s_macAutoWindowMenu ; } diff --git a/Externals/wxWidgets3/include/wx/osx/textctrl.h b/Externals/wxWidgets3/include/wx/osx/textctrl.h index 53604bab7b..a52620b5c7 100644 --- a/Externals/wxWidgets3/include/wx/osx/textctrl.h +++ b/Externals/wxWidgets3/include/wx/osx/textctrl.h @@ -74,10 +74,6 @@ public: virtual void MarkDirty(); virtual void DiscardEdits(); - // set the grayed out hint text - virtual bool SetHint(const wxString& hint); - virtual wxString GetHint() const; - // text control under some platforms supports the text styles: these // methods apply the given text style to the given selection or to // set/get the style which will be used for all appended text @@ -151,7 +147,6 @@ protected: private : wxMenu *m_privateContextMenu; - wxString m_hintString; DECLARE_EVENT_TABLE() }; diff --git a/Externals/wxWidgets3/include/wx/osx/textentry.h b/Externals/wxWidgets3/include/wx/osx/textentry.h index 2362cae8af..12d780778a 100644 --- a/Externals/wxWidgets3/include/wx/osx/textentry.h +++ b/Externals/wxWidgets3/include/wx/osx/textentry.h @@ -81,6 +81,10 @@ public: virtual bool SendMaxLenEvent(); + // set the grayed out hint text + virtual bool SetHint(const wxString& hint); + virtual wxString GetHint() const; + // Implementation // -------------- @@ -102,6 +106,8 @@ protected: // need to make this public because of the current implementation via callbacks unsigned long m_maxLength; +private: + wxString m_hintString; }; #endif // _WX_OSX_TEXTENTRY_H_ diff --git a/Externals/wxWidgets3/include/wx/platform.h b/Externals/wxWidgets3/include/wx/platform.h index 53b04e522d..97c669f7a4 100644 --- a/Externals/wxWidgets3/include/wx/platform.h +++ b/Externals/wxWidgets3/include/wx/platform.h @@ -95,8 +95,13 @@ # endif #endif /* __WINDOWS__ */ -/* Don't use widget toolkit specific code in non-GUI code */ -#if defined(wxUSE_GUI) && !wxUSE_GUI +/* + Don't use widget toolkit specific code in non-GUI code in the library + itself to ensure that the same base library is used for both MSW and GTK + ports. But keep __WXMSW__ defined for (console) applications using + wxWidgets for compatibility. + */ +#if defined(WXBUILDING) && defined(wxUSE_GUI) && !wxUSE_GUI # ifdef __WXMSW__ # undef __WXMSW__ # endif diff --git a/Externals/wxWidgets3/include/wx/private/textmeasure.h b/Externals/wxWidgets3/include/wx/private/textmeasure.h index 69fbf85ab2..a4db67cb50 100644 --- a/Externals/wxWidgets3/include/wx/private/textmeasure.h +++ b/Externals/wxWidgets3/include/wx/private/textmeasure.h @@ -156,7 +156,7 @@ protected: wxDECLARE_NO_COPY_CLASS(wxTextMeasureBase); }; -// Include the platform dependant class declaration, if any. +// Include the platform dependent class declaration, if any. #if defined(__WXGTK20__) #include "wx/gtk/private/textmeasure.h" #elif defined(__WXMSW__) diff --git a/Externals/wxWidgets3/include/wx/selstore.h b/Externals/wxWidgets3/include/wx/selstore.h index 4361a11a9c..62ff2298ce 100644 --- a/Externals/wxWidgets3/include/wx/selstore.h +++ b/Externals/wxWidgets3/include/wx/selstore.h @@ -80,7 +80,7 @@ public: private: // (re)init - void Init() { m_defaultState = false; } + void Init() { m_count = 0; m_defaultState = false; } // the total number of items we handle unsigned m_count; diff --git a/Externals/wxWidgets3/include/wx/stringops.h b/Externals/wxWidgets3/include/wx/stringops.h index 301a7bf843..21c6121787 100644 --- a/Externals/wxWidgets3/include/wx/stringops.h +++ b/Externals/wxWidgets3/include/wx/stringops.h @@ -79,8 +79,6 @@ struct WXDLLIMPEXP_BASE wxStringOperationsUtf8 template static void DecIter(Iterator& i) { - wxASSERT( IsValidUtf8LeadByte(*i) ); - // Non-lead bytes are all in the 0x80..0xBF range (i.e. 10xxxxxx in // binary), so we just have to go back until we hit a byte that is // either < 0x80 (i.e. 0xxxxxxx in binary) or 0xC0..0xFF (11xxxxxx in diff --git a/Externals/wxWidgets3/include/wx/strvararg.h b/Externals/wxWidgets3/include/wx/strvararg.h index dc566e9443..6562ee3150 100644 --- a/Externals/wxWidgets3/include/wx/strvararg.h +++ b/Externals/wxWidgets3/include/wx/strvararg.h @@ -748,7 +748,7 @@ struct wxArgNormalizer : public wxArgNormalizer { wxArgNormalizer(const wxUniChar& s, const wxFormatString *fmt, unsigned index) - : wxArgNormalizer(s.GetValue(), fmt, index) {} + : wxArgNormalizer(wx_truncate_cast(wchar_t, s.GetValue()), fmt, index) {} }; // for wchar_t, default handler does the right thing diff --git a/Externals/wxWidgets3/include/wx/textctrl.h b/Externals/wxWidgets3/include/wx/textctrl.h index 83634e1885..ce922bb631 100644 --- a/Externals/wxWidgets3/include/wx/textctrl.h +++ b/Externals/wxWidgets3/include/wx/textctrl.h @@ -205,6 +205,9 @@ enum wxTextAttrFlags wxTEXT_ATTR_EFFECTS = 0x00800000, wxTEXT_ATTR_OUTLINE_LEVEL = 0x01000000, + wxTEXT_ATTR_AVOID_PAGE_BREAK_BEFORE = 0x20000000, + wxTEXT_ATTR_AVOID_PAGE_BREAK_AFTER = 0x40000000, + /*! * Character and paragraph combined styles */ @@ -216,7 +219,8 @@ enum wxTextAttrFlags wxTEXT_ATTR_PARAGRAPH = \ (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\ wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|\ - wxTEXT_ATTR_BULLET|wxTEXT_ATTR_PARAGRAPH_STYLE_NAME|wxTEXT_ATTR_LIST_STYLE_NAME|wxTEXT_ATTR_OUTLINE_LEVEL|wxTEXT_ATTR_PAGE_BREAK), + wxTEXT_ATTR_BULLET|wxTEXT_ATTR_PARAGRAPH_STYLE_NAME|wxTEXT_ATTR_LIST_STYLE_NAME|wxTEXT_ATTR_OUTLINE_LEVEL|\ + wxTEXT_ATTR_PAGE_BREAK|wxTEXT_ATTR_AVOID_PAGE_BREAK_BEFORE|wxTEXT_ATTR_AVOID_PAGE_BREAK_AFTER), wxTEXT_ATTR_ALL = (wxTEXT_ATTR_CHARACTER|wxTEXT_ATTR_PARAGRAPH) }; @@ -262,7 +266,9 @@ enum wxTextAttrEffects wxTEXT_ATTR_EFFECT_OUTLINE = 0x00000040, wxTEXT_ATTR_EFFECT_ENGRAVE = 0x00000080, wxTEXT_ATTR_EFFECT_SUPERSCRIPT = 0x00000100, - wxTEXT_ATTR_EFFECT_SUBSCRIPT = 0x00000200 + wxTEXT_ATTR_EFFECT_SUBSCRIPT = 0x00000200, + wxTEXT_ATTR_EFFECT_RTL = 0x00000400, + wxTEXT_ATTR_EFFECT_SUPPRESS_HYPHENATION = 0x00001000 }; /*! diff --git a/Externals/wxWidgets3/include/wx/unichar.h b/Externals/wxWidgets3/include/wx/unichar.h index a661e5a4e2..e9726943ab 100644 --- a/Externals/wxWidgets3/include/wx/unichar.h +++ b/Externals/wxWidgets3/include/wx/unichar.h @@ -161,7 +161,7 @@ private: return ToHi8bit(c); #else - return c; + return wx_truncate_cast(char, c); #endif } diff --git a/Externals/wxWidgets3/include/wx/vector.h b/Externals/wxWidgets3/include/wx/vector.h index dffb19fc9d..e81cafb082 100644 --- a/Externals/wxWidgets3/include/wx/vector.h +++ b/Externals/wxWidgets3/include/wx/vector.h @@ -327,7 +327,7 @@ public: if ( m_capacity + increment > n ) n = m_capacity + increment; - m_values = Ops::Realloc(m_values, n * sizeof(value_type), m_size); + m_values = Ops::Realloc(m_values, n, m_size); m_capacity = n; } diff --git a/Externals/wxWidgets3/include/wx/version.h b/Externals/wxWidgets3/include/wx/version.h index c762d9a9f0..16578dc283 100644 --- a/Externals/wxWidgets3/include/wx/version.h +++ b/Externals/wxWidgets3/include/wx/version.h @@ -26,10 +26,10 @@ /* NB: this file is parsed by automatic tools so don't change its format! */ #define wxMAJOR_VERSION 3 -#define wxMINOR_VERSION 0 +#define wxMINOR_VERSION 1 #define wxRELEASE_NUMBER 0 #define wxSUBRELEASE_NUMBER 0 -#define wxVERSION_STRING wxT("wxWidgets 3.0.0 RC1") +#define wxVERSION_STRING wxT("wxWidgets 3.1.0") /* nothing to update below this line when updating the version */ /* ---------------------------------------------------------------------------- */ diff --git a/Externals/wxWidgets3/include/wx/wxcrtbase.h b/Externals/wxWidgets3/include/wx/wxcrtbase.h index 16f6499229..1c3522ec66 100644 --- a/Externals/wxWidgets3/include/wx/wxcrtbase.h +++ b/Externals/wxWidgets3/include/wx/wxcrtbase.h @@ -565,24 +565,6 @@ WXDLLIMPEXP_BASE wchar_t * wxCRT_GetenvW(const wchar_t *name); /* wcstoi doesn't exist */ #endif -#ifdef __DARWIN__ - #if !defined(__WXOSX_IPHONE__) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 - #define wxNEED_WX_MBSTOWCS - #endif -#endif - -#ifdef wxNEED_WX_MBSTOWCS - /* even though they are defined and "implemented", they are bad and just - stubs so we need our own - we need these even in ANSI builds!! */ - WXDLLIMPEXP_BASE size_t wxMbstowcs(wchar_t *, const char *, size_t); - WXDLLIMPEXP_BASE size_t wxWcstombs(char *, const wchar_t *, size_t); -#else - #define wxMbstowcs mbstowcs - #define wxWcstombs wcstombs -#endif - - - /* ------------------------------------------------------------------------- time.h ------------------------------------------------------------------------- */ diff --git a/Externals/wxWidgets3/include/wx/wxcrtvararg.h b/Externals/wxWidgets3/include/wx/wxcrtvararg.h index c3a306be85..08d6981e26 100644 --- a/Externals/wxWidgets3/include/wx/wxcrtvararg.h +++ b/Externals/wxWidgets3/include/wx/wxcrtvararg.h @@ -238,7 +238,17 @@ #define wxCRT_ScanfA scanf #define wxCRT_SscanfA sscanf #define wxCRT_FscanfA fscanf -#define wxCRT_VsscanfA vsscanf + +/* vsscanf() may have a wrong declaration with non-const first parameter, fix + * this by wrapping it if necessary. */ +#if defined __cplusplus && defined HAVE_BROKEN_VSSCANF_DECL + inline int wxCRT_VsscanfA(const char *str, const char *format, va_list ap) + { + return vsscanf(const_cast(str), format, ap); + } +#else + #define wxCRT_VsscanfA vsscanf +#endif #if defined(wxNEED_WPRINTF) int wxCRT_ScanfW(const wchar_t *format, ...); diff --git a/Externals/wxWidgets3/src/common/appbase.cpp b/Externals/wxWidgets3/src/common/appbase.cpp index da6f2948ef..68113d9956 100644 --- a/Externals/wxWidgets3/src/common/appbase.cpp +++ b/Externals/wxWidgets3/src/common/appbase.cpp @@ -173,6 +173,10 @@ wxAppConsoleBase::~wxAppConsoleBase() bool wxAppConsoleBase::Initialize(int& WXUNUSED(argc), wxChar **WXUNUSED(argv)) { +#if defined(__WINDOWS__) && !defined(__WXWINCE__) + SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX); +#endif + return true; } diff --git a/Externals/wxWidgets3/src/common/cmdproc.cpp b/Externals/wxWidgets3/src/common/cmdproc.cpp index 54f14ea028..4534de633e 100644 --- a/Externals/wxWidgets3/src/common/cmdproc.cpp +++ b/Externals/wxWidgets3/src/common/cmdproc.cpp @@ -329,16 +329,11 @@ void wxCommandProcessor::ClearCommands() bool wxCommandProcessor::IsDirty() const { - if ( m_commands.empty() ) - { - // If we have never been modified, we can't be dirty. - return false; - } - if ( !m_lastSavedCommand ) { - // If we have been modified but have never been saved, we're dirty. - return true; + // We have never been saved, so we are dirty if and only if we have any + // commands at all. + return m_currentCommand; } if ( !m_currentCommand ) diff --git a/Externals/wxWidgets3/src/common/ctrlcmn.cpp b/Externals/wxWidgets3/src/common/ctrlcmn.cpp index 32bce06c6f..dbfbc9f700 100644 --- a/Externals/wxWidgets3/src/common/ctrlcmn.cpp +++ b/Externals/wxWidgets3/src/common/ctrlcmn.cpp @@ -584,7 +584,7 @@ wxSize wxStaticBitmapBase::DoGetBestSize() const wxSize best; wxBitmap bmp = GetBitmap(); if ( bmp.IsOk() ) - best = wxSize(bmp.GetWidth(), bmp.GetHeight()); + best = bmp.GetScaledSize(); else // this is completely arbitrary best = wxSize(16, 16); diff --git a/Externals/wxWidgets3/src/common/datavcmn.cpp b/Externals/wxWidgets3/src/common/datavcmn.cpp index 2cad362531..fd7412117a 100644 --- a/Externals/wxWidgets3/src/common/datavcmn.cpp +++ b/Externals/wxWidgets3/src/common/datavcmn.cpp @@ -330,28 +330,49 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem { long l1 = value1.GetLong(); long l2 = value2.GetLong(); - long res = l1-l2; - if (res) - return res; + if (l1 < l2) + return -1; + else if (l1 > l2) + return 1; } else if (value1.GetType() == wxT("double")) { double d1 = value1.GetDouble(); double d2 = value2.GetDouble(); if (d1 < d2) - return 1; - if (d1 > d2) return -1; + else if (d1 > d2) + return 1; } else if (value1.GetType() == wxT("datetime")) { wxDateTime dt1 = value1.GetDateTime(); wxDateTime dt2 = value2.GetDateTime(); if (dt1.IsEarlierThan(dt2)) - return 1; - if (dt2.IsEarlierThan(dt1)) return -1; + if (dt2.IsEarlierThan(dt1)) + return 1; } + else if (value1.GetType() == wxT("bool")) + { + bool b1 = value1.GetBool(); + bool b2 = value2.GetBool(); + + if (b1 != b2) + return b1 ? 1 : -1; + } + else if (value1.GetType() == wxT("wxDataViewIconText")) + { + wxDataViewIconText iconText1, iconText2; + + iconText1 << value1; + iconText2 << value2; + + int res = iconText1.GetText().Cmp(iconText2.GetText()); + if (res != 0) + return res; + } + // items must be different wxUIntPtr id1 = wxPtrToUInt(item1.GetID()), @@ -1769,6 +1790,11 @@ void wxDataViewListStore::DeleteAllItems() Reset( 0 ); } +void wxDataViewListStore::ClearColumns() +{ + m_cols.clear(); +} + void wxDataViewListStore::SetItemData( const wxDataViewItem& item, wxUIntPtr data ) { wxDataViewListStoreLine* line = m_data[GetRow(item)]; @@ -1780,7 +1806,7 @@ void wxDataViewListStore::SetItemData( const wxDataViewItem& item, wxUIntPtr dat wxUIntPtr wxDataViewListStore::GetItemData( const wxDataViewItem& item ) const { wxDataViewListStoreLine* line = m_data[GetRow(item)]; - if (!line) return static_cast(NULL); + if (!line) return 0; return line->GetData(); } @@ -1872,6 +1898,12 @@ bool wxDataViewListCtrl::AppendColumn( wxDataViewColumn *col ) return AppendColumn( col, "string" ); } +bool wxDataViewListCtrl::ClearColumns() +{ + GetStore()->ClearColumns(); + return wxDataViewCtrl::ClearColumns(); +} + wxDataViewColumn *wxDataViewListCtrl::AppendTextColumn( const wxString &label, wxDataViewCellMode mode, int width, wxAlignment align, int flags ) { diff --git a/Externals/wxWidgets3/src/common/dcbufcmn.cpp b/Externals/wxWidgets3/src/common/dcbufcmn.cpp index ee50d2311a..3bc2e275ed 100644 --- a/Externals/wxWidgets3/src/common/dcbufcmn.cpp +++ b/Externals/wxWidgets3/src/common/dcbufcmn.cpp @@ -148,7 +148,7 @@ void wxBufferedDC::UnMask() int width = m_area.GetWidth(), height = m_area.GetHeight(); - if (! m_style & wxBUFFER_VIRTUAL_AREA) + if (!(m_style & wxBUFFER_VIRTUAL_AREA)) { int widthDC, heightDC; @@ -157,7 +157,8 @@ void wxBufferedDC::UnMask() height = wxMin(height, heightDC); } - m_dc->Blit(0, 0, width, height, this, -x, -y); + const wxPoint origin = GetLogicalOrigin(); + m_dc->Blit(-origin.x, -origin.y, width, height, this, -x, -y); m_dc = NULL; if ( m_style & wxBUFFER_USES_SHARED_BUFFER ) diff --git a/Externals/wxWidgets3/src/common/dcsvg.cpp b/Externals/wxWidgets3/src/common/dcsvg.cpp index 6fd0c2a46f..5c55a0b935 100644 --- a/Externals/wxWidgets3/src/common/dcsvg.cpp +++ b/Externals/wxWidgets3/src/common/dcsvg.cpp @@ -27,6 +27,8 @@ #include "wx/wfstream.h" #include "wx/filename.h" +#include "wx/private/markupparser.h" + // ---------------------------------------------------------- // Global utilities // ---------------------------------------------------------- @@ -293,7 +295,7 @@ void wxSVGFileDCImpl::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoor //text will be solid, unless alpha value isn't opaque in the foreground colour s += wxBrushString(m_textForegroundColour) + wxPenString(m_textForegroundColour); sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %s %d %d ) \" >"), NumStr(-angle), x,y ); - s += sTmp + sText + wxT(" ") + wxT("\n"); + s += sTmp + wxMarkupParser::Quote(sText) + wxT(" ") + wxT("\n"); if (m_OK) { write(s); diff --git a/Externals/wxWidgets3/src/common/dlgcmn.cpp b/Externals/wxWidgets3/src/common/dlgcmn.cpp index df7ecdff59..3f73371484 100644 --- a/Externals/wxWidgets3/src/common/dlgcmn.cpp +++ b/Externals/wxWidgets3/src/common/dlgcmn.cpp @@ -517,7 +517,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxWindowModalDialogEvent, wxCommandEvent) void wxDialogBase::ShowWindowModal () { - ShowModal(); + int retval = ShowModal(); + // wxWindowModalDialogEvent relies on GetReturnCode() returning correct + // code. Rather than doing it manually in all ShowModal() overrides for + // native dialogs (and getting accidentally broken again), set it here. + // The worst that can happen is that it will be set twice to the same + // value. + SetReturnCode(retval); SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED ); } diff --git a/Externals/wxWidgets3/src/common/docview.cpp b/Externals/wxWidgets3/src/common/docview.cpp index 45205f0e00..b646d9efe2 100644 --- a/Externals/wxWidgets3/src/common/docview.cpp +++ b/Externals/wxWidgets3/src/common/docview.cpp @@ -2027,11 +2027,16 @@ bool wxDocChildFrameAnyBase::TryProcessEvent(wxEvent& event) return false; } + // Store a (non-owning) pointer to the last processed event here to be able + // to recognize this event again if it bubbles up to the parent frame, see + // the code in wxDocParentFrameAnyBase::TryProcessEvent(). + m_lastEvent = &event; + // Forward the event to the document manager which will, in turn, forward // it to its active view which must be our m_childView. // // Notice that we do things in this roundabout way to guarantee the correct - // event handlers call order: first the document, then the new and then the + // event handlers call order: first the document, then the view and then the // document manager itself. And if we forwarded the event directly to the // view, then the document manager would do it once again when we forwarded // it to it. @@ -2079,28 +2084,13 @@ bool wxDocParentFrameAnyBase::TryProcessEvent(wxEvent& event) // already forwarded the event to wxDocManager, check for this: if ( wxView* const view = m_docManager->GetAnyUsableView() ) { - wxWindow* win = view->GetFrame(); - if ( win && win != m_frame ) - { - // Notice that we intentionally don't use wxGetTopLevelParent() - // here because we want to check both for the case of a child - // "frame" (e.g. MDI child frame or notebook page) inside this TLW - // and a separate child TLW frame (as used in the SDI mode) here. - for ( win = win->GetParent(); win; win = win->GetParent() ) - { - if ( win == m_frame ) - return false; - } - } - //else: This view is directly associated with the parent frame (which - // can happen in the so called "single" mode in which only one - // document can be opened and so is managed by the parent frame - // itself), there can be no child frame in play so we must forward - // the event to wxDocManager ourselves. + wxDocChildFrameAnyBase* const childFrame = view->GetDocChildFrame(); + if ( childFrame && childFrame->HasAlreadyProcessed(event) ) + return false; } // But forward the event to wxDocManager ourselves if there are no views at - // all or if we are the frame's view ourselves. + // all or if this event hadn't been sent to the child frame previously. return m_docManager->ProcessEventLocally(event); } diff --git a/Externals/wxWidgets3/src/common/filename.cpp b/Externals/wxWidgets3/src/common/filename.cpp index d538ebcc38..6acde7603c 100644 --- a/Externals/wxWidgets3/src/common/filename.cpp +++ b/Externals/wxWidgets3/src/common/filename.cpp @@ -315,14 +315,20 @@ static bool IsUNCPath(const wxString& path, wxPathFormat format) !IsDOSPathSep(path[2u]); } -#ifndef __WIN32__ +// Under Unix-ish systems (basically everything except Windows but we can't +// just test for non-__WIN32__ because Cygwin defines it, yet we want to use +// lstat() under it, so test for all the rest explicitly) we may work either +// with the file itself or its target if it's a symbolic link and we should +// dereference it, as determined by wxFileName::ShouldFollowLink() and the +// absence of the wxFILE_EXISTS_NO_FOLLOW flag. StatAny() can be used to stat +// the appropriate file with an extra twist that it also works when there is no +// wxFileName object at all, as is the case in static methods. -// Under Unix-ish systems (basically everything except Windows) we may work -// either with the file itself or its target if it's a symbolic link and we -// should dereference it, as determined by wxFileName::ShouldFollowLink() and -// the absence of the wxFILE_EXISTS_NO_FOLLOW flag. StatAny() can be used to -// stat the appropriate file with an extra twist that it also works when there -// is no wxFileName object at all, as is the case in static methods. +#if defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__OS2__) || (defined(__DOS__) && defined(__WATCOMC__)) + #define wxHAVE_LSTAT +#endif + +#ifdef wxHAVE_LSTAT // Private implementation, don't call directly, use one of the overloads below. bool DoStatAny(wxStructStat& st, wxString path, bool dereference) @@ -363,7 +369,7 @@ bool StatAny(wxStructStat& st, const wxFileName& fn) return DoStatAny(st, fn.GetFullPath(), fn.ShouldFollowLink()); } -#endif // !__WIN32__ +#endif // wxHAVE_LSTAT // ---------------------------------------------------------------------------- // private constants @@ -1851,7 +1857,7 @@ bool wxFileName::SameAs(const wxFileName& filepath, wxPathFormat format) const if ( fn1.GetFullPath() == fn2.GetFullPath() ) return true; -#if defined(__UNIX__) +#ifdef wxHAVE_LSTAT wxStructStat st1, st2; if ( StatAny(st1, fn1) && StatAny(st2, fn2) ) { @@ -1859,7 +1865,7 @@ bool wxFileName::SameAs(const wxFileName& filepath, wxPathFormat format) const return true; } //else: It's not an error if one or both files don't exist. -#endif // defined __UNIX__ +#endif // wxHAVE_LSTAT return false; } @@ -2752,7 +2758,7 @@ bool wxFileName::GetTimes(wxDateTime *dtAccess, return true; } -#elif defined(__UNIX_LIKE__) || defined(__WXMAC__) || defined(__OS2__) || (defined(__DOS__) && defined(__WATCOMC__)) +#elif defined(wxHAVE_LSTAT) // no need to test for IsDir() here wxStructStat stBuf; if ( StatAny(stBuf, *this) ) diff --git a/Externals/wxWidgets3/src/common/fldlgcmn.cpp b/Externals/wxWidgets3/src/common/fldlgcmn.cpp index 12ca3a43f0..0b02b78409 100644 --- a/Externals/wxWidgets3/src/common/fldlgcmn.cpp +++ b/Externals/wxWidgets3/src/common/fldlgcmn.cpp @@ -67,6 +67,24 @@ bool wxFileDialogBase::Create(wxWindow *parent, m_wildCard = wildCard; m_parent = parent; + +#ifdef __WXOSX__ + /* + [DS] + Remove the (for OS X unnecessary) wxFD_FILE_MUST_EXIST flag. Using it + causes problems when having an extra panel (either a custom one or + by showing the filetype filters through calling + wxSystemOptions::SetOption(wxOSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1) ). + Presumably the style flag conflicts with other style flags and an + assert in wxRegion::DoOffset is triggered later on. + Another solution was to override GetWindowStyleFlag() to not include + wxFD_FILE_MUST_EXIST in its return value, but as other wxFileDialog + style flags (that are actually used) dont't seem to cause problems + this seemed an easier solution. + */ + style &= ~wxFD_FILE_MUST_EXIST; +#endif + m_windowStyle = style; m_filterIndex = 0; diff --git a/Externals/wxWidgets3/src/common/fswatchercmn.cpp b/Externals/wxWidgets3/src/common/fswatchercmn.cpp index 1de2422183..66fb869e9c 100644 --- a/Externals/wxWidgets3/src/common/fswatchercmn.cpp +++ b/Externals/wxWidgets3/src/common/fswatchercmn.cpp @@ -65,6 +65,11 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileSystemWatcherEvent, wxEvent); wxString wxFileSystemWatcherEvent::ToString() const { + if (IsError()) + { + return wxString::Format("FSW_EVT type=%d (%s) message='%s'", m_changeType, + GetFSWEventChangeTypeName(m_changeType), GetErrorDescription()); + } return wxString::Format("FSW_EVT type=%d (%s) path='%s'", m_changeType, GetFSWEventChangeTypeName(m_changeType), GetPath().GetFullPath()); } diff --git a/Externals/wxWidgets3/src/common/gdicmn.cpp b/Externals/wxWidgets3/src/common/gdicmn.cpp index 2928d1dd80..4938977b10 100644 --- a/Externals/wxWidgets3/src/common/gdicmn.cpp +++ b/Externals/wxWidgets3/src/common/gdicmn.cpp @@ -333,7 +333,7 @@ void wxColourDatabase::Initialize() {wxT("LIGHT GREY"), 192, 192, 192}, {wxT("LIGHT STEEL BLUE"), 143, 143, 188}, {wxT("LIME GREEN"), 50, 204, 50}, - {wxT("LIGHT MAGENTA"), 255, 0, 255}, + {wxT("LIGHT MAGENTA"), 255, 119, 255}, {wxT("MAGENTA"), 255, 0, 255}, {wxT("MAROON"), 142, 35, 107}, {wxT("MEDIUM AQUAMARINE"), 50, 204, 153}, diff --git a/Externals/wxWidgets3/src/common/menucmn.cpp b/Externals/wxWidgets3/src/common/menucmn.cpp index e92a047041..bce29b6c54 100644 --- a/Externals/wxWidgets3/src/common/menucmn.cpp +++ b/Externals/wxWidgets3/src/common/menucmn.cpp @@ -423,21 +423,25 @@ wxMenuItem *wxMenuBase::Remove(wxMenuItem *item) { wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Remove") ); - return DoRemove(item); -} - -wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) -{ wxMenuItemList::compatibility_iterator node = m_items.Find(item); // if we get here, the item is valid or one of Remove() functions is broken - wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") ); + wxCHECK_MSG( node, NULL, wxT("removing item not in the menu?") ); + + // call DoRemove() before removing the item from the list of items as the + // existing code in port-specific implementation may rely on the item still + // being there (this is the case for at least wxMSW) + wxMenuItem* const item2 = DoRemove(item); // we detach the item, but we do delete the list node (i.e. don't call // DetachNode() here!) m_items.Erase(node); - // item isn't attached to anything any more + return item2; +} + +wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) +{ item->SetMenu(NULL); wxMenu *submenu = item->GetSubMenu(); if ( submenu ) @@ -459,7 +463,7 @@ bool wxMenuBase::Delete(wxMenuItem *item) bool wxMenuBase::DoDelete(wxMenuItem *item) { - wxMenuItem *item2 = DoRemove(item); + wxMenuItem *item2 = Remove(item); wxCHECK_MSG( item2, false, wxT("failed to delete menu item") ); // don't delete the submenu @@ -479,7 +483,7 @@ bool wxMenuBase::Destroy(wxMenuItem *item) bool wxMenuBase::DoDestroy(wxMenuItem *item) { - wxMenuItem *item2 = DoRemove(item); + wxMenuItem *item2 = Remove(item); wxCHECK_MSG( item2, false, wxT("failed to delete menu item") ); delete item2; diff --git a/Externals/wxWidgets3/src/common/socket.cpp b/Externals/wxWidgets3/src/common/socket.cpp index a793e3520d..bcb331fcc3 100644 --- a/Externals/wxWidgets3/src/common/socket.cpp +++ b/Externals/wxWidgets3/src/common/socket.cpp @@ -1357,7 +1357,25 @@ wxSocketEventFlags wxSocketImpl::Select(wxSocketEventFlags flags, wxSocketEventFlags detected = 0; if ( preadfds && wxFD_ISSET(m_fd, preadfds) ) - detected |= wxSOCKET_INPUT_FLAG; + { + // check for the case of a server socket waiting for connection + if ( m_server && (flags & wxSOCKET_CONNECTION_FLAG) ) + { + int error; + SOCKOPTLEN_T len = sizeof(error); + m_establishing = false; + getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + + if ( error ) + detected = wxSOCKET_LOST_FLAG; + else + detected |= wxSOCKET_CONNECTION_FLAG; + } + else // not called to get non-blocking accept() status + { + detected |= wxSOCKET_INPUT_FLAG; + } + } if ( pwritefds && wxFD_ISSET(m_fd, pwritefds) ) { diff --git a/Externals/wxWidgets3/src/common/textcmn.cpp b/Externals/wxWidgets3/src/common/textcmn.cpp index 22d5b7250b..4cba1dec5b 100644 --- a/Externals/wxWidgets3/src/common/textcmn.cpp +++ b/Externals/wxWidgets3/src/common/textcmn.cpp @@ -227,42 +227,43 @@ bool wxTextAttr::operator== (const wxTextAttr& attr) const { return GetFlags() == attr.GetFlags() && - GetTextColour() == attr.GetTextColour() && - GetBackgroundColour() == attr.GetBackgroundColour() && + (!HasTextColour() || (GetTextColour() == attr.GetTextColour())) && + (!HasBackgroundColour() || (GetBackgroundColour() == attr.GetBackgroundColour())) && - GetAlignment() == attr.GetAlignment() && - GetLeftIndent() == attr.GetLeftIndent() && - GetLeftSubIndent() == attr.GetLeftSubIndent() && - GetRightIndent() == attr.GetRightIndent() && - TabsEq(GetTabs(), attr.GetTabs()) && + (!HasAlignment() || (GetAlignment() == attr.GetAlignment())) && + (!HasLeftIndent() || (GetLeftIndent() == attr.GetLeftIndent() && + GetLeftSubIndent() == attr.GetLeftSubIndent())) && + (!HasRightIndent() || (GetRightIndent() == attr.GetRightIndent())) && + (!HasTabs() || (TabsEq(GetTabs(), attr.GetTabs()))) && - GetParagraphSpacingAfter() == attr.GetParagraphSpacingAfter() && - GetParagraphSpacingBefore() == attr.GetParagraphSpacingBefore() && - GetLineSpacing() == attr.GetLineSpacing() && - GetCharacterStyleName() == attr.GetCharacterStyleName() && - GetParagraphStyleName() == attr.GetParagraphStyleName() && - GetListStyleName() == attr.GetListStyleName() && + (!HasParagraphSpacingAfter() || (GetParagraphSpacingAfter() == attr.GetParagraphSpacingAfter())) && + (!HasParagraphSpacingBefore() || (GetParagraphSpacingBefore() == attr.GetParagraphSpacingBefore())) && + (!HasLineSpacing() || (GetLineSpacing() == attr.GetLineSpacing())) && + (!HasCharacterStyleName() || (GetCharacterStyleName() == attr.GetCharacterStyleName())) && + (!HasParagraphStyleName() || (GetParagraphStyleName() == attr.GetParagraphStyleName())) && + (!HasListStyleName() || (GetListStyleName() == attr.GetListStyleName())) && - GetBulletStyle() == attr.GetBulletStyle() && - GetBulletText() == attr.GetBulletText() && - GetBulletNumber() == attr.GetBulletNumber() && - GetBulletFont() == attr.GetBulletFont() && - GetBulletName() == attr.GetBulletName() && + (!HasBulletStyle() || (GetBulletStyle() == attr.GetBulletStyle())) && + (!HasBulletText() || (GetBulletText() == attr.GetBulletText())) && + (!HasBulletNumber() || (GetBulletNumber() == attr.GetBulletNumber())) && + (GetBulletFont() == attr.GetBulletFont()) && + (!HasBulletName() || (GetBulletName() == attr.GetBulletName())) && - GetTextEffects() == attr.GetTextEffects() && - GetTextEffectFlags() == attr.GetTextEffectFlags() && + (!HasTextEffects() || (GetTextEffects() == attr.GetTextEffects() && + GetTextEffectFlags() == attr.GetTextEffectFlags())) && - GetOutlineLevel() == attr.GetOutlineLevel() && + (!HasOutlineLevel() || (GetOutlineLevel() == attr.GetOutlineLevel())) && - GetFontSize() == attr.GetFontSize() && - GetFontStyle() == attr.GetFontStyle() && - GetFontWeight() == attr.GetFontWeight() && - GetFontUnderlined() == attr.GetFontUnderlined() && - GetFontFaceName() == attr.GetFontFaceName() && - GetFontEncoding() == attr.GetFontEncoding() && - GetFontFamily() == attr.GetFontFamily() && + (!HasFontSize() || (GetFontSize() == attr.GetFontSize())) && + (!HasFontItalic() || (GetFontStyle() == attr.GetFontStyle())) && + (!HasFontWeight() || (GetFontWeight() == attr.GetFontWeight())) && + (!HasFontUnderlined() || (GetFontUnderlined() == attr.GetFontUnderlined())) && + (!HasFontStrikethrough() || (GetFontStrikethrough() == attr.GetFontStrikethrough())) && + (!HasFontFaceName() || (GetFontFaceName() == attr.GetFontFaceName())) && + (!HasFontEncoding() || (GetFontEncoding() == attr.GetFontEncoding())) && + (!HasFontFamily() || (GetFontFamily() == attr.GetFontFamily())) && - GetURL() == attr.GetURL(); + (!HasURL() || (GetURL() == attr.GetURL())); } // Partial equality test. Only returns false if an attribute doesn't match. @@ -393,7 +394,7 @@ bool wxTextAttr::EqPartial(const wxTextAttr& attr, bool weakTest) const if (HasTextEffects() && attr.HasTextEffects()) { - if (!BitlistsEqPartial(GetTextEffects(), attr.GetTextEffects(), attr.GetTextEffectFlags())) + if (!BitlistsEqPartial(GetTextEffects(), attr.GetTextEffects(), GetTextEffectFlags())) return false; } @@ -817,6 +818,19 @@ bool wxTextAttr::RemoveStyle(wxTextAttr& destStyle, const wxTextAttr& style) int flags = style.GetFlags(); int destFlags = destStyle.GetFlags(); + // We must treat text effects specially, since we must remove only some. + if (style.HasTextEffects() && (style.GetTextEffectFlags() != 0)) + { + int newTextEffectFlags = destStyle.GetTextEffectFlags() & ~style.GetTextEffectFlags(); + int newTextEffects = destStyle.GetTextEffects() & ~style.GetTextEffectFlags(); + destStyle.SetTextEffects(newTextEffects); + destStyle.SetTextEffectFlags(newTextEffectFlags); + + // Don't remove wxTEXT_ATTR_EFFECTS unless the resulting flags are zero + if (newTextEffectFlags != 0) + flags &= ~wxTEXT_ATTR_EFFECTS; + } + destStyle.SetFlags(destFlags & ~flags); return true; @@ -927,7 +941,7 @@ bool wxTextAreaBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType) { #if wxUSE_FFILE wxFFile file(filename, wxT("w")); - if ( file.IsOpened() && file.Write(GetValue(), *wxConvCurrent) ) + if ( file.IsOpened() && file.Write(GetValue()) ) { // if it worked, save for future calls m_filename = filename; diff --git a/Externals/wxWidgets3/src/common/textfile.cpp b/Externals/wxWidgets3/src/common/textfile.cpp index 4c7d4c330c..ddf88c9e46 100644 --- a/Externals/wxWidgets3/src/common/textfile.cpp +++ b/Externals/wxWidgets3/src/common/textfile.cpp @@ -208,8 +208,8 @@ bool wxTextFile::OnRead(const wxMBConv& conv) // now break the buffer in lines - // last processed character, we need to know if it was a CR or not - wxChar chLast = '\0'; + // was the last processed character a CR? + bool lastWasCR = false; // the beginning of the current line, changes inside the loop wxString::const_iterator lineStart = str.begin(); @@ -221,7 +221,7 @@ bool wxTextFile::OnRead(const wxMBConv& conv) { case '\n': // could be a DOS or Unix EOL - if ( chLast == '\r' ) + if ( lastWasCR ) { if ( p - 1 >= lineStart ) { @@ -239,10 +239,11 @@ bool wxTextFile::OnRead(const wxMBConv& conv) } lineStart = p + 1; + lastWasCR = false; break; case '\r': - if ( chLast == '\r' ) + if ( lastWasCR ) { // Mac empty line AddLine(wxEmptyString, wxTextFileType_Mac); @@ -250,10 +251,12 @@ bool wxTextFile::OnRead(const wxMBConv& conv) } //else: we don't know what this is yet -- could be a Mac EOL or // start of DOS EOL so wait for next char + + lastWasCR = true; break; default: - if ( chLast == '\r' ) + if ( lastWasCR ) { // Mac line termination if ( p - 1 >= lineStart ) @@ -267,16 +270,31 @@ bool wxTextFile::OnRead(const wxMBConv& conv) } lineStart = p; } + lastWasCR = false; } - - chLast = ch; } // anything in the last line? if ( lineStart != end ) { - // add unterminated last line - AddLine(wxString(lineStart, end), wxTextFileType_None); + // add the last line, notice that it may have been terminated with CR + // as we don't end the line immediately when we see a CR, as it could + // be followed by a LF. + wxString lastLine(lineStart, end); + wxTextFileType lastType; + if ( lastWasCR ) + { + // last line had Mac EOL, exclude it from the string + lastLine.RemoveLast(); + lastType = wxTextFileType_Mac; + } + else + { + // last line wasn't terminated at all + lastType = wxTextFileType_None; + } + + AddLine(lastLine, lastType); } return true; diff --git a/Externals/wxWidgets3/src/common/threadinfo.cpp b/Externals/wxWidgets3/src/common/threadinfo.cpp index 8ef745f349..be07847b70 100644 --- a/Externals/wxWidgets3/src/common/threadinfo.cpp +++ b/Externals/wxWidgets3/src/common/threadinfo.cpp @@ -28,11 +28,26 @@ namespace // All thread info objects are stored in a global list so that they are // freed when global objects are destroyed and no memory leaks are reported. -wxCriticalSection g_csAllThreadInfos; -typedef wxVector< wxSharedPtr > wxAllThreadInfos; -wxAllThreadInfos g_allThreadInfos; -// Pointer to currenct thread's instance +// Notice that we must be using accessor functions instead of simple global +// variables here as this code could be executed during global initialization +// time, i.e. before any globals in this module were initialzied. +inline wxCriticalSection& GetAllThreadInfosCS() +{ + static wxCriticalSection s_csAllThreadInfos; + + return s_csAllThreadInfos; +} + +typedef wxVector< wxSharedPtr > wxAllThreadInfos; +inline wxAllThreadInfos& GetAllThreadInfos() +{ + static wxAllThreadInfos s_allThreadInfos; + + return s_allThreadInfos; +} + +// Pointer to the current thread's instance wxTLS_TYPE(wxThreadSpecificInfo*) g_thisThreadInfo; } // anonymous namespace @@ -43,8 +58,8 @@ wxThreadSpecificInfo& wxThreadSpecificInfo::Get() if ( !wxTLS_VALUE(g_thisThreadInfo) ) { wxTLS_VALUE(g_thisThreadInfo) = new wxThreadSpecificInfo; - wxCriticalSectionLocker lock(g_csAllThreadInfos); - g_allThreadInfos.push_back( + wxCriticalSectionLocker lock(GetAllThreadInfosCS()); + GetAllThreadInfos().push_back( wxSharedPtr(wxTLS_VALUE(g_thisThreadInfo))); } return *wxTLS_VALUE(g_thisThreadInfo); @@ -55,15 +70,15 @@ void wxThreadSpecificInfo::ThreadCleanUp() if ( !wxTLS_VALUE(g_thisThreadInfo) ) return; // nothing to do, not used by this thread at all - // find this thread's instance in g_allThreadInfos and destroy it - wxCriticalSectionLocker lock(g_csAllThreadInfos); - for ( wxAllThreadInfos::iterator i = g_allThreadInfos.begin(); - i != g_allThreadInfos.end(); + // find this thread's instance in GetAllThreadInfos() and destroy it + wxCriticalSectionLocker lock(GetAllThreadInfosCS()); + for ( wxAllThreadInfos::iterator i = GetAllThreadInfos().begin(); + i != GetAllThreadInfos().end(); ++i ) { if ( i->get() == wxTLS_VALUE(g_thisThreadInfo) ) { - g_allThreadInfos.erase(i); + GetAllThreadInfos().erase(i); wxTLS_VALUE(g_thisThreadInfo) = NULL; break; } diff --git a/Externals/wxWidgets3/src/common/toplvcmn.cpp b/Externals/wxWidgets3/src/common/toplvcmn.cpp index b5d3e5e39d..03504cc0fe 100644 --- a/Externals/wxWidgets3/src/common/toplvcmn.cpp +++ b/Externals/wxWidgets3/src/common/toplvcmn.cpp @@ -76,7 +76,7 @@ wxTopLevelWindowBase::~wxTopLevelWindowBase() ) { wxWindow * const win = wxDynamicCast(*i, wxWindow); - if ( win && win->GetParent() == this ) + if ( win && wxGetTopLevelParent(win->GetParent()) == this ) { wxPendingDelete.erase(i); diff --git a/Externals/wxWidgets3/src/common/utilscmn.cpp b/Externals/wxWidgets3/src/common/utilscmn.cpp index 6c597072a9..0d30b0249b 100644 --- a/Externals/wxWidgets3/src/common/utilscmn.cpp +++ b/Externals/wxWidgets3/src/common/utilscmn.cpp @@ -630,7 +630,14 @@ static bool ReadAll(wxInputStream *is, wxArrayString& output) // the stream could be already at EOF or in wxSTREAM_BROKEN_PIPE state is->Reset(); - wxTextInputStream tis(*is); + // Notice that wxTextInputStream doesn't work correctly with wxConvAuto + // currently, see #14720, so use the current locale conversion explicitly + // under assumption that any external program should be using it too. + wxTextInputStream tis(*is, " \t" +#if wxUSE_UNICODE + , wxConvLibc +#endif + ); for ( ;; ) { @@ -1198,6 +1205,7 @@ wxString wxStripMenuCodes(const wxString& in, int flags) if ( ++it == in.end() ) { wxLogDebug(wxT("Invalid menu string '%s'"), in.c_str()); + break; } else { @@ -1414,7 +1422,7 @@ wxVersionInfo wxGetLibraryVersionInfo() wxMINOR_VERSION, wxRELEASE_NUMBER, msg, - wxS("Copyright (c) 1995-2011 wxWidgets team")); + wxS("Copyright (c) 1995-2013 wxWidgets team")); } void wxInfoMessageBox(wxWindow* parent) diff --git a/Externals/wxWidgets3/src/common/wxcrt.cpp b/Externals/wxWidgets3/src/common/wxcrt.cpp index d46c08bce4..819700c2bf 100644 --- a/Externals/wxWidgets3/src/common/wxcrt.cpp +++ b/Externals/wxWidgets3/src/common/wxcrt.cpp @@ -89,7 +89,7 @@ WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n) #ifdef HAVE_WCSRTOMBS return mbsrtowcs(buf, &psz, n, &mbstate); #else - return wxMbstowcs(buf, psz, n); + return mbstowcs(buf, psz, n); #endif } @@ -102,7 +102,7 @@ WXDLLIMPEXP_BASE size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n) #ifdef HAVE_WCSRTOMBS return mbsrtowcs(NULL, &psz, 0, &mbstate); #else - return wxMbstowcs(NULL, psz, 0); + return mbstowcs(NULL, psz, 0); #endif } @@ -122,14 +122,14 @@ WXDLLIMPEXP_BASE size_t wxWC2MB(char *buf, const wchar_t *pwz, size_t n) #ifdef HAVE_WCSRTOMBS return wcsrtombs(buf, &pwz, n, &mbstate); #else - return wxWcstombs(buf, pwz, n); + return wcstombs(buf, pwz, n); #endif } #ifdef HAVE_WCSRTOMBS return wcsrtombs(NULL, &pwz, 0, &mbstate); #else - return wxWcstombs(NULL, pwz, 0); + return wcstombs(NULL, pwz, 0); #endif } @@ -737,54 +737,6 @@ int wxVsnprintf(wchar_t *str, size_t size, const wxString& format, va_list argpt // ctype.h stuff (currently unused) // ---------------------------------------------------------------------------- -#ifdef wxNEED_WX_MBSTOWCS - -WXDLLIMPEXP_BASE size_t wxMbstowcs (wchar_t * out, const char * in, size_t outlen) -{ - if (!out) - { - size_t outsize = 0; - while(*in++) - outsize++; - return outsize; - } - - const char* origin = in; - - while (outlen-- && *in) - { - *out++ = (wchar_t) *in++; - } - - *out = '\0'; - - return in - origin; -} - -WXDLLIMPEXP_BASE size_t wxWcstombs (char * out, const wchar_t * in, size_t outlen) -{ - if (!out) - { - size_t outsize = 0; - while(*in++) - outsize++; - return outsize; - } - - const wchar_t* origin = in; - - while (outlen-- && *in) - { - *out++ = (char) *in++; - } - - *out = '\0'; - - return in - origin; -} - -#endif // wxNEED_WX_MBSTOWCS - #ifndef wxCRT_StrdupA WXDLLIMPEXP_BASE char *wxCRT_StrdupA(const char *s) { diff --git a/Externals/wxWidgets3/src/common/xlocale.cpp b/Externals/wxWidgets3/src/common/xlocale.cpp index 37bc1290b4..26ac4df2a3 100644 --- a/Externals/wxWidgets3/src/common/xlocale.cpp +++ b/Externals/wxWidgets3/src/common/xlocale.cpp @@ -76,9 +76,10 @@ wxXLocale& wxXLocale::GetCLocale() { if ( !gs_cLocale ) { - // NOTE: bcc551 has trouble doing static_cast with incomplete - // type definition. reinterpret_cast used as workaround - gs_cLocale = new wxXLocale( reinterpret_cast(NULL) ); + // Notice that we need a separate variable because clang 3.1 refuses to + // cast nullptr (which is how NULL is defined in it) to anything. + static wxXLocaleCTag* const tag = NULL; + gs_cLocale = new wxXLocale(tag); } return *gs_cLocale; diff --git a/Externals/wxWidgets3/src/cwcopysetup.bat b/Externals/wxWidgets3/src/cwcopysetup.bat index a918a7bfee..e69de29bb2 100755 --- a/Externals/wxWidgets3/src/cwcopysetup.bat +++ b/Externals/wxWidgets3/src/cwcopysetup.bat @@ -1,32 +0,0 @@ -if exist ..\include\wx\msw\setup.h ( - echo include\wx\msw\setup.h already exists -) else ( - copy /y ..\include\wx\msw\setup0.h ..\include\wx\msw\setup.h -) - -if exist ..\lib\cw7msw ( - echo lib\cw7msw already exists -) else ( - mkdir ..\lib\cw7msw -) - -if exist ..\lib\cw7msw\include ( - echo lib\cw7msw\include already exists -) else ( - mkdir ..\lib\cw7msw\include -) - -if exist ..\lib\cw7msw\include\wx ( - echo lib\cw7msw\include\wx already exists -) else ( - mkdir ..\lib\cw7msw\include\wx -) - -if exist ..\lib\cw7msw\include\wx\setup.h ( - echo lib\cw7msw\include\wx\setup.h already exists -) else ( - copy /y ..\include\wx\msw\setup.h ..\lib\cw7msw\include\wx\setup.h -) - -rem pause - diff --git a/Externals/wxWidgets3/src/cwdcopysetup.bat b/Externals/wxWidgets3/src/cwdcopysetup.bat index b902913964..e69de29bb2 100755 --- a/Externals/wxWidgets3/src/cwdcopysetup.bat +++ b/Externals/wxWidgets3/src/cwdcopysetup.bat @@ -1,32 +0,0 @@ -if exist ..\include\wx\msw\setup.h ( - echo include\wx\msw\setup.h already exists -) else ( - copy /y ..\include\wx\msw\setup0.h ..\include\wx\msw\setup.h -) - -if exist ..\lib\cw7mswd ( - echo lib\cw7mswd already exists -) else ( - mkdir ..\lib\cw7mswd -) - -if exist ..\lib\cw7mswd\include ( - echo lib\cw7mswd\include already exists -) else ( - mkdir ..\lib\cw7mswd\include -) - -if exist ..\lib\cw7mswd\include\wx ( - echo lib\cw7mswd\include\wx already exists -) else ( - mkdir ..\lib\cw7mswd\include\wx -) - -if exist ..\lib\cw7mswd\include\wx\setup.h ( - echo lib\cw7mswd\include\wx\setup.h already exists -) else ( - copy /y ..\include\wx\msw\setup.h ..\lib\cw7mswd\include\wx\setup.h -) - -rem pause - diff --git a/Externals/wxWidgets3/src/generic/aboutdlgg.cpp b/Externals/wxWidgets3/src/generic/aboutdlgg.cpp index 2fe35a2800..9cb175334d 100644 --- a/Externals/wxWidgets3/src/generic/aboutdlgg.cpp +++ b/Externals/wxWidgets3/src/generic/aboutdlgg.cpp @@ -277,16 +277,24 @@ void wxGenericAboutDialog::AddCollapsiblePane(const wxString& title, void wxGenericAboutDialog::OnCloseWindow(wxCloseEvent& event) { - Destroy(); + // safeguards in case the window is still shown using ShowModal + if ( !IsModal() ) + Destroy(); event.Skip(); } -void wxGenericAboutDialog::OnOK(wxCommandEvent& WXUNUSED(event)) +void wxGenericAboutDialog::OnOK(wxCommandEvent& event) { - // By default a modeless dialog would be just hidden, destroy this one - // instead. - Destroy(); + // safeguards in case the window is still shown using ShowModal + if ( !IsModal() ) + { + // By default a modeless dialog would be just hidden, destroy this one + // instead. + Destroy(); + } + else + event.Skip(); } #endif // !wxUSE_MODAL_ABOUT_DIALOG diff --git a/Externals/wxWidgets3/src/generic/datavgen.cpp b/Externals/wxWidgets3/src/generic/datavgen.cpp index d5c0614e60..996640097f 100644 --- a/Externals/wxWidgets3/src/generic/datavgen.cpp +++ b/Externals/wxWidgets3/src/generic/datavgen.cpp @@ -119,6 +119,34 @@ wxDataViewColumn* GetExpanderColumnOrFirstOne(wxDataViewCtrl* dataview) return expander; } +wxTextCtrl *CreateEditorTextCtrl(wxWindow *parent, const wxRect& labelRect, const wxString& value) +{ + wxTextCtrl* ctrl = new wxTextCtrl(parent, wxID_ANY, value, + wxPoint(labelRect.x,labelRect.y), + wxSize(labelRect.width,labelRect.height), + wxTE_PROCESS_ENTER); + + // Adjust size of wxTextCtrl editor to fit text, even if it means being + // wider than the corresponding column (this is how Explorer behaves). + const int fitting = ctrl->GetSizeFromTextSize(ctrl->GetTextExtent(ctrl->GetValue())).x; + const int current = ctrl->GetSize().x; + const int maxwidth = ctrl->GetParent()->GetSize().x - ctrl->GetPosition().x; + + // Adjust size so that it fits all content. Don't change anything if the + // allocated space is already larger than needed and don't extend wxDVC's + // boundaries. + int width = wxMin(wxMax(current, fitting), maxwidth); + + if ( width != current ) + ctrl->SetSize(wxSize(width, -1)); + + // select the text in the control an place the cursor at the end + ctrl->SetInsertionPointEnd(); + ctrl->SelectAll(); + + return ctrl; +} + } // anonymous namespace //----------------------------------------------------------------------------- @@ -229,6 +257,8 @@ protected: } private: + void FinishEditing(); + bool SendEvent(wxEventType type, unsigned int n) { wxDataViewCtrl * const owner = GetOwner(); @@ -246,6 +276,8 @@ private: void OnClick(wxHeaderCtrlEvent& event) { + FinishEditing(); + const unsigned idx = event.GetColumn(); if ( SendEvent(wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, idx) ) @@ -290,6 +322,8 @@ private: void OnResize(wxHeaderCtrlEvent& event) { + FinishEditing(); + wxDataViewCtrl * const owner = GetOwner(); const unsigned col = event.GetColumn(); @@ -299,6 +333,8 @@ private: void OnEndReorder(wxHeaderCtrlEvent& event) { + FinishEditing(); + wxDataViewCtrl * const owner = GetOwner(); owner->ColumnMoved(owner->GetColumn(event.GetColumn()), event.GetNewOrder()); @@ -766,9 +802,13 @@ public: void OnColumnsCountChanged(); + // Adjust last column to window size + void UpdateColumnSizes(); + // Called by wxDataViewCtrl and our own OnRenameTimer() to start edit the // specified item in the given column. void StartEditing(const wxDataViewItem& item, const wxDataViewColumn* col); + void FinishEditing(); private: int RecalculateCount() const; @@ -958,16 +998,7 @@ bool wxDataViewTextRenderer::HasEditorCtrl() const wxWindow* wxDataViewTextRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) { - wxTextCtrl* ctrl = new wxTextCtrl( parent, wxID_ANY, value, - wxPoint(labelRect.x,labelRect.y), - wxSize(labelRect.width,labelRect.height), - wxTE_PROCESS_ENTER ); - - // select the text in the control an place the cursor at the end - ctrl->SetInsertionPointEnd(); - ctrl->SelectAll(); - - return ctrl; + return CreateEditorTextCtrl(parent, labelRect, value); } bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxWindow *editor, wxVariant &value ) @@ -1167,7 +1198,11 @@ wxDataViewProgressRenderer::Render(wxRect rect, wxDC *dc, int WXUNUSED(state)) wxSize wxDataViewProgressRenderer::GetSize() const { - return wxSize(40,12); + // Return -1 width because a progress bar fits any width; unlike most + // renderers, it doesn't have a "good" width for the content. This makes it + // grow to the whole column, which is pretty much always the desired + // behaviour. Keep the height fixed so that the progress bar isn't too fat. + return wxSize(-1, 12); } // --------------------------------------------------------- @@ -1239,16 +1274,7 @@ wxWindow* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect labelRect.width -= w; } - wxTextCtrl* ctrl = new wxTextCtrl( parent, wxID_ANY, text, - wxPoint(labelRect.x,labelRect.y), - wxSize(labelRect.width,labelRect.height), - wxTE_PROCESS_ENTER ); - - // select the text in the control an place the cursor at the end - ctrl->SetInsertionPointEnd(); - ctrl->SelectAll(); - - return ctrl; + return CreateEditorTextCtrl(parent, labelRect, text); } bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( wxWindow *editor, wxVariant& value ) @@ -2194,6 +2220,20 @@ wxDataViewMainWindow::StartEditing(const wxDataViewItem& item, } } +void wxDataViewMainWindow::FinishEditing() +{ + if ( m_editorCtrl ) + { + m_editorRenderer->FinishEditing(); + } +} + +void wxDataViewHeaderWindow::FinishEditing() +{ + wxDataViewMainWindow *win = static_cast(GetOwner()->GetMainWindow()); + win->FinishEditing(); +} + //----------------------------------------------------------------------------- // Helper class for do operation on the tree node //----------------------------------------------------------------------------- @@ -2489,18 +2529,8 @@ bool wxDataViewMainWindow::ItemChanged(const wxDataViewItem & item) bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned int model_column ) { - int view_column = -1; - unsigned int n_col = m_owner->GetColumnCount(); - for (unsigned i = 0; i < n_col; i++) - { - wxDataViewColumn *column = m_owner->GetColumn( i ); - if (column->GetModelColumn() == model_column) - { - view_column = (int) i; - break; - } - } - if (view_column == -1) + int view_column = m_owner->GetModelColumnIndex(model_column); + if ( view_column == wxNOT_FOUND ) return false; // NOTE: to be valid, we cannot use e.g. INT_MAX - 1 @@ -2564,6 +2594,7 @@ void wxDataViewMainWindow::OnInternalIdle() if (m_dirty) { + UpdateColumnSizes(); RecalculateDisplay(); m_dirty = false; } @@ -4389,9 +4420,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) // see #12270. // adjust the rectangle ourselves to account for the alignment - int align = cell->GetAlignment(); - if ( align == wxDVR_DEFAULT_ALIGNMENT ) - align = wxALIGN_CENTRE; + const int align = cell->GetEffectiveAlignment(); wxRect rectItem = cell_rect; const wxSize size = cell->GetSize(); @@ -4464,11 +4493,44 @@ void wxDataViewMainWindow::OnColumnsCountChanged() editableCount++; } - m_useCellFocus = (editableCount > 1); + m_useCellFocus = (editableCount > 0); UpdateDisplay(); } +void wxDataViewMainWindow::UpdateColumnSizes() +{ + int colsCount = GetOwner()->GetColumnCount(); + if ( !colsCount ) + return; + + wxDataViewCtrl *owner = GetOwner(); + + int fullWinWidth = GetSize().x; + + wxDataViewColumn *lastCol = owner->GetColumn(colsCount - 1); + int colswidth = GetEndOfLastCol(); + int lastColX = colswidth - lastCol->GetWidth(); + if ( lastColX < fullWinWidth ) + { + int desiredWidth = wxMax(fullWinWidth - lastColX, lastCol->GetMinWidth()); + lastCol->SetWidth(desiredWidth); + + // All columns fit on screen, so we don't need horizontal scrolling. + // To prevent flickering scrollbar when resizing the window to be + // narrower, force-set the virtual width to 0 here. It will eventually + // be corrected at idle time. + SetVirtualSize(0, m_virtualSize.y); + + RefreshRect(wxRect(lastColX, 0, fullWinWidth - lastColX, GetSize().y)); + } + else + { + // else: don't bother, the columns won't fit anyway + SetVirtualSize(colswidth, m_virtualSize.y); + } +} + //----------------------------------------------------------------------------- // wxDataViewCtrl //----------------------------------------------------------------------------- @@ -4584,6 +4646,9 @@ wxSize wxDataViewCtrl::GetSizeAvailableForScrollTarget(const wxSize& size) void wxDataViewCtrl::OnSize( wxSizeEvent &WXUNUSED(event) ) { + if ( m_clientArea && GetColumnCount() ) + m_clientArea->UpdateColumnSizes(); + // We need to override OnSize so that our scrolled // window a) does call Layout() to use sizers for // positioning the controls but b) does not query @@ -4730,6 +4795,14 @@ void wxDataViewCtrl::OnColumnsCountChanged() void wxDataViewCtrl::DoSetExpanderColumn() { + wxDataViewColumn* column = GetExpanderColumn(); + if ( column ) + { + int index = GetColumnIndex(column); + if ( index != wxNOT_FOUND ) + InvalidateColBestWidth(index); + } + m_clientArea->UpdateDisplay(); } @@ -4780,6 +4853,18 @@ int wxDataViewCtrl::GetColumnIndex(const wxDataViewColumn *column) const return wxNOT_FOUND; } +int wxDataViewCtrl::GetModelColumnIndex( unsigned int model_column ) const +{ + const int count = GetColumnCount(); + for ( int index = 0; index < count; index++ ) + { + wxDataViewColumn* column = GetColumn(index); + if ( column->GetModelColumn() == model_column ) + return index; + } + return wxNOT_FOUND; +} + unsigned int wxDataViewCtrl::GetBestColumnWidth(int idx) const { if ( m_colsBestWidths[idx].width != 0 ) @@ -4797,21 +4882,23 @@ unsigned int wxDataViewCtrl::GetBestColumnWidth(int idx) const wxDataViewMainWindow *clientArea, wxDataViewRenderer *renderer, const wxDataViewModel *model, - unsigned column, + unsigned int model_column, int expanderSize) : m_width(0), m_dvc(dvc), m_clientArea(clientArea), m_renderer(renderer), m_model(model), - m_column(column), + m_model_column(model_column), m_expanderSize(expanderSize) { + int index = dvc->GetModelColumnIndex( model_column ); + wxDataViewColumn* column = index == wxNOT_FOUND ? NULL : dvc->GetColumn(index); m_isExpanderCol = !clientArea->IsList() && (column == 0 || - GetExpanderColumnOrFirstOne(const_cast(dvc)) == dvc->GetColumnAt(column)); + GetExpanderColumnOrFirstOne(const_cast(dvc)) == column ); } void UpdateWithWidth(int width) @@ -4835,7 +4922,7 @@ unsigned int wxDataViewCtrl::GetBestColumnWidth(int idx) const item = m_clientArea->GetItemByRow(row); } - m_renderer->PrepareForItem(m_model, item, m_column); + m_renderer->PrepareForItem(m_model, item, m_model_column); m_width = wxMax(m_width, m_renderer->GetSize().x + indent); } @@ -4847,7 +4934,7 @@ unsigned int wxDataViewCtrl::GetBestColumnWidth(int idx) const wxDataViewMainWindow *m_clientArea; wxDataViewRenderer *m_renderer; const wxDataViewModel *m_model; - unsigned m_column; + unsigned m_model_column; bool m_isExpanderCol; int m_expanderSize; }; diff --git a/Externals/wxWidgets3/src/generic/editlbox.cpp b/Externals/wxWidgets3/src/generic/editlbox.cpp index 6502d4bfa8..a236e62f59 100644 --- a/Externals/wxWidgets3/src/generic/editlbox.cpp +++ b/Externals/wxWidgets3/src/generic/editlbox.cpp @@ -378,10 +378,10 @@ void wxEditableListBox::SwapItems(long i1, long i2) m_listCtrl->SetItemText(i2, t1); // swap the item data - long d1 = m_listCtrl->GetItemData(i1); - long d2 = m_listCtrl->GetItemData(i2); - m_listCtrl->SetItemData(i1, d2); - m_listCtrl->SetItemData(i2, d1); + wxUIntPtr d1 = m_listCtrl->GetItemData(i1); + wxUIntPtr d2 = m_listCtrl->GetItemData(i2); + m_listCtrl->SetItemPtrData(i1, d2); + m_listCtrl->SetItemPtrData(i2, d1); } diff --git a/Externals/wxWidgets3/src/generic/infobar.cpp b/Externals/wxWidgets3/src/generic/infobar.cpp index 49cdefc582..3ae926223a 100644 --- a/Externals/wxWidgets3/src/generic/infobar.cpp +++ b/Externals/wxWidgets3/src/generic/infobar.cpp @@ -69,9 +69,7 @@ bool wxInfoBarGeneric::Create(wxWindow *parent, wxWindowID winid) return false; // use special, easy to notice, colours - const wxColour colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK); - SetBackgroundColour(colBg); - SetOwnForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); // create the controls: icon, text and the button to dismiss the // message. @@ -80,6 +78,7 @@ bool wxInfoBarGeneric::Create(wxWindow *parent, wxWindowID winid) m_icon = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap); m_text = new wxStaticText(this, wxID_ANY, ""); + m_text->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); m_button = wxBitmapButton::NewCloseButton(this, wxID_ANY); m_button->SetToolTip(_("Hide this notification message.")); @@ -111,6 +110,17 @@ bool wxInfoBarGeneric::SetFont(const wxFont& font) return true; } +bool wxInfoBarGeneric::SetForegroundColour(const wxColor& colour) +{ + if ( !wxInfoBarBase::SetForegroundColour(colour) ) + return false; + + if ( m_text ) + m_text->SetForegroundColour(colour); + + return true; +} + wxInfoBarGeneric::BarPlacement wxInfoBarGeneric::GetBarPlacement() const { wxSizer * const sizer = GetContainingSizer(); diff --git a/Externals/wxWidgets3/src/generic/listctrl.cpp b/Externals/wxWidgets3/src/generic/listctrl.cpp index 58a5c733eb..bbe22e4eef 100644 --- a/Externals/wxWidgets3/src/generic/listctrl.cpp +++ b/Externals/wxWidgets3/src/generic/listctrl.cpp @@ -3496,6 +3496,12 @@ size_t wxListMainWindow::GetItemCount() const void wxListMainWindow::SetItemCount(long count) { + // Update the current item if it's not valid any longer (notice that this + // invalidates it completely if the control is becoming empty, which is the + // right thing to do). + if ( HasCurrent() && m_current >= (size_t)count ) + ChangeCurrent(count - 1); + m_selStore.SetItemCount(count); m_countVirt = count; @@ -5191,6 +5197,9 @@ void wxGenericListCtrl::OnInternalIdle() bool wxGenericListCtrl::SetBackgroundColour( const wxColour &colour ) { + if ( !wxWindow::SetBackgroundColour( colour ) ) + return false; + if (m_mainWin) { m_mainWin->SetBackgroundColour( colour ); @@ -5211,9 +5220,6 @@ bool wxGenericListCtrl::SetForegroundColour( const wxColour &colour ) m_mainWin->m_dirty = true; } - if (m_headerWin) - m_headerWin->SetForegroundColour( colour ); - return true; } diff --git a/Externals/wxWidgets3/src/generic/prntdlgg.cpp b/Externals/wxWidgets3/src/generic/prntdlgg.cpp index 61104b8b97..41d3dda771 100644 --- a/Externals/wxWidgets3/src/generic/prntdlgg.cpp +++ b/Externals/wxWidgets3/src/generic/prntdlgg.cpp @@ -63,11 +63,6 @@ #ifndef __WXUNIVERSAL__ -#if wxUSE_LIBGNOMEPRINT - #include "wx/link.h" - wxFORCE_LINK_MODULE(gnome_print) -#endif - #if wxUSE_GTKPRINT #include "wx/link.h" wxFORCE_LINK_MODULE(gtk_print) diff --git a/Externals/wxWidgets3/src/generic/scrlwing.cpp b/Externals/wxWidgets3/src/generic/scrlwing.cpp index 6291815209..c14ab53075 100644 --- a/Externals/wxWidgets3/src/generic/scrlwing.cpp +++ b/Externals/wxWidgets3/src/generic/scrlwing.cpp @@ -214,9 +214,6 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event) return true; } - if ( processed && event.IsCommandEvent()) - return true; - // For wxEVT_PAINT the user code can either handle this event as usual or // override virtual OnDraw(), so if the event hasn't been handled we need // to call this virtual function ourselves. @@ -235,6 +232,11 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event) return true; } + // If the user code handled this event, it should prevent the default + // handling from taking place, so don't do anything else in this case. + if ( processed ) + return true; + if ( evType == wxEVT_CHILD_FOCUS ) { m_scrollHelper->HandleOnChildFocus((wxChildFocusEvent &)event); diff --git a/Externals/wxWidgets3/src/generic/treelist.cpp b/Externals/wxWidgets3/src/generic/treelist.cpp index 4d249c2cb5..73fbe6c466 100644 --- a/Externals/wxWidgets3/src/generic/treelist.cpp +++ b/Externals/wxWidgets3/src/generic/treelist.cpp @@ -716,8 +716,6 @@ void wxTreeListModel::DeleteItem(Node* item) Node* const parent = item->GetParent(); - ItemDeleted(ToDVI(parent), ToDVI(item)); - Node* previous = parent->GetChild(); if ( previous == item ) { @@ -739,6 +737,8 @@ void wxTreeListModel::DeleteItem(Node* item) previous->DeleteNext(); } + + ItemDeleted(ToDVI(parent), ToDVI(item)); } void wxTreeListModel::DeleteAllItems() diff --git a/Externals/wxWidgets3/src/generic/vscroll.cpp b/Externals/wxWidgets3/src/generic/vscroll.cpp index efbef67e33..38e882bbb0 100644 --- a/Externals/wxWidgets3/src/generic/vscroll.cpp +++ b/Externals/wxWidgets3/src/generic/vscroll.cpp @@ -89,9 +89,6 @@ bool wxVarScrollHelperEvtHandler::ProcessEvent(wxEvent& event) return true; } - if ( processed && event.IsCommandEvent()) - return true; - // For wxEVT_PAINT the user code can either handle this event as usual or // override virtual OnDraw(), so if the event hasn't been handled we need // to call this virtual function ourselves. @@ -110,6 +107,11 @@ bool wxVarScrollHelperEvtHandler::ProcessEvent(wxEvent& event) return true; } + // If the user code handled this event, it should prevent the default + // handling from taking place, so don't do anything else in this case. + if ( processed ) + return true; + // reset the skipped flag (which might have been set to true in // ProcessEvent() above) to be able to test it below bool wasSkipped = event.GetSkipped(); @@ -142,6 +144,7 @@ bool wxVarScrollHelperEvtHandler::ProcessEvent(wxEvent& event) else if ( evType == wxEVT_MOUSEWHEEL ) { m_scrollHelper->HandleOnMouseWheel((wxMouseEvent &)event); + return true; } #endif #endif // wxUSE_MOUSEWHEEL diff --git a/Externals/wxWidgets3/src/gtk/bmpcbox.cpp b/Externals/wxWidgets3/src/gtk/bmpcbox.cpp index dc1e889a59..127b50d5e3 100644 --- a/Externals/wxWidgets3/src/gtk/bmpcbox.cpp +++ b/Externals/wxWidgets3/src/gtk/bmpcbox.cpp @@ -202,7 +202,7 @@ void wxBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap) if ( gtk_tree_model_iter_nth_child( model, &iter, NULL, n ) ) { - GValue value0 = { 0, }; + GValue value0 = G_VALUE_INIT; g_value_init( &value0, G_TYPE_OBJECT ); g_value_set_object( &value0, bitmap.GetPixbuf() ); gtk_list_store_set_value( GTK_LIST_STORE(model), &iter, @@ -222,7 +222,7 @@ wxBitmap wxBitmapComboBox::GetItemBitmap(unsigned int n) const if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; gtk_tree_model_get_value( model, &iter, m_bitmapCellIndex, &value ); GdkPixbuf* pixbuf = (GdkPixbuf*) g_value_get_object( &value ); @@ -300,7 +300,7 @@ void wxBitmapComboBox::GTKInsertComboBoxTextItem( unsigned int n, const wxString gtk_list_store_insert( store, &iter, n ); - GValue value = { 0, }; + GValue value = G_VALUE_INIT; g_value_init( &value, G_TYPE_STRING ); g_value_set_string( &value, wxGTK_CONV( text ) ); gtk_list_store_set_value( store, &iter, m_stringCellIndex, &value ); diff --git a/Externals/wxWidgets3/src/gtk/checklst.cpp b/Externals/wxWidgets3/src/gtk/checklst.cpp index 0a9d31840a..9c5e7065d1 100644 --- a/Externals/wxWidgets3/src/gtk/checklst.cpp +++ b/Externals/wxWidgets3/src/gtk/checklst.cpp @@ -15,6 +15,7 @@ #include "wx/checklst.h" #include +#include "wx/gtk/private.h" //----------------------------------------------------------------------------- // "toggled" @@ -111,7 +112,7 @@ bool wxCheckListBox::IsChecked(unsigned int index) const if(!res) return false; - GValue value = {0, }; + GValue value = G_VALUE_INIT; gtk_tree_model_get_value(GTK_TREE_MODEL(m_liststore), &iter, 0, //column diff --git a/Externals/wxWidgets3/src/gtk/choice.cpp b/Externals/wxWidgets3/src/gtk/choice.cpp index d8819a2abc..c30e031087 100644 --- a/Externals/wxWidgets3/src/gtk/choice.cpp +++ b/Externals/wxWidgets3/src/gtk/choice.cpp @@ -208,7 +208,7 @@ int wxChoice::FindString( const wxString &item, bool bCase ) const int count = 0; do { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; gtk_tree_model_get_value( model, &iter, m_stringCellIndex, &value ); wxString str = wxGTK_CONV_BACK( g_value_get_string( &value ) ); g_value_unset( &value ); @@ -239,7 +239,7 @@ void wxChoice::SetString(unsigned int n, const wxString &text) GtkTreeIter iter; if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; g_value_init( &value, G_TYPE_STRING ); g_value_set_string( &value, wxGTK_CONV( text ) ); gtk_list_store_set_value( GTK_LIST_STORE(model), &iter, m_stringCellIndex, &value ); @@ -260,7 +260,7 @@ wxString wxChoice::GetString(unsigned int n) const GtkTreeIter iter; if (gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) { - GValue value = { 0, }; + GValue value = G_VALUE_INIT; gtk_tree_model_get_value( model, &iter, m_stringCellIndex, &value ); wxString tmp = wxGTK_CONV_BACK( g_value_get_string( &value ) ); g_value_unset( &value ); @@ -305,10 +305,7 @@ void wxChoice::SetColumns(int n) int wxChoice::GetColumns() const { - // gtk_combo_box_get_wrap_width() was added in gtk 2.6 - gint intval; - g_object_get(G_OBJECT(m_widget), "wrap-width", &intval, NULL); - return intval; + return gtk_combo_box_get_wrap_width(GTK_COMBO_BOX(m_widget)); } void wxChoice::GTKDisableEvents() diff --git a/Externals/wxWidgets3/src/gtk/control.cpp b/Externals/wxWidgets3/src/gtk/control.cpp index b63b370645..c2633772fe 100644 --- a/Externals/wxWidgets3/src/gtk/control.cpp +++ b/Externals/wxWidgets3/src/gtk/control.cpp @@ -254,9 +254,9 @@ wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* widget, gtk_style_context_get_background_color(sc, stateFlag, &c); attr.colBg = wxColour(c); wxNativeFontInfo info; - info.description = const_cast(gtk_style_context_get_font(sc, stateFlag)); + gtk_style_context_get( + sc, stateFlag, GTK_STYLE_PROPERTY_FONT, &info.description, NULL); attr.font = wxFont(info); - info.description = NULL; #else GtkStyle* style; diff --git a/Externals/wxWidgets3/src/gtk/dataview.cpp b/Externals/wxWidgets3/src/gtk/dataview.cpp index c58858a7ff..7a181fd4c5 100644 --- a/Externals/wxWidgets3/src/gtk/dataview.cpp +++ b/Externals/wxWidgets3/src/gtk/dataview.cpp @@ -608,6 +608,7 @@ gtk_wx_tree_model_get_type (void) sizeof (GtkWxTreeModel), 0, wxgtk_tree_model_init, + NULL }; static const GInterfaceInfo tree_model_iface_info = @@ -1114,6 +1115,7 @@ gtk_wx_cell_renderer_text_get_type (void) sizeof (GtkWxCellRendererText), 0, /* n_preallocs */ gtk_wx_cell_renderer_text_init, + NULL }; cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER_TEXT, @@ -1264,6 +1266,7 @@ gtk_wx_cell_renderer_get_type (void) sizeof (GtkWxCellRenderer), 0, /* n_preallocs */ gtk_wx_cell_renderer_init, + NULL }; cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER, @@ -1875,7 +1878,7 @@ void wxDataViewRenderer::SetMode( wxDataViewCellMode mode ) m_mode = mode; // This value is most often ignored in GtkTreeView - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() ); g_value_set_enum( &gvalue, gtkMode ); g_object_set_property( G_OBJECT(m_renderer), "mode", &gvalue ); @@ -1936,7 +1939,7 @@ void wxDataViewRenderer::GtkApplyAlignment(GtkCellRenderer *renderer) else if (align & wxALIGN_CENTER_HORIZONTAL) xalign = 0.5; - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_FLOAT ); g_value_set_float( &gvalue, xalign ); g_object_set_property( G_OBJECT(renderer), "xalign", &gvalue ); @@ -1950,7 +1953,7 @@ void wxDataViewRenderer::GtkApplyAlignment(GtkCellRenderer *renderer) else if (align & wxALIGN_CENTER_VERTICAL) yalign = 0.5; - GValue gvalue2 = { 0, }; + GValue gvalue2 = G_VALUE_INIT; g_value_init( &gvalue2, G_TYPE_FLOAT ); g_value_set_float( &gvalue2, yalign ); g_object_set_property( G_OBJECT(renderer), "yalign", &gvalue2 ); @@ -1976,7 +1979,7 @@ void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode) // we use the same values in wxEllipsizeMode as PangoEllipsizeMode so we // can just cast between them - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, PANGO_TYPE_ELLIPSIZE_MODE ); g_value_set_enum( &gvalue, static_cast(mode) ); g_object_set_property( G_OBJECT(rend), "ellipsize", &gvalue ); @@ -1989,7 +1992,7 @@ wxEllipsizeMode wxDataViewRenderer::GetEllipsizeMode() const if ( !rend ) return wxELLIPSIZE_NONE; - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, PANGO_TYPE_ELLIPSIZE_MODE ); g_object_get_property( G_OBJECT(rend), "ellipsize", &gvalue ); wxEllipsizeMode @@ -2052,7 +2055,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) { const GdkColor * const gcol = attr.GetColour().GetColor(); - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, GDK_TYPE_COLOR ); g_value_set_boxed( &gvalue, gcol ); g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue ); @@ -2062,7 +2065,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) } else { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, FALSE ); g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue ); @@ -2071,7 +2074,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) if (attr.GetItalic()) { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, PANGO_TYPE_STYLE ); g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC ); g_object_set_property( G_OBJECT(renderer), "style", &gvalue ); @@ -2081,7 +2084,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) } else { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, FALSE ); g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue ); @@ -2091,7 +2094,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) if (attr.GetBold()) { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, PANGO_TYPE_WEIGHT ); g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD ); g_object_set_property( G_OBJECT(renderer), "weight", &gvalue ); @@ -2101,7 +2104,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) } else { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, FALSE ); g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue ); @@ -2114,7 +2117,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) wxColour colour = attr.GetBackgroundColour(); const GdkColor * const gcol = colour.GetColor(); - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, GDK_TYPE_COLOR ); g_value_set_boxed( &gvalue, gcol ); g_object_set_property( G_OBJECT(renderer), "cell-background_gdk", &gvalue ); @@ -2122,7 +2125,7 @@ bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr) } else { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, FALSE ); g_object_set_property( G_OBJECT(renderer), "cell-background-set", &gvalue ); @@ -2147,7 +2150,7 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD if (mode & wxDATAVIEW_CELL_EDITABLE) { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, true ); g_object_set_property( G_OBJECT(m_renderer), "editable", &gvalue ); @@ -2164,7 +2167,7 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD bool wxDataViewTextRenderer::SetTextValue(const wxString& str) { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_STRING ); g_value_set_string( &gvalue, wxGTK_CONV_FONT( str, GetOwner()->GetOwner()->GetFont() ) ); g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue ); @@ -2175,7 +2178,7 @@ bool wxDataViewTextRenderer::SetTextValue(const wxString& str) bool wxDataViewTextRenderer::GetTextValue(wxString& str) const { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_STRING ); g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); str = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), const_cast(this)->GetOwner()->GetOwner()->GetFont() ); @@ -2200,7 +2203,7 @@ void wxDataViewTextRenderer::SetAlignment( int align ) else if (align & wxALIGN_CENTER_HORIZONTAL) pangoAlign = PANGO_ALIGN_CENTER; - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() ); g_value_set_enum( &gvalue, pangoAlign ); g_object_set_property( G_OBJECT(m_renderer), "alignment", &gvalue ); @@ -2227,7 +2230,7 @@ namespace // set "pixbuf" property on the given renderer void SetPixbufProp(GtkCellRenderer *renderer, GdkPixbuf *pixbuf) { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_OBJECT ); g_value_set_object( &gvalue, pixbuf ); g_object_set_property( G_OBJECT(renderer), "pixbuf", &gvalue ); @@ -2294,7 +2297,7 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer, wxDataViewToggleRenderer *cell = (wxDataViewToggleRenderer*) user_data; // get old value - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_object_get_property( G_OBJECT(renderer), "active", &gvalue ); // invert it @@ -2329,7 +2332,7 @@ wxDataViewToggleRenderer::wxDataViewToggleRenderer( const wxString &varianttype, } else { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, false ); g_object_set_property( G_OBJECT(m_renderer), "activatable", &gvalue ); @@ -2344,7 +2347,7 @@ bool wxDataViewToggleRenderer::SetValue( const wxVariant &value ) { bool tmp = value; - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, tmp ); g_object_set_property( G_OBJECT(m_renderer), "active", &gvalue ); @@ -2355,7 +2358,7 @@ bool wxDataViewToggleRenderer::SetValue( const wxVariant &value ) bool wxDataViewToggleRenderer::GetValue( wxVariant &value ) const { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_object_get_property( G_OBJECT(m_renderer), "active", &gvalue ); value = g_value_get_boolean( &gvalue ) != 0; @@ -2451,7 +2454,7 @@ void wxDataViewCustomRenderer::RenderText( const wxString &text, GtkCellRendererText * const textRenderer = GtkGetTextRenderer(); - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_STRING ); g_value_set_string( &gvalue, wxGTK_CONV_FONT( text, GetOwner()->GetOwner()->GetFont() ) ); g_object_set_property( G_OBJECT(textRenderer), "text", &gvalue ); @@ -2562,7 +2565,7 @@ wxDataViewProgressRenderer::~wxDataViewProgressRenderer() void wxDataViewProgressRenderer::GTKSetLabel() { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_STRING ); // Take care to not use GetOwner() here if the label is empty, we can be @@ -2590,7 +2593,7 @@ bool wxDataViewProgressRenderer::SetValue( const wxVariant &value ) #endif // !wxUSE_UNICODE gint tmp = (long) value; - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_INT ); g_value_set_int( &gvalue, tmp ); g_object_set_property( G_OBJECT(m_renderer), "value", &gvalue ); @@ -2672,7 +2675,7 @@ wxSize wxDataViewChoiceRenderer::GetSize() const bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value ) { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_STRING ); g_value_set_string(&gvalue, wxGTK_CONV_FONT(value.GetString(), @@ -2685,7 +2688,7 @@ bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value ) bool wxDataViewChoiceRenderer::GetValue( wxVariant &value ) const { - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_STRING ); g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); wxString temp = wxGTK_CONV_BACK_FONT(g_value_get_string(&gvalue), @@ -2712,7 +2715,7 @@ void wxDataViewChoiceRenderer::SetAlignment( int align ) else if (align & wxALIGN_CENTER_HORIZONTAL) pangoAlign = PANGO_ALIGN_CENTER; - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() ); g_value_set_enum( &gvalue, pangoAlign ); g_object_set_property( G_OBJECT(m_renderer), "alignment", &gvalue ); @@ -2894,7 +2897,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), visible = true; } - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, visible ); g_object_set_property( G_OBJECT(renderer), "visible", &gvalue ); @@ -2920,7 +2923,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), bool enabled = wx_model->IsEnabled( item, cell->GetOwner()->GetModelColumn() ); // a) this sets the appearance to disabled grey - GValue gvalue = { 0, }; + GValue gvalue = G_VALUE_INIT; g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_set_boolean( &gvalue, enabled ); g_object_set_property( G_OBJECT(renderer), "sensitive", &gvalue ); @@ -4260,6 +4263,7 @@ wxdataview_selection_changed_callback( GtkTreeSelection* WXUNUSED(selection), wx return; wxDataViewEvent event( wxEVT_DATAVIEW_SELECTION_CHANGED, dv->GetId() ); + event.SetEventObject( dv ); event.SetItem( dv->GetSelection() ); event.SetModel( dv->GetModel() ); dv->HandleWindowEvent( event ); @@ -4437,6 +4441,16 @@ gtk_dataview_button_press_callback( GtkWidget *WXUNUSED(widget), &cell_y ); + // If the right click is on an item that isn't selected, select it, as is + // commonly done. Do not do it if the item under mouse is already selected, + // because it could be a part of multi-item selection. + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dv->GtkGetTreeView())); + if ( !gtk_tree_selection_path_is_selected(selection, path) ) + { + gtk_tree_selection_unselect_all(selection); + gtk_tree_selection_select_path(selection, path); + } + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, dv->GetId() ); if (path) event.SetItem(dv->GTKPathToItem(path)); @@ -4594,6 +4608,9 @@ void wxDataViewCtrl::OnInternalIdle() { wxWindow::OnInternalIdle(); + if ( !m_internal ) + return; + m_internal->OnInternalIdle(); unsigned int cols = GetColumnCount(); @@ -4625,18 +4642,21 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model ) bool fixed = (((GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) == 0) || (model->IsVirtualListModel())); gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed ); - m_internal = new wxDataViewCtrlInternal( this, model ); + if ( model ) + m_internal = new wxDataViewCtrlInternal( this, model ); return true; } bool wxDataViewCtrl::EnableDragSource( const wxDataFormat &format ) { + wxCHECK_MSG( m_internal, false, "model must be associated before calling EnableDragSource" ); return m_internal->EnableDragSource( format ); } bool wxDataViewCtrl::EnableDropTarget( const wxDataFormat &format ) { + wxCHECK_MSG( m_internal, false, "model must be associated before calling EnableDragTarget" ); return m_internal->EnableDropTarget( format ); } @@ -4765,6 +4785,7 @@ int wxDataViewCtrl::GetColumnPosition( const wxDataViewColumn *column ) const wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const { + wxCHECK_MSG( m_internal, NULL, "model must be associated before calling GetSortingColumn" ); return m_internal->GetDataViewSortColumn(); } @@ -4778,6 +4799,8 @@ void wxDataViewCtrl::Expand( const wxDataViewItem & item ) void wxDataViewCtrl::Collapse( const wxDataViewItem & item ) { + wxCHECK_RET( m_internal, "model must be associated before calling Collapse" ); + GtkTreeIter iter; iter.user_data = item.GetID(); wxGtkTreePath path(m_internal->get_path( &iter )); @@ -4786,6 +4809,8 @@ void wxDataViewCtrl::Collapse( const wxDataViewItem & item ) bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const { + wxCHECK_MSG( m_internal, false, "model must be associated before calling IsExpanded" ); + GtkTreeIter iter; iter.user_data = item.GetID(); wxGtkTreePath path(m_internal->get_path( &iter )); @@ -4797,7 +4822,7 @@ wxDataViewItem wxDataViewCtrl::DoGetCurrentItem() const // The tree doesn't have any current item if it hadn't been created yet but // it's arguably not an error to call this function in this case so just // return an invalid item without asserting. - if ( !m_treeview ) + if ( !m_treeview || !m_internal ) return wxDataViewItem(); wxGtkTreePath path; @@ -4810,6 +4835,7 @@ void wxDataViewCtrl::DoSetCurrentItem(const wxDataViewItem& item) { wxCHECK_RET( m_treeview, "Current item can't be set before creating the control." ); + wxCHECK_RET( m_internal, "model must be associated before setting current item" ); // We need to make sure the model knows about this item or the path would // be invalid and gtk_tree_view_set_cursor() would silently do nothing. @@ -4845,7 +4871,8 @@ wxDataViewColumn *wxDataViewCtrl::GetCurrentColumn() const void wxDataViewCtrl::EditItem(const wxDataViewItem& item, const wxDataViewColumn *column) { wxCHECK_RET( m_treeview, - "Current item can't be set before creating the control." ); + "item can't be edited before creating the control." ); + wxCHECK_RET( m_internal, "model must be associated before editing an item" ); wxCHECK_RET( item.IsOk(), "invalid item" ); wxCHECK_RET( column, "no column provided" ); @@ -4878,6 +4905,8 @@ int wxDataViewCtrl::GetSelectedItemsCount() const int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const { + wxCHECK_MSG( m_internal, 0, "model must be associated before calling GetSelections" ); + sel.Clear(); GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -4907,6 +4936,8 @@ int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel ) { + wxCHECK_RET( m_internal, "model must be associated before calling SetSelections" ); + GtkDisableSelectionEvents(); GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -4938,6 +4969,8 @@ void wxDataViewCtrl::SetSelections( const wxDataViewItemArray & sel ) void wxDataViewCtrl::Select( const wxDataViewItem & item ) { + wxCHECK_RET( m_internal, "model must be associated before calling Select" ); + ExpandAncestors(item); GtkDisableSelectionEvents(); @@ -4954,6 +4987,8 @@ void wxDataViewCtrl::Select( const wxDataViewItem & item ) void wxDataViewCtrl::Unselect( const wxDataViewItem & item ) { + wxCHECK_RET( m_internal, "model must be associated before calling Unselect" ); + GtkDisableSelectionEvents(); GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); @@ -4968,6 +5003,8 @@ void wxDataViewCtrl::Unselect( const wxDataViewItem & item ) bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const { + wxCHECK_MSG( m_internal, false, "model must be associated before calling IsSelected" ); + GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) ); GtkTreeIter iter; @@ -5002,6 +5039,8 @@ void wxDataViewCtrl::UnselectAll() void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item, const wxDataViewColumn *WXUNUSED(column)) { + wxCHECK_RET( m_internal, "model must be associated before calling EnsureVisible" ); + m_ensureVisibleDefered = item; ExpandAncestors(item); @@ -5015,6 +5054,8 @@ void wxDataViewCtrl::HitTest(const wxPoint& point, wxDataViewItem& item, wxDataViewColumn *& column) const { + wxCHECK_RET( m_internal, "model must be associated before calling HitTest" ); + // gtk_tree_view_get_dest_row_at_pos() is the right one. But it does not tell the column. // gtk_tree_view_get_path_at_pos() is the wrong function. It doesn't mind the header but returns column. // See http://mail.gnome.org/archives/gtkmm-list/2005-January/msg00080.html diff --git a/Externals/wxWidgets3/src/gtk/font.cpp b/Externals/wxWidgets3/src/gtk/font.cpp index 734b7221c0..9cd46bac4b 100644 --- a/Externals/wxWidgets3/src/gtk/font.cpp +++ b/Externals/wxWidgets3/src/gtk/font.cpp @@ -487,6 +487,7 @@ bool wxFont::GTKSetPangoAttrs(PangoLayout* layout) const PangoAttrList* attrs = pango_attr_list_new(); PangoAttribute* a; +#ifndef __WXGTK3__ if (wx_pango_version_check(1,16,0)) { // a PangoLayout which has leading/trailing spaces with underlined font @@ -525,6 +526,8 @@ bool wxFont::GTKSetPangoAttrs(PangoLayout* layout) const pango_attr_list_insert(attrs, a); } } +#endif // !__WXGTK3__ + if (GetUnderlined()) { a = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE); diff --git a/Externals/wxWidgets3/src/gtk/gnome/gprint.cpp b/Externals/wxWidgets3/src/gtk/gnome/gprint.cpp index c7b28d668f..e69de29bb2 100644 --- a/Externals/wxWidgets3/src/gtk/gnome/gprint.cpp +++ b/Externals/wxWidgets3/src/gtk/gnome/gprint.cpp @@ -1,2121 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: src/gtk/gnome/gprint.cpp -// Author: Robert Roebling -// Purpose: Implement GNOME printing support -// Created: 09/20/04 -// Copyright: Robert Roebling -// Licence: wxWindows Licence -///////////////////////////////////////////////////////////////////////////// - -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#if wxUSE_LIBGNOMEPRINT - -#include "wx/gtk/gnome/gprint.h" - -#ifndef WX_PRECOMP - #include "wx/log.h" - #include "wx/dcmemory.h" - #include "wx/icon.h" - #include "wx/math.h" - #include "wx/image.h" - #include "wx/module.h" - #include "wx/crt.h" -#endif - -#include "wx/fontutil.h" -#include "wx/gtk/private.h" -#include "wx/dynlib.h" -#include "wx/paper.h" -#include "wx/dcprint.h" -#include "wx/modalhook.h" - -#include -#include -#include -#include -#include -#include - -#include "wx/link.h" -wxFORCE_LINK_THIS_MODULE(gnome_print) - -//---------------------------------------------------------------------------- -// wxGnomePrintLibrary -//---------------------------------------------------------------------------- - -class wxGnomePrintLibrary -{ -public: - wxGnomePrintLibrary(); - ~wxGnomePrintLibrary(); - - bool IsOk(); -private: - bool InitializeMethods(); - - wxDynamicLibrary m_libGnomePrint; - wxDynamicLibrary m_libGnomePrintUI; - - // only true if we successfully loaded both libraries - // - // don't rename this field, it's used by wxDL_XXX macros internally - bool m_ok; - -public: - wxDL_METHOD_DEFINE( gint, gnome_print_newpath, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_moveto, - (GnomePrintContext *pc, gdouble x, gdouble y), (pc, x, y), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_lineto, - (GnomePrintContext *pc, gdouble x, gdouble y), (pc, x, y), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_arcto, - (GnomePrintContext *pc, gdouble x, gdouble y, gdouble radius, gdouble angle1, gdouble angle2, gint direction ), (pc, x, y, radius, angle1, angle2, direction), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_curveto, - (GnomePrintContext *pc, gdouble x1, gdouble y1, gdouble x2, gdouble y2, gdouble x3, gdouble y3), (pc, x1, y1, x2, y2, x3, y3), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_closepath, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_stroke, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_fill, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_setrgbcolor, - (GnomePrintContext *pc, gdouble r, gdouble g, gdouble b), (pc, r, g, b), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_setlinewidth, - (GnomePrintContext *pc, gdouble width), (pc, width), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_setdash, - (GnomePrintContext *pc, gint n_values, const gdouble *values, gdouble offset), (pc, n_values, values, offset), 0 ) - - wxDL_METHOD_DEFINE( gint, gnome_print_rgbimage, - (GnomePrintContext *pc, const guchar *data, gint width, gint height, gint rowstride), (pc, data, width, height, rowstride ), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_rgbaimage, - (GnomePrintContext *pc, const guchar *data, gint width, gint height, gint rowstride), (pc, data, width, height, rowstride ), 0 ) - - wxDL_METHOD_DEFINE( gint, gnome_print_concat, - (GnomePrintContext *pc, const gdouble *matrix), (pc, matrix), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_scale, - (GnomePrintContext *pc, gdouble sx, gdouble sy), (pc, sx, sy), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_rotate, - (GnomePrintContext *pc, gdouble theta), (pc, theta), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_translate, - (GnomePrintContext *pc, gdouble x, gdouble y), (pc, x, y), 0 ) - - wxDL_METHOD_DEFINE( gint, gnome_print_gsave, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_grestore, - (GnomePrintContext *pc), (pc), 0 ) - - wxDL_METHOD_DEFINE( gint, gnome_print_clip, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_eoclip, - (GnomePrintContext *pc), (pc), 0 ) - - wxDL_METHOD_DEFINE( gint, gnome_print_beginpage, - (GnomePrintContext *pc, const guchar* name), (pc, name), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_showpage, - (GnomePrintContext *pc), (pc), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_end_doc, - (GnomePrintContext *pc), (pc), 0 ) - - wxDL_METHOD_DEFINE( PangoLayout*, gnome_print_pango_create_layout, - (GnomePrintContext *gpc), (gpc), NULL ) - wxDL_VOIDMETHOD_DEFINE( gnome_print_pango_layout, - (GnomePrintContext *gpc, PangoLayout *layout), (gpc, layout) ) - - wxDL_METHOD_DEFINE( GnomePrintJob*, gnome_print_job_new, - (GnomePrintConfig *config), (config), NULL ) - wxDL_METHOD_DEFINE( GnomePrintContext*, gnome_print_job_get_context, - (GnomePrintJob *job), (job), NULL ) - wxDL_METHOD_DEFINE( gint, gnome_print_job_close, - (GnomePrintJob *job), (job), 0 ) - wxDL_METHOD_DEFINE( gint, gnome_print_job_print, - (GnomePrintJob *job), (job), 0 ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_job_get_page_size, - (GnomePrintJob *job, gdouble *width, gdouble *height), (job, width, height), 0 ) - - wxDL_METHOD_DEFINE( GnomePrintUnit*, gnome_print_unit_get_by_abbreviation, - (const guchar *abbreviation), (abbreviation), NULL ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_convert_distance, - (gdouble *distance, const GnomePrintUnit *from, const GnomePrintUnit *to), (distance, from, to), false ) - - wxDL_METHOD_DEFINE( GnomePrintConfig*, gnome_print_config_default, - (void), (), NULL ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_set, - (GnomePrintConfig *config, const guchar *key, const guchar *value), (config, key, value), false ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_set_double, - (GnomePrintConfig *config, const guchar *key, gdouble value), (config, key, value), false ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_set_int, - (GnomePrintConfig *config, const guchar *key, gint value), (config, key, value), false ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_set_boolean, - (GnomePrintConfig *config, const guchar *key, gboolean value), (config, key, value), false ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_set_length, - (GnomePrintConfig *config, const guchar *key, gdouble value, const GnomePrintUnit *unit), (config, key, value, unit), false ) - - wxDL_METHOD_DEFINE( guchar*, gnome_print_config_get, - (GnomePrintConfig *config, const guchar *key), (config, key), NULL ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_get_length, - (GnomePrintConfig *config, const guchar *key, gdouble *val, const GnomePrintUnit **unit), (config, key, val, unit), false ) - wxDL_METHOD_DEFINE( gboolean, gnome_print_config_get_boolean, - (GnomePrintConfig *config, const guchar *key, gboolean *val), (config, key, val), false ) - - wxDL_METHOD_DEFINE( GtkWidget*, gnome_print_dialog_new, - (GnomePrintJob *gpj, const guchar *title, gint flags), (gpj, title, flags), NULL ) - wxDL_VOIDMETHOD_DEFINE( gnome_print_dialog_construct_range_page, - (GnomePrintDialog *gpd, gint flags, gint start, gint end, - const guchar *currentlabel, const guchar *rangelabel), - (gpd, flags, start, end, currentlabel, rangelabel) ) - wxDL_VOIDMETHOD_DEFINE( gnome_print_dialog_get_copies, - (GnomePrintDialog *gpd, gint *copies, gboolean *collate), (gpd, copies, collate) ) - wxDL_VOIDMETHOD_DEFINE( gnome_print_dialog_set_copies, - (GnomePrintDialog *gpd, gint copies, gint collate), (gpd, copies, collate) ) - wxDL_METHOD_DEFINE( GnomePrintRangeType, gnome_print_dialog_get_range, - (GnomePrintDialog *gpd), (gpd), GNOME_PRINT_RANGETYPE_NONE ) - wxDL_METHOD_DEFINE( int, gnome_print_dialog_get_range_page, - (GnomePrintDialog *gpd, gint *start, gint *end), (gpd, start, end), 0 ) - - wxDL_METHOD_DEFINE( GtkWidget*, gnome_paper_selector_new_with_flags, - (GnomePrintConfig *config, gint flags), (config, flags), NULL ) - - wxDL_METHOD_DEFINE( GtkWidget*, gnome_print_job_preview_new, - (GnomePrintJob *gpm, const guchar *title), (gpm, title), NULL ) - - wxDECLARE_NO_COPY_CLASS(wxGnomePrintLibrary); -}; - -wxGnomePrintLibrary::wxGnomePrintLibrary() -{ - wxLogNull log; - - m_libGnomePrint.Load("libgnomeprint-2-2.so.0"); - m_ok = m_libGnomePrint.IsLoaded(); - if ( !m_ok ) - return; - - m_libGnomePrintUI.Load("libgnomeprintui-2-2.so.0"); - m_ok = m_libGnomePrintUI.IsLoaded(); - if ( !m_ok ) - { - m_libGnomePrint.Unload(); - return; - } - - m_ok = InitializeMethods(); -} - -wxGnomePrintLibrary::~wxGnomePrintLibrary() -{ -} - -bool wxGnomePrintLibrary::IsOk() -{ - return m_ok; -} - -bool wxGnomePrintLibrary::InitializeMethods() -{ - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_newpath ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_moveto ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_lineto ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_curveto ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_arcto ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_closepath ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_stroke ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_fill ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_setrgbcolor ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_setlinewidth ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_setdash ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_rgbimage ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_rgbaimage ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_concat ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_scale ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_rotate ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_translate ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_gsave ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_grestore ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_clip ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_eoclip ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_beginpage ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_showpage ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_end_doc ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_pango_create_layout ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_pango_layout ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_job_new ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_job_get_context ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_job_close ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_job_print ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_job_get_page_size ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_unit_get_by_abbreviation ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_convert_distance ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_default ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_set ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_set_boolean ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_set_double ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_set_int ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_set_length ); - - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_get ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_get_length ); - wxDL_METHOD_LOAD( m_libGnomePrint, gnome_print_config_get_boolean ); - - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_dialog_new ); - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_dialog_construct_range_page ); - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_dialog_get_copies ); - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_dialog_set_copies ); - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_dialog_get_range ); - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_dialog_get_range_page ); - - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_paper_selector_new_with_flags ); - - wxDL_METHOD_LOAD( m_libGnomePrintUI, gnome_print_job_preview_new ); - - return true; -} - -static wxGnomePrintLibrary* gs_libGnomePrint = NULL; - -//---------------------------------------------------------------------------- -// wxGnomePrintNativeData -//---------------------------------------------------------------------------- - -IMPLEMENT_CLASS(wxGnomePrintNativeData, wxPrintNativeDataBase) - -wxGnomePrintNativeData::wxGnomePrintNativeData() -{ - m_config = gs_libGnomePrint->gnome_print_config_default(); - m_job = gs_libGnomePrint->gnome_print_job_new( m_config ); -} - -wxGnomePrintNativeData::~wxGnomePrintNativeData() -{ - g_object_unref (m_config); -} - -bool wxGnomePrintNativeData::TransferTo( wxPrintData &data ) -{ - guchar *res = gs_libGnomePrint->gnome_print_config_get( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAGE_ORIENTATION ); - if (g_ascii_strcasecmp((const gchar *)res,"R90") == 0) - data.SetOrientation( wxLANDSCAPE ); - else - data.SetOrientation( wxPORTRAIT ); - g_free( res ); - - res = gs_libGnomePrint->gnome_print_config_get( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_OUTPUT_FILENAME ); - if (res) - { - data.SetFilename( wxConvFile.cMB2WX( (const char*) res ) ); - wxPrintf( "filename %s\n", data.GetFilename() ); - g_free( res ); - } - else - { - data.SetFilename( wxEmptyString ); - } - - gboolean ret; - if (gs_libGnomePrint->gnome_print_config_get_boolean( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_COLLATE, &ret)) - { - data.SetCollate( ret ); - } - - // gnome_print_v - - return true; -} - -bool wxGnomePrintNativeData::TransferFrom( const wxPrintData &data ) -{ - if (data.GetOrientation() == wxLANDSCAPE) - { - gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAGE_ORIENTATION, - (guchar*)(char*)"R90" ); - } - else - { - gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAGE_ORIENTATION, - (guchar*)(char*)"R0" ); - } - - if (data.GetCollate()) - { - gs_libGnomePrint->gnome_print_config_set_boolean( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_COLLATE, - TRUE ); - } - else - { - gs_libGnomePrint->gnome_print_config_set_boolean( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_COLLATE, - FALSE ); - } - - switch (data.GetPaperId()) - { - case wxPAPER_A3: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"A3" ); - break; - case wxPAPER_A5: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"A5" ); - break; - case wxPAPER_B4: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"B4" ); - break; - case wxPAPER_B5: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"B5" ); - break; - case wxPAPER_LETTER: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"USLetter" ); - break; - case wxPAPER_LEGAL: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"USLegal" ); - break; - case wxPAPER_EXECUTIVE: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"Executive" ); - break; - case wxPAPER_ENV_C5: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"C5" ); - break; - case wxPAPER_ENV_C6: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"C6" ); - break; - case wxPAPER_NONE: break; - - default: - case wxPAPER_A4: gs_libGnomePrint->gnome_print_config_set( m_config, - (guchar*)(char*)GNOME_PRINT_KEY_PAPER_SIZE, - (guchar*)(char*)"A4" ); - break; - } - - return true; -} - -//---------------------------------------------------------------------------- -// wxGnomePrintFactory -//---------------------------------------------------------------------------- - -wxPrinterBase* wxGnomePrintFactory::CreatePrinter( wxPrintDialogData *data ) -{ - return new wxGnomePrinter( data ); -} - -wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview, - wxPrintout *printout, - wxPrintDialogData *data ) -{ - return new wxGnomePrintPreview( preview, printout, data ); -} - -wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview, - wxPrintout *printout, - wxPrintData *data ) -{ - return new wxGnomePrintPreview( preview, printout, data ); -} - -wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent, - wxPrintDialogData *data ) -{ - return new wxGnomePrintDialog( parent, data ); -} - -wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent, - wxPrintData *data ) -{ - return new wxGnomePrintDialog( parent, data ); -} - -wxPageSetupDialogBase *wxGnomePrintFactory::CreatePageSetupDialog( wxWindow *parent, - wxPageSetupDialogData * data ) -{ -// The native page setup dialog is broken. It -// miscalculates newly entered values for the -// margins if you have not chose "points" but -// e.g. centimerters. -// This has been fixed in GNOME CVS (maybe -// fixed in libgnomeprintui 2.8.1) - - return new wxGnomePageSetupDialog( parent, data ); -} - -bool wxGnomePrintFactory::HasPrintSetupDialog() -{ - return false; -} - -wxDialog * -wxGnomePrintFactory::CreatePrintSetupDialog(wxWindow * WXUNUSED(parent), - wxPrintData * WXUNUSED(data)) -{ - return NULL; -} - - -#if wxUSE_NEW_DC - -wxDCImpl* wxGnomePrintFactory::CreatePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ) -{ - return new wxGnomePrinterDCImpl( owner, data ); -} - -#else - -wxDC* wxGnomePrintFactory::CreatePrinterDC( const wxPrintData& data ) -{ - return new wxGnomePrinterDC(data); -} - -#endif - -bool wxGnomePrintFactory::HasOwnPrintToFile() -{ - return true; -} - -bool wxGnomePrintFactory::HasPrinterLine() -{ - return true; -} - -wxString wxGnomePrintFactory::CreatePrinterLine() -{ - // redundant now - return wxEmptyString; -} - -bool wxGnomePrintFactory::HasStatusLine() -{ - // redundant now - return true; -} - -wxString wxGnomePrintFactory::CreateStatusLine() -{ - // redundant now - return wxEmptyString; -} - -wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData() -{ - return new wxGnomePrintNativeData; -} - -//---------------------------------------------------------------------------- -// wxGnomePrintSetupDialog -//---------------------------------------------------------------------------- - -IMPLEMENT_CLASS(wxGnomePrintDialog, wxPrintDialogBase) - -wxGnomePrintDialog::wxGnomePrintDialog( wxWindow *parent, wxPrintDialogData *data ) - : wxPrintDialogBase(parent, wxID_ANY, _("Print"), - wxPoint(0, 0), wxSize(600, 600), - wxDEFAULT_DIALOG_STYLE | - wxTAB_TRAVERSAL) -{ - if (data) - m_printDialogData = *data; - - Init(); -} - -wxGnomePrintDialog::wxGnomePrintDialog( wxWindow *parent, wxPrintData *data ) - : wxPrintDialogBase(parent, wxID_ANY, _("Print"), - wxPoint(0, 0), wxSize(600, 600), - wxDEFAULT_DIALOG_STYLE | - wxTAB_TRAVERSAL) -{ - if (data) - m_printDialogData = *data; - - Init(); -} - -void wxGnomePrintDialog::Init() -{ - wxPrintData data = m_printDialogData.GetPrintData(); - - data.ConvertToNative(); - - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) data.GetNativeData(); - - m_widget = gs_libGnomePrint->gnome_print_dialog_new( native->GetPrintJob(), - (guchar*)"Print", - GNOME_PRINT_DIALOG_RANGE|GNOME_PRINT_DIALOG_COPIES ); - - int flag = 0; - if (m_printDialogData.GetEnableSelection()) - flag |= GNOME_PRINT_RANGE_SELECTION; - if (m_printDialogData.GetEnablePageNumbers()) - flag |= GNOME_PRINT_RANGE_ALL|GNOME_PRINT_RANGE_RANGE; - - gs_libGnomePrint->gnome_print_dialog_construct_range_page( (GnomePrintDialog*) m_widget, - flag, - m_printDialogData.GetMinPage(), - m_printDialogData.GetMaxPage(), - NULL, - NULL ); -} - -wxGnomePrintDialog::~wxGnomePrintDialog() -{ - m_widget = NULL; -} - -int wxGnomePrintDialog::ShowModal() -{ - WX_HOOK_MODAL_DIALOG(); - - int response = gtk_dialog_run (GTK_DIALOG (m_widget)); - - if (response == GNOME_PRINT_DIALOG_RESPONSE_CANCEL) - { - gtk_widget_destroy(m_widget); - m_widget = NULL; - - return wxID_CANCEL; - } - - m_printDialogData.GetPrintData().ConvertFromNative(); - - gint copies = 1; - gboolean collate = false; - gs_libGnomePrint->gnome_print_dialog_get_copies( (GnomePrintDialog*) m_widget, &copies, &collate ); - m_printDialogData.SetNoCopies( copies ); - m_printDialogData.SetCollate( collate ); - - // Cast needed to avoid warnings because the gnome_print_dialog_get_range() - // is declared as returning a wrong enum type. - switch ( static_cast( gs_libGnomePrint->gnome_print_dialog_get_range( (GnomePrintDialog*) m_widget ))) - { - case GNOME_PRINT_RANGE_SELECTION: - m_printDialogData.SetSelection( true ); - break; - case GNOME_PRINT_RANGE_ALL: - m_printDialogData.SetAllPages( true ); - m_printDialogData.SetFromPage( 0 ); - m_printDialogData.SetToPage( 9999 ); - break; - case GNOME_PRINT_RANGE_RANGE: - default: - gint start,end; - gs_libGnomePrint->gnome_print_dialog_get_range_page( (GnomePrintDialog*) m_widget, &start, &end ); - m_printDialogData.SetFromPage( start ); - m_printDialogData.SetToPage( end ); - break; - } - - gtk_widget_destroy(m_widget); - m_widget = NULL; - - if (response == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW) - return wxID_PREVIEW; - - return wxID_OK; -} - -wxDC *wxGnomePrintDialog::GetPrintDC() -{ - // Later - return NULL; -} - -bool wxGnomePrintDialog::Validate() -{ - return true; -} - -bool wxGnomePrintDialog::TransferDataToWindow() -{ - return true; -} - -bool wxGnomePrintDialog::TransferDataFromWindow() -{ - return true; -} - -//---------------------------------------------------------------------------- -// wxGnomePageSetupDialog -//---------------------------------------------------------------------------- - -IMPLEMENT_CLASS(wxGnomePageSetupDialog, wxPageSetupDialogBase) - -wxGnomePageSetupDialog::wxGnomePageSetupDialog(wxWindow * WXUNUSED(parent), - wxPageSetupDialogData *data) -{ - if (data) - m_pageDialogData = *data; - - m_pageDialogData.GetPrintData().ConvertToNative(); - - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) m_pageDialogData.GetPrintData().GetNativeData(); - - // This *was* required as the page setup dialog - // calculates wrong values otherwise. -#if 0 - gs_libGnomePrint->gnome_print_config_set( native->GetPrintConfig(), - (const guchar*) GNOME_PRINT_KEY_PREFERED_UNIT, - (const guchar*) "Pts" ); -#endif - - GnomePrintConfig *config = native->GetPrintConfig(); - - const GnomePrintUnit *mm_unit = gs_libGnomePrint->gnome_print_unit_get_by_abbreviation( (const guchar*) "mm" ); - - double ml = (double) m_pageDialogData.GetMarginTopLeft().x; - double mt = (double) m_pageDialogData.GetMarginTopLeft().y; - double mr = (double) m_pageDialogData.GetMarginBottomRight().x; - double mb = (double) m_pageDialogData.GetMarginBottomRight().y; - - gs_libGnomePrint->gnome_print_config_set_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, ml, mm_unit ); - gs_libGnomePrint->gnome_print_config_set_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, mr, mm_unit ); - gs_libGnomePrint->gnome_print_config_set_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_TOP, mt, mm_unit ); - gs_libGnomePrint->gnome_print_config_set_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, mb, mm_unit ); - - m_widget = gtk_dialog_new(); - - gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( _("Page setup") ) ); - - GtkWidget *main = gs_libGnomePrint->gnome_paper_selector_new_with_flags( native->GetPrintConfig(), - GNOME_PAPER_SELECTOR_MARGINS|GNOME_PAPER_SELECTOR_FEED_ORIENTATION ); - gtk_container_set_border_width (GTK_CONTAINER (main), 8); - gtk_widget_show (main); - - gtk_container_add( GTK_CONTAINER (GTK_DIALOG (m_widget)->vbox), main ); - - gtk_dialog_set_has_separator (GTK_DIALOG (m_widget), TRUE); - - gtk_dialog_add_buttons (GTK_DIALOG (m_widget), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG (m_widget), - GTK_RESPONSE_OK); -} - -wxGnomePageSetupDialog::~wxGnomePageSetupDialog() -{ -} - -wxPageSetupDialogData& wxGnomePageSetupDialog::GetPageSetupDialogData() -{ - return m_pageDialogData; -} - -int wxGnomePageSetupDialog::ShowModal() -{ - WX_HOOK_MODAL_DIALOG(); - - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) m_pageDialogData.GetPrintData().GetNativeData(); - - GnomePrintConfig *config = native->GetPrintConfig(); - - - int ret = gtk_dialog_run( GTK_DIALOG(m_widget) ); - - if (ret == GTK_RESPONSE_OK) - { - // Transfer data back to m_pageDialogData - m_pageDialogData.GetPrintData().ConvertFromNative(); - - // I don't know how querying the last parameter works - double ml,mr,mt,mb,pw,ph; - gs_libGnomePrint->gnome_print_config_get_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &ml, NULL); - gs_libGnomePrint->gnome_print_config_get_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &mr, NULL); - gs_libGnomePrint->gnome_print_config_get_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &mt, NULL); - gs_libGnomePrint->gnome_print_config_get_length (config, - (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &mb, NULL); - gs_libGnomePrint->gnome_print_config_get_length (config, - (const guchar*) GNOME_PRINT_KEY_PAPER_WIDTH, &pw, NULL); - gs_libGnomePrint->gnome_print_config_get_length (config, - (const guchar*) GNOME_PRINT_KEY_PAPER_HEIGHT, &ph, NULL); - - // This code converts correctly from what the user chose - // as the unit although I query Pts here - const GnomePrintUnit *mm_unit = gs_libGnomePrint->gnome_print_unit_get_by_abbreviation( (const guchar*) "mm" ); - const GnomePrintUnit *pts_unit = gs_libGnomePrint->gnome_print_unit_get_by_abbreviation( (const guchar*) "Pts" ); - gs_libGnomePrint->gnome_print_convert_distance( &ml, pts_unit, mm_unit ); - gs_libGnomePrint->gnome_print_convert_distance( &mr, pts_unit, mm_unit ); - gs_libGnomePrint->gnome_print_convert_distance( &mt, pts_unit, mm_unit ); - gs_libGnomePrint->gnome_print_convert_distance( &mb, pts_unit, mm_unit ); - gs_libGnomePrint->gnome_print_convert_distance( &pw, pts_unit, mm_unit ); - gs_libGnomePrint->gnome_print_convert_distance( &ph, pts_unit, mm_unit ); - - m_pageDialogData.SetMarginTopLeft( wxPoint( (int)(ml+0.5), (int)(mt+0.5)) ); - m_pageDialogData.SetMarginBottomRight( wxPoint( (int)(mr+0.5), (int)(mb+0.5)) ); - - m_pageDialogData.SetPaperSize( wxSize( (int)(pw+0.5), (int)(ph+0.5) ) ); - - ret = wxID_OK; - } - else - { - ret = wxID_CANCEL; - } - - gtk_widget_destroy( m_widget ); - m_widget = NULL; - - return ret; -} - -bool wxGnomePageSetupDialog::Validate() -{ - return true; -} - -bool wxGnomePageSetupDialog::TransferDataToWindow() -{ - return true; -} - -bool wxGnomePageSetupDialog::TransferDataFromWindow() -{ - return true; -} - -//---------------------------------------------------------------------------- -// wxGnomePrinter -//---------------------------------------------------------------------------- - -IMPLEMENT_CLASS(wxGnomePrinter, wxPrinterBase) - -wxGnomePrinter::wxGnomePrinter( wxPrintDialogData *data ) : - wxPrinterBase( data ) -{ - m_native_preview = false; -} - -wxGnomePrinter::~wxGnomePrinter() -{ -} - -bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt ) -{ - if (!printout) - { - sm_lastError = wxPRINTER_ERROR; - return false; - } - - wxPrintData printdata = GetPrintDialogData().GetPrintData(); - - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) printdata.GetNativeData(); - - GnomePrintJob *job = gs_libGnomePrint->gnome_print_job_new( native->GetPrintConfig() ); - - // The GnomePrintJob is temporarily stored in the - // native print data as the native print dialog - // needs to access it. - native->SetPrintJob( job ); - - - if (m_printDialogData.GetMinPage() < 1) - m_printDialogData.SetMinPage(1); - if (m_printDialogData.GetMaxPage() < 1) - m_printDialogData.SetMaxPage(9999); - - wxDC *dc; - if (prompt) - dc = PrintDialog( parent ); - else -#if wxUSE_NEW_DC - dc = new wxPrinterDC( printdata ); // TODO: check that this works -#else - dc = new wxGnomePrinterDC( printdata ); // TODO: check that this works -#endif - - if (!dc) - { - gs_libGnomePrint->gnome_print_job_close( job ); - g_object_unref (job); - if (sm_lastError != wxPRINTER_CANCELLED) - sm_lastError = wxPRINTER_ERROR; - return false; - } - - printout->SetPPIScreen(wxGetDisplayPPI()); - printout->SetPPIPrinter( dc->GetResolution(), - dc->GetResolution() ); - - printout->SetDC(dc); - - int w, h; - dc->GetSize(&w, &h); - printout->SetPageSizePixels((int)w, (int)h); - printout->SetPaperRectPixels(wxRect(0, 0, w, h)); - int mw, mh; - dc->GetSizeMM(&mw, &mh); - printout->SetPageSizeMM((int)mw, (int)mh); - printout->OnPreparePrinting(); - - // Get some parameters from the printout, if defined - int fromPage, toPage; - int minPage, maxPage; - printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); - - if (maxPage == 0) - { - gs_libGnomePrint->gnome_print_job_close( job ); - g_object_unref (job); - sm_lastError = wxPRINTER_ERROR; - return false; - } - - printout->OnBeginPrinting(); - - int minPageNum = minPage, maxPageNum = maxPage; - - if ( !m_printDialogData.GetAllPages() ) - { - minPageNum = m_printDialogData.GetFromPage(); - maxPageNum = m_printDialogData.GetToPage(); - } - - - int copyCount; - for ( copyCount = 1; - copyCount <= m_printDialogData.GetNoCopies(); - copyCount++ ) - { - if (!printout->OnBeginDocument(minPageNum, maxPageNum)) - { - wxLogError(_("Could not start printing.")); - sm_lastError = wxPRINTER_ERROR; - break; - } - - int pn; - for ( pn = minPageNum; - pn <= maxPageNum && printout->HasPage(pn); - pn++ ) - { - dc->StartPage(); - printout->OnPrintPage(pn); - dc->EndPage(); - } - - printout->OnEndDocument(); - printout->OnEndPrinting(); - } - - gs_libGnomePrint->gnome_print_job_close( job ); - if (m_native_preview) - { - const wxCharBuffer title(wxGTK_CONV_SYS(_("Print preview"))); - GtkWidget *preview = gs_libGnomePrint->gnome_print_job_preview_new - ( - job, - (const guchar *)title.data() - ); - gtk_widget_show(preview); - } - else - { - gs_libGnomePrint->gnome_print_job_print( job ); - } - - g_object_unref (job); - delete dc; - - return (sm_lastError == wxPRINTER_NO_ERROR); -} - -wxDC* wxGnomePrinter::PrintDialog( wxWindow *parent ) -{ - wxGnomePrintDialog dialog( parent, &m_printDialogData ); - int ret = dialog.ShowModal(); - if (ret == wxID_CANCEL) - { - sm_lastError = wxPRINTER_CANCELLED; - return NULL; - } - - m_native_preview = ret == wxID_PREVIEW; - - m_printDialogData = dialog.GetPrintDialogData(); -#if wxUSE_NEW_DC - return new wxPrinterDC( m_printDialogData.GetPrintData() ); -#else - return new wxGnomePrinterDC( m_printDialogData.GetPrintData() ); -#endif -} - -bool wxGnomePrinter::Setup(wxWindow * WXUNUSED(parent)) -{ - return false; -} - -//----------------------------------------------------------------------------- -// wxGnomePrinterDC -//----------------------------------------------------------------------------- - -// conversion -static const double RAD2DEG = 180.0 / M_PI; - -// we don't want to use only 72 dpi from GNOME print -static const int DPI = 600; -static const double PS2DEV = 600.0 / 72.0; -static const double DEV2PS = 72.0 / 600.0; - -#define XLOG2DEV(x) ((double)(LogicalToDeviceX(x)) * DEV2PS) -#define XLOG2DEVREL(x) ((double)(LogicalToDeviceXRel(x)) * DEV2PS) -#define YLOG2DEV(x) ((m_pageHeight - (double)LogicalToDeviceY(x)) * DEV2PS) -#define YLOG2DEVREL(x) ((double)(LogicalToDeviceYRel(x)) * DEV2PS) - -#if wxUSE_NEW_DC -IMPLEMENT_ABSTRACT_CLASS(wxGnomePrinterDCImpl, wxDCImpl) -#else -IMPLEMENT_ABSTRACT_CLASS(wxGnomePrinterDC, wxDC) -#endif - -#if wxUSE_NEW_DC -wxGnomePrinterDCImpl::wxGnomePrinterDCImpl( wxPrinterDC *owner, const wxPrintData& data ) : - wxDCImpl( owner ) -#else -wxGnomePrinterDC::wxGnomePrinterDC( const wxPrintData& data ) -#endif -{ - m_printData = data; - - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) m_printData.GetNativeData(); - - m_job = native->GetPrintJob(); - m_gpc = gs_libGnomePrint->gnome_print_job_get_context (m_job); - - m_layout = gs_libGnomePrint->gnome_print_pango_create_layout( m_gpc ); - m_fontdesc = pango_font_description_from_string( "Sans 12" ); - m_context = NULL; - - m_currentRed = 0; - m_currentBlue = 0; - m_currentGreen = 0; - - // Query page size. This seems to omit the margins - double pw,ph; - gs_libGnomePrint->gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph ); - - m_pageHeight = ph * PS2DEV; -} - -wxGnomePrinterDCImpl::~wxGnomePrinterDCImpl() -{ -} - -bool wxGnomePrinterDCImpl::IsOk() const -{ - return true; -} - -bool -wxGnomePrinterDCImpl::DoFloodFill(wxCoord WXUNUSED(x1), - wxCoord WXUNUSED(y1), - const wxColour& WXUNUSED(col), - wxFloodFillStyle WXUNUSED(style)) -{ - return false; -} - -bool -wxGnomePrinterDCImpl::DoGetPixel(wxCoord WXUNUSED(x1), - wxCoord WXUNUSED(y1), - wxColour * WXUNUSED(col)) const -{ - return false; -} - -void wxGnomePrinterDCImpl::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) -{ - if ( m_pen.IsTransparent() ) - return; - - SetPen( m_pen ); - - gs_libGnomePrint->gnome_print_moveto ( m_gpc, XLOG2DEV(x1), YLOG2DEV(y1) ); - gs_libGnomePrint->gnome_print_lineto ( m_gpc, XLOG2DEV(x2), YLOG2DEV(y2) ); - gs_libGnomePrint->gnome_print_stroke ( m_gpc); - - CalcBoundingBox( x1, y1 ); - CalcBoundingBox( x2, y2 ); -} - -void wxGnomePrinterDCImpl::DoCrossHair(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y)) -{ -} - -void wxGnomePrinterDCImpl::DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc) -{ - double dx = x1 - xc; - double dy = y1 - yc; - double radius = sqrt((double)(dx*dx+dy*dy)); - double alpha1, alpha2; - if (x1 == x2 && y1 == y2) - { - alpha1 = 0.0; - alpha2 = 360.0; - } - else if ( wxIsNullDouble(radius) ) - { - alpha1 = - alpha2 = 0.0; - } - else - { - alpha1 = (x1 - xc == 0) ? - (y1 - yc < 0) ? 90.0 : -90.0 : - -atan2(double(y1-yc), double(x1-xc)) * RAD2DEG; - alpha2 = (x2 - xc == 0) ? - (y2 - yc < 0) ? 90.0 : -90.0 : - -atan2(double(y2-yc), double(x2-xc)) * RAD2DEG; - - while (alpha1 <= 0) alpha1 += 360; - while (alpha2 <= 0) alpha2 += 360; // adjust angles to be between - while (alpha1 > 360) alpha1 -= 360; // 0 and 360 degree - while (alpha2 > 360) alpha2 -= 360; - } - - if ( m_brush.IsNonTransparent() ) - { - SetBrush( m_brush ); - gs_libGnomePrint->gnome_print_moveto ( m_gpc, XLOG2DEV(xc), YLOG2DEV(yc) ); - gs_libGnomePrint->gnome_print_arcto( m_gpc, XLOG2DEV(xc), YLOG2DEV(yc), XLOG2DEVREL((int)radius), alpha1, alpha2, 0 ); - - gs_libGnomePrint->gnome_print_fill( m_gpc ); - } - - if ( m_pen.IsNonTransparent() ) - { - SetPen (m_pen); - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto ( m_gpc, XLOG2DEV(xc), YLOG2DEV(yc) ); - gs_libGnomePrint->gnome_print_arcto( m_gpc, XLOG2DEV(xc), YLOG2DEV(yc), XLOG2DEVREL((int)radius), alpha1, alpha2, 0 ); - gs_libGnomePrint->gnome_print_closepath( m_gpc ); - - gs_libGnomePrint->gnome_print_stroke( m_gpc ); - } - - CalcBoundingBox (x1, y1); - CalcBoundingBox (x2, y2); - CalcBoundingBox (xc, yc); -} - -void wxGnomePrinterDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) -{ - x += w/2; - y += h/2; - - double xx = XLOG2DEV(x); - double yy = YLOG2DEV(y); - - gs_libGnomePrint->gnome_print_gsave( m_gpc ); - - gs_libGnomePrint->gnome_print_translate( m_gpc, xx, yy ); - double scale = (double)YLOG2DEVREL(h) / (double) XLOG2DEVREL(w); - gs_libGnomePrint->gnome_print_scale( m_gpc, 1.0, scale ); - - xx = 0.0; - yy = 0.0; - - if ( m_brush.IsNonTransparent() ) - { - SetBrush( m_brush ); - - gs_libGnomePrint->gnome_print_moveto ( m_gpc, xx, yy ); - gs_libGnomePrint->gnome_print_arcto( m_gpc, xx, yy, - XLOG2DEVREL(w)/2, sa, ea, 0 ); - gs_libGnomePrint->gnome_print_moveto ( m_gpc, xx, yy ); - - gs_libGnomePrint->gnome_print_fill( m_gpc ); - } - - if ( m_pen.IsNonTransparent() ) - { - SetPen (m_pen); - - gs_libGnomePrint->gnome_print_arcto( m_gpc, xx, yy, - XLOG2DEVREL(w)/2, sa, ea, 0 ); - - gs_libGnomePrint->gnome_print_stroke( m_gpc ); - } - - gs_libGnomePrint->gnome_print_grestore( m_gpc ); - - CalcBoundingBox( x, y ); - CalcBoundingBox( x+w, y+h ); -} - -void wxGnomePrinterDCImpl::DoDrawPoint(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y)) -{ -} - -void wxGnomePrinterDCImpl::DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset) -{ - if (n <= 0) return; - - if ( m_pen.IsTransparent() ) - return; - - SetPen (m_pen); - - int i; - for ( i =0; ignome_print_moveto ( m_gpc, XLOG2DEV(points[0].x+xoffset), YLOG2DEV(points[0].y+yoffset) ); - - for (i = 1; i < n; i++) - gs_libGnomePrint->gnome_print_lineto ( m_gpc, XLOG2DEV(points[i].x+xoffset), YLOG2DEV(points[i].y+yoffset) ); - - gs_libGnomePrint->gnome_print_stroke ( m_gpc); -} - -void wxGnomePrinterDCImpl::DoDrawPolygon(int n, const wxPoint points[], - wxCoord xoffset, wxCoord yoffset, - wxPolygonFillMode WXUNUSED(fillStyle)) -{ - if (n==0) return; - - if ( m_brush.IsNonTransparent() ) - { - SetBrush( m_brush ); - - int x = points[0].x + xoffset; - int y = points[0].y + yoffset; - CalcBoundingBox( x, y ); - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - int i; - for (i = 1; i < n; i++) - { - x = points[i].x + xoffset; - y = points[i].y + yoffset; - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - CalcBoundingBox( x, y ); - } - gs_libGnomePrint->gnome_print_closepath( m_gpc ); - gs_libGnomePrint->gnome_print_fill( m_gpc ); - } - - if ( m_pen.IsNonTransparent() ) - { - SetPen (m_pen); - - int x = points[0].x + xoffset; - int y = points[0].y + yoffset; - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - int i; - for (i = 1; i < n; i++) - { - x = points[i].x + xoffset; - y = points[i].y + yoffset; - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - CalcBoundingBox( x, y ); - } - gs_libGnomePrint->gnome_print_closepath( m_gpc ); - gs_libGnomePrint->gnome_print_stroke( m_gpc ); - } -} - -void wxGnomePrinterDCImpl::DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle) -{ -#if wxUSE_NEW_DC - wxDCImpl::DoDrawPolyPolygon( n, count, points, xoffset, yoffset, fillStyle ); -#else - wxDC::DoDrawPolyPolygon( n, count, points, xoffset, yoffset, fillStyle ); -#endif -} - -void wxGnomePrinterDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ - width--; - height--; - - if ( m_brush.IsNonTransparent() ) - { - SetBrush( m_brush ); - - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_closepath( m_gpc ); - gs_libGnomePrint->gnome_print_fill( m_gpc ); - - CalcBoundingBox( x, y ); - CalcBoundingBox( x + width, y + height ); - } - - if ( m_pen.IsNonTransparent() ) - { - SetPen (m_pen); - - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_closepath( m_gpc ); - gs_libGnomePrint->gnome_print_stroke( m_gpc ); - - CalcBoundingBox( x, y ); - CalcBoundingBox( x + width, y + height ); - } -} - -void wxGnomePrinterDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius) -{ - width--; - height--; - - wxCoord rad = wxRound( radius ); - - if ( m_brush.IsNonTransparent() ) - { - SetBrush(m_brush); - gs_libGnomePrint->gnome_print_newpath(m_gpc); - gs_libGnomePrint->gnome_print_moveto(m_gpc,XLOG2DEV(x + rad),YLOG2DEV(y)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x + rad),YLOG2DEV(y), - XLOG2DEV(x),YLOG2DEV(y), - XLOG2DEV(x),YLOG2DEV(y + rad)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x),YLOG2DEV(y + height - rad)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x),YLOG2DEV(y + height - rad), - XLOG2DEV(x),YLOG2DEV(y + height), - XLOG2DEV(x + rad),YLOG2DEV(y + height)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x + width - rad),YLOG2DEV(y + height)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x + width - rad),YLOG2DEV(y + height), - XLOG2DEV(x + width),YLOG2DEV(y + height), - XLOG2DEV(x + width),YLOG2DEV(y + height - rad)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x + width),YLOG2DEV(y + rad)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x + width),YLOG2DEV(y + rad), - XLOG2DEV(x + width),YLOG2DEV(y), - XLOG2DEV(x + width - rad),YLOG2DEV(y)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x + rad),YLOG2DEV(y)); - gs_libGnomePrint->gnome_print_closepath(m_gpc); - gs_libGnomePrint->gnome_print_fill(m_gpc); - - CalcBoundingBox(x,y); - CalcBoundingBox(x+width,y+height); - } - - if ( m_pen.IsNonTransparent() ) - { - SetPen(m_pen); - gs_libGnomePrint->gnome_print_newpath(m_gpc); - gs_libGnomePrint->gnome_print_moveto(m_gpc,XLOG2DEV(x + rad),YLOG2DEV(y)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x + rad),YLOG2DEV(y), - XLOG2DEV(x),YLOG2DEV(y), - XLOG2DEV(x),YLOG2DEV(y + rad)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x),YLOG2DEV(y + height - rad)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x),YLOG2DEV(y + height - rad), - XLOG2DEV(x),YLOG2DEV(y + height), - XLOG2DEV(x + rad),YLOG2DEV(y + height)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x + width - rad),YLOG2DEV(y + height)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x + width - rad),YLOG2DEV(y + height), - XLOG2DEV(x + width),YLOG2DEV(y + height), - XLOG2DEV(x + width),YLOG2DEV(y + height - rad)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x + width),YLOG2DEV(y + rad)); - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV(x + width),YLOG2DEV(y + rad), - XLOG2DEV(x + width),YLOG2DEV(y), - XLOG2DEV(x + width - rad),YLOG2DEV(y)); - gs_libGnomePrint->gnome_print_lineto(m_gpc,XLOG2DEV(x + rad),YLOG2DEV(y)); - gs_libGnomePrint->gnome_print_closepath(m_gpc); - gs_libGnomePrint->gnome_print_stroke(m_gpc); - - CalcBoundingBox(x,y); - CalcBoundingBox(x+width,y+height); - } -} - -void wxGnomePrinterDCImpl::makeEllipticalPath(wxCoord x, wxCoord y, - wxCoord width, wxCoord height) -{ - double r = 4 * (sqrt(2.) - 1) / 3; - double halfW = 0.5 * width, - halfH = 0.5 * height, - halfWR = r * halfW, - halfHR = r * halfH; - wxCoord halfWI = (wxCoord) halfW, - halfHI = (wxCoord) halfH; - - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - - // Approximate an ellipse using four cubic splines, clockwise from 0 deg */ - gs_libGnomePrint->gnome_print_moveto( m_gpc, - XLOG2DEV(x + width), - YLOG2DEV(y + halfHI) ); - gs_libGnomePrint->gnome_print_curveto( m_gpc, - XLOG2DEV(x + width), - YLOG2DEV(y + (wxCoord) rint (halfH + halfHR)), - XLOG2DEV(x + (wxCoord) rint(halfW + halfWR)), - YLOG2DEV(y + height), - XLOG2DEV(x + halfWI), - YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_curveto( m_gpc, - XLOG2DEV(x + (wxCoord) rint(halfW - halfWR)), - YLOG2DEV(y + height), - XLOG2DEV(x), - YLOG2DEV(y + (wxCoord) rint (halfH + halfHR)), - XLOG2DEV(x), YLOG2DEV(y+halfHI) ); - gs_libGnomePrint->gnome_print_curveto( m_gpc, - XLOG2DEV(x), - YLOG2DEV(y + (wxCoord) rint (halfH - halfHR)), - XLOG2DEV(x + (wxCoord) rint (halfW - halfWR)), - YLOG2DEV(y), - XLOG2DEV(x+halfWI), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_curveto( m_gpc, - XLOG2DEV(x + (wxCoord) rint(halfW + halfWR)), - YLOG2DEV(y), - XLOG2DEV(x + width), - YLOG2DEV(y + (wxCoord) rint(halfH - halfHR)), - XLOG2DEV(x + width), YLOG2DEV(y + halfHI) ); - - gs_libGnomePrint->gnome_print_closepath(m_gpc); -} - -void wxGnomePrinterDCImpl::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ - width--; - height--; - - if ( m_brush.IsNonTransparent() ) - { - SetBrush( m_brush ); - makeEllipticalPath( x, y, width, height ); - gs_libGnomePrint->gnome_print_fill( m_gpc ); - CalcBoundingBox( x, y ); - CalcBoundingBox( x + width, y + height ); - } - - if ( m_pen.IsNonTransparent() ) - { - SetPen (m_pen); - makeEllipticalPath( x, y, width, height ); - gs_libGnomePrint->gnome_print_stroke( m_gpc ); - CalcBoundingBox( x, y ); - CalcBoundingBox( x + width, y + height ); - } -} - -#if wxUSE_SPLINES -void wxGnomePrinterDCImpl::DoDrawSpline(const wxPointList *points) -{ - SetPen (m_pen); - - double c, d, x1, y1, x2, y2, x3, y3; - wxPoint *p, *q; - - wxPointList::compatibility_iterator node = points->GetFirst(); - p = node->GetData(); - x1 = p->x; - y1 = p->y; - - node = node->GetNext(); - p = node->GetData(); - c = p->x; - d = p->y; - x3 = - (double)(x1 + c) / 2; - y3 = - (double)(y1 + d) / 2; - - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, XLOG2DEV((wxCoord)x1), YLOG2DEV((wxCoord)y1) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV((wxCoord)x3), YLOG2DEV((wxCoord)y3) ); - - CalcBoundingBox( (wxCoord)x1, (wxCoord)y1 ); - CalcBoundingBox( (wxCoord)x3, (wxCoord)y3 ); - - node = node->GetNext(); - while (node) - { - q = node->GetData(); - - x1 = x3; - y1 = y3; - x2 = c; - y2 = d; - c = q->x; - d = q->y; - x3 = (double)(x2 + c) / 2; - y3 = (double)(y2 + d) / 2; - - gs_libGnomePrint->gnome_print_curveto(m_gpc, - XLOG2DEV((wxCoord)x1), YLOG2DEV((wxCoord)y1), - XLOG2DEV((wxCoord)x2), YLOG2DEV((wxCoord)y2), - XLOG2DEV((wxCoord)x3), YLOG2DEV((wxCoord)y3) ); - - CalcBoundingBox( (wxCoord)x1, (wxCoord)y1 ); - CalcBoundingBox( (wxCoord)x3, (wxCoord)y3 ); - - node = node->GetNext(); - } - - gs_libGnomePrint->gnome_print_lineto ( m_gpc, XLOG2DEV((wxCoord)c), YLOG2DEV((wxCoord)d) ); - - gs_libGnomePrint->gnome_print_stroke( m_gpc ); -} -#endif // wxUSE_SPLINES - -bool -wxGnomePrinterDCImpl::DoBlit(wxCoord xdest, wxCoord ydest, - wxCoord width, wxCoord height, - wxDC *source, - wxCoord xsrc, wxCoord ysrc, - wxRasterOperationMode rop, - bool WXUNUSED(useMask), - wxCoord WXUNUSED(xsrcMask), wxCoord WXUNUSED(ysrcMask)) -{ - wxCHECK_MSG( source, false, wxT("invalid source dc") ); - - // blit into a bitmap - wxBitmap bitmap( width, height ); - wxMemoryDC memDC; - memDC.SelectObject(bitmap); - memDC.Blit(0, 0, width, height, source, xsrc, ysrc, rop); /* TODO: Blit transparently? */ - memDC.SelectObject(wxNullBitmap); - - // draw bitmap. scaling and positioning is done there - GetOwner()->DrawBitmap( bitmap, xdest, ydest ); - - return true; -} - -void wxGnomePrinterDCImpl::DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y ) -{ - DoDrawBitmap( icon, x, y, true ); -} - -void -wxGnomePrinterDCImpl::DoDrawBitmap(const wxBitmap& bitmap, - wxCoord x, wxCoord y, - bool WXUNUSED(useMask)) -{ - if (!bitmap.IsOk()) return; - - if (bitmap.HasPixbuf()) - { - GdkPixbuf *pixbuf = bitmap.GetPixbuf(); - guchar *raw_image = gdk_pixbuf_get_pixels( pixbuf ); - bool has_alpha = gdk_pixbuf_get_has_alpha( pixbuf ); - int rowstride = gdk_pixbuf_get_rowstride( pixbuf ); - int height = gdk_pixbuf_get_height( pixbuf ); - int width = gdk_pixbuf_get_width( pixbuf ); - - gs_libGnomePrint->gnome_print_gsave( m_gpc ); - double matrix[6]; - matrix[0] = XLOG2DEVREL(width); - matrix[1] = 0; - matrix[2] = 0; - matrix[3] = YLOG2DEVREL(height); - matrix[4] = XLOG2DEV(x); - matrix[5] = YLOG2DEV(y+height); - gs_libGnomePrint->gnome_print_concat( m_gpc, matrix ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, 0, 0 ); - if (has_alpha) - gs_libGnomePrint->gnome_print_rgbaimage( m_gpc, (guchar *)raw_image, width, height, rowstride ); - else - gs_libGnomePrint->gnome_print_rgbimage( m_gpc, (guchar *)raw_image, width, height, rowstride ); - gs_libGnomePrint->gnome_print_grestore( m_gpc ); - } - else - { - wxImage image = bitmap.ConvertToImage(); - - if (!image.IsOk()) return; - - gs_libGnomePrint->gnome_print_gsave( m_gpc ); - double matrix[6]; - matrix[0] = XLOG2DEVREL(image.GetWidth()); - matrix[1] = 0; - matrix[2] = 0; - matrix[3] = YLOG2DEVREL(image.GetHeight()); - matrix[4] = XLOG2DEV(x); - matrix[5] = YLOG2DEV(y+image.GetHeight()); - gs_libGnomePrint->gnome_print_concat( m_gpc, matrix ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, 0, 0 ); - gs_libGnomePrint->gnome_print_rgbimage( m_gpc, (guchar*) image.GetData(), image.GetWidth(), image.GetHeight(), image.GetWidth()*3 ); - gs_libGnomePrint->gnome_print_grestore( m_gpc ); - } -} - -void wxGnomePrinterDCImpl::DoDrawText(const wxString& text, wxCoord x, wxCoord y ) -{ - DoDrawRotatedText( text, x, y, 0.0 ); -} - -void wxGnomePrinterDCImpl::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) -{ - double xx = XLOG2DEV(x); - double yy = YLOG2DEV(y); - - const wxScopedCharBuffer data(text.utf8_str()); - - pango_layout_set_text(m_layout, data, data.length()); - const bool setAttrs = m_font.GTKSetPangoAttrs(m_layout); - - if (m_textForegroundColour.IsOk()) - { - unsigned char red = m_textForegroundColour.Red(); - unsigned char blue = m_textForegroundColour.Blue(); - unsigned char green = m_textForegroundColour.Green(); - - if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue)) - { - double redPS = (double)(red) / 255.0; - double bluePS = (double)(blue) / 255.0; - double greenPS = (double)(green) / 255.0; - - gs_libGnomePrint->gnome_print_setrgbcolor( m_gpc, redPS, greenPS, bluePS ); - - m_currentRed = red; - m_currentBlue = blue; - m_currentGreen = green; - } - } - -#if 0 - if ( m_backgroundMode == wxSOLID ) - { - gdk_gc_set_foreground(m_textGC, m_textBackgroundColour.GetColor()); - gdk_draw_rectangle(m_window, m_textGC, TRUE, xx, yy, w, h); - gdk_gc_set_foreground(m_textGC, m_textForegroundColour.GetColor()); - } -#endif - - // Draw layout. - gs_libGnomePrint->gnome_print_moveto (m_gpc, xx, yy); - - gs_libGnomePrint->gnome_print_gsave( m_gpc ); - - gs_libGnomePrint->gnome_print_scale( m_gpc, m_scaleX * DEV2PS, m_scaleY * DEV2PS ); - - if (fabs(angle) > 0.00001) - gs_libGnomePrint->gnome_print_rotate( m_gpc, angle ); - - gs_libGnomePrint->gnome_print_pango_layout( m_gpc, m_layout ); - - int w,h; - pango_layout_get_pixel_size( m_layout, &w, &h ); - - gs_libGnomePrint->gnome_print_grestore( m_gpc ); - - if (setAttrs) - { - // undo underline attributes setting: - pango_layout_set_attributes(m_layout, NULL); - } - - CalcBoundingBox(x, y); - CalcBoundingBox(x + w, y + h); -} - -void wxGnomePrinterDCImpl::Clear() -{ -} - -void wxGnomePrinterDCImpl::SetFont( const wxFont& font ) -{ - m_font = font; - - if (m_font.IsOk()) - { - if (m_fontdesc) - pango_font_description_free( m_fontdesc ); - - m_fontdesc = pango_font_description_copy( m_font.GetNativeFontInfo()->description ); - - float size = pango_font_description_get_size( m_fontdesc ); - size = size * GetFontPointSizeAdjustment(72.0); - pango_font_description_set_size( m_fontdesc, (gint)size ); - - pango_layout_set_font_description( m_layout, m_fontdesc ); - } -} - -void wxGnomePrinterDCImpl::SetPen( const wxPen& pen ) -{ - if (!pen.IsOk()) return; - - m_pen = pen; - - double width; - - if (m_pen.GetWidth() <= 0) - width = 0.1; - else - width = (double) m_pen.GetWidth(); - - gs_libGnomePrint->gnome_print_setlinewidth( m_gpc, width * DEV2PS * m_scaleX ); - - static const double dotted[] = {2.0, 5.0}; - static const double short_dashed[] = {4.0, 4.0}; - static const double wxCoord_dashed[] = {4.0, 8.0}; - static const double dotted_dashed[] = {6.0, 6.0, 2.0, 6.0}; - - switch (m_pen.GetStyle()) - { - case wxPENSTYLE_DOT: gs_libGnomePrint->gnome_print_setdash( m_gpc, 2, dotted, 0 ); break; - case wxPENSTYLE_SHORT_DASH: gs_libGnomePrint->gnome_print_setdash( m_gpc, 2, short_dashed, 0 ); break; - case wxPENSTYLE_LONG_DASH: gs_libGnomePrint->gnome_print_setdash( m_gpc, 2, wxCoord_dashed, 0 ); break; - case wxPENSTYLE_DOT_DASH: gs_libGnomePrint->gnome_print_setdash( m_gpc, 4, dotted_dashed, 0 ); break; - case wxPENSTYLE_USER_DASH: - { - // It may be noted that libgnomeprint between at least - // versions 2.8.0 and 2.12.1 makes a copy of the dashes - // and then leak the memory since it doesn't set the - // internal flag "privatedash" to 0. - wxDash *wx_dashes; - int num = m_pen.GetDashes (&wx_dashes); - gdouble *g_dashes = g_new( gdouble, num ); - int i; - for (i = 0; i < num; ++i) - g_dashes[i] = (gdouble) wx_dashes[i]; - gs_libGnomePrint -> gnome_print_setdash( m_gpc, num, g_dashes, 0); - g_free( g_dashes ); - } - break; - case wxPENSTYLE_SOLID: - case wxPENSTYLE_TRANSPARENT: - default: gs_libGnomePrint->gnome_print_setdash( m_gpc, 0, NULL, 0 ); break; - } - - - unsigned char red = m_pen.GetColour().Red(); - unsigned char blue = m_pen.GetColour().Blue(); - unsigned char green = m_pen.GetColour().Green(); - - if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue)) - { - double redPS = (double)(red) / 255.0; - double bluePS = (double)(blue) / 255.0; - double greenPS = (double)(green) / 255.0; - - gs_libGnomePrint->gnome_print_setrgbcolor( m_gpc, redPS, greenPS, bluePS ); - - m_currentRed = red; - m_currentBlue = blue; - m_currentGreen = green; - } -} - -void wxGnomePrinterDCImpl::SetBrush( const wxBrush& brush ) -{ - if (!brush.IsOk()) return; - - m_brush = brush; - - // Brush colour - unsigned char red = m_brush.GetColour().Red(); - unsigned char blue = m_brush.GetColour().Blue(); - unsigned char green = m_brush.GetColour().Green(); - - if (!m_colour) - { - // Anything not white is black - if (! (red == (unsigned char) 255 && - blue == (unsigned char) 255 && - green == (unsigned char) 255) ) - { - red = (unsigned char) 0; - green = (unsigned char) 0; - blue = (unsigned char) 0; - } - // setgray here ? - } - - if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue)) - { - double redPS = (double)(red) / 255.0; - double bluePS = (double)(blue) / 255.0; - double greenPS = (double)(green) / 255.0; - - gs_libGnomePrint->gnome_print_setrgbcolor( m_gpc, redPS, greenPS, bluePS ); - - m_currentRed = red; - m_currentBlue = blue; - m_currentGreen = green; - } -} - -void wxGnomePrinterDCImpl::SetLogicalFunction(wxRasterOperationMode WXUNUSED(function)) -{ -} - -void wxGnomePrinterDCImpl::SetBackground(const wxBrush& WXUNUSED(brush)) -{ -} - -void wxGnomePrinterDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height) -{ -#if wxUSE_NEW_DC - m_clipping = TRUE; // TODO move somewhere else - m_clipX1 = x; - m_clipY1 = y; - m_clipX2 = x + width; - m_clipY2 = y + height; -#else - wxDC::DoSetClippingRegion( x, y, width, height ); -#endif - - gs_libGnomePrint->gnome_print_gsave( m_gpc ); - - gs_libGnomePrint->gnome_print_newpath( m_gpc ); - gs_libGnomePrint->gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) ); - gs_libGnomePrint->gnome_print_closepath( m_gpc ); - gs_libGnomePrint->gnome_print_clip( m_gpc ); -} - -void wxGnomePrinterDCImpl::DestroyClippingRegion() -{ -#if wxUSE_NEW_DC - wxDCImpl::DestroyClippingRegion(); -#else - wxDC::DestroyClippingRegion(); -#endif - - gs_libGnomePrint->gnome_print_grestore( m_gpc ); - -#if 0 - // not needed, we set the values in each - // drawing method anyways - SetPen( m_pen ); - SetBrush( m_brush ); - SetFont( m_font ); -#endif -} - -bool wxGnomePrinterDCImpl::StartDoc(const wxString& WXUNUSED(message)) -{ - return true; -} - -void wxGnomePrinterDCImpl::EndDoc() -{ - gs_libGnomePrint->gnome_print_end_doc( m_gpc ); -} - -void wxGnomePrinterDCImpl::StartPage() -{ - gs_libGnomePrint->gnome_print_beginpage( m_gpc, (const guchar*) "page" ); -} - -void wxGnomePrinterDCImpl::EndPage() -{ - gs_libGnomePrint->gnome_print_showpage( m_gpc ); -} - -wxCoord wxGnomePrinterDCImpl::GetCharHeight() const -{ - pango_layout_set_text( m_layout, "H", 1 ); - - int w,h; - pango_layout_get_pixel_size( m_layout, &w, &h ); - - return h; -} - -wxCoord wxGnomePrinterDCImpl::GetCharWidth() const -{ - pango_layout_set_text( m_layout, "H", 1 ); - - int w,h; - pango_layout_get_pixel_size( m_layout, &w, &h ); - - return w; -} - -void wxGnomePrinterDCImpl::DoGetTextExtent(const wxString& string, wxCoord *width, wxCoord *height, - wxCoord *descent, - wxCoord *externalLeading, - const wxFont *theFont ) const -{ - if ( width ) - *width = 0; - if ( height ) - *height = 0; - if ( descent ) - *descent = 0; - if ( externalLeading ) - *externalLeading = 0; - - if (string.empty()) - { - return; - } - - // Set layout's text - - const wxScopedCharBuffer dataUTF8(string.utf8_str()); - - gint oldSize = 0; - if ( theFont ) - { - // scale the font and apply it - PangoFontDescription *desc = theFont->GetNativeFontInfo()->description; - oldSize = pango_font_description_get_size(desc); - float size = oldSize * GetFontPointSizeAdjustment(72.0); - pango_font_description_set_size(desc, (gint)size); - - pango_layout_set_font_description(m_layout, desc); - } - - pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) ); - - int h; - pango_layout_get_pixel_size( m_layout, width, &h ); - if ( height ) - *height = h; - - if (descent) - { - PangoLayoutIter *iter = pango_layout_get_iter(m_layout); - int baseline = pango_layout_iter_get_baseline(iter); - pango_layout_iter_free(iter); - *descent = h - PANGO_PIXELS(baseline); - } - - if ( theFont ) - { - // restore font and reset font's size back - pango_layout_set_font_description(m_layout, m_fontdesc); - - PangoFontDescription *desc = theFont->GetNativeFontInfo()->description; - pango_font_description_set_size(desc, oldSize); - } -} - -void wxGnomePrinterDCImpl::DoGetSize(int* width, int* height) const -{ - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) m_printData.GetNativeData(); - - // Query page size. This seems to omit the margins - double pw,ph; - gs_libGnomePrint->gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph ); - - if (width) - *width = wxRound( pw * PS2DEV ); - - if (height) - *height = wxRound( ph * PS2DEV ); -} - -void wxGnomePrinterDCImpl::DoGetSizeMM(int *width, int *height) const -{ - wxGnomePrintNativeData *native = - (wxGnomePrintNativeData*) m_printData.GetNativeData(); - - // This code assumes values in Pts. - - double pw,ph; - gs_libGnomePrint->gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph ); - - // Convert to mm. - - const GnomePrintUnit *mm_unit = gs_libGnomePrint->gnome_print_unit_get_by_abbreviation( (const guchar*) "mm" ); - const GnomePrintUnit *pts_unit = gs_libGnomePrint->gnome_print_unit_get_by_abbreviation( (const guchar*) "Pts" ); - gs_libGnomePrint->gnome_print_convert_distance( &pw, pts_unit, mm_unit ); - gs_libGnomePrint->gnome_print_convert_distance( &ph, pts_unit, mm_unit ); - - if (width) - *width = (int) (pw + 0.5); - if (height) - *height = (int) (ph + 0.5); -} - -wxSize wxGnomePrinterDCImpl::GetPPI() const -{ - return wxSize(DPI,DPI); -} - -void wxGnomePrinterDCImpl::SetPrintData(const wxPrintData& data) -{ - m_printData = data; - - int height; - if (m_printData.GetOrientation() == wxPORTRAIT) - GetOwner()->GetSize( NULL, &height ); - else - GetOwner()->GetSize( &height, NULL ); - m_deviceLocalOriginY = height; -} - -// overridden for wxPrinterDC Impl - -int wxGnomePrinterDCImpl::GetResolution() const -{ - return DPI; -} - -wxRect wxGnomePrinterDCImpl::GetPaperRect() const -{ - // GNOME print doesn't support printer margins - int w = 0; - int h = 0; - DoGetSize( &w, &h ); - return wxRect( 0, 0, w, h ); -} - -// ---------------------------------------------------------------------------- -// wxGnomePrintModule -// ---------------------------------------------------------------------------- - -bool wxGnomePrintModule::OnInit() -{ - gs_libGnomePrint = new wxGnomePrintLibrary; - if (gs_libGnomePrint->IsOk()) - wxPrintFactory::SetPrintFactory( new wxGnomePrintFactory ); - return true; -} - -void wxGnomePrintModule::OnExit() -{ - wxDELETE(gs_libGnomePrint); -} - -IMPLEMENT_DYNAMIC_CLASS(wxGnomePrintModule, wxModule) - -// ---------------------------------------------------------------------------- -// Print preview -// ---------------------------------------------------------------------------- - -IMPLEMENT_CLASS(wxGnomePrintPreview, wxPrintPreviewBase) - -void wxGnomePrintPreview::Init(wxPrintout * WXUNUSED(printout), - wxPrintout * WXUNUSED(printoutForPrinting)) -{ - DetermineScaling(); -} - -wxGnomePrintPreview::wxGnomePrintPreview(wxPrintout *printout, - wxPrintout *printoutForPrinting, - wxPrintDialogData *data) - : wxPrintPreviewBase(printout, printoutForPrinting, data) -{ - Init(printout, printoutForPrinting); -} - -wxGnomePrintPreview::wxGnomePrintPreview(wxPrintout *printout, - wxPrintout *printoutForPrinting, - wxPrintData *data) - : wxPrintPreviewBase(printout, printoutForPrinting, data) -{ - Init(printout, printoutForPrinting); -} - -wxGnomePrintPreview::~wxGnomePrintPreview() -{ -} - -bool wxGnomePrintPreview::Print(bool interactive) -{ - if (!m_printPrintout) - return false; - - wxPrinter printer(& m_printDialogData); - return printer.Print(m_previewFrame, m_printPrintout, interactive); -} - -void wxGnomePrintPreview::DetermineScaling() -{ - wxPaperSize paperType = m_printDialogData.GetPrintData().GetPaperId(); - if (paperType == wxPAPER_NONE) - paperType = wxPAPER_NONE; - - wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType); - if (!paper) - paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4); - - if (paper) - { - m_previewPrintout->SetPPIScreen(wxGetDisplayPPI()); - - int resolution = DPI; - m_previewPrintout->SetPPIPrinter( resolution, resolution ); - - wxSize sizeDevUnits(paper->GetSizeDeviceUnits()); - - // TODO: get better resolution information from wxGnomePrinterDCImpl, if possible. - - sizeDevUnits.x = (wxCoord)((float)sizeDevUnits.x * resolution / 72.0); - sizeDevUnits.y = (wxCoord)((float)sizeDevUnits.y * resolution / 72.0); - wxSize sizeTenthsMM(paper->GetSize()); - wxSize sizeMM(sizeTenthsMM.x / 10, sizeTenthsMM.y / 10); - - // If in landscape mode, we need to swap the width and height. - if ( m_printDialogData.GetPrintData().GetOrientation() == wxLANDSCAPE ) - { - m_pageWidth = sizeDevUnits.y; - m_pageHeight = sizeDevUnits.x; - m_previewPrintout->SetPageSizeMM(sizeMM.y, sizeMM.x); - } - else - { - m_pageWidth = sizeDevUnits.x; - m_pageHeight = sizeDevUnits.y; - m_previewPrintout->SetPageSizeMM(sizeMM.x, sizeMM.y); - } - m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight); - m_previewPrintout->SetPaperRectPixels(wxRect(0, 0, m_pageWidth, m_pageHeight)); - - // At 100%, the page should look about page-size on the screen. - m_previewScaleX = (double)0.8 * 72.0 / (double)resolution; - m_previewScaleY = m_previewScaleX; - } -} - -#endif - // wxUSE_LIBGNOMEPRINT diff --git a/Externals/wxWidgets3/src/gtk/minifram.cpp b/Externals/wxWidgets3/src/gtk/minifram.cpp index 6d07a6d893..24c32acaa6 100644 --- a/Externals/wxWidgets3/src/gtk/minifram.cpp +++ b/Externals/wxWidgets3/src/gtk/minifram.cpp @@ -392,6 +392,7 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title gtk_container_add(GTK_CONTAINER(m_widget), eventbox); m_gdkDecor = 0; + gtk_window_set_decorated(GTK_WINDOW(m_widget), false); m_gdkFunc = 0; if (style & wxRESIZE_BORDER) m_gdkFunc = GDK_FUNC_RESIZE; diff --git a/Externals/wxWidgets3/src/gtk/print.cpp b/Externals/wxWidgets3/src/gtk/print.cpp index d309ffd6ad..a7f75959e2 100644 --- a/Externals/wxWidgets3/src/gtk/print.cpp +++ b/Externals/wxWidgets3/src/gtk/print.cpp @@ -51,10 +51,6 @@ #include "wx/link.h" wxFORCE_LINK_THIS_MODULE(gtk_print) -#if wxUSE_LIBGNOMEPRINT -#include "wx/gtk/gnome/gprint.h" -#endif - #include "wx/gtk/private/object.h" // Useful to convert angles from/to Rad to/from Deg. @@ -64,8 +60,7 @@ static const double DEG2RAD = M_PI / 180.0; //---------------------------------------------------------------------------- // wxGtkPrintModule // Initialized when starting the app : if it successfully load the gtk-print framework, -// it uses it. If not, it falls back to gnome print (see /gtk/gnome/gprint.cpp) then -// to postscript if gnomeprint is not available. +// it uses it. If not, it falls back to Postscript. //---------------------------------------------------------------------------- class wxGtkPrintModule: public wxModule @@ -73,10 +68,6 @@ class wxGtkPrintModule: public wxModule public: wxGtkPrintModule() { -#if wxUSE_LIBGNOMEPRINT - // This module must be initialized AFTER gnomeprint's one - AddDependency(wxCLASSINFO(wxGnomePrintModule)); -#endif } bool OnInit(); void OnExit() {} @@ -1366,47 +1357,43 @@ void wxGtkPrinterDCImpl::DoCrossHair(wxCoord x, wxCoord y) void wxGtkPrinterDCImpl::DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc) { - double dx = x1 - xc; - double dy = y1 - yc; - double radius = sqrt((double)(dx*dx+dy*dy)); + const double dx1 = x1 - xc; + const double dy1 = y1 - yc; + const double radius = sqrt(dx1*dx1 + dy1*dy1); + + if ( radius == 0.0 ) + return; double alpha1, alpha2; - if (x1 == x2 && y1 == y2) + if ( x1 == x2 && y1 == y2 ) { alpha1 = 0.0; - alpha2 = 360.0; - } - else - if (radius == 0.0) - { - alpha1 = alpha2 = 0.0; + alpha2 = 2*M_PI; + } else { - alpha1 = (x1 - xc == 0) ? - (y1 - yc < 0) ? 90.0 : -90.0 : - atan2(double(y1-yc), double(x1-xc)) * RAD2DEG; - alpha2 = (x2 - xc == 0) ? - (y2 - yc < 0) ? 90.0 : -90.0 : - atan2(double(y2-yc), double(x2-xc)) * RAD2DEG; - - while (alpha1 <= 0) alpha1 += 360; - while (alpha2 <= 0) alpha2 += 360; // adjust angles to be between. - while (alpha1 > 360) alpha1 -= 360; // 0 and 360 degree. - while (alpha2 > 360) alpha2 -= 360; + alpha1 = atan2(dy1, dx1); + alpha2 = atan2(double(y2-yc), double(x2-xc)); } - alpha1 *= DEG2RAD; - alpha2 *= DEG2RAD; - cairo_new_path(m_cairo); - cairo_arc_negative ( m_cairo, XLOG2DEV(xc), YLOG2DEV(yc), XLOG2DEVREL((int)radius), alpha1, alpha2); - cairo_line_to(m_cairo, XLOG2DEV(xc), YLOG2DEV(yc)); - cairo_close_path (m_cairo); + // We use the "negative" variant because the arc should go counterclockwise + // while in the default coordinate system, with Y axis going down, Cairo + // counts angles in the direction from positive X axis direction to + // positive Y axis direction, i.e. clockwise. + cairo_arc_negative(m_cairo, XLOG2DEV(xc), YLOG2DEV(yc), + XLOG2DEVREL(wxRound(radius)), alpha1, alpha2); - SetBrush( m_brush ); - cairo_fill_preserve( m_cairo ); + if ( m_brush.IsNonTransparent() ) + { + cairo_line_to(m_cairo, XLOG2DEV(xc), YLOG2DEV(yc)); + cairo_close_path (m_cairo); + + SetBrush( m_brush ); + cairo_fill_preserve( m_cairo ); + } SetPen (m_pen); cairo_stroke( m_cairo ); diff --git a/Externals/wxWidgets3/src/gtk/settings.cpp b/Externals/wxWidgets3/src/gtk/settings.cpp index 89353c0b5c..98efe96766 100644 --- a/Externals/wxWidgets3/src/gtk/settings.cpp +++ b/Externals/wxWidgets3/src/gtk/settings.cpp @@ -428,8 +428,8 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) wxNativeFontInfo info; #ifdef __WXGTK3__ GtkStyleContext* sc = gtk_widget_get_style_context(ButtonWidget()); - info.description = const_cast( - gtk_style_context_get_font(sc, GTK_STATE_FLAG_NORMAL)); + gtk_style_context_get(sc, GTK_STATE_FLAG_NORMAL, + GTK_STYLE_PROPERTY_FONT, &info.description, NULL); #else info.description = ButtonStyle()->font_desc; #endif @@ -440,10 +440,14 @@ wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) // it's "Sans Serif" but the real font is called "Sans"): if (!wxFontEnumerator::IsValidFacename(gs_fontSystem.GetFaceName()) && gs_fontSystem.GetFaceName() == "Sans Serif") + { gs_fontSystem.SetFaceName("Sans"); + } #endif // wxUSE_FONTENUM +#ifndef __WXGTK3__ info.description = NULL; +#endif } font = gs_fontSystem; break; diff --git a/Externals/wxWidgets3/src/gtk/spinbutt.cpp b/Externals/wxWidgets3/src/gtk/spinbutt.cpp index e7c559502b..fd1ee2cb9d 100644 --- a/Externals/wxWidgets3/src/gtk/spinbutt.cpp +++ b/Externals/wxWidgets3/src/gtk/spinbutt.cpp @@ -14,10 +14,6 @@ #include "wx/spinbutt.h" -#ifndef WX_PRECOMP - #include "wx/utils.h" -#endif - #include //----------------------------------------------------------------------------- @@ -71,10 +67,6 @@ gtk_value_changed(GtkSpinButton* spinbutton, wxSpinButton* win) // wxSpinButton //----------------------------------------------------------------------------- -BEGIN_EVENT_TABLE(wxSpinButton, wxControl) - EVT_SIZE(wxSpinButton::OnSize) -END_EVENT_TABLE() - wxSpinButton::wxSpinButton() { m_pos = 0; @@ -87,14 +79,8 @@ bool wxSpinButton::Create(wxWindow *parent, long style, const wxString& name) { - wxSize new_size = size, - sizeBest = DoGetBestSize(); - new_size.x = sizeBest.x; // override width always - if (new_size.y == -1) - new_size.y = sizeBest.y; - - if (!PreCreation( parent, pos, new_size ) || - !CreateBase( parent, id, pos, new_size, style, wxDefaultValidator, name )) + if (!PreCreation(parent, pos, size) || + !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name)) { wxFAIL_MSG( wxT("wxSpinButton creation failed") ); return false; @@ -105,6 +91,7 @@ bool wxSpinButton::Create(wxWindow *parent, m_widget = gtk_spin_button_new_with_range(0, 100, 1); g_object_ref(m_widget); + gtk_entry_set_width_chars(GTK_ENTRY(m_widget), 0); gtk_spin_button_set_wrap( GTK_SPIN_BUTTON(m_widget), (int)(m_windowStyle & wxSP_WRAP) ); @@ -113,7 +100,7 @@ bool wxSpinButton::Create(wxWindow *parent, m_parent->DoAddChild( this ); - PostCreation(new_size); + PostCreation(size); return true; } @@ -163,14 +150,6 @@ void wxSpinButton::SetRange(int minVal, int maxVal) GtkEnableEvents(); } -void wxSpinButton::OnSize( wxSizeEvent &WXUNUSED(event) ) -{ - wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") ); - - m_width = DoGetBestSize().x; - gtk_widget_set_size_request( m_widget, m_width, m_height ); -} - bool wxSpinButton::Enable( bool enable ) { if (!base_type::Enable(enable)) @@ -207,7 +186,20 @@ GdkWindow *wxSpinButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) cons wxSize wxSpinButton::DoGetBestSize() const { - wxSize best(15, 26); // FIXME + wxSize best = base_type::DoGetBestSize(); +#ifdef __WXGTK3__ + GtkStyleContext* sc = gtk_widget_get_style_context(m_widget); + GtkBorder pad = { 0, 0, 0, 0 }; + gtk_style_context_get_padding(sc, GtkStateFlags(0), &pad); + best.x -= pad.left + pad.right; +#else + gtk_widget_ensure_style(m_widget); + int w = PANGO_PIXELS(pango_font_description_get_size(m_widget->style->font_desc)); + w &= ~1; + if (w < 6) + w = 6; + best.x = w + 2 * m_widget->style->xthickness; +#endif CacheBestSize(best); return best; } @@ -219,4 +211,4 @@ wxSpinButton::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) return GetDefaultAttributesFromGTKWidget(gtk_spin_button_new_with_range(0, 100, 1)); } -#endif +#endif // wxUSE_SPINBTN diff --git a/Externals/wxWidgets3/src/gtk/textentry.cpp b/Externals/wxWidgets3/src/gtk/textentry.cpp index 0c15570343..03a6867379 100644 --- a/Externals/wxWidgets3/src/gtk/textentry.cpp +++ b/Externals/wxWidgets3/src/gtk/textentry.cpp @@ -514,4 +514,31 @@ wxPoint wxTextEntry::DoGetMargins() const #endif } +#ifdef __WXGTK3__ +bool wxTextEntry::SetHint(const wxString& hint) +{ +#if GTK_CHECK_VERSION(3,2,0) + GtkEntry *entry = GetEntry(); + if ( entry ) + { + gtk_entry_set_placeholder_text(entry, wxGTK_CONV(hint)); + return true; + } + else +#endif + return wxTextEntryBase::SetHint(hint); +} + +wxString wxTextEntry::GetHint() const +{ +#if GTK_CHECK_VERSION(3,2,0) + GtkEntry *entry = GetEntry(); + if ( entry ) + return wxGTK_CONV_BACK(gtk_entry_get_placeholder_text(entry)); + else +#endif + return wxTextEntryBase::GetHint(); +} +#endif // __WXGTK3__ + #endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX diff --git a/Externals/wxWidgets3/src/gtk/toplevel.cpp b/Externals/wxWidgets3/src/gtk/toplevel.cpp index 9e2a4176f9..19af5b8cf9 100644 --- a/Externals/wxWidgets3/src/gtk/toplevel.cpp +++ b/Externals/wxWidgets3/src/gtk/toplevel.cpp @@ -39,6 +39,9 @@ #include // XA_CARDINAL #include "wx/unix/utilsx11.h" #endif +#ifdef GDK_WINDOWING_WAYLAND + #include +#endif #include "wx/gtk/private.h" #include "wx/gtk/private/gtk2-compat.h" @@ -549,7 +552,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, long style, const wxString &name ) { - const wxSize size(WidthDefault(sizeOrig.x), HeightDefault(sizeOrig.y)); + wxSize size(sizeOrig); + if (!size.IsFullySpecified()) + size.SetDefaults(GetDefaultSize()); wxTopLevelWindows.Append( this ); @@ -718,6 +723,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, if ( (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER) ) { m_gdkDecor = 0; + gtk_window_set_decorated(GTK_WINDOW(m_widget), false); } else // have border { @@ -725,6 +731,14 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, if ( style & wxCAPTION ) m_gdkDecor |= GDK_DECOR_TITLE; +#if defined(GDK_WINDOWING_WAYLAND) && GTK_CHECK_VERSION(3,10,0) + else if ( + GDK_IS_WAYLAND_DISPLAY(gtk_widget_get_display(m_widget)) && + gtk_check_version(3,10,0) == NULL) + { + gtk_window_set_titlebar(GTK_WINDOW(m_widget), gtk_header_bar_new()); + } +#endif if ( style & wxSYSTEM_MENU ) m_gdkDecor |= GDK_DECOR_MENU; @@ -742,17 +756,25 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, } } - if ((style & wxRESIZE_BORDER) == 0) - gtk_window_set_resizable(GTK_WINDOW(m_widget), false); -#ifndef __WXGTK3__ - else - gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1); -#endif - m_decorSize = GetCachedDecorSize(); int w, h; GTKDoGetSize(&w, &h); - gtk_window_set_default_size(GTK_WINDOW(m_widget), w, h); + + if (style & wxRESIZE_BORDER) + { + gtk_window_set_default_size(GTK_WINDOW(m_widget), w, h); +#ifndef __WXGTK3__ + gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1); +#endif + } + else + { + gtk_window_set_resizable(GTK_WINDOW(m_widget), false); + // gtk_window_set_default_size() does not work for un-resizable windows, + // unless you set the size hints, but that causes Ubuntu's WM to make + // the window resizable even though GDK_FUNC_RESIZE is not set. + gtk_widget_set_size_request(m_widget, w, h); + } return true; } @@ -1118,6 +1140,8 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si int w, h; GTKDoGetSize(&w, &h); gtk_window_resize(GTK_WINDOW(m_widget), w, h); + if (!gtk_window_get_resizable(GTK_WINDOW(m_widget))) + gtk_widget_set_size_request(GTK_WIDGET(m_widget), w, h); DoGetClientSize(&m_clientWidth, &m_clientHeight); wxSizeEvent event(GetSize(), GetId()); @@ -1231,6 +1255,8 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const DecorSize& decorSize) h >= m_minHeight - (decorSize.top + decorSize.bottom)) { gtk_window_resize(GTK_WINDOW(m_widget), w, h); + if (!gtk_window_get_resizable(GTK_WINDOW(m_widget))) + gtk_widget_set_size_request(GTK_WIDGET(m_widget), w, h); resized = true; } } diff --git a/Externals/wxWidgets3/src/gtk/utilsgtk.cpp b/Externals/wxWidgets3/src/gtk/utilsgtk.cpp index 384344934f..34a16108a3 100644 --- a/Externals/wxWidgets3/src/gtk/utilsgtk.cpp +++ b/Externals/wxWidgets3/src/gtk/utilsgtk.cpp @@ -418,11 +418,11 @@ wxGUIAppTraits::GetStandardCmdLineOptions(wxArrayString& names, { wxString usage; - // check whether GLib version is greater than 2.6 but also lower than 2.33 + // check whether GLib version is lower than 2.39 // because, as we use the undocumented _GOptionGroup struct, we don't want - // to run this code with future versions which might change it (2.32 is the + // to run this code with future versions which might change it (2.38 is the // latest one at the time of this writing) - if (glib_check_version(2,33,0)) + if (glib_check_version(2,39,0)) { usage << _("The following standard GTK+ options are also supported:\n"); diff --git a/Externals/wxWidgets3/src/gtk/webview_webkit.cpp b/Externals/wxWidgets3/src/gtk/webview_webkit.cpp index faaf4be807..d1f19f9065 100644 --- a/Externals/wxWidgets3/src/gtk/webview_webkit.cpp +++ b/Externals/wxWidgets3/src/gtk/webview_webkit.cpp @@ -414,7 +414,7 @@ wxgtk_webview_webkit_context_menu(WebKitWebView *, static WebKitWebView* wxgtk_webview_webkit_create_webview(WebKitWebView *web_view, - WebKitWebFrame *frame, + WebKitWebFrame*, wxWebViewWebKit *webKitCtrl) { //As we do not know the uri being loaded at this point allow the load to diff --git a/Externals/wxWidgets3/src/gtk/window.cpp b/Externals/wxWidgets3/src/gtk/window.cpp index e163078b98..a16743410f 100644 --- a/Externals/wxWidgets3/src/gtk/window.cpp +++ b/Externals/wxWidgets3/src/gtk/window.cpp @@ -1614,112 +1614,125 @@ gtk_window_motion_notify_callback( GtkWidget * WXUNUSED(widget), // "scroll_event" (mouse wheel event) //----------------------------------------------------------------------------- -// Compute lines/columns per action the same way as private GTK+ function -// _gtk_range_get_wheel_delta() -static inline int GetWheelScrollActionDelta(GtkRange* range) +static void AdjustRangeValue(GtkRange* range, double step) { - int delta = 3; - if (range) + if (range && gtk_widget_get_visible(GTK_WIDGET(range))) { GtkAdjustment* adj = gtk_range_get_adjustment(range); - const double page_size = gtk_adjustment_get_page_size(adj); - delta = wxRound(pow(page_size, 2.0 / 3.0)); + double value = gtk_adjustment_get_value(adj); + value += step * gtk_adjustment_get_step_increment(adj); + gtk_range_set_value(range, value); } - return delta; } static gboolean -window_scroll_event(GtkWidget*, GdkEventScroll* gdk_event, wxWindow* win) +scroll_event(GtkWidget* widget, GdkEventScroll* gdk_event, wxWindow* win) { wxMouseEvent event(wxEVT_MOUSEWHEEL); InitMouseEvent(win, event, gdk_event); event.m_wheelDelta = 120; + event.m_linesPerAction = 3; + event.m_columnsPerAction = 3; -#if GTK_CHECK_VERSION(3,4,0) - if (gdk_event->direction == GDK_SCROLL_SMOOTH) + GtkRange* range_h = win->m_scrollBar[wxWindow::ScrollDir_Horz]; + GtkRange* range_v = win->m_scrollBar[wxWindow::ScrollDir_Vert]; + const bool is_range_h = (void*)widget == range_h; + const bool is_range_v = (void*)widget == range_v; + GdkScrollDirection direction = gdk_event->direction; + switch (direction) { - bool processed_x = false; - if (gdk_event->delta_x) - { - event.m_wheelAxis = wxMOUSE_WHEEL_HORIZONTAL; - event.m_wheelRotation = int(event.m_wheelDelta * gdk_event->delta_x); - GtkRange* range = win->m_scrollBar[wxWindow::ScrollDir_Horz]; - event.m_linesPerAction = GetWheelScrollActionDelta(range); - event.m_columnsPerAction = event.m_linesPerAction; - processed_x = win->GTKProcessEvent(event); - } - bool processed_y = false; - if (gdk_event->delta_y) - { - event.m_wheelAxis = wxMOUSE_WHEEL_VERTICAL; - event.m_wheelRotation = int(event.m_wheelDelta * -gdk_event->delta_y); - GtkRange* range = win->m_scrollBar[wxWindow::ScrollDir_Vert]; - event.m_linesPerAction = GetWheelScrollActionDelta(range); - event.m_columnsPerAction = event.m_linesPerAction; - processed_y = win->GTKProcessEvent(event); - } - return processed_x || processed_y; - } + case GDK_SCROLL_UP: + if (is_range_h) + direction = GDK_SCROLL_LEFT; + break; + case GDK_SCROLL_DOWN: + if (is_range_h) + direction = GDK_SCROLL_RIGHT; + break; + case GDK_SCROLL_LEFT: + if (is_range_v) + direction = GDK_SCROLL_UP; + break; + case GDK_SCROLL_RIGHT: + if (is_range_v) + direction = GDK_SCROLL_DOWN; + break; + default: + break; +#if GTK_CHECK_VERSION(3,4,0) + case GDK_SCROLL_SMOOTH: + double delta_x = gdk_event->delta_x; + double delta_y = gdk_event->delta_y; + if (delta_x == 0) + { + if (is_range_h) + { + delta_x = delta_y; + delta_y = 0; + } + } + else if (delta_y == 0) + { + if (is_range_v) + { + delta_y = delta_x; + delta_x = 0; + } + } + if (delta_x) + { + event.m_wheelAxis = wxMOUSE_WHEEL_HORIZONTAL; + event.m_wheelRotation = int(event.m_wheelDelta * delta_x); + if (!win->GTKProcessEvent(event)) + AdjustRangeValue(range_h, event.m_columnsPerAction * delta_x); + } + if (delta_y) + { + event.m_wheelAxis = wxMOUSE_WHEEL_VERTICAL; + event.m_wheelRotation = int(event.m_wheelDelta * -delta_y); + if (!win->GTKProcessEvent(event)) + AdjustRangeValue(range_v, event.m_linesPerAction * delta_y); + } + return true; #endif // GTK_CHECK_VERSION(3,4,0) + } GtkRange *range; - switch (gdk_event->direction) + double step; + switch (direction) { case GDK_SCROLL_UP: case GDK_SCROLL_DOWN: - range = win->m_scrollBar[wxWindow::ScrollDir_Vert]; + range = range_v; event.m_wheelAxis = wxMOUSE_WHEEL_VERTICAL; + step = event.m_linesPerAction; break; case GDK_SCROLL_LEFT: case GDK_SCROLL_RIGHT: - range = win->m_scrollBar[wxWindow::ScrollDir_Horz]; + range = range_h; event.m_wheelAxis = wxMOUSE_WHEEL_HORIZONTAL; + step = event.m_columnsPerAction; break; default: return false; } event.m_wheelRotation = event.m_wheelDelta; - if (gdk_event->direction == GDK_SCROLL_DOWN || - gdk_event->direction == GDK_SCROLL_LEFT) - { + if (direction == GDK_SCROLL_DOWN || direction == GDK_SCROLL_LEFT) event.m_wheelRotation = -event.m_wheelRotation; - } - event.m_linesPerAction = GetWheelScrollActionDelta(range); - event.m_columnsPerAction = event.m_linesPerAction; - return win->GTKProcessEvent(event); -} - -#if GTK_CHECK_VERSION(3,4,0) -static gboolean -hscrollbar_scroll_event(GtkWidget* widget, GdkEventScroll* gdk_event, wxWindow* win) -{ - GdkEventScroll event2; - if (gdk_event->direction == GDK_SCROLL_SMOOTH && gdk_event->delta_x == 0) + if (!win->GTKProcessEvent(event)) { - memcpy(&event2, gdk_event, sizeof(event2)); - event2.delta_x = event2.delta_y; - event2.delta_y = 0; - gdk_event = &event2; - } - return window_scroll_event(widget, gdk_event, win); -} + if (!range) + return false; -static gboolean -vscrollbar_scroll_event(GtkWidget* widget, GdkEventScroll* gdk_event, wxWindow* win) -{ - GdkEventScroll event2; - if (gdk_event->direction == GDK_SCROLL_SMOOTH && gdk_event->delta_y == 0) - { - memcpy(&event2, gdk_event, sizeof(event2)); - event2.delta_y = event2.delta_x; - event2.delta_x = 0; - gdk_event = &event2; + if (direction == GDK_SCROLL_UP || direction == GDK_SCROLL_LEFT) + step = -step; + AdjustRangeValue(range, step); } - return window_scroll_event(widget, gdk_event, win); + + return true; } -#endif // GTK_CHECK_VERSION(3,4,0) //----------------------------------------------------------------------------- // "popup-menu" @@ -2647,23 +2660,13 @@ void wxWindowGTK::ConnectWidget( GtkWidget *widget ) g_signal_connect (widget, "motion_notify_event", G_CALLBACK (gtk_window_motion_notify_callback), this); - g_signal_connect (widget, "scroll_event", - G_CALLBACK (window_scroll_event), this); - for (int i = 0; i < 2; i++) - { - GtkRange* range = m_scrollBar[i]; - if (range) - { -#if GTK_CHECK_VERSION(3,4,0) - GCallback cb = GCallback(i == ScrollDir_Horz - ? hscrollbar_scroll_event - : vscrollbar_scroll_event); -#else - GCallback cb = GCallback(window_scroll_event); -#endif - g_signal_connect(range, "scroll_event", cb, this); - } - } + g_signal_connect(widget, "scroll_event", G_CALLBACK(scroll_event), this); + GtkRange* range = m_scrollBar[ScrollDir_Horz]; + if (range) + g_signal_connect(range, "scroll_event", G_CALLBACK(scroll_event), this); + range = m_scrollBar[ScrollDir_Vert]; + if (range) + g_signal_connect(range, "scroll_event", G_CALLBACK(scroll_event), this); g_signal_connect (widget, "popup_menu", G_CALLBACK (wxgtk_window_popup_menu_callback), this); diff --git a/Externals/wxWidgets3/src/msw/app.cpp b/Externals/wxWidgets3/src/msw/app.cpp index cadcdaaead..9d9b1ce161 100644 --- a/Externals/wxWidgets3/src/msw/app.cpp +++ b/Externals/wxWidgets3/src/msw/app.cpp @@ -646,12 +646,6 @@ bool wxApp::Initialize(int& argc, wxChar **argv) SHInitExtraControls(); #endif -#ifndef __WXWINCE__ - // Don't show a message box if a function such as SHGetFileInfo - // fails to find a device. - SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX); -#endif - wxOleInitialize(); #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) diff --git a/Externals/wxWidgets3/src/msw/choice.cpp b/Externals/wxWidgets3/src/msw/choice.cpp index 26e4a8e135..6699e1e95b 100644 --- a/Externals/wxWidgets3/src/msw/choice.cpp +++ b/Externals/wxWidgets3/src/msw/choice.cpp @@ -436,7 +436,16 @@ void wxChoice::DoSetItemClientData(unsigned int n, void* clientData) void* wxChoice::DoGetItemClientData(unsigned int n) const { + // Before using GetLastError() below, ensure that we don't have a stale + // error code from a previous API call as CB_GETITEMDATA doesn't reset it + // in case of success, it only sets it if an error occurs. + SetLastError(ERROR_SUCCESS); + LPARAM rc = SendMessage(GetHwnd(), CB_GETITEMDATA, n, 0); + + // Notice that we must call GetLastError() to distinguish between a real + // error and successfully retrieving a previously stored client data value + // of CB_ERR (-1). if ( rc == CB_ERR && GetLastError() != ERROR_SUCCESS ) { wxLogLastError(wxT("CB_GETITEMDATA")); diff --git a/Externals/wxWidgets3/src/msw/combobox.cpp b/Externals/wxWidgets3/src/msw/combobox.cpp index cb0885892e..692c546654 100644 --- a/Externals/wxWidgets3/src/msw/combobox.cpp +++ b/Externals/wxWidgets3/src/msw/combobox.cpp @@ -228,36 +228,55 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam) case WM_CHAR: // for compatibility with wxTextCtrl, generate a special message // when Enter is pressed - if ( wParam == VK_RETURN ) + switch ( wParam ) { - if (SendMessage(GetHwnd(), CB_GETDROPPEDSTATE, 0, 0)) - return false; + case VK_RETURN: + { + if (SendMessage(GetHwnd(), CB_GETDROPPEDSTATE, 0, 0)) + return false; - wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId); + wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId); - const int sel = GetSelection(); - event.SetInt(sel); - event.SetString(GetValue()); - InitCommandEventWithItems(event, sel); + const int sel = GetSelection(); + event.SetInt(sel); + event.SetString(GetValue()); + InitCommandEventWithItems(event, sel); - if ( ProcessCommand(event) ) - { - // don't let the event through to the native control - // because it doesn't need it and may generate an annoying - // beep if it gets it - return true; - } + if ( ProcessCommand(event) ) + { + // don't let the event through to the native control + // because it doesn't need it and may generate an annoying + // beep if it gets it + return true; + } + } + break; + + case VK_TAB: + // If we have wxTE_PROCESS_ENTER style, we get all char + // events, including those for TAB which are usually used + // for keyboard navigation, but we should not process them + // unless we also have wxTE_PROCESS_TAB style. + if ( !HasFlag(wxTE_PROCESS_TAB) ) + { + int flags = 0; + if ( !wxIsShiftDown() ) + flags |= wxNavigationKeyEvent::IsForward; + if ( wxIsCtrlDown() ) + flags |= wxNavigationKeyEvent::WinChange; + if ( Navigate(flags) ) + return true; + } + break; } - // fall through, WM_CHAR is one of the message we should forward. + } - default: - if ( ShouldForwardFromEditToCombo(msg) ) - { - // For all the messages forward from the edit control the - // result is not used. - WXLRESULT result; - return MSWHandleMessage(&result, msg, wParam, lParam); - } + if ( ShouldForwardFromEditToCombo(msg) ) + { + // For all the messages forward from the edit control the + // result is not used. + WXLRESULT result; + return MSWHandleMessage(&result, msg, wParam, lParam); } return false; @@ -674,4 +693,22 @@ wxSize wxComboBox::DoGetSizeFromTextSize(int xlen, int ylen) const return tsize; } +wxWindow *wxComboBox::MSWFindItem(long id, WXHWND hWnd) const +{ + // The base class version considers that any window with the same ID as + // this one must be this window itself, but this is not the case for the + // comboboxes where the native control seems to always use the ID of 1000 + // for the popup listbox that it creates -- and this ID may be the same as + // our own one. So we must explicitly check the HWND value too here and + // avoid eating the events from the listbox as otherwise it is rendered + // inoperative, see #15647. + if ( id == GetId() && hWnd && hWnd != GetHWND() ) + { + // Must be the case described above. + return NULL; + } + + return wxChoice::MSWFindItem(id, hWnd); +} + #endif // wxUSE_COMBOBOX diff --git a/Externals/wxWidgets3/src/msw/control.cpp b/Externals/wxWidgets3/src/msw/control.cpp index 1fe94bab92..4bb6ae8423 100644 --- a/Externals/wxWidgets3/src/msw/control.cpp +++ b/Externals/wxWidgets3/src/msw/control.cpp @@ -442,6 +442,15 @@ WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC) GetHWND()); } +wxWindow* wxControl::MSWFindItem(long id, WXHWND hWnd) const +{ + // is it us or one of our "internal" children? + if ( id == GetId() || (GetSubcontrols().Index(id) != wxNOT_FOUND) ) + return const_cast(this); + + return wxControlBase::MSWFindItem(id, hWnd); +} + // ---------------------------------------------------------------------------- // wxControlWithItems // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/msw/crashrpt.cpp b/Externals/wxWidgets3/src/msw/crashrpt.cpp index c9d45cb191..8f97402bc6 100644 --- a/Externals/wxWidgets3/src/msw/crashrpt.cpp +++ b/Externals/wxWidgets3/src/msw/crashrpt.cpp @@ -226,7 +226,9 @@ bool wxCrashReportImpl::Generate(int flags, EXCEPTION_POINTERS *ep) } else // dbghelp.dll couldn't be loaded { - Output(wxT("%s"), wxDbgHelpDLL::GetErrorMessage().c_str()); + Output(wxT("%s"), static_cast( + wxDbgHelpDLL::GetErrorMessage().c_str() + )); } #else // !wxUSE_DBGHELP wxUnusedVar(flags); diff --git a/Externals/wxWidgets3/src/msw/datectrl.cpp b/Externals/wxWidgets3/src/msw/datectrl.cpp index cf85692bb7..987edd1fd8 100644 --- a/Externals/wxWidgets3/src/msw/datectrl.cpp +++ b/Externals/wxWidgets3/src/msw/datectrl.cpp @@ -91,11 +91,15 @@ WXDWORD wxDatePickerCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const // TODO: handle WM_WININICHANGE +#if wxUSE_INTL + wxLocaleInfo wxDatePickerCtrl::MSWGetFormat() const { return wxLOCALE_SHORT_DATE_FMT; } +#endif // wxUSE_INTL + // ---------------------------------------------------------------------------- // wxDatePickerCtrl operations // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/msw/datetimectrl.cpp b/Externals/wxWidgets3/src/msw/datetimectrl.cpp index c9b4449686..408feab3eb 100644 --- a/Externals/wxWidgets3/src/msw/datetimectrl.cpp +++ b/Externals/wxWidgets3/src/msw/datetimectrl.cpp @@ -110,8 +110,12 @@ wxSize wxDateTimePickerCtrl::DoGetBestSize() const { wxClientDC dc(const_cast(this)); - // Use the same native format as this as the underlying native control. + // Use the same native format as the underlying native control. +#if wxUSE_INTL wxString s = wxDateTime::Now().Format(wxLocale::GetInfo(MSWGetFormat())); +#else // !wxUSE_INTL + wxString s("XXX-YYY-ZZZZ"); +#endif // wxUSE_INTL/!wxUSE_INTL // the best size for the control is bigger than just the string // representation of the current value because the control must accommodate diff --git a/Externals/wxWidgets3/src/msw/dc.cpp b/Externals/wxWidgets3/src/msw/dc.cpp index 779e750e0c..97a4da07fc 100644 --- a/Externals/wxWidgets3/src/msw/dc.cpp +++ b/Externals/wxWidgets3/src/msw/dc.cpp @@ -148,7 +148,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, #endif // wxHAS_RAW_BITMAP -namespace wxMSW +namespace wxMSWImpl { // Wrappers for the dynamically loaded {Set,Get}Layout() functions. They work @@ -162,7 +162,7 @@ DWORD SetLayout(HDC hdc, DWORD dwLayout); // temporary compatible memory DC to the real target DC) using the same layout. HDC CreateCompatibleDCWithLayout(HDC hdc); -} // namespace wxMSW +} // namespace wxMSWImpl // ---------------------------------------------------------------------------- // private classes @@ -1341,7 +1341,7 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool #endif // wxUSE_SYSTEM_OPTIONS { HDC cdc = GetHdc(); - HDC hdcMem = wxMSW::CreateCompatibleDCWithLayout(cdc); + HDC hdcMem = wxMSWImpl::CreateCompatibleDCWithLayout(cdc); HGDIOBJ hOldBitmap = ::SelectObject(hdcMem, GetHbitmapOf(bmp)); #if wxUSE_PALETTE wxPalette *pal = bmp.GetPalette(); @@ -1382,7 +1382,7 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool else // no mask, just use BitBlt() { HDC cdc = GetHdc(); - HDC memdc = wxMSW::CreateCompatibleDCWithLayout( cdc ); + HDC memdc = wxMSWImpl::CreateCompatibleDCWithLayout( cdc ); HBITMAP hbitmap = (HBITMAP) bmp.GetHBITMAP( ); wxASSERT_MSG( hbitmap, wxT("bitmap is ok but HBITMAP is NULL?") ); @@ -2281,8 +2281,8 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, buffer_bmap = (HBITMAP) bitmapCacheEntry->m_bitmap; #else // !wxUSE_DC_CACHEING // create a temp buffer bitmap and DCs to access it and the mask - dc_mask = wxMSW::CreateCompatibleDCWithLayout(hdcSrc); - dc_buffer = wxMSW::CreateCompatibleDCWithLayout(GetHdc()); + dc_mask = wxMSWImpl::CreateCompatibleDCWithLayout(hdcSrc); + dc_buffer = wxMSWImpl::CreateCompatibleDCWithLayout(GetHdc()); buffer_bmap = ::CreateCompatibleBitmap(GetHdc(), dstWidth, dstHeight); #endif // wxUSE_DC_CACHEING/!wxUSE_DC_CACHEING HGDIOBJ hOldMaskBitmap = ::SelectObject(dc_mask, (HBITMAP) mask->GetMaskBitmap()); @@ -2595,7 +2595,7 @@ wxDCCacheEntry* wxMSWDCImpl::FindDCInCache(wxDCCacheEntry* notThis, WXHDC dc) node = node->GetNext(); } - WXHDC hDC = (WXHDC) wxMSW::CreateCompatibleDCWithLayout((HDC) dc); + WXHDC hDC = (WXHDC) wxMSWImpl::CreateCompatibleDCWithLayout((HDC) dc); if ( !hDC) { wxLogLastError(wxT("CreateCompatibleDC")); @@ -2827,7 +2827,7 @@ void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, #if wxUSE_DYNLIB_CLASS -namespace wxMSW +namespace wxMSWImpl { DWORD GetLayout(HDC hdc) @@ -2853,19 +2853,19 @@ HDC CreateCompatibleDCWithLayout(HDC hdc) HDC hdcNew = ::CreateCompatibleDC(hdc); if ( hdcNew ) { - DWORD dwLayout = wxMSW::GetLayout(hdc); + DWORD dwLayout = wxMSWImpl::GetLayout(hdc); if ( dwLayout != GDI_ERROR ) - wxMSW::SetLayout(hdcNew, dwLayout); + wxMSWImpl::SetLayout(hdcNew, dwLayout); } return hdcNew; } -} // namespace wxMSW +} // namespace wxMSWImpl wxLayoutDirection wxMSWDCImpl::GetLayoutDirection() const { - DWORD layout = wxMSW::GetLayout(GetHdc()); + DWORD layout = wxMSWImpl::GetLayout(GetHdc()); if ( layout == GDI_ERROR ) return wxLayout_Default; @@ -2882,7 +2882,7 @@ void wxMSWDCImpl::SetLayoutDirection(wxLayoutDirection dir) return; } - DWORD layout = wxMSW::GetLayout(GetHdc()); + DWORD layout = wxMSWImpl::GetLayout(GetHdc()); if ( layout == GDI_ERROR ) return; @@ -2891,13 +2891,13 @@ void wxMSWDCImpl::SetLayoutDirection(wxLayoutDirection dir) else layout &= ~LAYOUT_RTL; - wxMSW::SetLayout(GetHdc(), layout); + wxMSWImpl::SetLayout(GetHdc(), layout); } #else // !wxUSE_DYNLIB_CLASS // Provide stubs to avoid ifdefs in the code using these functions. -namespace wxMSW +namespace wxMSWImpl { DWORD GetLayout(HDC WXUNUSED(hdc)) @@ -2915,7 +2915,7 @@ HDC CreateCompatibleDCWithLayout(HDC hdc) return ::CreateCompatibleDC(hdc); } -} // namespace wxMSW +} // namespace wxMSWImpl // we can't provide RTL support without dynamic loading, so stub it out wxLayoutDirection wxMSWDCImpl::GetLayoutDirection() const diff --git a/Externals/wxWidgets3/src/msw/dirdlg.cpp b/Externals/wxWidgets3/src/msw/dirdlg.cpp index 620d74b8ea..cec2c85b7a 100644 --- a/Externals/wxWidgets3/src/msw/dirdlg.cpp +++ b/Externals/wxWidgets3/src/msw/dirdlg.cpp @@ -105,11 +105,11 @@ struct IModalWindow : public IUnknown #define FOS_FORCEFILESYSTEM 0x40 #endif -struct COMDLG_FILTERSPEC; +struct _COMDLG_FILTERSPEC; struct IFileDialog : public IModalWindow { - virtual HRESULT wxSTDCALL SetFileTypes(UINT, const COMDLG_FILTERSPEC*) = 0; + virtual HRESULT wxSTDCALL SetFileTypes(UINT, const _COMDLG_FILTERSPEC*) = 0; virtual HRESULT wxSTDCALL SetFileTypeIndex(UINT) = 0; virtual HRESULT wxSTDCALL GetFileTypeIndex(UINT*) = 0; virtual HRESULT wxSTDCALL Advise(IFileDialogEvents*, DWORD*) = 0; diff --git a/Externals/wxWidgets3/src/msw/dlmsw.cpp b/Externals/wxWidgets3/src/msw/dlmsw.cpp index 5957086cb4..a83e47788e 100644 --- a/Externals/wxWidgets3/src/msw/dlmsw.cpp +++ b/Externals/wxWidgets3/src/msw/dlmsw.cpp @@ -236,51 +236,7 @@ wxDynamicLibrary::RawLoad(const wxString& libname, int flags) if (flags & wxDL_GET_LOADED) return ::GetModuleHandle(libname.t_str()); - // Explicitly look in the same path as where the main wx HINSTANCE module - // is located (usually the executable or the DLL that uses wx). Normally - // this is automatically part of the default search path but in some cases - // it may not be, such as when the wxPython extension modules need to load - // a DLL, but the intperpreter executable is located elsewhere. Doing - // this allows us to always be able to dynamically load a DLL that is - // located at the same place as the wx modules. - wxString modpath, path; - ::GetModuleFileName(wxGetInstance(), - wxStringBuffer(modpath, MAX_PATH+1), - MAX_PATH); - - wxFileName::SplitPath(modpath, &path, NULL, NULL); - - typedef BOOL (WINAPI *SetDllDirectory_t)(LPCTSTR lpPathName); - - static SetDllDirectory_t s_pfnSetDllDirectory = (SetDllDirectory_t) -1; - - if ( s_pfnSetDllDirectory == (SetDllDirectory_t) -1 ) - { - /* - Should wxLoadedDLL ever not be used here (or rather, the - wxDL_GET_LOADED flag isn't used), infinite recursion will take - place (unless s_pfnSetDllDirectory is set to NULL here right - before loading the DLL). - */ - wxLoadedDLL dllKernel("kernel32.dll"); - - wxDL_INIT_FUNC_AW(s_pfn, SetDllDirectory, dllKernel); - } - - if (s_pfnSetDllDirectory) - { - s_pfnSetDllDirectory(path.t_str()); - } - - wxDllType handle = ::LoadLibrary(libname.t_str()); - - // reset the search path - if (s_pfnSetDllDirectory) - { - s_pfnSetDllDirectory(NULL); - } - - return handle; + return ::LoadLibrary(libname.t_str()); } /* static */ @@ -294,7 +250,7 @@ void *wxDynamicLibrary::RawGetSymbol(wxDllType handle, const wxString& name) { return (void *)::GetProcAddress(handle, #ifdef __WXWINCE__ - name.c_str() + name.t_str() #else name.ToAscii() #endif // __WXWINCE__ diff --git a/Externals/wxWidgets3/src/msw/fswatcher.cpp b/Externals/wxWidgets3/src/msw/fswatcher.cpp index 7546f03a48..d179f67155 100644 --- a/Externals/wxWidgets3/src/msw/fswatcher.cpp +++ b/Externals/wxWidgets3/src/msw/fswatcher.cpp @@ -231,6 +231,29 @@ bool wxIOCPThread::ReadEvents() if (!count && !watch && !overlapped) return false; + // if the thread got woken up but we got an empty packet it means that + // there was an overflow, too many events and not all could fit in + // the watch buffer. In this case, ReadDirectoryChangesW dumps the + // buffer. + if (!count && watch) + { + wxLogTrace(wxTRACE_FSWATCHER, "[iocp] Event queue overflowed: path=\"%s\"", + watch->GetPath()); + + if (watch->GetFlags() & wxFSW_EVENT_WARNING) + { + wxFileSystemWatcherEvent + overflowEvent(wxFSW_EVENT_WARNING, wxFSW_WARNING_OVERFLOW); + overflowEvent.SetPath(watch->GetPath()); + SendEvent(overflowEvent); + } + + // overflow is not a fatal error, we still want to get future events + // reissue the watch + (void) m_service->SetUpWatch(*watch); + return true; + } + // in case of spurious wakeup if (!count || !watch) return true; @@ -283,9 +306,10 @@ void wxIOCPThread::ProcessNativeEvents(wxVector& events) int flags = Native2WatcherFlags(nativeFlags); if (flags & wxFSW_EVENT_WARNING || flags & wxFSW_EVENT_ERROR) { - // TODO think about this...do we ever have any errors to report? - wxString errMsg = "Error occurred"; - wxFileSystemWatcherEvent event(flags, errMsg); + wxFileSystemWatcherEvent + event(flags, + flags & wxFSW_EVENT_ERROR ? wxFSW_WARNING_NONE + : wxFSW_WARNING_GENERAL); SendEvent(event); } // filter out ignored events and those not asked for. diff --git a/Externals/wxWidgets3/src/msw/listbox.cpp b/Externals/wxWidgets3/src/msw/listbox.cpp index e0f34e3637..4a452a16bf 100644 --- a/Externals/wxWidgets3/src/msw/listbox.cpp +++ b/Externals/wxWidgets3/src/msw/listbox.cpp @@ -304,6 +304,10 @@ bool wxListBox::IsSelected(int N) const void *wxListBox::DoGetItemClientData(unsigned int n) const { + // This is done here for the same reasons as in wxChoice method with the + // same name. + SetLastError(ERROR_SUCCESS); + LPARAM rc = SendMessage(GetHwnd(), LB_GETITEMDATA, n, 0); if ( rc == LB_ERR && GetLastError() != ERROR_SUCCESS ) { diff --git a/Externals/wxWidgets3/src/msw/mdi.cpp b/Externals/wxWidgets3/src/msw/mdi.cpp index 0645e4beb5..5a1aae5373 100644 --- a/Externals/wxWidgets3/src/msw/mdi.cpp +++ b/Externals/wxWidgets3/src/msw/mdi.cpp @@ -374,15 +374,19 @@ void wxMDIParentFrame::SetWindowMenu(wxMenu* menu) { if ( menu != m_windowMenu ) { - // notice that Remove/AddWindowMenu() are safe to call even when - // m_windowMenu is NULL - RemoveWindowMenu(); + // We may not be showing the window menu currently if we don't have any + // children, and in this case we shouldn't remove/add it back right now. + const bool hasWindowMenu = GetActiveChild() != NULL; + + if ( hasWindowMenu ) + RemoveWindowMenu(); delete m_windowMenu; m_windowMenu = menu; - AddWindowMenu(); + if ( hasWindowMenu ) + AddWindowMenu(); } #if wxUSE_ACCEL diff --git a/Externals/wxWidgets3/src/msw/menu.cpp b/Externals/wxWidgets3/src/msw/menu.cpp index f2bcc2000e..2b65c0142b 100644 --- a/Externals/wxWidgets3/src/msw/menu.cpp +++ b/Externals/wxWidgets3/src/msw/menu.cpp @@ -558,7 +558,13 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) pItem->GetBackgroundColour().IsOk() || pItem->GetFont().IsOk(); - if ( !mustUseOwnerDrawn ) + // Windows XP or earlier don't display menu bitmaps bigger than + // standard size correctly (they're truncated), so we must use + // owner-drawn items to show them correctly there. OTOH Win7 + // doesn't seem to have any problems with even very large bitmaps + // so don't use owner-drawn items unnecessarily there (Vista wasn't + // actually tested but I assume it works as 7 rather than as XP). + if ( !mustUseOwnerDrawn && winver < wxWinVersion_Vista ) { const wxBitmap& bmpUnchecked = pItem->GetBitmap(false), bmpChecked = pItem->GetBitmap(true); @@ -731,11 +737,13 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) return false; } +#if wxUSE_OWNER_DRAWN if ( makeItemOwnerDrawn ) { SetOwnerDrawnMenuItem(GetHmenu(), pos, reinterpret_cast(pItem), TRUE); } +#endif } @@ -785,9 +793,6 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) node = node->GetNext(); } - // DoRemove() (unlike Remove) can only be called for an existing item! - wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") ); - #if wxUSE_ACCEL // remove the corresponding accel from the accel table int n = FindAccel(item->GetId()); @@ -1359,10 +1364,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) (GetHmenu() != 0); #endif - int mswpos = (!isAttached || (pos == m_menus.GetCount())) - ? -1 // append the menu - : MSWPositionForWxMenu(GetMenu(pos),pos); - if ( !wxMenuBarBase::Insert(pos, menu, title) ) return false; @@ -1390,9 +1391,33 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) wxLogLastError(wxT("TB_INSERTBUTTON")); return false; } - wxUnusedVar(mswpos); #else - if ( !::InsertMenu(GetHmenu(), mswpos, + // We have a problem with the index if there is an extra "Window" menu + // in this menu bar, which is added by wxMDIParentFrame to it directly + // using Windows API (so that it remains invisible to the user code), + // but which does affect the indices of the items we insert after it. + // So we check if any of the menus before the insertion position is a + // foreign one and adjust the insertion index accordingly. + int mswExtra = 0; + + // Skip all this if the total number of menus matches (notice that the + // internal menu count has already been incremented by wxMenuBarBase:: + // Insert() call above, hence -1). + int mswCount = ::GetMenuItemCount(GetHmenu()); + if ( mswCount != -1 && + static_cast(mswCount) != GetMenuCount() - 1 ) + { + wxMenuList::compatibility_iterator node = m_menus.GetFirst(); + for ( size_t n = 0; n < pos; n++ ) + { + if ( ::GetSubMenu(GetHmenu(), n) != GetHmenuOf(node->GetData()) ) + mswExtra++; + else + node = node->GetNext(); + } + } + + if ( !::InsertMenu(GetHmenu(), pos + mswExtra, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR)GetHmenuOf(menu), title.t_str()) ) { diff --git a/Externals/wxWidgets3/src/msw/msgdlg.cpp b/Externals/wxWidgets3/src/msw/msgdlg.cpp index e44ca16d1a..02da8a94d8 100644 --- a/Externals/wxWidgets3/src/msw/msgdlg.cpp +++ b/Externals/wxWidgets3/src/msw/msgdlg.cpp @@ -586,9 +586,7 @@ int wxMessageDialog::ShowMessageBox() // do show the dialog int msAns = MessageBox(hWnd, message.t_str(), m_caption.t_str(), msStyle); - int ret = MSWTranslateReturnCode(msAns); - SetReturnCode(ret); - return ret; + return MSWTranslateReturnCode(msAns); } int wxMessageDialog::ShowModal() @@ -623,9 +621,7 @@ int wxMessageDialog::ShowModal() msAns = IDOK; } - int ret = MSWTranslateReturnCode(msAns); - SetReturnCode(ret); - return ret; + return MSWTranslateReturnCode( msAns ); } #endif // wxHAS_MSW_TASKDIALOG diff --git a/Externals/wxWidgets3/src/msw/ole/automtn.cpp b/Externals/wxWidgets3/src/msw/ole/automtn.cpp index b3f5f72e4a..1c3bd0a2b9 100644 --- a/Externals/wxWidgets3/src/msw/ole/automtn.cpp +++ b/Externals/wxWidgets3/src/msw/ole/automtn.cpp @@ -70,6 +70,7 @@ wxAutomationObject::wxAutomationObject(WXIDISPATCH* dispatchPtr) { m_dispatchPtr = dispatchPtr; m_lcid = LOCALE_SYSTEM_DEFAULT; + m_convertVariantFlags = wxOleConvertVariant_Default; } wxAutomationObject::~wxAutomationObject() @@ -214,7 +215,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, if (vReturnPtr) { // Convert result to wxVariant form - if (!wxConvertOleToVariant(vReturn, retValue)) + if (!wxConvertOleToVariant(vReturn, retValue, m_convertVariantFlags)) return false; // Mustn't release the dispatch pointer if (vReturn.vt == VT_DISPATCH) @@ -474,6 +475,7 @@ bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& prop { obj.SetDispatchPtr(dispatch); obj.SetLCID(GetLCID()); + obj.SetConvertVariantFlags(GetConvertVariantFlags()); return true; } else @@ -488,6 +490,7 @@ bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& prop { obj.SetDispatchPtr(dispatch); obj.SetLCID(GetLCID()); + obj.SetConvertVariantFlags(GetConvertVariantFlags()); return true; } else @@ -607,6 +610,17 @@ void wxAutomationObject::SetLCID(LCID lcid) m_lcid = lcid; } +long wxAutomationObject::GetConvertVariantFlags() const +{ + return m_convertVariantFlags; +} + +void wxAutomationObject::SetConvertVariantFlags(long flags) +{ + m_convertVariantFlags = flags; +} + + static void ShowException(const wxString& member, HRESULT hr, diff --git a/Externals/wxWidgets3/src/msw/ole/dataobj.cpp b/Externals/wxWidgets3/src/msw/ole/dataobj.cpp index 510aa9d574..2055a0a0de 100644 --- a/Externals/wxWidgets3/src/msw/ole/dataobj.cpp +++ b/Externals/wxWidgets3/src/msw/ole/dataobj.cpp @@ -77,12 +77,19 @@ wxDataFormat HtmlFormatFixup(wxDataFormat format) // format does not match the native constant in the way other formats do, // so for the format checks below to work, we must change the native // id to the wxDF_HTML constant. - wxChar s_szBuf[256]; - if (::GetClipboardFormatName(format, s_szBuf, WXSIZEOF(s_szBuf))) + // + // But skip this for the standard constants which are never going to match + // wxDF_HTML anyhow. + if ( !format.IsStandard() ) { - if (s_szBuf == wxString("HTML Format")) - format = wxDF_HTML; + wxChar szBuf[256]; + if ( ::GetClipboardFormatName(format, szBuf, WXSIZEOF(szBuf)) ) + { + if ( wxStrcmp(szBuf, wxT("HTML Format")) == 0 ) + format = wxDF_HTML; + } } + return format; } @@ -342,6 +349,26 @@ wxIDataObject::SaveSystemData(FORMATETC *pformatetc, // wxDataFormat // ---------------------------------------------------------------------------- +bool wxDataFormat::operator==(wxDataFormatId format) const +{ + return HtmlFormatFixup(*this).m_format == (NativeFormat)format; +} + +bool wxDataFormat::operator!=(wxDataFormatId format) const +{ + return !(*this == format); +} + +bool wxDataFormat::operator==(const wxDataFormat& format) const +{ + return HtmlFormatFixup(*this).m_format == HtmlFormatFixup(format).m_format; +} + +bool wxDataFormat::operator!=(const wxDataFormat& format) const +{ + return !(*this == format); +} + void wxDataFormat::SetId(const wxString& format) { m_format = (wxDataFormat::NativeFormat)::RegisterClipboardFormat(format.t_str()); diff --git a/Externals/wxWidgets3/src/msw/ole/oleutils.cpp b/Externals/wxWidgets3/src/msw/ole/oleutils.cpp index 57a7a6c2d7..ab4122e0aa 100644 --- a/Externals/wxWidgets3/src/msw/ole/oleutils.cpp +++ b/Externals/wxWidgets3/src/msw/ole/oleutils.cpp @@ -414,57 +414,53 @@ WXDLLEXPORT bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& ole #endif WXDLLEXPORT bool -wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) +wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant, long flags) { bool ok = true; if ( oleVariant.vt & VT_ARRAY ) { - // TODO: We currently return arrays as wxVariant of the list type - // containing the flattened form of array but we should allow - // getting it as wxVariantDataSafeArray instead. Doing this is - // simple, we'd just need to do something like this: - // - // if ( oleVariant.parray && SafeArrayGetDim(oleVariant.parray) > 1 ) - // { - // variant.SetData(new wxVariantDataSafeArray(oleVariant.parray)); - // } - // - // but currently we don't do it for compatibility reasons. - switch (oleVariant.vt & VT_TYPEMASK) + if ( flags & wxOleConvertVariant_ReturnSafeArrays ) { - case VT_I2: - ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); - break; - case VT_I4: - ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); - break; - case VT_R4: - ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); - break; - case VT_R8: - ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); - break; - case VT_VARIANT: - ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); - break; - case VT_BSTR: - { - wxArrayString strings; - if ( wxSafeArray::ConvertToArrayString(oleVariant.parray, strings) ) - variant = strings; - else - ok = false; - } - break; - default: - ok = false; - break; + variant.SetData(new wxVariantDataSafeArray(oleVariant.parray)); } - if ( !ok ) + else { - wxLogDebug(wxT("unhandled VT_ARRAY type %x in wxConvertOleToVariant"), - oleVariant.vt & VT_TYPEMASK); - variant = wxVariant(); + switch (oleVariant.vt & VT_TYPEMASK) + { + case VT_I2: + ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); + break; + case VT_I4: + ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); + break; + case VT_R4: + ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); + break; + case VT_R8: + ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); + break; + case VT_VARIANT: + ok = wxSafeArray::ConvertToVariant(oleVariant.parray, variant); + break; + case VT_BSTR: + { + wxArrayString strings; + if ( wxSafeArray::ConvertToArrayString(oleVariant.parray, strings) ) + variant = strings; + else + ok = false; + } + break; + default: + ok = false; + break; + } + if ( !ok ) + { + wxLogDebug(wxT("unhandled VT_ARRAY type %x in wxConvertOleToVariant"), + oleVariant.vt & VT_TYPEMASK); + variant = wxVariant(); + } } } else if ( oleVariant.vt & VT_BYREF ) diff --git a/Externals/wxWidgets3/src/msw/region.cpp b/Externals/wxWidgets3/src/msw/region.cpp index d8523a072f..846fff1e85 100644 --- a/Externals/wxWidgets3/src/msw/region.cpp +++ b/Externals/wxWidgets3/src/msw/region.cpp @@ -164,8 +164,7 @@ void wxRegion::Clear() bool wxRegion::DoOffset(wxCoord x, wxCoord y) { - const HRGN hrgn = GetHrgn(); - wxCHECK_MSG( hrgn, false, wxT("invalid wxRegion") ); + wxCHECK_MSG( GetHrgn(), false, wxT("invalid wxRegion") ); if ( !x && !y ) { @@ -175,7 +174,7 @@ bool wxRegion::DoOffset(wxCoord x, wxCoord y) AllocExclusive(); - if ( ::OffsetRgn(hrgn, x, y) == ERROR ) + if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR ) { wxLogLastError(wxT("OffsetRgn")); diff --git a/Externals/wxWidgets3/src/msw/sockmsw.cpp b/Externals/wxWidgets3/src/msw/sockmsw.cpp index 7bad1d450b..58557e4e6c 100644 --- a/Externals/wxWidgets3/src/msw/sockmsw.cpp +++ b/Externals/wxWidgets3/src/msw/sockmsw.cpp @@ -191,7 +191,7 @@ wxDynamicLibrary wxSocketMSWManager::gs_wsock32dll; bool wxSocketMSWManager::OnInit() { - static LPCTSTR pclassname = NULL; + LPCTSTR pclassname = NULL; int i; /* Create internal window for event notifications */ diff --git a/Externals/wxWidgets3/src/msw/stattext.cpp b/Externals/wxWidgets3/src/msw/stattext.cpp index de04f2084f..1eb8b24acd 100644 --- a/Externals/wxWidgets3/src/msw/stattext.cpp +++ b/Externals/wxWidgets3/src/msw/stattext.cpp @@ -110,24 +110,20 @@ wxSize wxStaticText::DoGetBestClientSize() const widthTextMax += 2; #endif // __WXWINCE__ - // It looks like the static control needs "slightly" more vertical space - // than the character height and while the text isn't actually truncated if - // we use just the minimal height, it is positioned differently than when - // the control has enough space and this result in the text in edit and - // static controls not being aligned when the controls themselves are. As - // this is something you really should be able to count on, increase the - // space allocated for the control so that the base lines do align - // correctly. Notice that while the above is true at least for the single - // line controls, there doesn't seem to do any harm to allocate two extra - // pixels in multi-line case neither so do it always for consistency. + // This extra pixel is a hack we use to ensure that a wxStaticText + // vertically centered around the same position as a wxTextCtrl shows its + // text on exactly the same baseline. It is not clear why is this needed + // nor even whether this works in all cases, but it does work, at least + // with the default fonts, under Windows XP, 7 and 8, so just use it for + // now. // - // I still have no idea why exactly is this needed nor why should we use 2 - // and not something else. This seems to work in all the configurations - // though (small/large fonts, different OS versions, ...) so just hard code - // it for now. If we need something better later it might be worth looking - // at the height of the text control returned by ::GetComboBoxInfo() as it - // seems to be the "minimal acceptable" height. - heightTextTotal += 2; + // In the future we really ought to provide a way for each of the controls + // to provide information about the position of the baseline for the text + // it shows and use this information in the sizer code when centering the + // controls vertically, otherwise we simply can't ensure that the text is + // always on the same line, e.g. even with this hack wxComboBox text is + // still not aligned to the same position. + heightTextTotal += 1; return wxSize(widthTextMax, heightTextTotal); } diff --git a/Externals/wxWidgets3/src/msw/textentry.cpp b/Externals/wxWidgets3/src/msw/textentry.cpp index 3577581ce2..d8a411ebc4 100644 --- a/Externals/wxWidgets3/src/msw/textentry.cpp +++ b/Externals/wxWidgets3/src/msw/textentry.cpp @@ -916,7 +916,7 @@ void wxTextEntry::SetMaxLength(unsigned long len) bool wxTextEntry::SetHint(const wxString& hint) { - if ( wxUxThemeEngine::GetIfActive() ) + if ( wxGetWinVersion() >= wxWinVersion_Vista && wxUxThemeEngine::GetIfActive() ) { // notice that this message always works with Unicode strings // diff --git a/Externals/wxWidgets3/src/msw/timectrl.cpp b/Externals/wxWidgets3/src/msw/timectrl.cpp index e87e1e0a6b..1a39cb4cdf 100644 --- a/Externals/wxWidgets3/src/msw/timectrl.cpp +++ b/Externals/wxWidgets3/src/msw/timectrl.cpp @@ -45,11 +45,15 @@ WXDWORD wxTimePickerCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const return styleMSW; } +#if wxUSE_INTL + wxLocaleInfo wxTimePickerCtrl::MSWGetFormat() const { return wxLOCALE_TIME_FMT; } +#endif // wxUSE_INTL + bool wxTimePickerCtrl::MSWOnDateTimeChange(const NMDATETIMECHANGE& dtch) { m_date.SetFromMSWSysTime(dtch.st); diff --git a/Externals/wxWidgets3/src/msw/treectrl.cpp b/Externals/wxWidgets3/src/msw/treectrl.cpp index 54211597c1..8f664ffa2f 100644 --- a/Externals/wxWidgets3/src/msw/treectrl.cpp +++ b/Externals/wxWidgets3/src/msw/treectrl.cpp @@ -1598,6 +1598,18 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent, return DoInsertAfter(parent, idPrev, text, image, selectedImage, data); } +bool wxTreeCtrl::MSWDeleteItem(const wxTreeItemId& item) +{ + TempSetter set(m_changingSelection); + if ( !TreeView_DeleteItem(GetHwnd(), HITEM(item)) ) + { + wxLogLastError(wxT("TreeView_DeleteItem")); + return false; + } + + return true; +} + void wxTreeCtrl::Delete(const wxTreeItemId& item) { // unlock tree selections on vista, without this the @@ -1619,14 +1631,8 @@ void wxTreeCtrl::Delete(const wxTreeItemId& item) } } - { - TempSetter set(m_changingSelection); - if ( !TreeView_DeleteItem(GetHwnd(), HITEM(item)) ) - { - wxLogLastError(wxT("TreeView_DeleteItem")); - return; - } - } + if ( !MSWDeleteItem(item) ) + return; if ( !selected ) { @@ -1657,10 +1663,7 @@ void wxTreeCtrl::Delete(const wxTreeItemId& item) } else { - if ( !TreeView_DeleteItem(GetHwnd(), HITEM(item)) ) - { - wxLogLastError(wxT("TreeView_DeleteItem")); - } + MSWDeleteItem(item); } } diff --git a/Externals/wxWidgets3/src/msw/utils.cpp b/Externals/wxWidgets3/src/msw/utils.cpp index 0610186a21..59adbbe3cc 100644 --- a/Externals/wxWidgets3/src/msw/utils.cpp +++ b/Externals/wxWidgets3/src/msw/utils.cpp @@ -1301,6 +1301,18 @@ wxString wxGetOsDescription() ? _("Windows Server 2008 R2") : _("Windows 7"); break; + + case 2: + str = wxIsWindowsServer() == 1 + ? _("Windows Server 2012") + : _("Windows 8"); + break; + + case 3: + str = wxIsWindowsServer() == 1 + ? _("Windows Server 2012 R2") + : _("Windows 8.1"); + break; } break; } diff --git a/Externals/wxWidgets3/src/msw/utilsexc.cpp b/Externals/wxWidgets3/src/msw/utilsexc.cpp index 5eb38a2fc9..82c7649972 100644 --- a/Externals/wxWidgets3/src/msw/utilsexc.cpp +++ b/Externals/wxWidgets3/src/msw/utilsexc.cpp @@ -51,7 +51,6 @@ #endif #if defined(__GNUWIN32__) - #include #include #endif diff --git a/Externals/wxWidgets3/src/msw/window.cpp b/Externals/wxWidgets3/src/msw/window.cpp index a08d1fa2ab..225e13d531 100644 --- a/Externals/wxWidgets3/src/msw/window.cpp +++ b/Externals/wxWidgets3/src/msw/window.cpp @@ -365,30 +365,21 @@ END_EVENT_TABLE() // --------------------------------------------------------------------------- // Find an item given the MS Windows id -wxWindow *wxWindowMSW::FindItem(long id) const +wxWindow *wxWindowMSW::FindItem(long id, WXHWND hWnd) const { -#if wxUSE_CONTROLS - wxControl *item = wxDynamicCastThis(wxControl); - if ( item ) - { - // is it us or one of our "internal" children? - if ( item->GetId() == id -#ifndef __WXUNIVERSAL__ - || (item->GetSubcontrols().Index(id) != wxNOT_FOUND) -#endif // __WXUNIVERSAL__ - ) - { - return item; - } - } -#endif // wxUSE_CONTROLS + // First check for the control itself and its Windows-level children which + // are mapped to the same wxWindow at wx level. + wxWindow *wnd = MSWFindItem(id, hWnd); + if ( wnd ) + return wnd; + // Then check wx level children. wxWindowList::compatibility_iterator current = GetChildren().GetFirst(); while (current) { wxWindow *childWin = current->GetData(); - wxWindow *wnd = childWin->FindItem(id); + wnd = childWin->FindItem(id, hWnd); if ( wnd ) return wnd; @@ -675,7 +666,8 @@ wxWindowMSW::MSWShowWithEffect(bool show, unsigned timeout) { #if wxUSE_DYNLIB_CLASS - if ( effect == wxSHOW_EFFECT_NONE ) + if ( effect == wxSHOW_EFFECT_NONE || + (GetParent() && !GetParent()->IsShownOnScreen()) ) return Show(show); if ( !wxWindowBase::Show(show) ) @@ -2303,12 +2295,14 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) { // wxUniversal implements tab traversal itself #ifndef __WXUNIVERSAL__ - // Notice that we check for WS_EX_CONTROLPARENT and not wxTAB_TRAVERSAL - // here. While usually they are both set or both unset, doing it like this - // also works if there is ever a bug that results in wxTAB_TRAVERSAL being - // set but not WS_EX_CONTROLPARENT as we must not call IsDialogMessage() in - // this case, it would simply hang (see #15458). - if ( m_hWnd != 0 && (wxGetWindowExStyle(this) & WS_EX_CONTROLPARENT) ) + // Notice that we check for both wxTAB_TRAVERSAL and WS_EX_CONTROLPARENT + // being set here. While normally the latter should always be set if the + // former is, doing it like this also works if there is ever a bug that + // results in wxTAB_TRAVERSAL being set but not WS_EX_CONTROLPARENT as we + // must not call IsDialogMessage() then, it would simply hang (see #15458). + if ( m_hWnd && + HasFlag(wxTAB_TRAVERSAL) && + (wxGetWindowExStyle(this) & WS_EX_CONTROLPARENT) ) { // intercept dialog navigation keys MSG *msg = (MSG *)pMsg; @@ -4049,7 +4043,10 @@ bool wxWindowMSW::HandleActivate(int state, { wxActivateEvent event(wxEVT_ACTIVATE, (state == WA_ACTIVE) || (state == WA_CLICKACTIVE), - m_windowId); + m_windowId, + state == WA_CLICKACTIVE + ? wxActivateEvent::Reason_Mouse + : wxActivateEvent::Reason_Unknown); event.SetEventObject(this); return HandleWindowEvent(event); @@ -5318,7 +5315,7 @@ bool wxWindowMSW::HandleCommand(WXWORD id_, WXWORD cmd, WXHWND control) // try the id if ( !win ) { - win = FindItem(id); + win = FindItem(id, control); } if ( win ) diff --git a/Externals/wxWidgets3/src/osx/bmpbuttn_osx.cpp b/Externals/wxWidgets3/src/osx/bmpbuttn_osx.cpp index 581ddd0865..fcc4b9ccf2 100644 --- a/Externals/wxWidgets3/src/osx/bmpbuttn_osx.cpp +++ b/Externals/wxWidgets3/src/osx/bmpbuttn_osx.cpp @@ -66,7 +66,7 @@ wxSize wxBitmapButton::DoGetBestSize() const if ( GetBitmapLabel().IsOk() ) { - best += GetBitmapLabel().GetSize(); + best += GetBitmapLabel().GetScaledSize(); } return best; diff --git a/Externals/wxWidgets3/src/osx/carbon/app.cpp b/Externals/wxWidgets3/src/osx/carbon/app.cpp index 30e3ba48be..1a3d426aaa 100644 --- a/Externals/wxWidgets3/src/osx/carbon/app.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/app.cpp @@ -229,6 +229,8 @@ short wxApp::MacHandleAEPDoc(const WXEVENTREF event , WXEVENTREF WXUNUSED(reply) wxString fName ; FSRef theRef ; + + wxArrayString fileNames; for (i = 1; i <= itemsInList; i++) { @@ -240,9 +242,10 @@ short wxApp::MacHandleAEPDoc(const WXEVENTREF event , WXEVENTREF WXUNUSED(reply) return err; fName = wxMacFSRefToPath( &theRef ) ; - - MacPrintFile(fName); + fileNames.Add( fName ); } + + MacPrintFiles(fileNames); return noErr; } @@ -307,6 +310,16 @@ void wxApp::MacOpenURL(const wxString & WXUNUSED(url) ) { } +void wxApp::MacPrintFiles(const wxArrayString & fileNames ) +{ + size_t i; + const size_t fileCount = fileNames.GetCount(); + for (i = 0; i < fileCount; i++) + { + MacPrintFile(fileNames[i]); + } +} + void wxApp::MacPrintFile(const wxString & fileName ) { #if wxUSE_DOC_VIEW_ARCHITECTURE @@ -403,7 +416,6 @@ void wxApp::MacReopenApp() #if wxOSX_USE_COCOA_OR_IPHONE void wxApp::OSXOnWillFinishLaunching() { - m_onInitResult = OnInit(); } void wxApp::OSXOnDidFinishLaunching() diff --git a/Externals/wxWidgets3/src/osx/carbon/dataview.cpp b/Externals/wxWidgets3/src/osx/carbon/dataview.cpp index 72edcc6144..66781a9e74 100644 --- a/Externals/wxWidgets3/src/osx/carbon/dataview.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/dataview.cpp @@ -155,9 +155,7 @@ static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDes (columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) || (columnDescription.propertyDesc.propertyType == kDataBrowserTextType)) columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; -#endif // set header's properties: columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; columnDescription.headerBtnDesc.titleOffset = 0; diff --git a/Externals/wxWidgets3/src/osx/carbon/dcscreen.cpp b/Externals/wxWidgets3/src/osx/carbon/dcscreen.cpp index 81761d364d..e738a13e58 100644 --- a/Externals/wxWidgets3/src/osx/carbon/dcscreen.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/dcscreen.cpp @@ -91,7 +91,7 @@ wxBitmap wxScreenDCImpl::DoGetAsBitmap(const wxRect *subrect) const CGImageRef image = NULL; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - if ( UMAGetSystemVersion() >= 10.6) + if ( UMAGetSystemVersion() >= 0x1060) { image = CGDisplayCreateImage(kCGDirectMainDisplay); } diff --git a/Externals/wxWidgets3/src/osx/carbon/font.cpp b/Externals/wxWidgets3/src/osx/carbon/font.cpp index ce2de44c54..c3ad61eb15 100644 --- a/Externals/wxWidgets3/src/osx/carbon/font.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/font.cpp @@ -50,11 +50,9 @@ public: wxFontRefData(wxOSXSystemFont font, int size); -#if wxOSX_USE_CORE_TEXT wxFontRefData( wxUint32 coreTextFontType ); wxFontRefData( CTFontRef font ); wxFontRefData( CTFontDescriptorRef fontdescriptor, int size ); -#endif virtual ~wxFontRefData(); @@ -146,9 +144,6 @@ public: protected: // common part of all ctors void Init(); -#if wxOSX_USE_CORE_TEXT - // void Init( CTFontRef font ); -#endif public: bool m_fontValid; #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT @@ -156,9 +151,7 @@ public: // information here, as this speeds up and optimizes rendering ThemeFontID m_macThemeFontID ; #endif -#if wxOSX_USE_CORE_TEXT wxCFRef m_ctFont; -#endif #if wxOSX_USE_ATSU_TEXT void CreateATSUFont(); @@ -184,9 +177,7 @@ wxFontRefData::wxFontRefData(const wxFontRefData& data) : wxGDIRefData() #if wxOSX_USE_CARBON && wxOSX_USE_ATSU_TEXT m_macThemeFontID = data.m_macThemeFontID; #endif -#if wxOSX_USE_CORE_TEXT m_ctFont = data.m_ctFont; -#endif m_cgFont = data.m_cgFont; #if wxOSX_USE_ATSU_TEXT if ( data.m_macATSUStyle != NULL ) @@ -236,9 +227,7 @@ wxFontRefData::~wxFontRefData() void wxFontRefData::Free() { -#if wxOSX_USE_CORE_TEXT m_ctFont.reset(); -#endif m_cgFont.reset(); #if wxOSX_USE_ATSU_TEXT #if wxOSX_USE_CARBON @@ -272,7 +261,6 @@ wxFontRefData::wxFontRefData(wxOSXSystemFont font, int size) wxASSERT( font != wxOSX_SYSTEM_FONT_NONE ); Init(); -#if wxOSX_USE_CORE_TEXT { CTFontUIFontType uifont = kCTFontSystemFontType; switch( font ) @@ -309,7 +297,6 @@ wxFontRefData::wxFontRefData(wxOSXSystemFont font, int size) descr.reset( CTFontCopyFontDescriptor( m_ctFont ) ); m_info.Init(descr); } -#endif #if wxOSX_USE_ATSU_TEXT { #if !wxOSX_USE_CARBON @@ -464,7 +451,6 @@ void wxFontRefData::MacFindFont() m_info.EnsureValid(); -#if wxOSX_USE_CORE_TEXT { CTFontSymbolicTraits traits = 0; @@ -527,8 +513,6 @@ void wxFontRefData::MacFindFont() m_cgFont.reset(CTFontCopyGraphicsFont(m_ctFont, NULL)); } - -#endif #if wxOSX_USE_ATSU_TEXT CreateATSUFont(); #endif @@ -543,12 +527,8 @@ void wxFontRefData::MacFindFont() bool wxFontRefData::IsFixedWidth() const { -#if wxOSX_USE_CORE_TEXT CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(m_ctFont); return (traits & kCTFontMonoSpaceTrait) != 0; -#else - return false; -#endif } // ---------------------------------------------------------------------------- @@ -852,8 +832,6 @@ wxUint32 wxFont::MacGetATSUAdditionalQDStyles() const } #endif -#if wxOSX_USE_CORE_TEXT - CTFontRef wxFont::OSXGetCTFont() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); @@ -864,8 +842,6 @@ CTFontRef wxFont::OSXGetCTFont() const return (CTFontRef)(M_FONTDATA->m_ctFont); } -#endif - #if wxOSX_USE_COCOA_OR_CARBON CGFontRef wxFont::OSXGetCGFont() const @@ -1005,7 +981,6 @@ void wxNativeFontInfo::Init() m_descriptorValid = false; } -#if wxOSX_USE_CORE_TEXT void wxNativeFontInfo::Init(CTFontDescriptorRef descr) { Init(); @@ -1028,7 +1003,6 @@ void wxNativeFontInfo::Init(CTFontDescriptorRef descr) wxCFStringRef familyName( (CFStringRef) CTFontDescriptorCopyAttribute(descr, kCTFontFamilyNameAttribute)); m_faceName = familyName.AsString(); } -#endif void wxNativeFontInfo::EnsureValid() { diff --git a/Externals/wxWidgets3/src/osx/carbon/fontdlg.cpp b/Externals/wxWidgets3/src/osx/carbon/fontdlg.cpp index 57c8ab45dd..b2a4013620 100644 --- a/Externals/wxWidgets3/src/osx/carbon/fontdlg.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/fontdlg.cpp @@ -76,7 +76,6 @@ wxMacCarbonFontPanelHandler(EventHandlerCallRef WXUNUSED(nextHandler), case kEventFontSelection : { bool setup = false ; -#if wxOSX_USE_CORE_TEXT if ( !setup ) { CTFontDescriptorRef descr; @@ -90,7 +89,6 @@ wxMacCarbonFontPanelHandler(EventHandlerCallRef WXUNUSED(nextHandler), setup = true; } } -#endif #if wxOSX_USE_ATSU_TEXT ATSUFontID fontId = 0 ; if ( !setup && (cEvent.GetParameter(kEventParamATSUFontID, &fontId) == noErr) ) @@ -240,24 +238,10 @@ int wxFontDialog::ShowModal() font = m_fontData.m_initialFont ; } - bool setup = false; -#if wxOSX_USE_CORE_TEXT - if ( !setup ) - { - CTFontDescriptorRef descr = (CTFontDescriptorRef) CTFontCopyFontDescriptor( (CTFontRef) font.OSXGetCTFont() ); - err = SetFontInfoForSelection (kFontSelectionCoreTextType,1, &descr , NULL); - CFRelease( descr ); - setup = true; - } -#endif -#if wxOSX_USE_ATSU_TEXT - if ( !setup ) - { - ATSUStyle style = (ATSUStyle)font.MacGetATSUStyle(); - err = SetFontInfoForSelection (kFontSelectionATSUIType,1, &style , NULL); - setup = true; - } -#endif + CTFontDescriptorRef descr = (CTFontDescriptorRef) CTFontCopyFontDescriptor( (CTFontRef) font.OSXGetCTFont() ); + err = SetFontInfoForSelection (kFontSelectionCoreTextType,1, &descr , NULL); + CFRelease( descr ); + // just clicking on ENTER will not send us any font setting event, therefore we have to make sure // that field is already correct m_fontData.m_chosenFont = font ; diff --git a/Externals/wxWidgets3/src/osx/carbon/glcanvas.cpp b/Externals/wxWidgets3/src/osx/carbon/glcanvas.cpp index cf8dd6b07d..7006d5e68f 100644 --- a/Externals/wxWidgets3/src/osx/carbon/glcanvas.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/glcanvas.cpp @@ -262,24 +262,7 @@ bool wxGLContext::SetCurrent(const wxGLCanvas& win) const const_cast(win).SetViewport(); - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if ( UMAGetSystemVersion() >= 0x1050 ) - { - aglSetWindowRef(m_glContext, win.MacGetTopLevelWindowRef()); - } - else -#endif - { - AGLDrawable drawable = (AGLDrawable)GetWindowPort( - MAC_WXHWND(win.MacGetTopLevelWindowRef())); - - if ( !aglSetDrawable(m_glContext, drawable) ) - { - wxLogAGLError("aglSetDrawable"); - return false; - } - } + aglSetWindowRef(m_glContext, win.MacGetTopLevelWindowRef()); return WXGLSetCurrentContext(m_glContext); } @@ -354,17 +337,7 @@ bool wxGLCanvas::Create(wxWindow *parent, m_bufferName = gCurrentBufferName++; aglSetInteger (m_dummyContext, AGL_BUFFER_NAME, &m_bufferName); -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if ( UMAGetSystemVersion() >= 0x1050 ) - { - aglSetWindowRef(m_dummyContext, MacGetTopLevelWindowRef()); - } - else -#endif - { - AGLDrawable drawable = (AGLDrawable)GetWindowPort(MAC_WXHWND(MacGetTopLevelWindowRef())); - aglSetDrawable(m_dummyContext, drawable); - } + aglSetWindowRef(m_dummyContext, MacGetTopLevelWindowRef()); m_macCanvasIsShown = true; diff --git a/Externals/wxWidgets3/src/osx/carbon/graphics.cpp b/Externals/wxWidgets3/src/osx/carbon/graphics.cpp index ff015c21d9..0fb0c50e22 100644 --- a/Externals/wxWidgets3/src/osx/carbon/graphics.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/graphics.cpp @@ -66,8 +66,6 @@ int UMAGetSystemVersion() } -#define wxOSX_USE_CORE_TEXT 1 - #endif #if wxOSX_USE_COCOA_OR_IPHONE @@ -78,10 +76,6 @@ extern void wxOSXUnlockFocus( WXWidget view) ; #endif #endif -#if 1 // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - -// TODO test whether this private API also works under 10.3 - // copying values from NSCompositingModes (see also webkit and cairo sources) typedef enum CGCompositeOperation { @@ -106,8 +100,6 @@ extern "C" CG_EXTERN void CGContextSetCompositeOperation (CGContextRef context, int operation); } ; -#endif - //----------------------------------------------------------------------------- // constants //----------------------------------------------------------------------------- @@ -152,8 +144,6 @@ CGColorRef wxMacCreateCGColor( const wxColour& col ) return retval; } -#if wxOSX_USE_CORE_TEXT - CTFontRef wxMacCreateCTFont( const wxFont& font ) { #ifdef __WXMAC__ @@ -163,8 +153,6 @@ CTFontRef wxMacCreateCTFont( const wxFont& font ) #endif } -#endif - // CGPattern wrapper class: always allocate on heap, never call destructor class wxMacCoreGraphicsPattern @@ -866,9 +854,7 @@ public: #if wxOSX_USE_ATSU_TEXT virtual ATSUStyle GetATSUStyle() { return m_macATSUIStyle; } #endif -#if wxOSX_USE_CORE_TEXT CTFontRef OSXGetCTFont() const { return m_ctFont ; } -#endif wxColour GetColour() const { return m_colour ; } bool GetUnderlined() const { return m_underlined ; } @@ -881,9 +867,7 @@ private : #if wxOSX_USE_ATSU_TEXT ATSUStyle m_macATSUIStyle; #endif -#if wxOSX_USE_CORE_TEXT wxCFRef< CTFontRef > m_ctFont; -#endif #if wxOSX_USE_IPHONE UIFont* m_uiFont; #endif @@ -894,9 +878,7 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere m_colour = col; m_underlined = font.GetUnderlined(); -#if wxOSX_USE_CORE_TEXT m_ctFont.reset( wxMacCreateCTFont( font ) ); -#endif #if wxOSX_USE_IPHONE m_uiFont = CreateUIFont(font); wxMacCocoaRetain( m_uiFont ); @@ -940,8 +922,6 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere wxMacCoreGraphicsFontData::~wxMacCoreGraphicsFontData() { -#if wxOSX_USE_CORE_TEXT -#endif #if wxOSX_USE_ATSU_TEXT if ( m_macATSUIStyle ) { @@ -2309,79 +2289,51 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo if (m_composition == wxCOMPOSITION_DEST) return; -#if wxOSX_USE_CORE_TEXT - { - wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); - wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); - CTFontRef font = fref->OSXGetCTFont(); - CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); -#if 0 - // right now there's no way to get continuous underlines, only words, so we emulate it - CTUnderlineStyle ustyle = fref->GetUnderlined() ? kCTUnderlineStyleSingle : kCTUnderlineStyleNone ; - wxCFRef underlined( CFNumberCreate(NULL, kCFNumberSInt32Type, &ustyle) ); - CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName }; - CFTypeRef values[] = { font, col, underlined }; -#else - CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName }; - CFTypeRef values[] = { font, col }; -#endif - wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, - WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); - wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); - wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); - - y += CTFontGetAscent(font); - - CGContextSaveGState(m_cgContext); - CGAffineTransform textMatrix = CGContextGetTextMatrix(m_cgContext); - - CGContextTranslateCTM(m_cgContext, (CGFloat) x, (CGFloat) y); - CGContextScaleCTM(m_cgContext, 1, -1); - CGContextSetTextMatrix(m_cgContext, CGAffineTransformIdentity); - - CTLineDraw( line, m_cgContext ); - - if ( fref->GetUnderlined() ) { - //AKT: draw horizontal line 1 pixel thick and with 1 pixel gap under baseline - CGFloat width = CTLineGetTypographicBounds(line, NULL, NULL, NULL); - - CGPoint points[] = { {0.0, -2.0}, {width, -2.0} }; - - CGContextSetStrokeColorWithColor(m_cgContext, col); - CGContextSetShouldAntialias(m_cgContext, false); - CGContextSetLineWidth(m_cgContext, 1.0); - CGContextStrokeLineSegments(m_cgContext, points, 2); - } - - CGContextRestoreGState(m_cgContext); - CGContextSetTextMatrix(m_cgContext, textMatrix); - CGColorRelease( col ); - CheckInvariants(); - return; - } -#endif -#if wxOSX_USE_ATSU_TEXT - { - DrawText(str, x, y, 0.0); - return; - } -#endif -#if wxOSX_USE_IPHONE wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); + wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); + CTFontRef font = fref->OSXGetCTFont(); + CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); +#if 0 + // right now there's no way to get continuous underlines, only words, so we emulate it + CTUnderlineStyle ustyle = fref->GetUnderlined() ? kCTUnderlineStyleSingle : kCTUnderlineStyleNone ; + wxCFRef underlined( CFNumberCreate(NULL, kCFNumberSInt32Type, &ustyle) ); + CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName }; + CFTypeRef values[] = { font, col, underlined }; +#else + CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName }; + CFTypeRef values[] = { font, col }; +#endif + wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, + WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); + wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); + wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); + + y += CTFontGetAscent(font); CGContextSaveGState(m_cgContext); + CGAffineTransform textMatrix = CGContextGetTextMatrix(m_cgContext); - CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); - CGContextSetTextDrawingMode (m_cgContext, kCGTextFill); - CGContextSetFillColorWithColor( m_cgContext, col ); + CGContextTranslateCTM(m_cgContext, (CGFloat) x, (CGFloat) y); + CGContextScaleCTM(m_cgContext, 1, -1); + CGContextSetTextMatrix(m_cgContext, CGAffineTransformIdentity); - wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); - DrawTextInContext( m_cgContext, CGPointMake( x, y ), fref->GetUIFont() , text.AsNSString() ); + CTLineDraw( line, m_cgContext ); + + if ( fref->GetUnderlined() ) { + //AKT: draw horizontal line 1 pixel thick and with 1 pixel gap under baseline + CGFloat width = CTLineGetTypographicBounds(line, NULL, NULL, NULL); + + CGPoint points[] = { {0.0, -2.0}, {width, -2.0} }; + + CGContextSetStrokeColorWithColor(m_cgContext, col); + CGContextSetShouldAntialias(m_cgContext, false); + CGContextSetLineWidth(m_cgContext, 1.0); + CGContextStrokeLineSegments(m_cgContext, points, 2); + } CGContextRestoreGState(m_cgContext); - CFRelease( col ); -#endif - + CGContextSetTextMatrix(m_cgContext, textMatrix); + CGColorRelease( col ); CheckInvariants(); } @@ -2397,103 +2349,9 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, if (m_composition == wxCOMPOSITION_DEST) return; -#if wxOSX_USE_CORE_TEXT - { - // default implementation takes care of rotation and calls non rotated DrawText afterwards - wxGraphicsContext::DoDrawRotatedText( str, x, y, angle ); - return; - } -#endif -#if wxOSX_USE_ATSU_TEXT - { - OSStatus status = noErr; - ATSUTextLayout atsuLayout; - wxMacUniCharBuffer unibuf( str ); - UniCharCount chars = unibuf.GetChars(); - - ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle()); - status = ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 0 , chars , chars , 1 , - &chars , &style , &atsuLayout ); - - wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") ); - - status = ::ATSUSetTransientFontMatching( atsuLayout , true ); - wxASSERT_MSG( status == noErr , wxT("couldn't setup transient font matching") ); - - int iAngle = int( angle * RAD2DEG ); - if ( abs(iAngle) > 0 ) - { - Fixed atsuAngle = IntToFixed( iAngle ); - ATSUAttributeTag atsuTags[] = - { - kATSULineRotationTag , - }; - ByteCount atsuSizes[WXSIZEOF(atsuTags)] = - { - sizeof( Fixed ) , - }; - ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = - { - &atsuAngle , - }; - status = ::ATSUSetLayoutControls(atsuLayout , WXSIZEOF(atsuTags), - atsuTags, atsuSizes, atsuValues ); - } - - { - ATSUAttributeTag atsuTags[] = - { - kATSUCGContextTag , - }; - ByteCount atsuSizes[WXSIZEOF(atsuTags)] = - { - sizeof( CGContextRef ) , - }; - ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = - { - &m_cgContext , - }; - status = ::ATSUSetLayoutControls(atsuLayout , WXSIZEOF(atsuTags), - atsuTags, atsuSizes, atsuValues ); - } - - ATSUTextMeasurement textBefore, textAfter; - ATSUTextMeasurement ascent, descent; - - status = ::ATSUGetUnjustifiedBounds( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, - &textBefore , &textAfter, &ascent , &descent ); - - wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") ); - - Rect rect; - x += (int)(sin(angle) * FixedToFloat(ascent)); - y += (int)(cos(angle) * FixedToFloat(ascent)); - - status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, - IntToFixed(x) , IntToFixed(y) , &rect ); - wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") ); - - CGContextSaveGState(m_cgContext); - CGContextTranslateCTM(m_cgContext, (CGFloat) x, (CGFloat) y); - CGContextScaleCTM(m_cgContext, 1, -1); - status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, - IntToFixed(0) , IntToFixed(0) ); - - wxASSERT_MSG( status == noErr , wxT("couldn't draw the rotated text") ); - - CGContextRestoreGState(m_cgContext); - - ::ATSUDisposeTextLayout(atsuLayout); - CheckInvariants(); - - return; - } -#endif -#if wxOSX_USE_IPHONE // default implementation takes care of rotation and calls non rotated DrawText afterwards wxGraphicsContext::DoDrawRotatedText( str, x, y, angle ); -#endif - + CheckInvariants(); } @@ -2518,100 +2376,33 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid if (str.empty()) strToMeasure = wxS(" "); -#if wxOSX_USE_CORE_TEXT - { - wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); - CTFontRef font = fref->OSXGetCTFont(); - - wxCFStringRef text(strToMeasure, wxLocale::GetSystemEncoding() ); - CFStringRef keys[] = { kCTFontAttributeName }; - CFTypeRef values[] = { font }; - wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, - WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); - wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); - wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); - - CGFloat a, d, l, w; - w = CTLineGetTypographicBounds(line, &a, &d, &l); - - if ( !str.empty() ) - { - if ( width ) - *width = w; - if ( height ) - *height = a+d+l; - } - - if ( descent ) - *descent = d; - if ( externalLeading ) - *externalLeading = l; - return; - } -#endif -#if wxOSX_USE_ATSU_TEXT - { - OSStatus status = noErr; - - ATSUTextLayout atsuLayout; - wxMacUniCharBuffer unibuf( strToMeasure ); - UniCharCount chars = unibuf.GetChars(); - - ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle()); - status = ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 0 , chars , chars , 1 , - &chars , &style , &atsuLayout ); - - wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the text") ); - - status = ::ATSUSetTransientFontMatching( atsuLayout , true ); - wxASSERT_MSG( status == noErr , wxT("couldn't setup transient font matching") ); - - ATSUTextMeasurement textBefore, textAfter; - ATSUTextMeasurement textAscent, textDescent; - - status = ::ATSUGetUnjustifiedBounds( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, - &textBefore , &textAfter, &textAscent , &textDescent ); - - if ( !str.empty() ) - { - if ( width ) - *width = FixedToFloat(textAfter - textBefore); - if ( height ) - *height = FixedToFloat(textAscent + textDescent); - } - - if ( descent ) - *descent = FixedToFloat(textDescent); - if ( externalLeading ) - *externalLeading = 0; - - ::ATSUDisposeTextLayout(atsuLayout); - - return; - } -#endif -#if wxOSX_USE_IPHONE wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); + CTFontRef font = fref->OSXGetCTFont(); wxCFStringRef text(strToMeasure, wxLocale::GetSystemEncoding() ); - CGSize sz = MeasureTextInContext( fref->GetUIFont() , text.AsNSString() ); + CFStringRef keys[] = { kCTFontAttributeName }; + CFTypeRef values[] = { font }; + wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, + WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); + wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); + wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); + + CGFloat a, d, l, w; + w = CTLineGetTypographicBounds(line, &a, &d, &l); if ( !str.empty() ) { if ( width ) - *width = sz.width; + *width = w; if ( height ) - *height = sz.height; + *height = a+d+l; } - /* if ( descent ) - *descent = FixedToFloat(textDescent); + *descent = d; if ( externalLeading ) - *externalLeading = 0; - */ -#endif - + *externalLeading = l; + CheckInvariants(); } @@ -2625,93 +2416,23 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr if (text.empty()) return; -#if wxOSX_USE_CORE_TEXT + wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); + CTFontRef font = fref->OSXGetCTFont(); + + wxCFStringRef t(text, wxLocale::GetSystemEncoding() ); + CFStringRef keys[] = { kCTFontAttributeName }; + CFTypeRef values[] = { font }; + wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, + WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); + wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, t, attributes) ); + wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); + + int chars = text.length(); + for ( int pos = 0; pos < (int)chars; pos ++ ) { - wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); - CTFontRef font = fref->OSXGetCTFont(); - - wxCFStringRef t(text, wxLocale::GetSystemEncoding() ); - CFStringRef keys[] = { kCTFontAttributeName }; - CFTypeRef values[] = { font }; - wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, - WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); - wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, t, attributes) ); - wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); - - int chars = text.length(); - for ( int pos = 0; pos < (int)chars; pos ++ ) - { - widths[pos] = CTLineGetOffsetForStringIndex( line, pos+1 , NULL ); - } - - return; + widths[pos] = CTLineGetOffsetForStringIndex( line, pos+1 , NULL ); } -#endif -#if wxOSX_USE_ATSU_TEXT - { - OSStatus status = noErr; - ATSUTextLayout atsuLayout; - wxMacUniCharBuffer unibuf( text ); - UniCharCount chars = unibuf.GetChars(); - ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle()); - status = ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 0 , chars , chars , 1 , - &chars , &style , &atsuLayout ); - - wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the text") ); - - status = ::ATSUSetTransientFontMatching( atsuLayout , true ); - wxASSERT_MSG( status == noErr , wxT("couldn't setup transient font matching") ); - -// new implementation from JS, keep old one just in case -#if 0 - for ( int pos = 0; pos < (int)chars; pos ++ ) - { - unsigned long actualNumberOfBounds = 0; - ATSTrapezoid glyphBounds; - - // We get a single bound, since the text should only require one. If it requires more, there is an issue - OSStatus result; - result = ATSUGetGlyphBounds( atsuLayout, 0, 0, kATSUFromTextBeginning, pos + 1, - kATSUseDeviceOrigins, 1, &glyphBounds, &actualNumberOfBounds ); - if (result != noErr || actualNumberOfBounds != 1 ) - return; - - widths[pos] = FixedToFloat( glyphBounds.upperRight.x - glyphBounds.upperLeft.x ); - //unsigned char uch = s[i]; - } -#else - ATSLayoutRecord *layoutRecords = NULL; - ItemCount glyphCount = 0; - - // Get the glyph extents - OSStatus err = ::ATSUDirectGetLayoutDataArrayPtrFromTextLayout(atsuLayout, - 0, - kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, - (void **) - &layoutRecords, - &glyphCount); - wxASSERT(glyphCount == (text.length()+1)); - - if ( err == noErr && glyphCount == (text.length()+1)) - { - for ( int pos = 1; pos < (int)glyphCount ; pos ++ ) - { - widths[pos-1] = FixedToFloat( layoutRecords[pos].realPos ); - } - } - - ::ATSUDirectReleaseLayoutDataArrayPtr(NULL, - kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, - (void **) &layoutRecords); -#endif - ::ATSUDisposeTextLayout(atsuLayout); - } -#endif -#if wxOSX_USE_IPHONE - // TODO core graphics text implementation here -#endif - CheckInvariants(); } diff --git a/Externals/wxWidgets3/src/osx/carbon/listctrl_mac.cpp b/Externals/wxWidgets3/src/osx/carbon/listctrl_mac.cpp index c9084e057e..d87a96ee91 100644 --- a/Externals/wxWidgets3/src/osx/carbon/listctrl_mac.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/listctrl_mac.cpp @@ -2853,35 +2853,14 @@ void wxMacDataBrowserListCtrlControl::DrawItem( HIThemeTextHorizontalFlush hFlush = kHIThemeTextHorizontalFlushLeft; HIThemeTextInfo info; - bool setup = false; -#if wxOSX_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) - { - info.version = kHIThemeTextInfoVersionOne; - info.fontID = kThemeViewsFont; - if (font.IsOk()) - { - info.fontID = kThemeSpecifiedFont; - info.font = (CTFontRef) font.OSXGetCTFont(); - setup = true; - } - } -#endif -#if wxOSX_USE_ATSU_TEXT - if ( !setup ) - { - info.version = kHIThemeTextInfoVersionZero; - info.fontID = kThemeViewsFont; - if (font.IsOk()) - { - info.fontID = font.MacGetThemeFontID(); - - ::TextSize( (short)(font.GetPointSize()) ) ; - ::TextFace( font.MacGetFontStyle() ) ; - } + info.version = kHIThemeTextInfoVersionOne; + info.fontID = kThemeViewsFont; + if (font.IsOk()) + { + info.fontID = kThemeSpecifiedFont; + info.font = (CTFontRef) font.OSXGetCTFont(); } -#endif wxListItem item; list->GetColumn(listColumn, item); diff --git a/Externals/wxWidgets3/src/osx/carbon/nonownedwnd.cpp b/Externals/wxWidgets3/src/osx/carbon/nonownedwnd.cpp index 881083c29c..f9acf7e4d8 100644 --- a/Externals/wxWidgets3/src/osx/carbon/nonownedwnd.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/nonownedwnd.cpp @@ -1522,18 +1522,11 @@ void wxNonOwnedWindowCarbonImpl::Maximize(bool maximize) Point idealSize = { 0 , 0 } ; if ( maximize ) { -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 HIRect bounds ; HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, &bounds); idealSize.h = bounds.size.width; idealSize.v = bounds.size.height; -#else - Rect rect ; - GetAvailableWindowPositioningBounds(GetMainDevice(),&rect) ; - idealSize.h = rect.right - rect.left ; - idealSize.v = rect.bottom - rect.top ; -#endif } ZoomWindowIdeal( (WindowRef)GetWXWindow() , maximize ? inZoomOut : inZoomIn , &idealSize ) ; } diff --git a/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp b/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp index 02ba93ad33..53a0f908d0 100644 --- a/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/textctrl.cpp @@ -369,41 +369,7 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, long style, long WXUNUSED(extraStyle)) { - bool forceMLTE = false ; - -#if wxUSE_SYSTEM_OPTIONS - if (wxSystemOptions::HasOption( wxMAC_TEXTCONTROL_USE_MLTE ) && (wxSystemOptions::GetOptionInt( wxMAC_TEXTCONTROL_USE_MLTE ) == 1)) - { - forceMLTE = true ; - } -#endif - - if ( UMAGetSystemVersion() >= 0x1050 ) - forceMLTE = false; - - wxMacControl* peer = NULL; - - if ( !forceMLTE ) - { - if ( style & wxTE_MULTILINE || ( UMAGetSystemVersion() >= 0x1050 ) ) - peer = new wxMacMLTEHIViewControl( wxpeer , str , pos , size , style ) ; - } - - if ( !peer ) - { - if ( !(style & wxTE_MULTILINE) && !forceMLTE ) - { - peer = new wxMacUnicodeTextControl( wxpeer , str , pos , size , style ) ; - } - } - - // the horizontal single line scrolling bug that made us keep the classic implementation - // is fixed in 10.5 -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - if ( !peer ) - peer = new wxMacMLTEClassicControl( wxpeer , str , pos , size , style ) ; -#endif - return peer; + return new wxMacMLTEHIViewControl( wxpeer , str , pos , size , style ) ; } // ---------------------------------------------------------------------------- @@ -1467,674 +1433,6 @@ int wxMacMLTEControl::GetLineLength(long lineNo) const return theLength ; } -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - -// ---------------------------------------------------------------------------- -// MLTE control implementation (classic part) -// ---------------------------------------------------------------------------- - -// OS X Notes : We still don't have a full replacement for MLTE, so this implementation -// has to live on. We have different problems coming from outdated implementations on the -// various OS X versions. Most deal with the scrollbars: they are not correctly embedded -// while this can be solved on 10.3 by reassigning them the correct place, on 10.2 there is -// no way out, therefore we are using our own implementation and our own scrollbars .... - -TXNScrollInfoUPP gTXNScrollInfoProc = NULL ; -ControlActionUPP gTXNScrollActionProc = NULL ; - -pascal void wxMacMLTEClassicControl::TXNScrollInfoProc( - SInt32 iValue, SInt32 iMaximumValue, - TXNScrollBarOrientation iScrollBarOrientation, SInt32 iRefCon ) -{ - wxMacMLTEClassicControl* mlte = (wxMacMLTEClassicControl*) iRefCon ; - SInt32 value = wxMax( iValue , 0 ) ; - SInt32 maximum = wxMax( iMaximumValue , 0 ) ; - - if ( iScrollBarOrientation == kTXNHorizontal ) - { - if ( mlte->m_sbHorizontal ) - { - SetControl32BitValue( mlte->m_sbHorizontal , value ) ; - SetControl32BitMaximum( mlte->m_sbHorizontal , maximum ) ; - mlte->m_lastHorizontalValue = value ; - } - } - else if ( iScrollBarOrientation == kTXNVertical ) - { - if ( mlte->m_sbVertical ) - { - SetControl32BitValue( mlte->m_sbVertical , value ) ; - SetControl32BitMaximum( mlte->m_sbVertical , maximum ) ; - mlte->m_lastVerticalValue = value ; - } - } -} - -pascal void wxMacMLTEClassicControl::TXNScrollActionProc( ControlRef controlRef , ControlPartCode partCode ) -{ - wxMacMLTEClassicControl* mlte = (wxMacMLTEClassicControl*) GetControlReference( controlRef ) ; - if ( mlte == NULL ) - return ; - - if ( controlRef != mlte->m_sbVertical && controlRef != mlte->m_sbHorizontal ) - return ; - - OSStatus err ; - bool isHorizontal = ( controlRef == mlte->m_sbHorizontal ) ; - - SInt32 minimum = 0 ; - SInt32 maximum = GetControl32BitMaximum( controlRef ) ; - SInt32 value = GetControl32BitValue( controlRef ) ; - SInt32 delta = 0; - - switch ( partCode ) - { - case kControlDownButtonPart : - delta = 10 ; - break ; - - case kControlUpButtonPart : - delta = -10 ; - break ; - - case kControlPageDownPart : - delta = GetControlViewSize( controlRef ) ; - break ; - - case kControlPageUpPart : - delta = -GetControlViewSize( controlRef ) ; - break ; - - case kControlIndicatorPart : - delta = value - (isHorizontal ? mlte->m_lastHorizontalValue : mlte->m_lastVerticalValue) ; - break ; - - default : - break ; - } - - if ( delta != 0 ) - { - SInt32 newValue = value ; - - if ( partCode != kControlIndicatorPart ) - { - if ( value + delta < minimum ) - delta = minimum - value ; - if ( value + delta > maximum ) - delta = maximum - value ; - - SetControl32BitValue( controlRef , value + delta ) ; - newValue = value + delta ; - } - - SInt32 verticalDelta = isHorizontal ? 0 : delta ; - SInt32 horizontalDelta = isHorizontal ? delta : 0 ; - - err = TXNScroll( - mlte->m_txn, kTXNScrollUnitsInPixels, kTXNScrollUnitsInPixels, - &verticalDelta, &horizontalDelta ); - verify_noerr( err ); - - if ( isHorizontal ) - mlte->m_lastHorizontalValue = newValue ; - else - mlte->m_lastVerticalValue = newValue ; - } -} - -// make correct activations -void wxMacMLTEClassicControl::MacActivatePaneText(bool setActive) -{ - wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef); - - wxMacWindowClipper clipper( textctrl ) ; - TXNActivate( m_txn, m_txnFrameID, setActive ); - - ControlRef controlFocus = 0 ; - GetKeyboardFocus( m_txnWindow , &controlFocus ) ; - if ( controlFocus == m_controlRef ) - TXNFocus( m_txn, setActive ); -} - -void wxMacMLTEClassicControl::MacFocusPaneText(bool setFocus) -{ - TXNFocus( m_txn, setFocus ); -} - -// guards against inappropriate redraw (hidden objects drawing onto window) - -void wxMacMLTEClassicControl::MacSetObjectVisibility(bool vis) -{ - ControlRef controlFocus = 0 ; - GetKeyboardFocus( m_txnWindow , &controlFocus ) ; - - if ( !vis && (controlFocus == m_controlRef ) ) - SetKeyboardFocus( m_txnWindow , m_controlRef , kControlFocusNoPart ) ; - - TXNControlTag iControlTags[1] = { kTXNVisibilityTag }; - TXNControlData iControlData[1] = { { (UInt32)false } }; - - verify_noerr( TXNGetTXNObjectControls( m_txn , 1, iControlTags, iControlData ) ) ; - - if ( iControlData[0].uValue != vis ) - { - iControlData[0].uValue = vis ; - verify_noerr( TXNSetTXNObjectControls( m_txn, false , 1, iControlTags, iControlData ) ) ; - } - - // currently, we always clip as partial visibility (overlapped) visibility is also a problem, - // if we run into further problems we might set the FrameBounds to an empty rect here -} - -// make sure that the TXNObject is at the right position - -void wxMacMLTEClassicControl::MacUpdatePosition() -{ - wxTextCtrl* textctrl = (wxTextCtrl*)GetControlReference( m_controlRef ); - if ( textctrl == NULL ) - return ; - - Rect bounds ; - GetRectInWindowCoords( &bounds ); - - wxRect visRect = textctrl->MacGetClippedClientRect() ; - Rect visBounds = { visRect.y , visRect.x , visRect.y + visRect.height , visRect.x + visRect.width } ; - int x , y ; - x = y = 0 ; - textctrl->MacWindowToRootWindow( &x , &y ) ; - OffsetRect( &visBounds , x , y ) ; - - if ( !EqualRect( &bounds, &m_txnControlBounds ) || !EqualRect( &visBounds, &m_txnVisBounds ) ) - { - m_txnControlBounds = bounds ; - m_txnVisBounds = visBounds ; - wxMacWindowClipper cl( textctrl ) ; - - if ( m_sbHorizontal || m_sbVertical ) - { - int w = bounds.right - bounds.left ; - int h = bounds.bottom - bounds.top ; - - if ( m_sbHorizontal ) - { - Rect sbBounds ; - - sbBounds.left = -1 ; - sbBounds.top = h - 14 ; - sbBounds.right = w + 1 ; - sbBounds.bottom = h + 1 ; - - SetControlBounds( m_sbHorizontal , &sbBounds ) ; - SetControlViewSize( m_sbHorizontal , w ) ; - } - - if ( m_sbVertical ) - { - Rect sbBounds ; - - sbBounds.left = w - 14 ; - sbBounds.top = -1 ; - sbBounds.right = w + 1 ; - sbBounds.bottom = m_sbHorizontal ? h - 14 : h + 1 ; - - SetControlBounds( m_sbVertical , &sbBounds ) ; - SetControlViewSize( m_sbVertical , h ) ; - } - } - - Rect oldviewRect ; - TXNLongRect olddestRect ; - TXNGetRectBounds( m_txn , &oldviewRect , &olddestRect , NULL ) ; - - Rect viewRect = { m_txnControlBounds.top, m_txnControlBounds.left, - m_txnControlBounds.bottom - ( m_sbHorizontal ? 14 : 0 ) , - m_txnControlBounds.right - ( m_sbVertical ? 14 : 0 ) } ; - TXNLongRect destRect = { m_txnControlBounds.top, m_txnControlBounds.left, - m_txnControlBounds.bottom - ( m_sbHorizontal ? 14 : 0 ) , - m_txnControlBounds.right - ( m_sbVertical ? 14 : 0 ) } ; - - if ( olddestRect.right >= 10000 ) - destRect.right = destRect.left + 32000 ; - - if ( olddestRect.bottom >= 0x20000000 ) - destRect.bottom = destRect.top + 0x40000000 ; - - SectRect( &viewRect , &visBounds , &viewRect ) ; - TXNSetRectBounds( m_txn , &viewRect , &destRect , true ) ; - -#if 0 - TXNSetFrameBounds( - m_txn, - m_txnControlBounds.top, - m_txnControlBounds.left, - m_txnControlBounds.bottom - (m_sbHorizontal ? 14 : 0), - m_txnControlBounds.right - (m_sbVertical ? 14 : 0), - m_txnFrameID ); -#endif - - // the SetFrameBounds method under Classic sometimes does not correctly scroll a selection into sight after a - // movement, therefore we have to force it - - // this problem has been reported in OSX as well, so we use this here once again - - TXNLongRect textRect ; - TXNGetRectBounds( m_txn , NULL , NULL , &textRect ) ; - if ( textRect.left < m_txnControlBounds.left ) - TXNShowSelection( m_txn , kTXNShowStart ) ; - } -} - -void wxMacMLTEClassicControl::Move(int x, int y, int width, int height) -{ - wxMacControl::Move(x,y,width,height) ; - MacUpdatePosition() ; -} - -void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 WXUNUSED(thePart)) -{ - wxTextCtrl* textctrl = (wxTextCtrl*)GetControlReference( m_controlRef ); - if ( textctrl == NULL ) - return ; - - if ( textctrl->IsShownOnScreen() ) - { - wxMacWindowClipper clipper( textctrl ) ; - TXNDraw( m_txn , NULL ) ; - } -} - -wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) -{ - Point where = { y , x } ; - ControlPartCode result = kControlNoPart; - - wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference( m_controlRef ); - if ( (textctrl != NULL) && textctrl->IsShownOnScreen() ) - { - if (PtInRect( where, &m_txnControlBounds )) - { - result = kControlEditTextPart ; - } - else - { - // sometimes we get the coords also in control local coordinates, therefore test again - int x = 0 , y = 0 ; - textctrl->MacClientToRootWindow( &x , &y ) ; - where.h += x ; - where.v += y ; - - if (PtInRect( where, &m_txnControlBounds )) - result = kControlEditTextPart ; - } - } - - return result; -} - -wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxInt16 y, void* WXUNUSED(actionProc) ) -{ - ControlPartCode result = kControlNoPart; - - wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference( m_controlRef ); - if ( (textctrl != NULL) && textctrl->IsShownOnScreen() ) - { - Point startPt = { y , x } ; - - // for compositing, we must convert these into toplevel window coordinates, because hittesting expects them - int x = 0 , y = 0 ; - textctrl->MacClientToRootWindow( &x , &y ) ; - startPt.h += x ; - startPt.v += y ; - - switch (MacControlUserPaneHitTestProc( startPt.h , startPt.v )) - { - case kControlEditTextPart : - { - wxMacWindowClipper clipper( textctrl ) ; - EventRecord rec ; - - ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ; - TXNClick( m_txn, &rec ); - } - break; - - default : - break; - } - } - - return result; -} - -void wxMacMLTEClassicControl::MacControlUserPaneIdleProc() -{ - wxTextCtrl* textctrl = (wxTextCtrl*)GetControlReference( m_controlRef ); - if ( textctrl == NULL ) - return ; - - if (textctrl->IsShownOnScreen()) - { - if (IsControlActive(m_controlRef)) - { - Point mousep; - - wxMacWindowClipper clipper( textctrl ) ; - GetMouse(&mousep); - - TXNIdle(m_txn); - - if (PtInRect(mousep, &m_txnControlBounds)) - { - RgnHandle theRgn = NewRgn(); - RectRgn(theRgn, &m_txnControlBounds); - TXNAdjustCursor(m_txn, theRgn); - DisposeRgn(theRgn); - } - } - } -} - -wxInt16 wxMacMLTEClassicControl::MacControlUserPaneKeyDownProc (wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) -{ - wxTextCtrl* textctrl = (wxTextCtrl*)GetControlReference( m_controlRef ); - if ( textctrl == NULL ) - return kControlNoPart; - - wxMacWindowClipper clipper( textctrl ) ; - - EventRecord ev ; - memset( &ev , 0 , sizeof( ev ) ) ; - ev.what = keyDown ; - ev.modifiers = modifiers ; - ev.message = ((keyCode << 8) & keyCodeMask) | (charCode & charCodeMask); - TXNKeyDown( m_txn , &ev ); - - return kControlEntireControl; -} - -void wxMacMLTEClassicControl::MacControlUserPaneActivateProc(bool activating) -{ - MacActivatePaneText( activating ); -} - -wxInt16 wxMacMLTEClassicControl::MacControlUserPaneFocusProc(wxInt16 action) -{ - ControlPartCode focusResult = kControlFocusNoPart; - - wxTextCtrl* textctrl = (wxTextCtrl*)GetControlReference( m_controlRef ); - if ( textctrl == NULL ) - return focusResult; - - wxMacWindowClipper clipper( textctrl ) ; - - ControlRef controlFocus = NULL ; - GetKeyboardFocus( m_txnWindow , &controlFocus ) ; - bool wasFocused = ( controlFocus == m_controlRef ) ; - - switch (action) - { - case kControlFocusPrevPart: - case kControlFocusNextPart: - MacFocusPaneText( !wasFocused ); - focusResult = (!wasFocused ? (ControlPartCode) kControlEditTextPart : (ControlPartCode) kControlFocusNoPart); - break; - - case kControlFocusNoPart: - default: - MacFocusPaneText( false ); - focusResult = kControlFocusNoPart; - break; - } - - return focusResult; -} - -void wxMacMLTEClassicControl::MacControlUserPaneBackgroundProc( void *WXUNUSED(info) ) -{ -} - -wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxTextCtrl *wxPeer, - const wxString& str, - const wxPoint& pos, - const wxSize& size, long style ) - : wxMacMLTEControl( wxPeer ) -{ - m_font = wxPeer->GetFont() ; - m_windowStyle = style ; - Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ; - - short featureSet = - kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle - | kControlWantsActivate | kControlHandlesTracking -// | kControlHasSpecialBackground - | kControlGetsFocusOnClick | kControlSupportsLiveFeedback; - - OSStatus err = ::CreateUserPaneControl( - MAC_WXHWND(wxPeer->GetParent()->MacGetTopLevelWindowRef()), - &bounds, featureSet, &m_controlRef ); - verify_noerr( err ); - SetControlReference( m_controlRef , (URefCon) wxPeer ); - - DoCreate(); - - AdjustCreationAttributes( *wxWHITE , true ) ; - - MacSetObjectVisibility( wxPeer->IsShownOnScreen() ) ; - - { - wxString st = str ; - wxMacConvertNewlines10To13( &st ) ; - wxMacWindowClipper clipper( GetWXPeer() ) ; - SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ; - TXNSetSelection( m_txn, 0, 0 ) ; - } -} - -wxMacMLTEClassicControl::~wxMacMLTEClassicControl() -{ - TXNDeleteObject( m_txn ); - m_txn = NULL ; -} - -void wxMacMLTEClassicControl::VisibilityChanged(bool shown) -{ - MacSetObjectVisibility( shown ) ; - wxMacControl::VisibilityChanged( shown ) ; -} - -void wxMacMLTEClassicControl::SuperChangedPosition() -{ - MacUpdatePosition() ; - wxMacControl::SuperChangedPosition() ; -} - -ControlUserPaneDrawUPP gTPDrawProc = NULL; -ControlUserPaneHitTestUPP gTPHitProc = NULL; -ControlUserPaneTrackingUPP gTPTrackProc = NULL; -ControlUserPaneIdleUPP gTPIdleProc = NULL; -ControlUserPaneKeyDownUPP gTPKeyProc = NULL; -ControlUserPaneActivateUPP gTPActivateProc = NULL; -ControlUserPaneFocusUPP gTPFocusProc = NULL; - -static pascal void wxMacControlUserPaneDrawProc(ControlRef control, SInt16 part) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget( (WXWidget) control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - win->MacControlUserPaneDrawProc( part ) ; -} - -static pascal ControlPartCode wxMacControlUserPaneHitTestProc(ControlRef control, Point where) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget( (WXWidget) control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - return win->MacControlUserPaneHitTestProc( where.h , where.v ) ; - else - return kControlNoPart ; -} - -static pascal ControlPartCode wxMacControlUserPaneTrackingProc(ControlRef control, Point startPt, ControlActionUPP actionProc) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget( (WXWidget) control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - return win->MacControlUserPaneTrackingProc( startPt.h , startPt.v , (void*) actionProc ) ; - else - return kControlNoPart ; -} - -static pascal void wxMacControlUserPaneIdleProc(ControlRef control) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget((WXWidget) control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - win->MacControlUserPaneIdleProc() ; -} - -static pascal ControlPartCode wxMacControlUserPaneKeyDownProc(ControlRef control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget((WXWidget) control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - return win->MacControlUserPaneKeyDownProc( keyCode, charCode, modifiers ) ; - else - return kControlNoPart ; -} - -static pascal void wxMacControlUserPaneActivateProc(ControlRef control, Boolean activating) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget( (WXWidget)control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - win->MacControlUserPaneActivateProc( activating ) ; -} - -static pascal ControlPartCode wxMacControlUserPaneFocusProc(ControlRef control, ControlFocusPart action) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget((WXWidget) control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - return win->MacControlUserPaneFocusProc( action ) ; - else - return kControlNoPart ; -} - -#if 0 -static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, ControlBackgroundPtr info) -{ - wxTextCtrl *textCtrl = wxDynamicCast( wxFindWindowFromWXWidget(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; - if ( win ) - win->MacControlUserPaneBackgroundProc(info) ; -} -#endif - -// TXNRegisterScrollInfoProc - -OSStatus wxMacMLTEClassicControl::DoCreate() -{ - Rect bounds; - OSStatus err = noErr ; - - // set up our globals - if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(wxMacControlUserPaneDrawProc); - if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(wxMacControlUserPaneHitTestProc); - if (gTPTrackProc == NULL) gTPTrackProc = NewControlUserPaneTrackingUPP(wxMacControlUserPaneTrackingProc); - if (gTPIdleProc == NULL) gTPIdleProc = NewControlUserPaneIdleUPP(wxMacControlUserPaneIdleProc); - if (gTPKeyProc == NULL) gTPKeyProc = NewControlUserPaneKeyDownUPP(wxMacControlUserPaneKeyDownProc); - if (gTPActivateProc == NULL) gTPActivateProc = NewControlUserPaneActivateUPP(wxMacControlUserPaneActivateProc); - if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(wxMacControlUserPaneFocusProc); - - if (gTXNScrollInfoProc == NULL ) gTXNScrollInfoProc = NewTXNScrollInfoUPP(TXNScrollInfoProc) ; - if (gTXNScrollActionProc == NULL ) gTXNScrollActionProc = NewControlActionUPP(TXNScrollActionProc) ; - - // set the initial settings for our private data - - m_txnWindow = GetControlOwner(m_controlRef); - m_txnPort = (GrafPtr) GetWindowPort(m_txnWindow); - - // set up the user pane procedures - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneDrawProcTag, sizeof(gTPDrawProc), &gTPDrawProc); - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneHitTestProcTag, sizeof(gTPHitProc), &gTPHitProc); - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneTrackingProcTag, sizeof(gTPTrackProc), &gTPTrackProc); - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneIdleProcTag, sizeof(gTPIdleProc), &gTPIdleProc); - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneKeyDownProcTag, sizeof(gTPKeyProc), &gTPKeyProc); - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneActivateProcTag, sizeof(gTPActivateProc), &gTPActivateProc); - SetControlData(m_controlRef, kControlEntireControl, kControlUserPaneFocusProcTag, sizeof(gTPFocusProc), &gTPFocusProc); - - // calculate the rectangles used by the control - GetRectInWindowCoords( &bounds ); - - m_txnControlBounds = bounds ; - m_txnVisBounds = bounds ; - - CGrafPtr origPort ; - GDHandle origDev ; - - GetGWorld( &origPort, &origDev ) ; - SetPort( m_txnPort ); - - // create the new edit field - TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( m_windowStyle ); - - // the scrollbars are not correctly embedded but are inserted at the root: - // this gives us problems as we have erratic redraws even over the structure area - - m_sbHorizontal = 0 ; - m_sbVertical = 0 ; - m_lastHorizontalValue = 0 ; - m_lastVerticalValue = 0 ; - - Rect sb = { 0 , 0 , 0 , 0 } ; - if ( frameOptions & kTXNWantVScrollBarMask ) - { - CreateScrollBarControl( m_txnWindow, &sb, 0, 0, 100, 1, true, gTXNScrollActionProc, &m_sbVertical ); - SetControlReference( m_sbVertical, (SInt32)this ); - SetControlAction( m_sbVertical, gTXNScrollActionProc ); - ShowControl( m_sbVertical ); - EmbedControl( m_sbVertical , m_controlRef ); - frameOptions &= ~kTXNWantVScrollBarMask; - } - - if ( frameOptions & kTXNWantHScrollBarMask ) - { - CreateScrollBarControl( m_txnWindow, &sb, 0, 0, 100, 1, true, gTXNScrollActionProc, &m_sbHorizontal ); - SetControlReference( m_sbHorizontal, (SInt32)this ); - SetControlAction( m_sbHorizontal, gTXNScrollActionProc ); - ShowControl( m_sbHorizontal ); - EmbedControl( m_sbHorizontal, m_controlRef ); - frameOptions &= ~(kTXNWantHScrollBarMask | kTXNDrawGrowIconMask); - } - - err = TXNNewObject( - NULL, m_txnWindow, &bounds, frameOptions, - kTXNTextEditStyleFrameType, kTXNTextensionFile, kTXNSystemDefaultEncoding, - &m_txn, &m_txnFrameID, NULL ); - verify_noerr( err ); - -#if 0 - TXNControlTag iControlTags[] = { kTXNUseCarbonEvents }; - TXNControlData iControlData[] = { { (UInt32)&cInfo } }; - int toptag = WXSIZEOF( iControlTags ) ; - TXNCarbonEventInfo cInfo ; - cInfo.useCarbonEvents = false ; - cInfo.filler = 0 ; - cInfo.flags = 0 ; - cInfo.fDictionary = NULL ; - - verify_noerr( TXNSetTXNObjectControls( m_txn, false, toptag, iControlTags, iControlData ) ); -#endif - - TXNRegisterScrollInfoProc( m_txn, gTXNScrollInfoProc, (SInt32)this ); - - SetGWorld( origPort , origDev ) ; - - return err; -} -#endif - // ---------------------------------------------------------------------------- // MLTE control implementation (OSX part) // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp b/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp index a44e23bbda..07121fbd85 100644 --- a/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/toolbar.cpp @@ -113,14 +113,6 @@ public: if ( m_toolbarItemRef ) { CFIndex count = CFGetRetainCount( m_toolbarItemRef ) ; - // different behaviour under Leopard - if ( UMAGetSystemVersion() < 0x1050 ) - { - if ( count != 1 ) - { - wxFAIL_MSG("Reference count of native tool was not 1 in wxToolBarTool destructor"); - } - } wxTheApp->MacAddToAutorelease(m_toolbarItemRef); CFRelease(m_toolbarItemRef); m_toolbarItemRef = NULL; @@ -941,14 +933,6 @@ wxToolBar::~wxToolBar() } CFIndex count = CFGetRetainCount( m_macToolbar ) ; - // Leopard seems to have one refcount more, so we cannot check reliably at the moment - if ( UMAGetSystemVersion() < 0x1050 ) - { - if ( count != 1 ) - { - wxFAIL_MSG("Reference count of native control was not 1 in wxToolBar destructor"); - } - } CFRelease( (HIToolbarRef)m_macToolbar ); m_macToolbar = NULL; #endif // wxOSX_USE_NATIVE_TOOLBAR @@ -1616,26 +1600,12 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) case wxTOOL_STYLE_BUTTON: { wxASSERT( tool->GetControlHandle() == NULL ); - ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, tool->GetNormalBitmap() ); - if ( UMAGetSystemVersion() >= 0x1000) - { - // contrary to the docs this control only works with iconrefs - ControlButtonContentInfo info; - wxMacCreateBitmapButton( &info, tool->GetNormalBitmap(), kControlContentIconRef ); - CreateIconControl( window, &toolrect, &info, false, &controlHandle ); - wxMacReleaseBitmapButton( &info ); - } - else - { - SInt16 behaviour = kControlBehaviorOffsetContents; - if ( tool->CanBeToggled() ) - behaviour |= kControlBehaviorToggles; - err = CreateBevelButtonControl( window, - &toolrect, CFSTR(""), kControlBevelButtonNormalBevel, - behaviour, &info, 0, 0, 0, &controlHandle ); - } + // contrary to the docs this control only works with iconrefs + ControlButtonContentInfo info; + wxMacCreateBitmapButton( &info, tool->GetNormalBitmap(), kControlContentIconRef ); + CreateIconControl( window, &toolrect, &info, false, &controlHandle ); + wxMacReleaseBitmapButton( &info ); #if wxOSX_USE_NATIVE_TOOLBAR if (m_macToolbar != NULL) diff --git a/Externals/wxWidgets3/src/osx/carbon/utils.cpp b/Externals/wxWidgets3/src/osx/carbon/utils.cpp index 8598ad1be8..9653ee4191 100644 --- a/Externals/wxWidgets3/src/osx/carbon/utils.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/utils.cpp @@ -33,9 +33,7 @@ // #include "MoreFilesX.h" -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - #include -#endif +#include #include "wx/osx/private.h" #if wxUSE_GUI @@ -49,17 +47,8 @@ // Emit a beeeeeep void wxBell() { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 if ( AudioServicesPlayAlertSound != NULL ) AudioServicesPlayAlertSound(kUserPreferredAlert); - else -#endif -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - AlertSoundPlay(); -#else - { - } -#endif } wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) @@ -156,7 +145,6 @@ void wxGetMousePosition( int* x, int* y ) void wxClientDisplayRect(int *x, int *y, int *width, int *height) { -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 HIRect bounds ; HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, &bounds); @@ -168,18 +156,6 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) *width = bounds.size.width; if ( height ) *height = bounds.size.height; -#else - Rect r; - GetAvailableWindowPositioningBounds( GetMainDevice() , &r ); - if ( x ) - *x = r.left; - if ( y ) - *y = r.top; - if ( width ) - *width = r.right - r.left; - if ( height ) - *height = r.bottom - r.top; -#endif } #endif // wxUSE_GUI diff --git a/Externals/wxWidgets3/src/osx/carbon/window.cpp b/Externals/wxWidgets3/src/osx/carbon/window.cpp index 5a4a0bf791..f7085d277f 100644 --- a/Externals/wxWidgets3/src/osx/carbon/window.cpp +++ b/Externals/wxWidgets3/src/osx/carbon/window.cpp @@ -299,11 +299,6 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl case kEventControlFocusPartChanged : // the event is emulated by wxmac for systems lower than 10.5 { - if ( UMAGetSystemVersion() < 0x1050 ) - { - // as it is synthesized here, we have to manually avoid propagation - result = noErr; - } ControlPartCode previousControlPart = cEvent.GetParameter(kEventParamControlPreviousPart , typeControlPartCode ); ControlPartCode currentControlPart = cEvent.GetParameter(kEventParamControlCurrentPart , typeControlPartCode ); @@ -387,76 +382,6 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl } else result = CallNextEventHandler(handler, event); - - if ( UMAGetSystemVersion() < 0x1050 ) - { -// set back to 0 if problems arise -#if 1 - if ( result == noErr ) - { - ControlPartCode currentControlPart = cEvent.GetParameter(kEventParamControlPart , typeControlPartCode ); - // synthesize the event focus changed event - EventRef evRef = NULL ; - - OSStatus err = MacCreateEvent( - NULL , kEventClassControl , kEventControlFocusPartChanged , TicksToEventTime( TickCount() ) , - kEventAttributeUserEvent , &evRef ); - verify_noerr( err ); - - wxMacCarbonEvent iEvent( evRef ) ; - iEvent.SetParameter( kEventParamDirectObject , controlRef ); - iEvent.SetParameter( kEventParamPostTarget, typeEventTargetRef, GetControlEventTarget( controlRef ) ); - iEvent.SetParameter( kEventParamControlPreviousPart, typeControlPartCode, previousControlPart ); - iEvent.SetParameter( kEventParamControlCurrentPart, typeControlPartCode, currentControlPart ); - -#if 1 - // TODO test this first, avoid double posts etc... - PostEventToQueue( GetMainEventQueue(), evRef , kEventPriorityHigh ); -#else - wxMacWindowControlEventHandler( NULL , evRef , data ) ; -#endif - ReleaseEvent( evRef ) ; - } -#else - // old implementation, to be removed if the new one works - if ( controlPart == kControlFocusNoPart ) - { -#if wxUSE_CARET - if ( thisWindow->GetCaret() ) - thisWindow->GetCaret()->OnKillFocus(); -#endif - - wxLogTrace(wxT("Focus"), wxT("focus lost(%p)"), static_cast(thisWindow)); - - static bool inKillFocusEvent = false ; - - if ( !inKillFocusEvent ) - { - inKillFocusEvent = true ; - wxFocusEvent event( wxEVT_KILL_FOCUS, thisWindow->GetId()); - event.SetEventObject(thisWindow); - thisWindow->HandleWindowEvent(event) ; - inKillFocusEvent = false ; - } - } - else - { - // panel wants to track the window which was the last to have focus in it - wxLogTrace(wxT("Focus"), wxT("focus set(%p)"), static_cast(thisWindow)); - wxChildFocusEvent eventFocus((wxWindow*)thisWindow); - thisWindow->HandleWindowEvent(eventFocus); - - #if wxUSE_CARET - if ( thisWindow->GetCaret() ) - thisWindow->GetCaret()->OnSetFocus(); - #endif - - wxFocusEvent event(wxEVT_SET_FOCUS, thisWindow->GetId()); - event.SetEventObject(thisWindow); - thisWindow->HandleWindowEvent(event) ; - } -#endif - } } break ; @@ -1136,19 +1061,10 @@ void wxMacControl::SetCursor(const wxCursor& cursor) ControlPartCode part ; ControlRef control ; Point pt ; -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 HIPoint hiPoint ; HIGetMousePosition(kHICoordSpaceWindow, window, &hiPoint); pt.h = hiPoint.x; pt.v = hiPoint.y; -#else - GetGlobalMouse( &pt ); - int x = pt.h; - int y = pt.v; - tlwwx->ScreenToClient(&x, &y); - pt.h = x; - pt.v = y; -#endif control = FindControlUnderMouse( pt , window , &part ) ; if ( control ) mouseWin = wxFindWindowFromWXWidget( (WXWidget) control ) ; @@ -1262,27 +1178,22 @@ void wxMacControl::SuperChangedPosition() void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle, bool ignoreBlack ) { m_font = font; -#if wxOSX_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) - { - HIViewPartCode part = 0; - HIThemeTextHorizontalFlush flush = kHIThemeTextHorizontalFlushDefault; - if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL ) - flush = kHIThemeTextHorizontalFlushCenter; - else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT ) - flush = kHIThemeTextHorizontalFlushRight; - HIViewSetTextFont( m_controlRef , part , (CTFontRef) font.OSXGetCTFont() ); - HIViewSetTextHorizontalFlush( m_controlRef, part, flush ); + HIViewPartCode part = 0; + HIThemeTextHorizontalFlush flush = kHIThemeTextHorizontalFlushDefault; + if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL ) + flush = kHIThemeTextHorizontalFlushCenter; + else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT ) + flush = kHIThemeTextHorizontalFlushRight; + HIViewSetTextFont( m_controlRef , part , (CTFontRef) font.OSXGetCTFont() ); + HIViewSetTextHorizontalFlush( m_controlRef, part, flush ); - if ( foreground != *wxBLACK || ignoreBlack == false ) - { - ControlFontStyleRec fontStyle; - foreground.GetRGBColor( &fontStyle.foreColor ); - fontStyle.flags = kControlUseForeColorMask; - ::SetControlFontStyle( m_controlRef , &fontStyle ); - } + if ( foreground != *wxBLACK || ignoreBlack == false ) + { + ControlFontStyleRec fontStyle; + foreground.GetRGBColor( &fontStyle.foreColor ); + fontStyle.flags = kControlUseForeColorMask; + ::SetControlFontStyle( m_controlRef , &fontStyle ); } -#endif #if wxOSX_USE_ATSU_TEXT ControlFontStyleRec fontStyle; if ( font.MacGetThemeFontID() != kThemeCurrentPortFont ) diff --git a/Externals/wxWidgets3/src/osx/cocoa/combobox.mm b/Externals/wxWidgets3/src/osx/cocoa/combobox.mm index e817c64d8c..112b37b43e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/combobox.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/combobox.mm @@ -248,6 +248,7 @@ wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxComboBox* wxpeer, { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSComboBox* v = [[wxNSComboBox alloc] initWithFrame:r]; + [v setNumberOfVisibleItems:13]; if (style & wxCB_READONLY) [v setEditable:NO]; wxNSComboBoxControl* c = new wxNSComboBoxControl( wxpeer, v ); diff --git a/Externals/wxWidgets3/src/osx/cocoa/dataview.mm b/Externals/wxWidgets3/src/osx/cocoa/dataview.mm index d2d219d18e..e9df8f2063 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/dataview.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/dataview.mm @@ -351,7 +351,7 @@ NSTableColumn* CreateNativeColumn(const wxDataViewColumn *column) int resizingMask; if (column->IsResizeable()) { - resizingMask = NSTableColumnUserResizingMask; + resizingMask = NSTableColumnUserResizingMask | NSTableColumnAutoresizingMask; [nativeColumn setMinWidth:column->GetMinWidth()]; [nativeColumn setMaxWidth:column->GetMaxWidth()]; } @@ -367,10 +367,8 @@ NSTableColumn* CreateNativeColumn(const wxDataViewColumn *column) } [nativeColumn setResizingMask:resizingMask]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 // setting the visibility: [nativeColumn setHidden:static_cast(column->IsHidden())]; -#endif wxDataViewRendererNativeData * const renderData = renderer->GetNativeData(); @@ -1486,7 +1484,6 @@ outlineView:(NSOutlineView*)outlineView [super editWithFrame:textFrame inView:controlView editor:textObj delegate:anObject event:theEvent]; } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 -(NSUInteger) hitTestForEvent:(NSEvent*)event inRect:(NSRect)cellFrame ofView:(NSView*)controlView { NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil]; @@ -1528,7 +1525,6 @@ outlineView:(NSOutlineView*)outlineView return [super hitTestForEvent:event inRect:textFrame ofView:controlView]; } -#endif -(NSRect) imageRectForBounds:(NSRect)cellFrame { @@ -1975,7 +1971,7 @@ wxCocoaDataViewControl::wxCocoaDataViewControl(wxWindow* peer, void wxCocoaDataViewControl::InitOutlineView(long style) { [m_OutlineView setImplementation:this]; - [m_OutlineView setColumnAutoresizingStyle:NSTableViewSequentialColumnAutoresizingStyle]; + [m_OutlineView setColumnAutoresizingStyle:NSTableViewLastColumnOnlyAutoresizingStyle]; [m_OutlineView setIndentationPerLevel:GetDataViewCtrl()->GetIndent()]; NSUInteger maskGridStyle(NSTableViewGridNone); if (style & wxDV_HORIZ_RULES) @@ -2060,7 +2056,6 @@ bool wxCocoaDataViewControl::InsertColumn(unsigned int pos, wxDataViewColumn* co void wxCocoaDataViewControl::FitColumnWidthToContent(unsigned int pos) { -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 const int count = GetCount(); NSTableColumn *column = GetColumn(pos)->GetNativeData()->GetNativeColumnPtr(); @@ -2173,7 +2168,6 @@ void wxCocoaDataViewControl::FitColumnWidthToContent(unsigned int pos) } [column setWidth:calculator.GetMaxWidth()]; -#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 } // @@ -3158,6 +3152,7 @@ wxDataViewColumn::wxDataViewColumn(const wxString& title, if (renderer && !renderer->IsCustomRenderer() && (renderer->GetAlignment() == wxDVR_DEFAULT_ALIGNMENT)) renderer->SetAlignment(align); + SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0); } wxDataViewColumn::wxDataViewColumn(const wxBitmap& bitmap, @@ -3242,7 +3237,7 @@ void wxDataViewColumn::SetResizeable(bool resizable) { wxDataViewColumnBase::SetResizeable(resizable); if (resizable) - [m_NativeDataPtr->GetNativeColumnPtr() setResizingMask:NSTableColumnUserResizingMask]; + [m_NativeDataPtr->GetNativeColumnPtr() setResizingMask:NSTableColumnUserResizingMask | NSTableColumnAutoresizingMask]; else [m_NativeDataPtr->GetNativeColumnPtr() setResizingMask:NSTableColumnNoResizing]; } @@ -3295,15 +3290,13 @@ void wxDataViewColumn::SetWidth(int width) switch ( width ) { case wxCOL_WIDTH_AUTOSIZE: -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 if ( GetOwner() ) { wxCocoaDataViewControl *peer = static_cast(GetOwner()->GetPeer()); peer->FitColumnWidthToContent(GetOwner()->GetColumnPosition(this)); break; } -#endif - // fall through if unsupported (OSX < 10.5) or not yet settable + // fall through if not yet settable case wxCOL_WIDTH_DEFAULT: width = wxDVC_DEFAULT_WIDTH; diff --git a/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm b/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm index 2a27139d35..3e43d778dc 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/evtloop.mm @@ -66,10 +66,8 @@ static NSUInteger CalculateNSEventMaskFromEventCategory(wxEventCategory cat) NSMouseEnteredMask | NSMouseExitedMask | NSScrollWheelMask | -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 NSTabletPointMask | NSTabletProximityMask | -#endif NSOtherMouseDownMask | NSOtherMouseUpMask | NSOtherMouseDraggedMask | @@ -77,14 +75,12 @@ static NSUInteger CalculateNSEventMaskFromEventCategory(wxEventCategory cat) NSKeyDownMask | NSKeyUpMask | NSFlagsChangedMask | -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 NSEventMaskGesture | NSEventMaskMagnify | NSEventMaskSwipe | NSEventMaskRotate | NSEventMaskBeginGesture | NSEventMaskEndGesture | -#endif 0; } @@ -425,6 +421,45 @@ void wxModalEventLoop::OSXDoStop() [NSApp abortModal]; } +// we need our own version of ProcessIdle here in order to +// avoid deletion of pending objects, because ProcessIdle is running +// to soon and ends up in destroying the object too early, ie before +// a stack allocated instance is removed resulting in double deletes +bool wxModalEventLoop::ProcessIdle() +{ + bool needMore = false; + if ( wxTheApp ) + { + // synthesize an idle event and check if more of them are needed + wxIdleEvent event; + event.SetEventObject(wxTheApp); + wxTheApp->ProcessEvent(event); + +#if wxUSE_LOG + // flush the logged messages if any (do this after processing the events + // which could have logged new messages) + wxLog::FlushActive(); +#endif + needMore = event.MoreRequested(); + + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + + // Don't send idle events to the windows that are about to be destroyed + // anyhow, this is wasteful and unexpected. + if ( !wxPendingDelete.Member(win) && win->SendIdleEvents(event) ) + needMore = true; + node = node->GetNext(); + } + + wxUpdateUIEvent::ResetUpdateTime(); + + } + return needMore; +} + void wxGUIEventLoop::BeginModalSession( wxWindow* modalWindow ) { WXWindow nsnow = nil; diff --git a/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm b/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm index c1f80b852e..9f73bfec91 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/glcanvas.mm @@ -88,6 +88,7 @@ WXGLPixelFormat WXGLChoosePixelFormat(const int *attribList) NSOpenGLPFAColorSize,(NSOpenGLPixelFormatAttribute)8, NSOpenGLPFAAlphaSize,(NSOpenGLPixelFormatAttribute)0, NSOpenGLPFADepthSize,(NSOpenGLPixelFormatAttribute)8, + NSOpenGLPFAAccelerated, // use hardware accelerated context (NSOpenGLPixelFormatAttribute)nil }; @@ -100,6 +101,7 @@ WXGLPixelFormat WXGLChoosePixelFormat(const int *attribList) { unsigned p = 0; data[p++] = NSOpenGLPFAMinimumPolicy; // make _SIZE tags behave more like GLX + data[p++] = NSOpenGLPFAAccelerated; // use hardware accelerated context for ( unsigned arg = 0; attribList[arg] !=0 && p < WXSIZEOF(data); ) { diff --git a/Externals/wxWidgets3/src/osx/cocoa/listbox.mm b/Externals/wxWidgets3/src/osx/cocoa/listbox.mm index 0cc450997e..95d36c388e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/listbox.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/listbox.mm @@ -302,8 +302,6 @@ protected: wxListBox *list = static_cast ( impl->GetWXPeer()); wxCHECK_RET( list != NULL , wxT("Listbox expected")); - wxCommandEvent event( wxEVT_LISTBOX, list->GetId() ); - if ((row < 0) || (row > (int) list->GetCount())) // OS X can select an item below the last item return; diff --git a/Externals/wxWidgets3/src/osx/cocoa/menu.mm b/Externals/wxWidgets3/src/osx/cocoa/menu.mm index 9733bc56cd..d5fdc23761 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/menu.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/menu.mm @@ -140,6 +140,9 @@ @interface NSApplication(MissingAppleMenuCall) - (void)setAppleMenu:(NSMenu *)menu; +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 +- (void)setHelpMenu:(NSMenu* )menu; +#endif @end class wxMenuCocoaImpl : public wxMenuImpl @@ -192,8 +195,35 @@ public : virtual void MakeRoot() { + wxMenu* peer = GetWXPeer(); + [NSApp setMainMenu:m_osxMenu]; [NSApp setAppleMenu:[[m_osxMenu itemAtIndex:0] submenu]]; + + wxMenuItem *services = peer->FindItem(wxID_OSX_SERVICES); + if ( services ) + [NSApp setServicesMenu:services->GetSubMenu()->GetHMenu()]; +#if 0 + // should we reset this just to be sure we don't leave a dangling ref ? + else + [NSApp setServicesMenu:nil]; +#endif + + NSMenu* helpMenu = nil; + int helpid = peer->FindItem(wxApp::s_macHelpMenuTitleName); + if ( helpid == wxNOT_FOUND ) + helpid = peer->FindItem(_("&Help")); + + if ( helpid != wxNOT_FOUND ) + { + wxMenuItem* helpMenuItem = peer->FindItem(helpid); + + if ( helpMenuItem->IsSubMenu() ) + helpMenu = helpMenuItem->GetSubMenu()->GetHMenu(); + } + if ( [NSApp respondsToSelector:@selector(setHelpMenu:)]) + [NSApp setHelpMenu:helpMenu]; + } virtual void Enable( bool WXUNUSED(enable) ) diff --git a/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm b/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm index eadec5cda6..578fcefd8e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/menuitem.mm @@ -153,7 +153,6 @@ void wxMacCocoaMenuItemSetAccelerator( NSMenuItem* menuItem, wxAcceleratorEntry* unichar shortcut = 0; if ( key >= WXK_F1 && key <= WXK_F15 ) { - modifiers |= NSFunctionKeyMask ; shortcut = NSF1FunctionKey + ( key - WXK_F1 ); } else @@ -161,47 +160,50 @@ void wxMacCocoaMenuItemSetAccelerator( NSMenuItem* menuItem, wxAcceleratorEntry* switch ( key ) { case WXK_CLEAR : - modifiers |= NSFunctionKeyMask; shortcut = NSDeleteCharacter ; break ; case WXK_PAGEUP : - modifiers |= NSFunctionKeyMask; shortcut = NSPageUpFunctionKey ; break ; case WXK_PAGEDOWN : - modifiers |= NSFunctionKeyMask; shortcut = NSPageDownFunctionKey ; break ; + case WXK_NUMPAD_LEFT : + modifiers |= NSNumericPadKeyMask; + // pass through case WXK_LEFT : - modifiers |= NSNumericPadKeyMask | NSFunctionKeyMask; shortcut = NSLeftArrowFunctionKey ; break ; + case WXK_NUMPAD_UP : + modifiers |= NSNumericPadKeyMask; + // pass through case WXK_UP : - modifiers |= NSNumericPadKeyMask | NSFunctionKeyMask; shortcut = NSUpArrowFunctionKey ; break ; + case WXK_NUMPAD_RIGHT : + modifiers |= NSNumericPadKeyMask; + // pass through case WXK_RIGHT : - modifiers |= NSNumericPadKeyMask | NSFunctionKeyMask; shortcut = NSRightArrowFunctionKey ; break ; + case WXK_NUMPAD_DOWN : + modifiers |= NSNumericPadKeyMask; + // pass through case WXK_DOWN : - modifiers |= NSNumericPadKeyMask | NSFunctionKeyMask; shortcut = NSDownArrowFunctionKey ; break ; case WXK_HOME : - modifiers |= NSFunctionKeyMask; shortcut = NSHomeFunctionKey ; break ; case WXK_END : - modifiers |= NSFunctionKeyMask; shortcut = NSEndFunctionKey ; break ; diff --git a/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm b/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm index 6559a8d47c..a93ae41f15 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/scrolbar.mm @@ -57,12 +57,8 @@ public : { double v = ((double) value)/m_maximum; double t = ((double) thumbSize)/(m_maximum+thumbSize); -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - [(wxNSScroller*) m_osxView setFloatValue:v knobProportion:t]; -#else [(wxNSScroller*) m_osxView setDoubleValue:v]; [(wxNSScroller*) m_osxView setKnobProportion:t]; -#endif } virtual wxInt32 GetValue() const diff --git a/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm b/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm index 6c38fdf74f..bec0c44431 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/textctrl.mm @@ -89,8 +89,18 @@ public : ms_viewCurrentlyEdited = m_viewPreviouslyEdited; } - // Returns the last view we were instantiated for or NULL. - static NSView *GetCurrentlyEditedView() { return ms_viewCurrentlyEdited; } + // Returns true if this view is the one currently being changed by the + // program. + static bool IsCurrentlyEditedView(NSView* v) + { + return v == ms_viewCurrentlyEdited; + } + + // Returns true if this editor is the one currently being modified. + static bool IsCurrentEditor(wxNSTextFieldEditor* e) + { + return e == [(NSTextField*)ms_viewCurrentlyEdited currentEditor]; + } protected : BOOL m_formerEditable ; @@ -282,11 +292,16 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; - (void) insertText:(id) str { - wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] ); - if ( impl == NULL || lastKeyDownEvent==nil || !impl->DoHandleCharEvent(lastKeyDownEvent, str) ) + // We should never generate char events for the text being inserted + // programmatically. + if ( !wxMacEditHelper::IsCurrentEditor(self) ) { - [super insertText:str]; + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( (WXWidget) [self delegate] ); + if ( impl && lastKeyDownEvent && impl->DoHandleCharEvent(lastKeyDownEvent, str) ) + return; } + + [super insertText:str]; } @end @@ -334,7 +349,7 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil; { wxUnusedVar(aNotification); - if ( self == wxMacEditHelper::GetCurrentlyEditedView() ) + if ( wxMacEditHelper::IsCurrentlyEditedView(self) ) { // This notification is generated as the result of calling our own // wxTextCtrl method (e.g. WriteText()) and doesn't correspond to any diff --git a/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm b/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm index ebca4f42e1..701f3f45b5 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/toolbar.mm @@ -254,7 +254,6 @@ public: #endif // wxOSX_USE_NATIVE_TOOLBAR private: -#if wxOSX_USE_NATIVE_TOOLBAR wxFontEncoding GetToolBarFontEncoding() const { wxFont f; @@ -262,7 +261,6 @@ private: f = GetToolBar()->GetFont(); return f.IsOk() ? f.GetEncoding() : wxFont::GetDefaultEncoding(); } -#endif // wxOSX_USE_NATIVE_TOOLBAR void Init() { @@ -689,9 +687,11 @@ wxToolBar::~wxToolBar() frame->SetToolBar(NULL); } +#if wxOSX_USE_NATIVE_TOOLBAR [(NSToolbar*)m_macToolbar setDelegate:nil]; [(NSToolbar*)m_macToolbar release]; m_macToolbar = NULL; +#endif // wxOSX_USE_NATIVE_TOOLBAR } bool wxToolBar::Show( bool show ) diff --git a/Externals/wxWidgets3/src/osx/cocoa/utils.mm b/Externals/wxWidgets3/src/osx/cocoa/utils.mm index 3e07d7dc2c..664ed5159b 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/utils.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/utils.mm @@ -80,15 +80,29 @@ void wxBell() fileList.Add( wxCFStringRef::AsStringWithNormalizationFormC([fileNames objectAtIndex:i]) ); } - wxTheApp->MacOpenFiles(fileList); + if ( wxTheApp->OSXInitWasCalled() ) + wxTheApp->MacOpenFiles(fileList); + else + wxTheApp->OSXStoreOpenFiles(fileList); } -- (BOOL)application:(NSApplication *)sender printFile:(NSString *)filename +- (NSApplicationPrintReply)application:(NSApplication *)sender printFiles:(NSArray *)fileNames withSettings:(NSDictionary *)printSettings showPrintPanels:(BOOL)showPrintPanels { wxUnusedVar(sender); - wxCFStringRef cf(wxCFRetain(filename)); - wxTheApp->MacPrintFile(cf.AsString()) ; - return YES; + wxArrayString fileList; + size_t i; + const size_t count = [fileNames count]; + for (i = 0; i < count; i++) + { + fileList.Add( wxCFStringRef::AsStringWithNormalizationFormC([fileNames objectAtIndex:i]) ); + } + + if ( wxTheApp->OSXInitWasCalled() ) + wxTheApp->MacPrintFiles(fileList); + else + wxTheApp->OSXStorePrintFiles(fileList); + + return NSPrintingSuccess; } - (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag @@ -105,14 +119,16 @@ void wxBell() wxUnusedVar(replyEvent); NSString* url = [[event descriptorAtIndex:1] stringValue]; wxCFStringRef cf(wxCFRetain(url)); - wxTheApp->MacOpenURL(cf.AsString()) ; + if ( wxTheApp->OSXInitWasCalled() ) + wxTheApp->MacOpenURL(cf.AsString()) ; + else + wxTheApp->OSXStoreOpenURL(cf.AsString()); } - (void)handleOpenAppEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent { wxUnusedVar(replyEvent); - wxTheApp->MacNewFile() ; } /* @@ -239,6 +255,50 @@ void wxBell() } @end + +// more on bringing non-bundled apps to the foreground +// https://devforums.apple.com/thread/203753 + +#if 0 + +// one possible solution is also quoted here +// from http://stackoverflow.com/questions/7596643/when-calling-transformprocesstype-the-app-menu-doesnt-show-up + +@interface wxNSNonBundledAppHelper : NSObject { + +} + ++ (void)transformToForegroundApplication; + +@end + +@implementation wxNSNonBundledAppHelper + ++ (void)transformToForegroundApplication { + for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"]) { + [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + break; + } + [self performSelector:@selector(transformStep2) withObject:nil afterDelay:0.1]; +} + ++ (void)transformStep2 +{ + ProcessSerialNumber psn = { 0, kCurrentProcess }; + (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication); + + [self performSelector:@selector(transformStep3) withObject:nil afterDelay:0.1]; +} + ++ (void)transformStep3 +{ + [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; +} + +@end + +#endif + // here we subclass NSApplication, for the purpose of being able to override sendEvent. @interface wxNSApplication : NSApplication { @@ -260,6 +320,26 @@ void wxBell() return self; } +- (void) transformToForegroundApplication { + ProcessSerialNumber psn = { 0, kCurrentProcess }; + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + if ( UMAGetSystemVersion() >= 0x1090 ) + { + [[NSRunningApplication currentApplication] activateWithOptions: + (NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)]; + } + else +#endif + { + [self deactivate]; + [self activateIgnoringOtherApps:YES]; + } +} + + + /* This is needed because otherwise we don't receive any key-up events for command-key combinations (an AppKit bug, apparently) */ - (void)sendEvent:(NSEvent *)anEvent @@ -295,6 +375,20 @@ bool wxApp::DoInitGui() if (!sm_isEmbedded) { [wxNSApplication sharedApplication]; + + if ( OSXIsGUIApplication() ) + { + CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle() ) ; + CFStringRef path = CFURLCopyFileSystemPath ( url , kCFURLPOSIXPathStyle ) ; + CFRelease( url ) ; + wxString app = wxCFStringRef(path).AsString(wxLocale::GetSystemEncoding()); + + // workaround is only needed for non-bundled apps + if ( !app.EndsWith(".app") ) + { + [(wxNSApplication*) [wxNSApplication sharedApplication] transformToForegroundApplication]; + } + } appcontroller = OSXCreateAppController(); [NSApp setDelegate:appcontroller]; @@ -315,8 +409,36 @@ bool wxApp::CallOnInit() { wxMacAutoreleasePool autoreleasepool; m_onInitResult = false; + m_inited = false; + + // Feed the upcoming event loop with a dummy event. Without this, + // [NSApp run] below wouldn't return, as we expect it to, if the + // application was launched without being activated and would block + // until the dock icon was clicked - delaying OnInit() call too. + NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined + location:NSMakePoint(0.0, 0.0) + modifierFlags:0 + timestamp:0 + windowNumber:0 + context:nil + subtype:0 data1:0 data2:0]; + [NSApp postEvent:event atStart:FALSE]; [NSApp run]; - return m_onInitResult; + + m_onInitResult = OnInit(); + m_inited = true; + if ( m_onInitResult ) + { + if ( m_openFiles.GetCount() > 0 ) + MacOpenFiles(m_openFiles); + else if ( m_printFiles.GetCount() > 0 ) + MacPrintFiles(m_printFiles); + else if ( m_getURL.Len() > 0 ) + MacOpenURL(m_getURL); + else + MacNewFile(); + } + return m_onInitResult; } void wxApp::DoCleanUp() diff --git a/Externals/wxWidgets3/src/osx/cocoa/window.mm b/Externals/wxWidgets3/src/osx/cocoa/window.mm index 78cd6f99aa..1dc97c5b5e 100644 --- a/Externals/wxWidgets3/src/osx/cocoa/window.mm +++ b/Externals/wxWidgets3/src/osx/cocoa/window.mm @@ -869,7 +869,9 @@ void wxOSX_insertText(NSView* self, SEL _cmd, NSString* text); - (void)doCommandBySelector:(SEL)aSelector { - // these are already caught in the keyEvent handler + wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if (impl) + impl->doCommandBySelector(aSelector, self, _cmd); } - (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange @@ -1366,13 +1368,82 @@ void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd) void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd) { - if ( m_lastKeyDownEvent==NULL || m_hasEditor || !DoHandleCharEvent(m_lastKeyDownEvent, text) ) + bool result = false; + if ( IsUserPane() && !m_hasEditor && [text length] > 0) + { + if ( m_lastKeyDownEvent!=NULL && [text isEqualToString:[m_lastKeyDownEvent characters]]) + { + // If we have a corresponding key event, send wxEVT_KEY_DOWN now. + // (see also: wxWidgetCocoaImpl::DoHandleKeyEvent) + { + wxKeyEvent wxevent(wxEVT_KEY_DOWN); + SetupKeyEvent( wxevent, m_lastKeyDownEvent ); + result = GetWXPeer()->OSXHandleKeyEvent(wxevent); + } + + // ...and wxEVT_CHAR. + result = result || DoHandleCharEvent(m_lastKeyDownEvent, text); + } + else + { + // If we don't have a corresponding key event (e.g. IME-composed + // characters), send wxEVT_CHAR without sending wxEVT_KEY_DOWN. + for (NSUInteger i = 0; i < [text length]; ++i) + { + wxKeyEvent wxevent(wxEVT_CHAR); + wxevent.m_shiftDown = wxevent.m_controlDown = wxevent.m_altDown = wxevent.m_metaDown = false; + wxevent.m_rawCode = 0; + wxevent.m_rawFlags = 0; + wxevent.SetTimestamp(); + unichar aunichar = [text characterAtIndex:i]; +#if wxUSE_UNICODE + wxevent.m_uniChar = aunichar; +#endif + wxevent.m_keyCode = aunichar < 0x80 ? aunichar : WXK_NONE; + wxWindowMac* peer = GetWXPeer(); + if ( peer ) + { + wxevent.SetEventObject(peer); + wxevent.SetId(peer->GetId()); + } + result = GetWXPeer()->OSXHandleKeyEvent(wxevent) || result; + } + } + } + if ( !result ) { wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; superimpl(slf, (SEL)_cmd, text); } } +void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* _cmd) +{ + if ( m_lastKeyDownEvent!=NULL ) + { + // If we have a corresponding key event, send wxEVT_KEY_DOWN now. + // (see also: wxWidgetCocoaImpl::DoHandleKeyEvent) + wxKeyEvent wxevent(wxEVT_KEY_DOWN); + SetupKeyEvent( wxevent, m_lastKeyDownEvent ); + bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent); + + if (!result) + { + // Generate wxEVT_CHAR if wxEVT_KEY_DOWN is not handled. + + long keycode = wxOSXTranslateCocoaKey( m_lastKeyDownEvent, wxEVT_CHAR ); + + wxKeyEvent wxevent2(wxevent) ; + wxevent2.SetEventType(wxEVT_CHAR); + SetupKeyEvent( wxevent2, m_lastKeyDownEvent ); + if ( (keycode > 0 && keycode < WXK_SPACE) || keycode == WXK_DELETE || keycode >= WXK_START ) + { + wxevent2.m_keyCode = keycode; + } + GetWXPeer()->OSXHandleKeyEvent(wxevent2); + } + } +} bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, void *_cmd) { @@ -2665,48 +2736,23 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) return true; } - bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent); - - // this will fire higher level events, like insertText, to help - // us handle EVT_CHAR, etc. - - if ( !result ) + if ( IsUserPane() && [event type] == NSKeyDown) { - if ( [event type] == NSKeyDown) - { - long keycode = wxOSXTranslateCocoaKey( event, wxEVT_CHAR ); - - if ( (keycode > 0 && keycode < WXK_SPACE) || keycode == WXK_DELETE || keycode >= WXK_START ) - { - // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars - wxKeyEvent wxevent2(wxevent) ; - wxevent2.SetEventType(wxEVT_CHAR); - SetupKeyEvent( wxevent2, event ); - wxevent2.m_keyCode = keycode; - result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); - } - else if (wxevent.CmdDown()) - { - wxKeyEvent wxevent2(wxevent) ; - wxevent2.SetEventType(wxEVT_CHAR); - SetupKeyEvent( wxevent2, event ); - result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); - } - else - { - if ( IsUserPane() && !wxevent.CmdDown() ) - { - if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) - [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; - else - [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; - result = true; - } - } - } - } + // Don't fire wxEVT_KEY_DOWN here in order to allow IME to intercept + // some key events. If the event is not handled by IME, either + // insertText: or doCommandBySelector: is called, so we send + // wxEVT_KEY_DOWN and wxEVT_CHAR there. - return result; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + else + [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + return true; + } + else + { + return GetWXPeer()->OSXHandleKeyEvent(wxevent); + } } bool wxWidgetCocoaImpl::DoHandleMouseEvent(NSEvent *event) diff --git a/Externals/wxWidgets3/src/osx/core/bitmap.cpp b/Externals/wxWidgets3/src/osx/core/bitmap.cpp index 2edc5ed7ee..8ee6127b11 100644 --- a/Externals/wxWidgets3/src/osx/core/bitmap.cpp +++ b/Externals/wxWidgets3/src/osx/core/bitmap.cpp @@ -1225,8 +1225,6 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) { UnRef(); - // XXX comex: how exactly is this supposed to work!? @2x support isn't used in this case - /* wxBitmapHandler *handler = FindHandler(type); if ( handler ) @@ -1236,7 +1234,6 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) return handler->LoadFile(this, filename, type, -1, -1); } else - */ { #if wxUSE_IMAGE double scale = 1.0; diff --git a/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp b/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp index e3e0752f04..37b22b5909 100644 --- a/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp +++ b/Externals/wxWidgets3/src/osx/core/evtloop_cf.cpp @@ -71,14 +71,14 @@ wxCFEventLoopSource::~wxCFEventLoopSource() void wxCFEventLoop::OSXCommonModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info) { wxCFEventLoop * eventloop = static_cast(info); - if ( eventloop ) + if ( eventloop && eventloop->IsRunning() ) eventloop->CommonModeObserverCallBack(observer, activity); } void wxCFEventLoop::OSXDefaultModeObserverCallBack(CFRunLoopObserverRef observer, int activity, void *info) { wxCFEventLoop * eventloop = static_cast(info); - if ( eventloop ) + if ( eventloop && eventloop->IsRunning() ) eventloop->DefaultModeObserverCallBack(observer, activity); } diff --git a/Externals/wxWidgets3/src/osx/core/fontenum.cpp b/Externals/wxWidgets3/src/osx/core/fontenum.cpp index 658701bc82..74bf8039e9 100644 --- a/Externals/wxWidgets3/src/osx/core/fontenum.cpp +++ b/Externals/wxWidgets3/src/osx/core/fontenum.cpp @@ -40,8 +40,7 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, wxArrayString fontFamilies ; wxUint32 macEncoding = wxMacGetSystemEncFromFontEnc(encoding) ; - -#if wxOSX_USE_CORE_TEXT + { CFArrayRef cfFontFamilies = nil; @@ -127,7 +126,6 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, CFRelease(cfFontFamilies); } -#endif for ( size_t i = 0 ; i < fontFamilies.Count() ; ++i ) { if ( OnFacename( fontFamilies[i] ) == false ) diff --git a/Externals/wxWidgets3/src/osx/core/sound.cpp b/Externals/wxWidgets3/src/osx/core/sound.cpp index 815ba16420..cc6185a33e 100644 --- a/Externals/wxWidgets3/src/osx/core/sound.cpp +++ b/Externals/wxWidgets3/src/osx/core/sound.cpp @@ -50,7 +50,7 @@ protected: }; wxOSXAudioToolboxSoundData::wxOSXAudioToolboxSoundData(const wxString& fileName) : - m_soundID(0) + m_soundID(NULL) { m_sndname = fileName; } diff --git a/Externals/wxWidgets3/src/osx/iphone/evtloop.mm b/Externals/wxWidgets3/src/osx/iphone/evtloop.mm index f928274e41..4e179b6241 100644 --- a/Externals/wxWidgets3/src/osx/iphone/evtloop.mm +++ b/Externals/wxWidgets3/src/osx/iphone/evtloop.mm @@ -54,10 +54,8 @@ static int CalculateUIEventMaskFromEventCategory(wxEventCategory cat) NSMouseEnteredMask = 1 << NSMouseEntered, NSMouseExitedMask = 1 << NSMouseExited, NSScrollWheelMask = 1 << NSScrollWheel, -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 NSTabletPointMask = 1 << NSTabletPoint, NSTabletProximityMask = 1 << NSTabletProximity, -#endif NSOtherMouseDownMask = 1 << NSOtherMouseDown, NSOtherMouseUpMask = 1 << NSOtherMouseUp, NSOtherMouseDraggedMask = 1 << NSOtherMouseDragged, diff --git a/Externals/wxWidgets3/src/osx/menu_osx.cpp b/Externals/wxWidgets3/src/osx/menu_osx.cpp index 2bf5cede9e..97685d31ef 100644 --- a/Externals/wxWidgets3/src/osx/menu_osx.cpp +++ b/Externals/wxWidgets3/src/osx/menu_osx.cpp @@ -588,30 +588,59 @@ wxMenu* emptyMenuBar = NULL; const int firstMenuPos = 1; // to account for the 0th application menu on mac +static wxMenu *CreateAppleMenu() +{ + wxMenu *appleMenu = new wxMenu(); + appleMenu->SetAllowRearrange(false); + + // Create standard items unless the application explicitly disabled this by + // setting the corresponding ids to wxID_NONE: although this is not + // recommended, sometimes these items really don't make sense. + if ( wxApp::s_macAboutMenuItemId != wxID_NONE ) + { + wxString aboutLabel; + if ( wxTheApp ) + aboutLabel.Printf(_("About %s"), wxTheApp->GetAppDisplayName()); + else + aboutLabel = _("About..."); + appleMenu->Append( wxApp::s_macAboutMenuItemId, aboutLabel); + appleMenu->AppendSeparator(); + } + +#if !wxOSX_USE_CARBON + if ( wxApp::s_macPreferencesMenuItemId != wxID_NONE ) + { + appleMenu->Append( wxApp::s_macPreferencesMenuItemId, + _("Preferences...") + "\tCtrl+," ); + appleMenu->AppendSeparator(); + } + + appleMenu->Append(wxID_OSX_SERVICES, _("Services"), new wxMenu()); + appleMenu->AppendSeparator(); + + // standard menu items, handled in wxMenu::HandleCommandProcess(), see above: + wxString hideLabel; + hideLabel = wxString::Format(_("Hide %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); + appleMenu->Append( wxID_OSX_HIDE, hideLabel + "\tCtrl+H" ); + appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" ); + appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") ); + appleMenu->AppendSeparator(); + + // Do always add "Quit" item unconditionally however, it can't be disabled. + wxString quitLabel; + quitLabel = wxString::Format(_("Quit %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); + appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel + "\tCtrl+Q" ); +#endif // !wxOSX_USE_CARBON + + return appleMenu; +} + void wxMenuBar::Init() { if ( emptyMenuBar == NULL ) { emptyMenuBar = new wxMenu(); - - wxMenu* appleMenu = new wxMenu(); - appleMenu->SetAllowRearrange(false); -#if !wxOSX_USE_CARBON - // standard menu items, handled in wxMenu::HandleCommandProcess(), see above: - wxString hideLabel; - hideLabel = wxString::Format(_("Hide %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); - appleMenu->Append( wxID_OSX_HIDE, hideLabel + "\tCtrl+H" ); - appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" ); - appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") ); - appleMenu->AppendSeparator(); - - // Do always add "Quit" item unconditionally however, it can't be disabled. - wxString quitLabel; - quitLabel = wxString::Format(_("Quit %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); - appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel + "\tCtrl+Q" ); -#endif // !wxOSX_USE_CARBON - - emptyMenuBar->AppendSubMenu(appleMenu, "\x14") ; + emptyMenuBar->AppendSubMenu(CreateAppleMenu(), "\x14") ; } m_eventHandler = this; @@ -619,45 +648,7 @@ void wxMenuBar::Init() m_rootMenu = new wxMenu(); m_rootMenu->Attach(this); - m_appleMenu = new wxMenu(); - m_appleMenu->SetAllowRearrange(false); - - // Create standard items unless the application explicitly disabled this by - // setting the corresponding ids to wxID_NONE: although this is not - // recommended, sometimes these items really don't make sense. - if ( wxApp::s_macAboutMenuItemId != wxID_NONE ) - { - wxString aboutLabel(_("About")); - if ( wxTheApp ) - aboutLabel << ' ' << wxTheApp->GetAppDisplayName(); - else - aboutLabel << "..."; - m_appleMenu->Append( wxApp::s_macAboutMenuItemId, aboutLabel); - m_appleMenu->AppendSeparator(); - } - -#if !wxOSX_USE_CARBON - if ( wxApp::s_macPreferencesMenuItemId != wxID_NONE ) - { - m_appleMenu->Append( wxApp::s_macPreferencesMenuItemId, - _("Preferences...") + "\tCtrl+," ); - m_appleMenu->AppendSeparator(); - } - - // standard menu items, handled in wxMenu::HandleCommandProcess(), see above: - wxString hideLabel; - hideLabel = wxString::Format(_("Hide %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); - m_appleMenu->Append( wxID_OSX_HIDE, hideLabel + "\tCtrl+H" ); - m_appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" ); - m_appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") ); - m_appleMenu->AppendSeparator(); - - // Do always add "Quit" item unconditionally however, it can't be disabled. - wxString quitLabel; - quitLabel = wxString::Format(_("Quit %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application")); - m_appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel + "\tCtrl+Q" ); -#endif // !wxOSX_USE_CARBON - + m_appleMenu = CreateAppleMenu(); m_rootMenu->AppendSubMenu(m_appleMenu, "\x14") ; } diff --git a/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp b/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp index 9e7f1e185c..0e57c7f9f9 100644 --- a/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp +++ b/Externals/wxWidgets3/src/osx/nonownedwnd_osx.cpp @@ -496,10 +496,12 @@ WXWindow wxNonOwnedWindow::GetWXWindow() const return m_nowpeer ? m_nowpeer->GetWXWindow() : NULL; } +#if wxOSX_USE_COCOA_OR_IPHONE void *wxNonOwnedWindow::OSXGetViewOrWindow() const { return GetWXWindow(); } +#endif // --------------------------------------------------------------------------- // Shape implementation diff --git a/Externals/wxWidgets3/src/osx/radiobox_osx.cpp b/Externals/wxWidgets3/src/osx/radiobox_osx.cpp index d728bd821e..2aba6e193b 100644 --- a/Externals/wxWidgets3/src/osx/radiobox_osx.cpp +++ b/Externals/wxWidgets3/src/osx/radiobox_osx.cpp @@ -432,7 +432,13 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) totHeight = GetRowCount() * maxHeight + (GetRowCount() - 1) * space; totWidth = GetColumnCount() * (maxWidth + charWidth); - wxSize sz = DoGetSizeFromClientSize( wxSize( totWidth, totHeight ) ) ; + // Determine the full size in case we need to use it as fallback. + wxSize sz; + if ( (width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH)) || + (height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT)) ) + { + sz = DoGetSizeFromClientSize( wxSize( totWidth, totHeight ) ) ; + } // change the width / height only when specified if ( width == wxDefaultCoord ) @@ -453,6 +459,11 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) wxControl::DoSetSize( x_offset, y_offset, width, height, wxSIZE_AUTO ); + // But now recompute the full size again because it could have changed. + // This notably happens if the previous full size was too small to fully + // fit the box margins. + sz = DoGetSizeFromClientSize( wxSize( totWidth, totHeight ) ) ; + // arrange radio buttons int x_start, y_start; diff --git a/Externals/wxWidgets3/src/osx/textctrl_osx.cpp b/Externals/wxWidgets3/src/osx/textctrl_osx.cpp index dcfc0e15b4..08346e5adb 100644 --- a/Externals/wxWidgets3/src/osx/textctrl_osx.cpp +++ b/Externals/wxWidgets3/src/osx/textctrl_osx.cpp @@ -599,21 +599,6 @@ bool wxTextCtrl::MacSetupCursor( const wxPoint& pt ) return true ; } -bool wxTextCtrl::SetHint(const wxString& hint) -{ - m_hintString = hint; - - if ( GetTextPeer() && GetTextPeer()->SetHint(hint) ) - return true; - - return false; -} - -wxString wxTextCtrl::GetHint() const -{ - return m_hintString; -} - // ---------------------------------------------------------------------------- // implementation base class // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/textentry_osx.cpp b/Externals/wxWidgets3/src/osx/textentry_osx.cpp index 67a858ea8f..8a1466ba83 100644 --- a/Externals/wxWidgets3/src/osx/textentry_osx.cpp +++ b/Externals/wxWidgets3/src/osx/textentry_osx.cpp @@ -287,6 +287,18 @@ wxTextWidgetImpl * wxTextEntry::GetTextPeer() const return win ? dynamic_cast(win->GetPeer()) : NULL; } +bool wxTextEntry::SetHint(const wxString& hint) +{ + m_hintString = hint; + return GetTextPeer() && GetTextPeer()->SetHint(hint); +} + +wxString wxTextEntry::GetHint() const +{ + return m_hintString; +} + + // ---------------------------------------------------------------------------- // Auto-completion // ---------------------------------------------------------------------------- diff --git a/Externals/wxWidgets3/src/osx/webview_webkit.mm b/Externals/wxWidgets3/src/osx/webview_webkit.mm index a311bb3d34..ab7586544f 100644 --- a/Externals/wxWidgets3/src/osx/webview_webkit.mm +++ b/Externals/wxWidgets3/src/osx/webview_webkit.mm @@ -351,10 +351,7 @@ bool wxWebViewWebKit::Create(wxWindow *parent, m_webView = (WebView*) HIWebViewGetWebView( peer->GetControlRef() ); -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 - if ( UMAGetSystemVersion() >= 0x1030 ) - HIViewChangeFeatures( peer->GetControlRef() , kHIViewIsOpaque , 0 ) ; -#endif + HIViewChangeFeatures( peer->GetControlRef() , kHIViewIsOpaque , 0 ) ; InstallControlEventHandler(peer->GetControlRef(), GetwxWebViewWebKitEventHandlerUPP(), GetEventTypeCount(eventList), eventList, this, @@ -495,18 +492,18 @@ wxString wxWebViewWebKit::GetPageSource() const { if (CanGetPageSource()) - { + { WebDataSource* dataSource = [[m_webView mainFrame] dataSource]; - wxASSERT (dataSource != nil); + wxASSERT (dataSource != nil); - id representation = [dataSource representation]; - wxASSERT (representation != nil); + id representation = [dataSource representation]; + wxASSERT (representation != nil); - NSString* source = [representation documentSource]; - if (source == nil) - { - return wxEmptyString; - } + NSString* source = [representation documentSource]; + if (source == nil) + { + return wxEmptyString; + } return wxStringWithNSString( source ); } @@ -1074,9 +1071,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) case NSURLErrorResourceUnavailable: case NSURLErrorHTTPTooManyRedirects: -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 case NSURLErrorDataLengthExceedsMaximum: -#endif case NSURLErrorBadURL: case NSURLErrorFileIsDirectory: *out = wxWEBVIEW_NAV_ERR_REQUEST; @@ -1098,11 +1093,9 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) *out = wxWEBVIEW_NAV_ERR_USER_CANCELLED; break; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 case NSURLErrorCannotDecodeRawData: case NSURLErrorCannotDecodeContentData: case NSURLErrorCannotParseResponse: -#endif case NSURLErrorBadServerResponse: *out = wxWEBVIEW_NAV_ERR_REQUEST; break; @@ -1116,7 +1109,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) break; case NSURLErrorNoPermissionsToReadFile: - *out = wxWEBVIEW_NAV_ERR_SECURITY; + *out = wxWEBVIEW_NAV_ERR_SECURITY; break; case NSURLErrorServerCertificateHasBadDate: @@ -1148,17 +1141,17 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) wxWebViewNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); - wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, - webKitWindow->GetId(), + wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, + webKitWindow->GetId(), wxStringWithNSString( url ), wxEmptyString); - event.SetString(description); - event.SetInt(type); + event.SetString(description); + event.SetInt(type); - if (webKitWindow && webKitWindow->GetEventHandler()) - { - webKitWindow->GetEventHandler()->ProcessEvent(event); - } + if (webKitWindow && webKitWindow->GetEventHandler()) + { + webKitWindow->GetEventHandler()->ProcessEvent(event); + } } } @@ -1172,17 +1165,17 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) NSString *url = [[[[frame provisionalDataSource] request] URL] absoluteString]; - wxWebViewNavigationError type; + wxWebViewNavigationError type; wxString description = nsErrorToWxHtmlError(error, &type); - wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, - webKitWindow->GetId(), + wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, + webKitWindow->GetId(), wxStringWithNSString( url ), wxEmptyString); - event.SetString(description); - event.SetInt(type); + event.SetString(description); + event.SetInt(type); - if (webKitWindow && webKitWindow->GetEventHandler()) - webKitWindow->GetEventHandler()->ProcessEvent(event); + if (webKitWindow && webKitWindow->GetEventHandler()) + webKitWindow->GetEventHandler()->ProcessEvent(event); } } @@ -1275,7 +1268,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) } } - return NO; + return NO; } + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request @@ -1287,7 +1280,7 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) - (void)startLoading { NSURLRequest *request = [self request]; - NSString* path = [[request URL] absoluteString]; + NSString* path = [[request URL] absoluteString]; id client = [self client]; @@ -1310,9 +1303,9 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL] - MIMEType:wxNSStringWithWxString(file->GetMimeType()) - expectedContentLength:length - textEncodingName:nil]; + MIMEType:wxNSStringWithWxString(file->GetMimeType()) + expectedContentLength:length + textEncodingName:nil]; //Load the data, we malloc it so it is tidied up properly void* buffer = malloc(length); @@ -1320,16 +1313,16 @@ wxString nsErrorToWxHtmlError(NSError* error, wxWebViewNavigationError* out) NSData *data = [[NSData alloc] initWithBytesNoCopy:buffer length:length]; //We do not support caching anything yet - [client URLProtocol:self didReceiveResponse:response + [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //Set the data - [client URLProtocol:self didLoadData:data]; + [client URLProtocol:self didLoadData:data]; - //Notify that we have finished - [client URLProtocolDidFinishLoading:self]; + //Notify that we have finished + [client URLProtocolDidFinishLoading:self]; - [response release]; + [response release]; } - (void)stopLoading diff --git a/Externals/wxWidgets3/src/osx/window_osx.cpp b/Externals/wxWidgets3/src/osx/window_osx.cpp index afbf5a0a32..0f8f921aae 100644 --- a/Externals/wxWidgets3/src/osx/window_osx.cpp +++ b/Externals/wxWidgets3/src/osx/window_osx.cpp @@ -39,6 +39,7 @@ #include "wx/tooltip.h" #include "wx/spinctrl.h" #include "wx/geometry.h" +#include "wx/weakref.h" #if wxUSE_LISTCTRL #include "wx/listctrl.h" @@ -610,7 +611,7 @@ void wxWindowMac::SetFocus() void wxWindowMac::OSXSimulateFocusEvents() { - wxWindow* former = FindFocus() ; + wxWeakRef former = FindFocus() ; if ( former != NULL && former != this ) { { @@ -620,6 +621,9 @@ void wxWindowMac::OSXSimulateFocusEvents() former->HandleWindowEvent(event) ; } + // 'former' could have been destroyed by a wxEVT_KILL_FOCUS handler, + // so we must test it for non-NULL again + if ( former ) { wxFocusEvent event(wxEVT_SET_FOCUS, former->GetId()); event.SetEventObject(former); @@ -2545,10 +2549,12 @@ bool wxWindowMac::OSXHandleClicked( double WXUNUSED(timestampsec) ) return false; } +#if wxOSX_USE_COCOA_OR_IPHONE void *wxWindowMac::OSXGetViewOrWindow() const { return GetHandle(); } +#endif wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF event ) { diff --git a/Externals/wxWidgets3/src/unix/displayx11.cpp b/Externals/wxWidgets3/src/unix/displayx11.cpp index 87dedfc530..51f1335d19 100644 --- a/Externals/wxWidgets3/src/unix/displayx11.cpp +++ b/Externals/wxWidgets3/src/unix/displayx11.cpp @@ -231,14 +231,14 @@ wxDisplayImpl *wxDisplayFactoryX11::CreateDisplay(unsigned n) // Correct res rate from GLFW #define wxCRR2(v,dc) (int) (((1000.0f * (float) dc) /*PIXELS PER SECOND */) / ((float) v.htotal * v.vtotal /*PIXELS PER FRAME*/) + 0.5f) #define wxCRR(v) wxCRR2(v,v.dotclock) -#define wxCVM2(v, dc) wxVideoMode(v.hdisplay, v.vdisplay, DefaultDepth((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay())), wxCRR2(v,dc)) -#define wxCVM(v) wxCVM2(v, v.dotclock) +#define wxCVM2(v, dc, display, nScreen) wxVideoMode(v.hdisplay, v.vdisplay, DefaultDepth(display, nScreen), wxCRR2(v,dc)) +#define wxCVM(v, display, nScreen) wxCVM2(v, v.dotclock, display, nScreen) wxArrayVideoModes wxDisplayImplX11::GetModes(const wxVideoMode& mode) const { //Convenience... - Display* pDisplay = (Display*) wxGetDisplay(); //default display - int nScreen = DefaultScreen(pDisplay); //default screen of (default) display... + Display* display = (Display*) wxGetDisplay(); //default display + int nScreen = DefaultScreen(display); //default screen of (default) display... //Some variables.. XF86VidModeModeInfo** ppXModes; //Enumerated Modes (Don't forget XFree() :)) @@ -246,16 +246,17 @@ wxArrayVideoModes wxDisplayImplX11::GetModes(const wxVideoMode& mode) const wxArrayVideoModes Modes; //modes to return... - if (XF86VidModeGetAllModeLines(pDisplay, nScreen, &nNumModes, &ppXModes) == TRUE) + if (XF86VidModeGetAllModeLines(display, nScreen, &nNumModes, &ppXModes)) { for (int i = 0; i < nNumModes; ++i) { - if (mode == wxDefaultVideoMode || //According to display.h All modes valid if dafault mode... - mode.Matches(wxCVM((*ppXModes[i]))) ) //...? + XF86VidModeModeInfo& info = *ppXModes[i]; + const wxVideoMode vm = wxCVM(info, display, nScreen); + if (vm.Matches(mode)) { - Modes.Add(wxCVM((*ppXModes[i]))); + Modes.Add(vm); } - wxClearXVM((*ppXModes[i])); + wxClearXVM(info); // XFree(ppXModes[i]); //supposed to free? } XFree(ppXModes); @@ -270,20 +271,23 @@ wxArrayVideoModes wxDisplayImplX11::GetModes(const wxVideoMode& mode) const wxVideoMode wxDisplayImplX11::GetCurrentMode() const { + Display* display = static_cast(wxGetDisplay()); + int nScreen = DefaultScreen(display); XF86VidModeModeLine VM; int nDotClock; - XF86VidModeGetModeLine((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()), - &nDotClock, &VM); + XF86VidModeGetModeLine(display, nScreen, &nDotClock, &VM); wxClearXVM(VM); - return wxCVM2(VM, nDotClock); + return wxCVM2(VM, nDotClock, display, nScreen); } bool wxDisplayImplX11::ChangeMode(const wxVideoMode& mode) { + Display* display = static_cast(wxGetDisplay()); + int nScreen = DefaultScreen(display); XF86VidModeModeInfo** ppXModes; //Enumerated Modes (Don't forget XFree() :)) int nNumModes; //Number of modes enumerated.... - if( !XF86VidModeGetAllModeLines((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()), &nNumModes, &ppXModes) ) + if(!XF86VidModeGetAllModeLines(display, nScreen, &nNumModes, &ppXModes)) { wxLogSysError(_("Failed to change video mode")); return false; @@ -292,8 +296,7 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& mode) bool bRet = false; if (mode == wxDefaultVideoMode) { - bRet = XF86VidModeSwitchToMode((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()), - ppXModes[0]) == TRUE; + bRet = XF86VidModeSwitchToMode(display, nScreen, ppXModes[0]) != 0; for (int i = 0; i < nNumModes; ++i) { @@ -311,8 +314,7 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& mode) wxCRR((*ppXModes[i])) == mode.GetRefresh()) { //switch! - bRet = XF86VidModeSwitchToMode((Display*)wxGetDisplay(), DefaultScreen((Display*)wxGetDisplay()), - ppXModes[i]) == TRUE; + bRet = XF86VidModeSwitchToMode(display, nScreen, ppXModes[i]) != 0; } wxClearXVM((*ppXModes[i])); // XFree(ppXModes[i]); //supposed to free? @@ -324,7 +326,6 @@ bool wxDisplayImplX11::ChangeMode(const wxVideoMode& mode) return bRet; } - #else // !HAVE_X11_EXTENSIONS_XF86VMODE_H wxArrayVideoModes wxDisplayImplX11::GetModes(const wxVideoMode& modeMatch) const @@ -339,7 +340,7 @@ wxArrayVideoModes wxDisplayImplX11::GetModes(const wxVideoMode& modeMatch) const wxVideoMode mode(m_rect.GetWidth(), m_rect.GetHeight(), depths[x]); if ( mode.Matches(modeMatch) ) { - modes.Add(modeMatch); + modes.Add(mode); } } diff --git a/Externals/wxWidgets3/src/unix/dlunix.cpp b/Externals/wxWidgets3/src/unix/dlunix.cpp index 881ea77687..74c2277321 100644 --- a/Externals/wxWidgets3/src/unix/dlunix.cpp +++ b/Externals/wxWidgets3/src/unix/dlunix.cpp @@ -64,171 +64,6 @@ // constants // ---------------------------------------------------------------------------- -// ============================================================================ -// wxDynamicLibrary implementation -// ============================================================================ - -// ---------------------------------------------------------------------------- -// dlxxx() emulation for Darwin -// Only useful if the OS X version could be < 10.3 at runtime -// ---------------------------------------------------------------------------- - -#if defined(__DARWIN__) && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_3) -// --------------------------------------------------------------------------- -// For Darwin/Mac OS X -// supply the sun style dlopen functions in terms of Darwin NS* -// --------------------------------------------------------------------------- - -/* Porting notes: - * The dlopen port is a port from dl_next.xs by Anno Siegel. - * dl_next.xs is itself a port from dl_dlopen.xs by Paul Marquess. - * The method used here is just to supply the sun style dlopen etc. - * functions in terms of Darwin NS*. - */ - -#include -#include - -static char dl_last_error[1024]; - -static const char *wx_darwin_dlerror() -{ - return dl_last_error; -} - -static void *wx_darwin_dlopen(const char *path, int WXUNUSED(mode) /* mode is ignored */) -{ - NSObjectFileImage ofile; - NSModule handle = NULL; - - unsigned dyld_result = NSCreateObjectFileImageFromFile(path, &ofile); - if ( dyld_result != NSObjectFileImageSuccess ) - { - handle = NULL; - - static const char *const errorStrings[] = - { - "%d: Object Image Load Failure", - "%d: Object Image Load Success", - "%d: Not an recognisable object file", - "%d: No valid architecture", - "%d: Object image has an invalid format", - "%d: Invalid access (permissions?)", - "%d: Unknown error code from NSCreateObjectFileImageFromFile" - }; - - const int index = dyld_result < WXSIZEOF(errorStrings) - ? dyld_result - : WXSIZEOF(errorStrings) - 1; - - // this call to sprintf() is safe as strings above are fixed at - // compile-time and are shorter than WXSIZEOF(dl_last_error) - sprintf(dl_last_error, errorStrings[index], dyld_result); - } - else - { - handle = NSLinkModule - ( - ofile, - path, - NSLINKMODULE_OPTION_BINDNOW | - NSLINKMODULE_OPTION_RETURN_ON_ERROR - ); - - if ( !handle ) - { - NSLinkEditErrors err; - int code; - const char *filename; - const char *errmsg; - - NSLinkEditError(&err, &code, &filename, &errmsg); - strncpy(dl_last_error, errmsg, WXSIZEOF(dl_last_error)-1); - dl_last_error[WXSIZEOF(dl_last_error)-1] = '\0'; - } - } - - - return handle; -} - -static int wx_darwin_dlclose(void *handle) -{ - NSUnLinkModule((NSModule)handle, NSUNLINKMODULE_OPTION_NONE); - return 0; -} - -static void *wx_darwin_dlsym(void *handle, const char *symbol) -{ - // as on many other systems, C symbols have prepended underscores under - // Darwin but unlike the normal dlopen(), NSLookupSymbolInModule() is not - // aware of this - wxCharBuffer buf(strlen(symbol) + 1); - char *p = buf.data(); - p[0] = '_'; - strcpy(p + 1, symbol); - - NSSymbol nsSymbol = NSLookupSymbolInModule((NSModule)handle, p ); - return nsSymbol ? NSAddressOfSymbol(nsSymbol) : NULL; -} - -// Add the weak linking attribute to dlopen's declaration -extern void * dlopen(const char * __path, int __mode) AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER; - -// For all of these methods we test dlopen since all of the dl functions we use were added -// to OS X at the same time. This also ensures we don't dlopen with the real function then -// dlclose with the internal implementation. - -static inline void *wx_dlopen(const char *__path, int __mode) -{ -#ifdef HAVE_DLOPEN - if(&dlopen != NULL) - return dlopen(__path, __mode); - else -#endif - return wx_darwin_dlopen(__path, __mode); -} - -static inline int wx_dlclose(void *__handle) -{ -#ifdef HAVE_DLOPEN - if(&dlopen != NULL) - return dlclose(__handle); - else -#endif - return wx_darwin_dlclose(__handle); -} - -static inline const char *wx_dlerror() -{ -#ifdef HAVE_DLOPEN - if(&dlopen != NULL) - return dlerror(); - else -#endif - return wx_darwin_dlerror(); -} - -static inline void *wx_dlsym(void *__handle, const char *__symbol) -{ -#ifdef HAVE_DLOPEN - if(&dlopen != NULL) - return dlsym(__handle, __symbol); - else -#endif - return wx_darwin_dlsym(__handle, __symbol); -} - -#else // __DARWIN__/!__DARWIN__ - -// Use preprocessor definitions for non-Darwin or OS X >= 10.3 -#define wx_dlopen(__path,__mode) dlopen(__path,__mode) -#define wx_dlclose(__handle) dlclose(__handle) -#define wx_dlerror() dlerror() -#define wx_dlsym(__handle,__symbol) dlsym(__handle,__symbol) - -#endif // defined(__DARWIN__) - // ---------------------------------------------------------------------------- // loading/unloading DLLs // ---------------------------------------------------------------------------- @@ -236,7 +71,7 @@ static inline void *wx_dlsym(void *__handle, const char *__symbol) wxDllType wxDynamicLibrary::GetProgramHandle() { #ifdef USE_POSIX_DL_FUNCS - return wx_dlopen(0, RTLD_LAZY); + return dlopen(0, RTLD_LAZY); #else return PROG_HANDLE; #endif @@ -257,7 +92,7 @@ wxDllType wxDynamicLibrary::RawLoad(const wxString& libname, int flags) if ( flags & wxDL_GLOBAL ) rtldFlags |= RTLD_GLOBAL; - return wx_dlopen(libname.fn_str(), rtldFlags); + return dlopen(libname.fn_str(), rtldFlags); #else // !USE_POSIX_DL_FUNCS int shlFlags = 0; @@ -282,7 +117,7 @@ void wxDynamicLibrary::Unload(wxDllType handle) #endif #ifdef USE_POSIX_DL_FUNCS - wx_dlclose(handle); + dlclose(handle); #else // !USE_POSIX_DL_FUNCS shl_unload(handle); #endif // USE_POSIX_DL_FUNCS/!USE_POSIX_DL_FUNCS @@ -299,7 +134,7 @@ void *wxDynamicLibrary::RawGetSymbol(wxDllType handle, const wxString& name) void *symbol; #ifdef USE_POSIX_DL_FUNCS - symbol = wx_dlsym(handle, name.fn_str()); + symbol = dlsym(handle, name.fn_str()); #else // !USE_POSIX_DL_FUNCS // note that shl_findsym modifies the handle argument to indicate where the // symbol was found, but it's ok to modify the local handle copy here @@ -319,7 +154,7 @@ void *wxDynamicLibrary::RawGetSymbol(wxDllType handle, const wxString& name) /* static */ void wxDynamicLibrary::Error() { - wxString err(wx_dlerror()); + wxString err(dlerror()); if ( err.empty() ) err = _("Unknown dynamic library error"); diff --git a/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp b/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp index 117a036d4e..694beecedf 100644 --- a/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp +++ b/Externals/wxWidgets3/src/unix/fswatcher_inotify.cpp @@ -256,6 +256,7 @@ protected: event ( wxFSW_EVENT_WARNING, + wxFSW_WARNING_GENERAL, wxString::Format ( _("Unexpected event for \"%s\": no " @@ -279,8 +280,19 @@ protected: // check out for error/warning condition if (flags & wxFSW_EVENT_WARNING || flags & wxFSW_EVENT_ERROR) { - wxString errMsg = GetErrorDescription(nativeFlags); - wxFileSystemWatcherEvent event(flags, errMsg); + wxFSWWarningType warningType; + if ( flags & wxFSW_EVENT_WARNING ) + { + warningType = nativeFlags & IN_Q_OVERFLOW + ? wxFSW_WARNING_OVERFLOW + : wxFSW_WARNING_GENERAL; + } + else // It's an error, not a warning. + { + warningType = wxFSW_WARNING_NONE; + } + + wxFileSystemWatcherEvent event(flags, warningType); SendEvent(event); return; } @@ -293,6 +305,7 @@ protected: event ( wxFSW_EVENT_WARNING, + wxFSW_WARNING_GENERAL, wxString::Format ( _("Invalid inotify event for \"%s\""), @@ -628,22 +641,6 @@ protected: return -1; } - /** - * Returns error description for specified inotify mask - */ - static const wxString GetErrorDescription(int flag) - { - switch ( flag ) - { - case IN_Q_OVERFLOW: - return _("Event queue overflowed"); - } - - // never reached - wxFAIL_MSG(wxString::Format("Unknown inotify event mask %u", flag)); - return wxEmptyString; - } - wxFSWSourceHandler* m_handler; // handler for inotify event source wxFSWatchEntryDescriptors m_watchMap; // inotify wd=>wxFSWatchEntry* map wxArrayInt m_staleDescriptors; // stores recently-removed watches diff --git a/Externals/wxWidgets3/src/unix/utilsunx.cpp b/Externals/wxWidgets3/src/unix/utilsunx.cpp index 98548a2e3f..450966d1fe 100644 --- a/Externals/wxWidgets3/src/unix/utilsunx.cpp +++ b/Externals/wxWidgets3/src/unix/utilsunx.cpp @@ -627,7 +627,7 @@ long wxExecute(char **argv, int flags, wxProcess *process, // 1. wxPRIORITY_{MIN,DEFAULT,MAX} map to -20, 0 and 19 respectively. // 2. The mapping is monotonously increasing. // 3. The mapping is onto the target range. - int prio = process ? process->GetPriority() : 0; + int prio = process ? int(process->GetPriority()) : int(wxPRIORITY_DEFAULT); if ( prio <= 50 ) prio = (2*prio)/5 - 20; else if ( prio < 55 ) @@ -697,6 +697,7 @@ long wxExecute(char **argv, int flags, wxProcess *process, // the descriptors do not need to be closed but for now this is better // than never closing them at all as wx code never used FD_CLOEXEC. +#ifdef __DARWIN__ // TODO: Iterating up to FD_SETSIZE is both inefficient (because it may // be quite big) and incorrect (because in principle we could // have more opened descriptions than this number). Unfortunately @@ -704,6 +705,14 @@ long wxExecute(char **argv, int flags, wxProcess *process, // above a certain threshold but non-portable solutions exist for // most platforms, see [http://stackoverflow.com/questions/899038/ // getting-the-highest-allocated-file-descriptor] + // + // Unfortunately, we cannot do this safely on OS X, because libdispatch + // may crash when we do this: + // Exception Type: EXC_BAD_INSTRUCTION (SIGILL) + // Exception Codes: 0x0000000000000001, 0x0000000000000000 + // + // Application Specific Information: + // BUG IN CLIENT OF LIBDISPATCH: Do not close random Unix descriptors for ( int fd = 0; fd < (int)FD_SETSIZE; ++fd ) { if ( fd != STDIN_FILENO && @@ -713,6 +722,7 @@ long wxExecute(char **argv, int flags, wxProcess *process, close(fd); } } +#endif // !__DARWIN__ // Process additional options if we have any