From 8ba4024ce7a8c0f0c75d4c3f2660b2c9a524fb89 Mon Sep 17 00:00:00 2001 From: zilmar Date: Mon, 19 Oct 2015 13:54:16 +1100 Subject: [PATCH] [Glide64] Clean up project so it is building correctly in Visual Studio 2008 --- Source/3rd Party/sdl/sdl2.vcproj | 3 + Source/3rd Party/wx/include/msvc/wx/setup.h | 4 - .../wx/lib/vc_lib/msw/wx/msw/rcdefs.h | 44 + Source/3rd Party/wx/lib/vc_lib/msw/wx/setup.h | 1361 ++++++++++++ .../3rd Party/wx/lib/vc_lib/mswu/wx/setup.h | 24 +- Source/3rd Party/wx/src/common/image.cpp | 8 +- Source/3rd Party/wx/src/msw/gsockmsw.cpp | 487 +++++ Source/3rd Party/wx/src/msw/tbar95.cpp | 1848 +++++++++++++++++ Source/3rd Party/wx/src/msw/utils.cpp | 4 + Source/3rd Party/wx/wx_base.vcproj | 3 +- Source/3rd Party/wx/wx_core.vcproj | 45 +- Source/Glide64/Gfx_1.3.h | 2 +- Source/Glide64/Glide64.vcproj | 2 +- Source/GlideHQ/GlideHQ.vcproj | 2 +- Source/Glitch64/Glitch64.vcproj | 2 +- 15 files changed, 3806 insertions(+), 33 deletions(-) create mode 100644 Source/3rd Party/wx/lib/vc_lib/msw/wx/msw/rcdefs.h create mode 100644 Source/3rd Party/wx/lib/vc_lib/msw/wx/setup.h create mode 100644 Source/3rd Party/wx/src/msw/gsockmsw.cpp create mode 100644 Source/3rd Party/wx/src/msw/tbar95.cpp diff --git a/Source/3rd Party/sdl/sdl2.vcproj b/Source/3rd Party/sdl/sdl2.vcproj index b36964bd3..c103f6cbd 100644 --- a/Source/3rd Party/sdl/sdl2.vcproj +++ b/Source/3rd Party/sdl/sdl2.vcproj @@ -93,7 +93,9 @@ /> and std::vector, with a compatibility interface, +// and for wxHashMap to be implemented with templates. +// +// Default is 0 +// +// Recommended setting: YMMV +#define wxUSE_STL 0 + +// Support for message/error logging. This includes wxLogXXX() functions and +// wxLog and derived classes. Don't set this to 0 unless you really know what +// you are doing. +// +// Default is 1 +// +// Recommended setting: 1 (always) +#define wxUSE_LOG 1 + +// Recommended setting: 1 +#define wxUSE_LOGWINDOW 1 + +// Recommended setting: 1 +#define wxUSE_LOGGUI 1 + +// Recommended setting: 1 +#define wxUSE_LOG_DIALOG 1 + +// Support for command line parsing using wxCmdLineParser class. +// +// Default is 1 +// +// Recommended setting: 1 (can be set to 0 if you don't use the cmd line) +#define wxUSE_CMDLINE_PARSER 1 + +// Support for multithreaded applications: if 1, compile in thread classes +// (thread.h) and make the library a bit more thread safe. Although thread +// support is quite stable by now, you may still consider recompiling the +// library without it if you have no use for it - this will result in a +// somewhat smaller and faster operation. +// +// Notice that if wxNO_THREADS is defined, wxUSE_THREADS is automatically reset +// to 0 in wx/chkconf.h, so, for example, if you set USE_THREADS to 0 in +// build/msw/config.* file this value will have no effect. +// +// Default is 1 +// +// Recommended setting: 0 unless you do plan to develop MT applications +#define wxUSE_THREADS 1 + +// If enabled, compiles wxWidgets streams classes +// +// wx stream classes are used for image IO, process IO redirection, network +// protocols implementation and much more and so disabling this results in a +// lot of other functionality being lost. +// +// Default is 1 +// +// Recommended setting: 1 as setting it to 0 disables many other things +#define wxUSE_STREAMS 1 + +// Use standard C++ streams if 1 instead of wx streams in some places. If +// disabled (default), wx streams are used everywhere and wxWidgets doesn't +// depend on the standard streams library. +// +// Notice that enabling this does not replace wx streams with std streams +// everywhere, in a lot of places wx streams are used no matter what. +// +// Default is 0 +// +// Recommended setting: 1 if you use the standard streams anyhow and so +// dependency on the standard streams library is not a +// problem +#define wxUSE_STD_IOSTREAM 0 + +// Enable conversion to standard C++ string if 1. +// +// Default is 1 for most compilers. +// +// Currently the Digital Mars and Watcom compilers come without standard C++ +// library headers by default, wxUSE_STD_STRING can be set to 1 if you do have +// them (e.g. from STLPort). +// +// VC++ 5.0 does include standard C++ library header, however they produce +// many warnings that can't be turned off when compiled at warning level 4. +#if defined(__DMC__) || defined(__WATCOMC__) \ + || (defined(_MSC_VER) && _MSC_VER < 1200) + #define wxUSE_STD_STRING 0 +#else + #define wxUSE_STD_STRING 1 +#endif + +// Support for positional parameters (e.g. %1$d, %2$s ...) in wxVsnprintf. +// Note that if the system's implementation does not support positional +// parameters, setting this to 1 forces the use of the wxWidgets implementation +// of wxVsnprintf. The standard vsnprintf() supports positional parameters on +// many Unix systems but usually doesn't under Windows. +// +// Positional parameters are very useful when translating a program since using +// them in formatting strings allow translators to correctly reorder the +// translated sentences. +// +// Default is 1 +// +// Recommended setting: 1 if you want to support multiple languages +#define wxUSE_PRINTF_POS_PARAMS 1 + +// ---------------------------------------------------------------------------- +// non GUI features selection +// ---------------------------------------------------------------------------- + +// Set wxUSE_LONGLONG to 1 to compile the wxLongLong class. This is a 64 bit +// integer which is implemented in terms of native 64 bit integers if any or +// uses emulation otherwise. +// +// This class is required by wxDateTime and so you should enable it if you want +// to use wxDateTime. For most modern platforms, it will use the native 64 bit +// integers in which case (almost) all of its functions are inline and it +// almost does not take any space, so there should be no reason to switch it +// off. +// +// Recommended setting: 1 +#define wxUSE_LONGLONG 1 + +// Set wxUSE_(F)FILE to 1 to compile wx(F)File classes. wxFile uses low level +// POSIX functions for file access, wxFFile uses ANSI C stdio.h functions. +// +// Default is 1 +// +// Recommended setting: 1 (wxFile is highly recommended as it is required by +// i18n code, wxFileConfig and others) +#define wxUSE_FILE 1 +#define wxUSE_FFILE 1 + +// Use wxFSVolume class providing access to the configured/active mount points +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely disabled if you don't use it) +#define wxUSE_FSVOLUME 1 + +// Use wxStandardPaths class which allows to retrieve some standard locations +// in the file system +// +// Default is 1 +// +// Recommended setting: 1 (may be disabled to save space, but not much) +#define wxUSE_STDPATHS 1 + +// use wxTextBuffer class: required by wxTextFile +#define wxUSE_TEXTBUFFER 1 + +// use wxTextFile class: requires wxFile and wxTextBuffer, required by +// wxFileConfig +#define wxUSE_TEXTFILE 1 + +// i18n support: _() macro, wxLocale class. Requires wxTextFile. +#define wxUSE_INTL 1 + +// Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which +// allow to manipulate dates, times and time intervals. wxDateTime replaces the +// old wxTime and wxDate classes which are still provided for backwards +// compatibility (and implemented in terms of wxDateTime). +// +// Note that this class is relatively new and is still officially in alpha +// stage because some features are not yet (fully) implemented. It is already +// quite useful though and should only be disabled if you are aiming at +// absolutely minimal version of the library. +// +// Requires: wxUSE_LONGLONG +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_DATETIME 1 + +// Set wxUSE_TIMER to 1 to compile wxTimer class +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_TIMER 1 + +// Use wxStopWatch clas. +// +// Default is 1 +// +// Recommended setting: 1 (needed by wxSocket) +#define wxUSE_STOPWATCH 1 + +// Setting wxUSE_CONFIG to 1 enables the use of wxConfig and related classes +// which allow the application to store its settings in the persistent +// storage. Setting this to 1 will also enable on-demand creation of the +// global config object in wxApp. +// +// See also wxUSE_CONFIG_NATIVE below. +// +// Recommended setting: 1 +#define wxUSE_CONFIG 1 + +// If wxUSE_CONFIG is 1, you may choose to use either the native config +// classes under Windows (using .INI files under Win16 and the registry under +// Win32) or the portable text file format used by the config classes under +// Unix. +// +// Default is 1 to use native classes. Note that you may still use +// wxFileConfig even if you set this to 1 - just the config object created by +// default for the applications needs will be a wxRegConfig or wxIniConfig and +// not wxFileConfig. +// +// Recommended setting: 1 +#define wxUSE_CONFIG_NATIVE 1 + +// If wxUSE_DIALUP_MANAGER is 1, compile in wxDialUpManager class which allows +// to connect/disconnect from the network and be notified whenever the dial-up +// network connection is established/terminated. Requires wxUSE_DYNAMIC_LOADER. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DIALUP_MANAGER 1 + +// Compile in classes for run-time DLL loading and function calling. +// Required by wxUSE_DIALUP_MANAGER. +// +// This setting is for Win32 only +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DYNLIB_CLASS 1 + +// experimental, don't use for now +#define wxUSE_DYNAMIC_LOADER 1 + +// Set to 1 to use socket classes +#define wxUSE_SOCKETS 1 + +// Set to 1 to enable virtual file systems (required by wxHTML) +#define wxUSE_FILESYSTEM 1 + +// Set to 1 to enable virtual ZIP filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ZIP 1 + +// Set to 1 to enable virtual archive filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_ARCHIVE 1 + +// Set to 1 to enable virtual Internet filesystem (requires wxUSE_FILESYSTEM) +#define wxUSE_FS_INET 1 + +// wxArchive classes for accessing archives such as zip and tar +#define wxUSE_ARCHIVE_STREAMS 1 + +// Set to 1 to compile wxZipInput/OutputStream classes. +#define wxUSE_ZIPSTREAM 1 + +// Set to 1 to compile wxTarInput/OutputStream classes. +#define wxUSE_TARSTREAM 1 + +// Set to 1 to compile wxZlibInput/OutputStream classes. Also required by +// wxUSE_LIBPNG +#define wxUSE_ZLIB 1 + +// If enabled, the code written by Apple will be used to write, in a portable +// way, float on the disk. See extended.c for the license which is different +// from wxWidgets one. +// +// Default is 1. +// +// Recommended setting: 1 unless you don't like the license terms (unlikely) +#define wxUSE_APPLE_IEEE 1 + +// Joystick support class +#define wxUSE_JOYSTICK 1 + +// wxFontMapper class +#define wxUSE_FONTMAP 1 + +// wxMimeTypesManager class +#define wxUSE_MIMETYPE 1 + +// wxProtocol and related classes: if you want to use either of wxFTP, wxHTTP +// or wxURL you need to set this to 1. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_PROTOCOL 1 + +// The settings for the individual URL schemes +#define wxUSE_PROTOCOL_FILE 1 +#define wxUSE_PROTOCOL_FTP 1 +#define wxUSE_PROTOCOL_HTTP 1 + +// Define this to use wxURL class. +#define wxUSE_URL 1 + +// Define this to use native platform url and protocol support. +// Currently valid only for MS-Windows. +// Note: if you set this to 1, you can open ftp/http/gopher sites +// and obtain a valid input stream for these sites +// even when you set wxUSE_PROTOCOL_FTP/HTTP to 0. +// Doing so reduces the code size. +// +// This code is experimental and subject to change. +#define wxUSE_URL_NATIVE 0 + +// Support for wxVariant class used in several places throughout the library, +// notably in wxDataViewCtrl API. +// +// Default is 1. +// +// Recommended setting: 1 unless you want to reduce the library size as much as +// possible in which case setting this to 0 can gain up to 100KB. +#define wxUSE_VARIANT 1 + +// Support for regular expression matching via wxRegEx class: enable this to +// use POSIX regular expressions in your code. You need to compile regex +// library from src/regex to use it under Windows. +// +// Default is 0 +// +// Recommended setting: 1 if your compiler supports it, if it doesn't please +// contribute us a makefile for src/regex for it +#define wxUSE_REGEX 0 + +// wxSystemOptions class +#define wxUSE_SYSTEM_OPTIONS 1 + +// wxSound class +#define wxUSE_SOUND 1 + +// Use wxMediaCtrl +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_MEDIACTRL 0 + +// Use GStreamer for Unix (req a lot of dependancies) +// +// Default is 0 +// +// Recommended setting: 1 (wxMediaCtrl won't work by default without it) +#define wxUSE_GSTREAMER 0 + +// Use wxWidget's XRC XML-based resource system. Recommended. +// +// Default is 1 +// +// Recommended setting: 1 (requires wxUSE_XML) +#define wxUSE_XRC 0 + +// XML parsing classes. Note that their API will change in the future, so +// using wxXmlDocument and wxXmlNode in your app is not recommended. +// +// Default is the same as wxUSE_XRC, i.e. 1 by default. +// +// Recommended setting: 1 (required by XRC) +#define wxUSE_XML wxUSE_XRC + +// Use wxWidget's AUI docking system +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_AUI 0 + + +// Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that on Windows you will need to link with gdiplus.lib (use +// USE_GDIPLUS=1 for makefile builds) and distribute gdiplus.dll with your +// application if you want it to be runnable on pre-XP systems. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_GRAPHICS_CONTEXT +#define wxUSE_GRAPHICS_CONTEXT 0 +#endif + +// Enable the new wxCairoContext classes for an advanced +// 2D drawing API. (Still somewhat experimental) +// +// Please note that you will need to link with Cairo for this to work. +// +// Default is 0 +// +// Recommended setting: 1 +#ifndef wxUSE_CAIRO +#define wxUSE_CAIRO 0 +#endif + +// ---------------------------------------------------------------------------- +// Individual GUI controls +// ---------------------------------------------------------------------------- + +// You must set wxUSE_CONTROLS to 1 if you are using any controls at all +// (without it, wxControl class is not compiled) +// +// Default is 1 +// +// Recommended setting: 1 (don't change except for very special programs) +#define wxUSE_CONTROLS 1 + +// wxPopupWindow class is a top level transient window. It is currently used +// to implement wxTipWindow +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0 if you don't wxUSE_TIPWINDOW) +#define wxUSE_POPUPWIN 1 + +// wxTipWindow allows to implement the custom tooltips, it is used by the +// context help classes. Requires wxUSE_POPUPWIN. +// +// Default is 1 +// +// Recommended setting: 1 (may be set to 0) +#define wxUSE_TIPWINDOW 1 + +// Each of the settings below corresponds to one wxWidgets control. They are +// all switched on by default but may be disabled if you are sure that your +// program (including any standard dialogs it can show!) doesn't need them and +// if you desperately want to save some space. If you use any of these you must +// set wxUSE_CONTROLS as well. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_ANIMATIONCTRL 1 // wxAnimationCtrl +#define wxUSE_BUTTON 1 // wxButton +#define wxUSE_BMPBUTTON 1 // wxBitmapButton +#define wxUSE_CALENDARCTRL 1 // wxCalendarCtrl +#define wxUSE_CHECKBOX 1 // wxCheckBox +#define wxUSE_CHECKLISTBOX 1 // wxCheckListBox (requires wxUSE_OWNER_DRAWN) +#define wxUSE_CHOICE 1 // wxChoice +#define wxUSE_COLLPANE 1 // wxCollapsiblePane +#define wxUSE_COLOURPICKERCTRL 1 // wxColourPickerCtrl +#define wxUSE_COMBOBOX 1 // wxComboBox +#define wxUSE_DATAVIEWCTRL 1 // wxDataViewCtrl +#define wxUSE_DATEPICKCTRL 1 // wxDatePickerCtrl +#define wxUSE_DIRPICKERCTRL 1 // wxDirPickerCtrl +#define wxUSE_FILEPICKERCTRL 1 // wxFilePickerCtrl +#define wxUSE_FONTPICKERCTRL 1 // wxFontPickerCtrl +#define wxUSE_GAUGE 1 // wxGauge +#define wxUSE_HYPERLINKCTRL 1 // wxHyperlinkCtrl +#define wxUSE_LISTBOX 1 // wxListBox +#define wxUSE_LISTCTRL 1 // wxListCtrl +#define wxUSE_RADIOBOX 1 // wxRadioBox +#define wxUSE_RADIOBTN 1 // wxRadioButton +#define wxUSE_SCROLLBAR 1 // wxScrollBar +#define wxUSE_SEARCHCTRL 1 // wxSearchCtrl +#define wxUSE_SLIDER 1 // wxSlider +#define wxUSE_SPINBTN 1 // wxSpinButton +#define wxUSE_SPINCTRL 1 // wxSpinCtrl +#define wxUSE_STATBOX 1 // wxStaticBox +#define wxUSE_STATLINE 1 // wxStaticLine +#define wxUSE_STATTEXT 1 // wxStaticText +#define wxUSE_STATBMP 1 // wxStaticBitmap +#define wxUSE_TEXTCTRL 1 // wxTextCtrl +#define wxUSE_TOGGLEBTN 1 // requires wxButton +#define wxUSE_TREECTRL 1 // wxTreeCtrl + +// Use a status bar class? Depending on the value of wxUSE_NATIVE_STATUSBAR +// below either wxStatusBar95 or a generic wxStatusBar will be used. +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_STATUSBAR 1 + +// Two status bar implementations are available under Win32: the generic one +// or the wrapper around native control. For native look and feel the native +// version should be used. +// +// Default is 1 for the platforms where native status bar is supported. +// +// Recommended setting: 1 (there is no advantage in using the generic one) +#define wxUSE_NATIVE_STATUSBAR 1 + +// wxToolBar related settings: if wxUSE_TOOLBAR is 0, don't compile any toolbar +// classes at all. Otherwise, use the native toolbar class unless +// wxUSE_TOOLBAR_NATIVE is 0. +// +// Default is 1 for all settings. +// +// Recommended setting: 1 for wxUSE_TOOLBAR and wxUSE_TOOLBAR_NATIVE. +#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR_NATIVE 1 + +// wxNotebook is a control with several "tabs" located on one of its sides. It +// may be used to logically organise the data presented to the user instead of +// putting everything in one huge dialog. It replaces wxTabControl and related +// classes of wxWin 1.6x. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_NOTEBOOK 1 + +// wxListbook control is similar to wxNotebook but uses wxListCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_LISTBOOK 1 + +// wxChoicebook control is similar to wxNotebook but uses wxChoice instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CHOICEBOOK 1 + +// wxTreebook control is similar to wxNotebook but uses wxTreeCtrl instead of +// the tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TREEBOOK 1 + +// wxToolbook control is similar to wxNotebook but uses wxToolBar instead of +// tabs +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLBOOK 1 + +// wxTabDialog is a generic version of wxNotebook but it is incompatible with +// the new class. It shouldn't be used in new code. +// +// Default is 0. +// +// Recommended setting: 0 (use wxNotebook) +#define wxUSE_TAB_DIALOG 0 + +// wxGrid class +// +// Default is 1, set to 0 to cut down compilation time and binaries size if you +// don't use it. +// +// Recommended setting: 1 +// +#define wxUSE_GRID 1 + +// wxMiniFrame class: a frame with narrow title bar +// +// Default is 1. +// +// Recommended setting: 1 (it doesn't cost almost anything) +#define wxUSE_MINIFRAME 1 + +// wxComboCtrl and related classes: combobox with custom popup window and +// not necessarily a listbox. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 except for wxUniv where it +// it used by wxComboBox +#define wxUSE_COMBOCTRL 1 + +// wxOwnerDrawnComboBox is a custom combobox allowing to paint the combobox +// items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0, except where it is +// needed as a base class for generic wxBitmapComboBox. +#define wxUSE_ODCOMBOBOX 1 + +// wxBitmapComboBox is a combobox that can have images in front of text items. +// +// Default is 1. +// +// Recommended setting: 1 but can be safely set to 0 +#define wxUSE_BITMAPCOMBOBOX 1 + +// ---------------------------------------------------------------------------- +// Miscellaneous GUI stuff +// ---------------------------------------------------------------------------- + +// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar) +#define wxUSE_ACCEL 1 + +// Hotkey support (currently Windows only) +#define wxUSE_HOTKEY 1 + +// Use wxCaret: a class implementing a "cursor" in a text control (called caret +// under Windows). +// +// Default is 1. +// +// Recommended setting: 1 (can be safely set to 0, not used by the library) +#define wxUSE_CARET 1 + +// Use wxDisplay class: it allows enumerating all displays on a system and +// their geometries as well as finding the display on which the given point or +// window lies. +// +// Default is 1. +// +// Recommended setting: 1 if you need it, can be safely set to 0 otherwise +#define wxUSE_DISPLAY 1 + +// Miscellaneous geometry code: needed for Canvas library +#define wxUSE_GEOMETRY 1 + +// Use wxImageList. This class is needed by wxNotebook, wxTreeCtrl and +// wxListCtrl. +// +// Default is 1. +// +// Recommended setting: 1 (set it to 0 if you don't use any of the controls +// enumerated above, then this class is mostly useless too) +#define wxUSE_IMAGLIST 1 + +// Use wxMenu, wxMenuBar, wxMenuItem. +// +// Default is 1. +// +// Recommended setting: 1 (can't be disabled under MSW) +#define wxUSE_MENUS 1 + +// Use wxSashWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SASH 1 + +// Use wxSplitterWindow class. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_SPLITTER 1 + +// Use wxToolTip and wxWindow::Set/GetToolTip() methods. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_TOOLTIPS 1 + +// wxValidator class and related methods +#define wxUSE_VALIDATORS 1 + +// ---------------------------------------------------------------------------- +// common dialogs +// ---------------------------------------------------------------------------- + +// On rare occasions (e.g. using DJGPP) may want to omit common dialogs (e.g. +// file selector, printer dialog). Switching this off also switches off the +// printing architecture and interactive wxPrinterDC. +// +// Default is 1 +// +// Recommended setting: 1 (unless it really doesn't work) +#define wxUSE_COMMON_DIALOGS 1 + +// wxBusyInfo displays window with message when app is busy. Works in same way +// as wxBusyCursor +#define wxUSE_BUSYINFO 1 + +// Use single/multiple choice dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_CHOICEDLG 1 + +// Use colour picker dialog +// +// Default is 1 +// +// Recommended setting: 1 +#define wxUSE_COLOURDLG 1 + +// wxDirDlg class for getting a directory name from user +#define wxUSE_DIRDLG 1 + +// TODO: setting to choose the generic or native one + +// Use file open/save dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (used in many places in the library itself) +#define wxUSE_FILEDLG 1 + +// Use find/replace dialogs. +// +// Default is 1 +// +// Recommended setting: 1 (but may be safely set to 0) +#define wxUSE_FINDREPLDLG 1 + +// Use font picker dialog +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_FONTDLG 1 + +// Use wxMessageDialog and wxMessageBox. +// +// Default is 1 +// +// Recommended setting: 1 (used in the library itself) +#define wxUSE_MSGDLG 1 + +// progress dialog class for lengthy operations +#define wxUSE_PROGRESSDLG 1 + +// support for startup tips (wxShowTip &c) +#define wxUSE_STARTUP_TIPS 1 + +// text entry dialog and wxGetTextFromUser function +#define wxUSE_TEXTDLG 1 + +// number entry dialog +#define wxUSE_NUMBERDLG 1 + +// splash screen class +#define wxUSE_SPLASH 1 + +// wizards +#define wxUSE_WIZARDDLG 1 + +// Compile in wxAboutBox() function showing the standard "About" dialog. +// +// Default is 1 +// +// Recommended setting: 1 but can be set to 0 to save some space if you don't +// use this function +#define wxUSE_ABOUTDLG 1 + +// ---------------------------------------------------------------------------- +// Metafiles support +// ---------------------------------------------------------------------------- + +// Windows supports the graphics format known as metafile which is, though not +// portable, is widely used under Windows and so is supported by wxWin (under +// Windows only, of course). Win16 (Win3.1) used the so-called "Window +// MetaFiles" or WMFs which were replaced with "Enhanced MetaFiles" or EMFs in +// Win32 (Win9x, NT, 2000). Both of these are supported in wxWin and, by +// default, WMFs will be used under Win16 and EMFs under Win32. This may be +// changed by setting wxUSE_WIN_METAFILES_ALWAYS to 1 and/or setting +// wxUSE_ENH_METAFILE to 0. You may also set wxUSE_METAFILE to 0 to not compile +// in any metafile related classes at all. +// +// Default is 1 for wxUSE_ENH_METAFILE and 0 for wxUSE_WIN_METAFILES_ALWAYS. +// +// Recommended setting: default or 0 for everything for portable programs. +#define wxUSE_METAFILE 1 +#define wxUSE_ENH_METAFILE 1 +#define wxUSE_WIN_METAFILES_ALWAYS 0 + +// ---------------------------------------------------------------------------- +// Big GUI components +// ---------------------------------------------------------------------------- + +// Set to 0 to disable MDI support. +// +// Requires wxUSE_NOTEBOOK under platforms other than MSW. +// +// Default is 1. +// +// Recommended setting: 1, can be safely set to 0. +#define wxUSE_MDI 1 + +// Set to 0 to disable document/view architecture +#define wxUSE_DOC_VIEW_ARCHITECTURE 1 + +// Set to 0 to disable MDI document/view architecture +// +// Requires wxUSE_MDI && wxUSE_DOC_VIEW_ARCHITECTURE +#define wxUSE_MDI_ARCHITECTURE 1 + +// Set to 0 to disable print/preview architecture code +#define wxUSE_PRINTING_ARCHITECTURE 1 + +// wxHTML sublibrary allows to display HTML in wxWindow programs and much, +// much more. +// +// Default is 1. +// +// Recommended setting: 1 (wxHTML is great!), set to 0 if you want compile a +// smaller library. +#define wxUSE_HTML 1 + +// Setting wxUSE_GLCANVAS to 1 enables OpenGL support. You need to have OpenGL +// headers and libraries to be able to compile the library with wxUSE_GLCANVAS +// set to 1. Note that for some compilers (notably Microsoft Visual C++) you +// will need to manually add opengl32.lib and glu32.lib to the list of +// libraries linked with your program if you use OpenGL. +// +// Default is 0. +// +// Recommended setting: 1 if you intend to use OpenGL, 0 otherwise +#define wxUSE_GLCANVAS 0 + +// wxRichTextCtrl allows editing of styled text. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 if you want compile a +// smaller library. +#define wxUSE_RICHTEXT 0 + +// ---------------------------------------------------------------------------- +// Data transfer +// ---------------------------------------------------------------------------- + +// Use wxClipboard class for clipboard copy/paste. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_CLIPBOARD 1 + +// Use wxDataObject and related classes. Needed for clipboard and OLE drag and +// drop +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DATAOBJ 1 + +// Use wxDropTarget and wxDropSource classes for drag and drop (this is +// different from "built in" drag and drop in wxTreeCtrl which is always +// available). Requires wxUSE_DATAOBJ. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_DRAG_AND_DROP 1 + +// Use wxAccessible for enhanced and customisable accessibility. +// Depends on wxUSE_OLE. +// +// Default is 0. +// +// Recommended setting (at present): 0 +#define wxUSE_ACCESSIBILITY 0 + +// ---------------------------------------------------------------------------- +// miscellaneous settings +// ---------------------------------------------------------------------------- + +// wxSingleInstanceChecker class allows to verify at startup if another program +// instance is running. +// +// Default is 1 +// +// Recommended setting: 1 (the class is tiny, disabling it won't save much +// space) +#define wxUSE_SNGLINST_CHECKER 1 + +#define wxUSE_DRAGIMAGE 1 + +#define wxUSE_IPC 1 + // 0 for no interprocess comms +#define wxUSE_HELP 1 + // 0 for no help facility + +// Should we use MS HTML help for wxHelpController? If disabled, neither +// wxCHMHelpController nor wxBestHelpController are available. +// +// Default is 1 under MSW, 0 is always used for the other platforms. +// +// Recommended setting: 1, only set to 0 if you have trouble compiling +// wxCHMHelpController (could be a problem with really ancient compilers) +#define wxUSE_MS_HTML_HELP 1 + + +// Use wxHTML-based help controller? +#define wxUSE_WXHTML_HELP 1 + +#define wxUSE_RESOURCES 0 + // 0 for no wxGetResource/wxWriteResource +#define wxUSE_CONSTRAINTS 1 + // 0 for no window layout constraint system + +#define wxUSE_SPLINES 1 + // 0 for no splines + +#define wxUSE_MOUSEWHEEL 1 + // Include mouse wheel support + +// ---------------------------------------------------------------------------- +// postscript support settings +// ---------------------------------------------------------------------------- + +// Set to 1 for PostScript device context. +#define wxUSE_POSTSCRIPT 0 + +// Set to 1 to use font metric files in GetTextExtent +#define wxUSE_AFM_FOR_POSTSCRIPT 1 + +// ---------------------------------------------------------------------------- +// database classes +// ---------------------------------------------------------------------------- + +// Define 1 to use ODBC classes +#define wxUSE_ODBC 0 + +// For backward compatibility reasons, this parameter now only controls the +// default scrolling method used by cursors. This default behavior can be +// overriden by setting the second param of wxDB::wxDbGetConnection() or +// wxDb() constructor to indicate whether the connection (and any wxDbTable()s +// that use the connection) should support forward only scrolling of cursors, +// or both forward and backward support for backward scrolling cursors is +// dependent on the data source as well as the ODBC driver being used. +#define wxODBC_FWD_ONLY_CURSORS 1 + +// Default is 0. Set to 1 to use the deprecated classes, enum types, function, +// member variables. With a setting of 1, full backward compatibility with the +// 2.0.x release is possible. It is STRONGLY recommended that this be set to 0, +// as future development will be done only on the non-deprecated +// functions/classes/member variables/etc. +#define wxODBC_BACKWARD_COMPATABILITY 0 + +// ---------------------------------------------------------------------------- +// other compiler (mis)features +// ---------------------------------------------------------------------------- + +// Set this to 0 if your compiler can't cope with omission of prototype +// parameters. +// +// Default is 1. +// +// Recommended setting: 1 (should never need to set this to 0) +#define REMOVE_UNUSED_ARG 1 + +// VC++ 4.2 and above allows and but you can't mix +// them. Set to 1 for , 0 for . Note that VC++ 7.1 +// and later doesn't support wxUSE_IOSTREAMH == 1 and so will be +// used anyhow. +// +// Default is 1. +// +// Recommended setting: whatever your compiler likes more +#define wxUSE_IOSTREAMH 1 + +// ---------------------------------------------------------------------------- +// image format support +// ---------------------------------------------------------------------------- + +// wxImage supports many different image formats which can be configured at +// compile-time. BMP is always supported, others are optional and can be safely +// disabled if you don't plan to use images in such format sometimes saving +// substantial amount of code in the final library. +// +// Some formats require an extra library which is included in wxWin sources +// which is mentioned if it is the case. + +// Set to 1 for wxImage support (recommended). +#define wxUSE_IMAGE 1 + +// Set to 1 for PNG format support (requires libpng). Also requires wxUSE_ZLIB. +#define wxUSE_LIBPNG 1 + +// Set to 1 for JPEG format support (requires libjpeg) +#define wxUSE_LIBJPEG 1 + +// Set to 1 for TIFF format support (requires libtiff) +#define wxUSE_LIBTIFF 0 + +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 0 + +// Set to 1 for GIF format support +#define wxUSE_GIF 0 + +// Set to 1 for PNM format support +#define wxUSE_PNM 0 + +// Set to 1 for PCX format support +#define wxUSE_PCX 0 + +// Set to 1 for IFF format support (Amiga format) +#define wxUSE_IFF 0 + +// Set to 1 for XPM format support +#define wxUSE_XPM 0 + +// Set to 1 for MS Icons and Cursors format support +#define wxUSE_ICO_CUR 1 + +// Set to 1 to compile in wxPalette class +#define wxUSE_PALETTE 1 + +// ---------------------------------------------------------------------------- +// wxUniversal-only options +// ---------------------------------------------------------------------------- + +// Set to 1 to enable compilation of all themes, this is the default +#define wxUSE_ALL_THEMES 1 + +// Set to 1 to enable the compilation of individual theme if wxUSE_ALL_THEMES +// is unset, if it is set these options are not used; notice that metal theme +// uses Win32 one +#define wxUSE_THEME_GTK 0 +#define wxUSE_THEME_METAL 0 +#define wxUSE_THEME_MONO 0 +#define wxUSE_THEME_WIN32 0 + + +/* --- end common options --- */ + +// ---------------------------------------------------------------------------- +// Windows-only settings +// ---------------------------------------------------------------------------- + +// Set wxUSE_UNICODE_MSLU to 1 if you're compiling wxWidgets in Unicode mode +// and want to run your programs under Windows 9x and not only NT/2000/XP. +// This setting enables use of unicows.dll from MSLU (MS Layer for Unicode, see +// http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx). Note +// that you will have to modify the makefiles to include unicows.lib import +// library as the first library (see installation instructions in install.txt +// to learn how to do it when building the library or samples). +// +// If your compiler doesn't have unicows.lib, you can get a version of it at +// http://libunicows.sourceforge.net +// +// Default is 0 +// +// Recommended setting: 0 (1 if you want to deploy Unicode apps on 9x systems) +#ifndef wxUSE_UNICODE_MSLU + #define wxUSE_UNICODE_MSLU 0 +#endif + +// Set this to 1 if you want to use wxWidgets and MFC in the same program. This +// will override some other settings (see below) +// +// Default is 0. +// +// Recommended setting: 0 unless you really have to use MFC +#define wxUSE_MFC 0 + +// Set this to 1 for generic OLE support: this is required for drag-and-drop, +// clipboard, OLE Automation. Only set it to 0 if your compiler is very old and +// can't compile/doesn't have the OLE headers. +// +// Default is 1. +// +// Recommended setting: 1 +#define wxUSE_OLE 1 + +// Set this to 1 to enable wxAutomationObject class. +// +// Default is 1. +// +// Recommended setting: 1 if you need to control other applications via OLE +// Automation, can be safely set to 0 otherwise +#define wxUSE_OLE_AUTOMATION 1 + +// Set this to 1 to enable wxActiveXContainer class allowing to embed OLE +// controls in wx. +// +// Default is 1. +// +// Recommended setting: 1, required by wxMediaCtrl +#define wxUSE_ACTIVEX 1 + +// wxDC cacheing implementation +#define wxUSE_DC_CACHEING 1 + +// Set this to 1 to enable the use of DIB's for wxBitmap to support +// bitmaps > 16MB on Win95/98/Me. Set to 0 to use DDB's only. +#define wxUSE_DIB_FOR_BITMAP 0 + +// Set this to 1 to enable wxDIB class used internally for manipulating +// wxBitmao data. +// +// Default is 1, set it to 0 only if you don't use wxImage neither +// +// Recommended setting: 1 (without it conversion to/from wxImage won't work) +#define wxUSE_WXDIB 1 + +// Set to 0 to disable PostScript print/preview architecture code under Windows +// (just use Windows printing). +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 + +// Set this to 1 to use RICHEDIT controls for wxTextCtrl with style wxTE_RICH +// which allows to put more than ~32Kb of text in it even under Win9x (NT +// doesn't have such limitation). +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1, only set it to 0 if your compiler doesn't have +// or can't compile +#define wxUSE_RICHEDIT 1 + +// Set this to 1 to use extra features of richedit v2 and later controls +// +// Default is 1 for compilers which support it +// +// Recommended setting: 1 +#define wxUSE_RICHEDIT2 1 + +// Set this to 1 to enable support for the owner-drawn menu and listboxes. This +// is required by wxUSE_CHECKLISTBOX. +// +// Default is 1. +// +// Recommended setting: 1, set to 0 for a small library size reduction +#define wxUSE_OWNER_DRAWN 1 + +// Set to 1 to compile MS Windows XP theme engine support +#define wxUSE_UXTHEME 1 + +// Set to 1 to auto-adapt to MS Windows XP themes where possible +// (notably, wxNotebook pages) +#define wxUSE_UXTHEME_AUTO 1 + +// Set to 1 to use InkEdit control (Tablet PC), if available +#define wxUSE_INKEDIT 0 + +// ---------------------------------------------------------------------------- +// Generic versions of native controls +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxDatePickerCtrlGeneric in addition to the +// native wxDatePickerCtrl +// +// Default is 0. +// +// Recommended setting: 0, this is mainly used for testing +#define wxUSE_DATEPICKCTRL_GENERIC 0 + +// ---------------------------------------------------------------------------- +// Crash debugging helpers +// ---------------------------------------------------------------------------- + +// Set this to 1 to be able to use wxCrashReport::Generate() to create mini +// dumps of your program when it crashes (or at any other moment) +// +// Default is 1 if supported by the compiler (VC++ and recent BC++ only). +// +// Recommended setting: 1, set to 0 if your programs never crash +#define wxUSE_CRASHREPORT 1 + +// ---------------------------------------------------------------------------- +// obsolete settings +// ---------------------------------------------------------------------------- + +// NB: all settings in this section are obsolete and should not be used/changed +// at all, they will disappear + +// Define 1 to use bitmap messages. +#define wxUSE_BITMAP_MESSAGE 1 + +#endif // _WX_SETUP_H_ + diff --git a/Source/3rd Party/wx/lib/vc_lib/mswu/wx/setup.h b/Source/3rd Party/wx/lib/vc_lib/mswu/wx/setup.h index f3e3fc04a..d393f7de6 100644 --- a/Source/3rd Party/wx/lib/vc_lib/mswu/wx/setup.h +++ b/Source/3rd Party/wx/lib/vc_lib/mswu/wx/setup.h @@ -139,7 +139,7 @@ // // Recommended setting: 1, it is compiled into a separate library so there // is no overhead if you don't use it -#define wxUSE_DEBUGREPORT 1 +#define wxUSE_DEBUGREPORT 0 // ---------------------------------------------------------------------------- // Unicode support @@ -520,7 +520,7 @@ // // Recommended setting: 1 if your compiler supports it, if it doesn't please // contribute us a makefile for src/regex for it -#define wxUSE_REGEX 1 +#define wxUSE_REGEX 0 // wxSystemOptions class #define wxUSE_SYSTEM_OPTIONS 1 @@ -533,7 +533,7 @@ // Default is 1. // // Recommended setting: 1 -#define wxUSE_MEDIACTRL 1 +#define wxUSE_MEDIACTRL 0 // Use GStreamer for Unix (req a lot of dependancies) // @@ -547,7 +547,7 @@ // Default is 1 // // Recommended setting: 1 (requires wxUSE_XML) -#define wxUSE_XRC 1 +#define wxUSE_XRC 0 // XML parsing classes. Note that their API will change in the future, so // using wxXmlDocument and wxXmlNode in your app is not recommended. @@ -562,7 +562,7 @@ // Default is 1 // // Recommended setting: 1 -#define wxUSE_AUI 1 +#define wxUSE_AUI 0 // Enable the new wxGraphicsPath and wxGraphicsContext classes for an advanced @@ -1011,7 +1011,7 @@ // // Recommended setting: 1, set to 0 if you want compile a // smaller library. -#define wxUSE_RICHTEXT 1 +#define wxUSE_RICHTEXT 0 // ---------------------------------------------------------------------------- // Data transfer @@ -1170,25 +1170,25 @@ #define wxUSE_LIBJPEG 1 // Set to 1 for TIFF format support (requires libtiff) -#define wxUSE_LIBTIFF 1 +#define wxUSE_LIBTIFF 0 // Set to 1 for TGA format support (loading only) -#define wxUSE_TGA 1 +#define wxUSE_TGA 0 // Set to 1 for GIF format support -#define wxUSE_GIF 1 +#define wxUSE_GIF 0 // Set to 1 for PNM format support -#define wxUSE_PNM 1 +#define wxUSE_PNM 0 // Set to 1 for PCX format support -#define wxUSE_PCX 1 +#define wxUSE_PCX 0 // Set to 1 for IFF format support (Amiga format) #define wxUSE_IFF 0 // Set to 1 for XPM format support -#define wxUSE_XPM 1 +#define wxUSE_XPM 0 // Set to 1 for MS Icons and Cursors format support #define wxUSE_ICO_CUR 1 diff --git a/Source/3rd Party/wx/src/common/image.cpp b/Source/3rd Party/wx/src/common/image.cpp index 7885d6486..dfc85eadb 100644 --- a/Source/3rd Party/wx/src/common/image.cpp +++ b/Source/3rd Party/wx/src/common/image.cpp @@ -167,7 +167,13 @@ wxImage::wxImage(const char* const* xpmData) Create(xpmData); } -bool wxImage::Create(const char* const* xpmData) +bool wxImage::Create(const char* const* +#ifdef wxUSE_XPM + xpmData +#else + /*xpmData*/ +#endif + ) { #if wxUSE_XPM UnRef(); diff --git a/Source/3rd Party/wx/src/msw/gsockmsw.cpp b/Source/3rd Party/wx/src/msw/gsockmsw.cpp new file mode 100644 index 000000000..6b185351f --- /dev/null +++ b/Source/3rd Party/wx/src/msw/gsockmsw.cpp @@ -0,0 +1,487 @@ +/* ------------------------------------------------------------------------- + * Project: GSocket (Generic Socket) + * Name: src/msw/gsockmsw.cpp + * Copyright: (c) Guilhem Lavaux + * Licence: wxWindows Licence + * Author: Guillermo Rodriguez Garcia + * Purpose: GSocket GUI-specific MSW code + * CVSID: $Id: gsockmsw.cpp 50893 2007-12-22 14:05:25Z VZ $ + * ------------------------------------------------------------------------- + */ + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +/* + * DONE: for WinCE we need to replace WSAAsyncSelect + * (Windows message-based notification of network events for a socket) + * with another mechanism. + * As WSAAsyncSelect is not present on WinCE, it now uses + * WSACreateEvent, WSAEventSelect, WSAWaitForMultipleEvents and WSAEnumNetworkEvents. + * When enabling eventhandling for a socket a new thread it created that keeps track of the events + * and posts a messageto the hidden window to use the standard message loop. + */ + +/* including rasasync.h (included from windows.h itself included from + * wx/setup.h and/or winsock.h results in this warning for + * RPCNOTIFICATION_ROUTINE + */ +#ifdef _MSC_VER +# pragma warning(disable:4115) /* named type definition in parentheses */ +#endif + +/* This needs to be before the wx/defs/h inclusion + * for some reason + */ + +#ifdef __WXWINCE__ + /* windows.h results in tons of warnings at max warning level */ +# ifdef _MSC_VER +# pragma warning(push, 1) +# endif +# include +# ifdef _MSC_VER +# pragma warning(pop) +# pragma warning(disable:4514) +# endif +#endif + +#ifndef __GSOCKET_STANDALONE__ +# include "wx/platform.h" +#endif + +#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) + +#ifndef __GSOCKET_STANDALONE__ + +#include "wx/msw/gsockmsw.h" +#include "wx/gsocket.h" + +extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(void); +#define INSTANCE wxGetInstance() + +#else /* __GSOCKET_STANDALONE__ */ + +#include "gsockmsw.h" +#include "gsocket.h" + +/* If not using wxWidgets, a global var called hInst must + * be available and it must contain the app's instance + * handle. + */ +extern HINSTANCE hInst; +#define INSTANCE hInst + +#endif /* !__GSOCKET_STANDALONE__/__GSOCKET_STANDALONE__ */ + +#ifndef __WXWINCE__ +#include +#else +#define assert(x) +#include +#include "wx/msw/wince/net.h" +#include "wx/hashmap.h" +WX_DECLARE_HASH_MAP(int,bool,wxIntegerHash,wxIntegerEqual,SocketHash); +#endif + +#include +#include +#include +#include +#include + +#include + +#ifdef _MSC_VER +# pragma warning(default:4115) /* named type definition in parentheses */ +#endif + +#define CLASSNAME TEXT("_GSocket_Internal_Window_Class") + +/* implemented in utils.cpp */ +extern "C" WXDLLIMPEXP_BASE HWND +wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc); + +/* Maximum number of different GSocket objects at a given time. + * This value can be modified at will, but it CANNOT be greater + * than (0x7FFF - WM_USER + 1) + */ +#define MAXSOCKETS 1024 + +#if (MAXSOCKETS > (0x7FFF - WM_USER + 1)) +#error "MAXSOCKETS is too big!" +#endif + +#ifndef __WXWINCE__ +typedef int (PASCAL *WSAAsyncSelectFunc)(SOCKET,HWND,u_int,long); +#else +/* Typedef the needed function prototypes and the WSANETWORKEVENTS structure +*/ +typedef struct _WSANETWORKEVENTS { + long lNetworkEvents; + int iErrorCode[10]; +} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS; +typedef HANDLE (PASCAL *WSACreateEventFunc)(void); +typedef int (PASCAL *WSAEventSelectFunc)(SOCKET,HANDLE,long); +typedef int (PASCAL *WSAWaitForMultipleEventsFunc)(long,HANDLE,BOOL,long,BOOL); +typedef int (PASCAL *WSAEnumNetworkEventsFunc)(SOCKET,HANDLE,LPWSANETWORKEVENTS); +#endif //__WXWINCE__ + +LRESULT CALLBACK _GSocket_Internal_WinProc(HWND, UINT, WPARAM, LPARAM); + +/* Global variables */ + +static HWND hWin; +static CRITICAL_SECTION critical; +static GSocket* socketList[MAXSOCKETS]; +static int firstAvailable; + +#ifndef __WXWINCE__ +static WSAAsyncSelectFunc gs_WSAAsyncSelect = NULL; +#else +static SocketHash socketHash; +static unsigned int currSocket; +HANDLE hThread[MAXSOCKETS]; +static WSACreateEventFunc gs_WSACreateEvent = NULL; +static WSAEventSelectFunc gs_WSAEventSelect = NULL; +static WSAWaitForMultipleEventsFunc gs_WSAWaitForMultipleEvents = NULL; +static WSAEnumNetworkEventsFunc gs_WSAEnumNetworkEvents = NULL; +/* This structure will be used to pass data on to the thread that handles socket events. +*/ +typedef struct thread_data{ + HWND hEvtWin; + unsigned long msgnumber; + unsigned long fd; + unsigned long lEvent; +}thread_data; +#endif + +static HMODULE gs_wsock32dll = 0; + + +#ifdef __WXWINCE__ +/* This thread handles socket events on WinCE using WSAEventSelect() as WSAAsyncSelect is not supported. +* When an event occures for the socket, it is checked what kind of event happend and the correct message gets posted +* so that the hidden window can handle it as it would in other MSW builds. +*/ +DWORD WINAPI SocketThread(LPVOID data) +{ + WSANETWORKEVENTS NetworkEvents; + thread_data* d = (thread_data *)data; + + HANDLE NetworkEvent = gs_WSACreateEvent(); + gs_WSAEventSelect(d->fd, NetworkEvent, d->lEvent); + + while(socketHash[d->fd] == true) + { + if ((gs_WSAWaitForMultipleEvents(1, &NetworkEvent, FALSE,INFINITE, FALSE)) == WAIT_FAILED) + { + printf("WSAWaitForMultipleEvents failed with error %d\n", WSAGetLastError()); + return 0; + } + if (gs_WSAEnumNetworkEvents(d->fd ,NetworkEvent, &NetworkEvents) == SOCKET_ERROR) + { + printf("WSAEnumNetworkEvents failed with error %d\n", WSAGetLastError()); + return 0; + } + + long flags = NetworkEvents.lNetworkEvents; + if (flags & FD_READ) + ::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_READ); + if (flags & FD_WRITE) + ::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_WRITE); + if (flags & FD_OOB) + ::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_OOB); + if (flags & FD_ACCEPT) + ::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_ACCEPT); + if (flags & FD_CONNECT) + ::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_CONNECT); + if (flags & FD_CLOSE) + ::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_CLOSE); + + } + gs_WSAEventSelect(d->fd, NetworkEvent, 0); + ExitThread(0); + return 0; +} +#endif + + +bool GSocketGUIFunctionsTableConcrete::CanUseEventLoop() +{ + return true; +} + +/* Global initializers */ + +bool GSocketGUIFunctionsTableConcrete::OnInit() +{ + static LPCTSTR pclassname = NULL; + int i; + + /* Create internal window for event notifications */ + hWin = wxCreateHiddenWindow(&pclassname, CLASSNAME, _GSocket_Internal_WinProc); + if (!hWin) + return false; + + /* Initialize socket list */ + InitializeCriticalSection(&critical); + + for (i = 0; i < MAXSOCKETS; i++) + { + socketList[i] = NULL; + } + firstAvailable = 0; + + /* Load WSAAsyncSelect from wsock32.dll (we don't link against it + statically to avoid dependency on wsock32.dll for apps that don't use + sockets): */ +#ifndef __WXWINCE__ + gs_wsock32dll = LoadLibrary(wxT("wsock32.dll")); + if (!gs_wsock32dll) + return false; + gs_WSAAsyncSelect =(WSAAsyncSelectFunc)GetProcAddress(gs_wsock32dll, + "WSAAsyncSelect"); + if (!gs_WSAAsyncSelect) + return false; +#else +/* On WinCE we load ws2.dll which will provide the needed functions. +*/ + gs_wsock32dll = LoadLibrary(wxT("ws2.dll")); + if (!gs_wsock32dll) + return false; + gs_WSAEventSelect =(WSAEventSelectFunc)GetProcAddress(gs_wsock32dll, + wxT("WSAEventSelect")); + if (!gs_WSAEventSelect) + return false; + + gs_WSACreateEvent =(WSACreateEventFunc)GetProcAddress(gs_wsock32dll, + wxT("WSACreateEvent")); + if (!gs_WSACreateEvent) + return false; + + gs_WSAWaitForMultipleEvents =(WSAWaitForMultipleEventsFunc)GetProcAddress(gs_wsock32dll, + wxT("WSAWaitForMultipleEvents")); + if (!gs_WSAWaitForMultipleEvents) + return false; + + gs_WSAEnumNetworkEvents =(WSAEnumNetworkEventsFunc)GetProcAddress(gs_wsock32dll, + wxT("WSAEnumNetworkEvents")); + if (!gs_WSAEnumNetworkEvents) + return false; + + currSocket = 0; +#endif + + return true; +} + +void GSocketGUIFunctionsTableConcrete::OnExit() +{ +#ifdef __WXWINCE__ +/* Delete the threads here */ + for(unsigned int i=0; i < currSocket; i++) + CloseHandle(hThread[i]); +#endif + /* Destroy internal window */ + DestroyWindow(hWin); + UnregisterClass(CLASSNAME, INSTANCE); + + /* Unlock wsock32.dll */ + if (gs_wsock32dll) + { + FreeLibrary(gs_wsock32dll); + gs_wsock32dll = 0; + } + + /* Delete critical section */ + DeleteCriticalSection(&critical); +} + +/* Per-socket GUI initialization / cleanup */ + +bool GSocketGUIFunctionsTableConcrete::Init_Socket(GSocket *socket) +{ + int i; + + /* Allocate a new message number for this socket */ + EnterCriticalSection(&critical); + + i = firstAvailable; + while (socketList[i] != NULL) + { + i = (i + 1) % MAXSOCKETS; + + if (i == firstAvailable) /* abort! */ + { + LeaveCriticalSection(&critical); + return false; + } + } + socketList[i] = socket; + firstAvailable = (i + 1) % MAXSOCKETS; + socket->m_msgnumber = (i + WM_USER); + + LeaveCriticalSection(&critical); + + return true; +} + +void GSocketGUIFunctionsTableConcrete::Destroy_Socket(GSocket *socket) +{ + /* Remove the socket from the list */ + EnterCriticalSection(&critical); + if ( socket->IsOk() ) + { + const int msgnum = socket->m_msgnumber; + + // we need to remove any pending messages for this socket to avoid having + // them sent to a new socket which could reuse the same message number as + // soon as we destroy this one + MSG msg; + while ( ::PeekMessage(&msg, hWin, msgnum, msgnum, PM_REMOVE) ) + ; + + socketList[msgnum - WM_USER] = NULL; + } + + LeaveCriticalSection(&critical); +} + +/* Windows proc for asynchronous event handling */ + +LRESULT CALLBACK _GSocket_Internal_WinProc(HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + GSocket *socket; + GSocketEvent event; + GSocketCallback cback; + char *data; + + if (uMsg >= WM_USER && uMsg <= (WM_USER + MAXSOCKETS - 1)) + { + EnterCriticalSection(&critical); + socket = socketList[(uMsg - WM_USER)]; + event = (GSocketEvent) -1; + cback = NULL; + data = NULL; + + /* Check that the socket still exists (it has not been + * destroyed) and for safety, check that the m_fd field + * is what we expect it to be. + */ + if ((socket != NULL) && (socket->m_fd == wParam)) + { + switch WSAGETSELECTEVENT(lParam) + { + case FD_READ: event = GSOCK_INPUT; break; + case FD_WRITE: event = GSOCK_OUTPUT; break; + case FD_ACCEPT: event = GSOCK_CONNECTION; break; + case FD_CONNECT: + { + if (WSAGETSELECTERROR(lParam) != 0) + event = GSOCK_LOST; + else + event = GSOCK_CONNECTION; + break; + } + case FD_CLOSE: event = GSOCK_LOST; break; + } + + if (event != -1) + { + cback = socket->m_cbacks[event]; + data = socket->m_data[event]; + + if (event == GSOCK_LOST) + socket->m_detected = GSOCK_LOST_FLAG; + else + socket->m_detected |= (1 << event); + } + } + + /* OK, we can now leave the critical section because we have + * already obtained the callback address (we make no further + * accesses to socket->whatever). However, the app should + * be prepared to handle events from a socket that has just + * been closed! + */ + LeaveCriticalSection(&critical); + + if (cback != NULL) + (cback)(socket, event, data); + + return (LRESULT) 0; + } + else + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +/* _GSocket_Enable_Events: + * Enable all event notifications; we need to be notified of all + * events for internal processing, but we will only notify users + * when an appropiate callback function has been installed. + */ +void GSocketGUIFunctionsTableConcrete::Enable_Events(GSocket *socket) +{ + assert (socket != NULL); + + if (socket->m_fd != INVALID_SOCKET) + { + /* We could probably just subscribe to all events regardless + * of the socket type, but MS recommends to do it this way. + */ + long lEvent = socket->m_server? + FD_ACCEPT : (FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE); +#ifndef __WXWINCE__ + gs_WSAAsyncSelect(socket->m_fd, hWin, socket->m_msgnumber, lEvent); +#else +/* +* WinCE creates a thread for socket event handling. +* All needed parameters get passed through the thread_data structure. +*/ + + thread_data* d = new thread_data; + d->lEvent = lEvent; + d->hEvtWin = hWin; + d->msgnumber = socket->m_msgnumber; + d->fd = socket->m_fd; + socketHash[socket->m_fd] = true; + hThread[currSocket++] = CreateThread(NULL, 0, &SocketThread,(LPVOID)d, 0, NULL); +#endif + } +} + +/* _GSocket_Disable_Events: + * Disable event notifications (when shutdowning the socket) + */ +void GSocketGUIFunctionsTableConcrete::Disable_Events(GSocket *socket) +{ + assert (socket != NULL); + + if (socket->m_fd != INVALID_SOCKET) + { +#ifndef __WXWINCE__ + gs_WSAAsyncSelect(socket->m_fd, hWin, socket->m_msgnumber, 0); +#else + //Destroy the thread + socketHash[socket->m_fd] = false; +#endif + } +} + +#else /* !wxUSE_SOCKETS */ + +/* + * Translation unit shouldn't be empty, so include this typedef to make the + * compiler (VC++ 6.0, for example) happy + */ +typedef void (*wxDummy)(); + +#endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */ diff --git a/Source/3rd Party/wx/src/msw/tbar95.cpp b/Source/3rd Party/wx/src/msw/tbar95.cpp new file mode 100644 index 000000000..71042510f --- /dev/null +++ b/Source/3rd Party/wx/src/msw/tbar95.cpp @@ -0,0 +1,1848 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/msw/tbar95.cpp +// Purpose: wxToolBar +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: tbar95.cpp 58446 2009-01-26 23:32:16Z VS $ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && !defined(__SMARTPHONE__) + +#include "wx/toolbar.h" + +#ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" + #include "wx/dynarray.h" + #include "wx/frame.h" + #include "wx/log.h" + #include "wx/intl.h" + #include "wx/settings.h" + #include "wx/bitmap.h" + #include "wx/dcmemory.h" + #include "wx/control.h" + #include "wx/app.h" // for GetComCtl32Version + #include "wx/image.h" +#endif + +#include "wx/sysopt.h" + +#include "wx/msw/private.h" + +#if wxUSE_UXTHEME +#include "wx/msw/uxtheme.h" +#endif + +// this define controls whether the code for button colours remapping (only +// useful for 16 or 256 colour images) is active at all, it's always turned off +// for CE where it doesn't compile (and is probably not needed anyhow) and may +// also be turned off for other systems if you always use 24bpp images and so +// never need it +#ifndef __WXWINCE__ + #define wxREMAP_BUTTON_COLOURS +#endif // !__WXWINCE__ + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// these standard constants are not always defined in compilers headers + +// Styles +#ifndef TBSTYLE_FLAT + #define TBSTYLE_LIST 0x1000 + #define TBSTYLE_FLAT 0x0800 +#endif + +#ifndef TBSTYLE_TRANSPARENT + #define TBSTYLE_TRANSPARENT 0x8000 +#endif + +#ifndef TBSTYLE_TOOLTIPS + #define TBSTYLE_TOOLTIPS 0x0100 +#endif + +// Messages +#ifndef TB_GETSTYLE + #define TB_SETSTYLE (WM_USER + 56) + #define TB_GETSTYLE (WM_USER + 57) +#endif + +#ifndef TB_HITTEST + #define TB_HITTEST (WM_USER + 69) +#endif + +#ifndef TB_GETMAXSIZE + #define TB_GETMAXSIZE (WM_USER + 83) +#endif + +// these values correspond to those used by comctl32.dll +#define DEFAULTBITMAPX 16 +#define DEFAULTBITMAPY 15 + +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl) + +/* + TOOLBAR PROPERTIES + tool + bitmap + bitmap2 + tooltip + longhelp + radio (bool) + toggle (bool) + separator + style ( wxNO_BORDER | wxTB_HORIZONTAL) + bitmapsize + margins + packing + separation + + dontattachtoframe +*/ + +BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase) + EVT_MOUSE_EVENTS(wxToolBar::OnMouseEvent) + EVT_SYS_COLOUR_CHANGED(wxToolBar::OnSysColourChanged) + EVT_ERASE_BACKGROUND(wxToolBar::OnEraseBackground) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +class wxToolBarTool : public wxToolBarToolBase +{ +public: + wxToolBarTool(wxToolBar *tbar, + int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp) + : wxToolBarToolBase(tbar, id, label, bmpNormal, bmpDisabled, kind, + clientData, shortHelp, longHelp) + { + m_nSepCount = 0; + } + + wxToolBarTool(wxToolBar *tbar, wxControl *control) + : wxToolBarToolBase(tbar, control) + { + m_nSepCount = 1; + } + + virtual void SetLabel(const wxString& label) + { + if ( label == m_label ) + return; + + wxToolBarToolBase::SetLabel(label); + + // we need to update the label shown in the toolbar because it has a + // pointer to the internal buffer of the old label + // + // TODO: use TB_SETBUTTONINFO + } + + // set/get the number of separators which we use to cover the space used by + // a control in the toolbar + void SetSeparatorsCount(size_t count) { m_nSepCount = count; } + size_t GetSeparatorsCount() const { return m_nSepCount; } + +private: + size_t m_nSepCount; + + DECLARE_NO_COPY_CLASS(wxToolBarTool) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxToolBarTool +// ---------------------------------------------------------------------------- + +wxToolBarToolBase *wxToolBar::CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpDisabled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp) +{ + return new wxToolBarTool(this, id, label, bmpNormal, bmpDisabled, kind, + clientData, shortHelp, longHelp); +} + +wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) +{ + return new wxToolBarTool(this, control); +} + +// ---------------------------------------------------------------------------- +// wxToolBar construction +// ---------------------------------------------------------------------------- + +void wxToolBar::Init() +{ + m_hBitmap = 0; + m_disabledImgList = NULL; + + m_nButtons = 0; + + m_defaultWidth = DEFAULTBITMAPX; + m_defaultHeight = DEFAULTBITMAPY; + + m_pInTool = 0; +} + +bool wxToolBar::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) +{ + // common initialisation + if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) + return false; + + FixupStyle(); + + // MSW-specific initialisation + if ( !MSWCreateToolbar(pos, size) ) + return false; + + wxSetCCUnicodeFormat(GetHwnd()); + + // workaround for flat toolbar on Windows XP classic style: we have to set + // the style after creating the control; doing it at creation time doesn't work +#if wxUSE_UXTHEME + if ( style & wxTB_FLAT ) + { + LRESULT style = GetMSWToolbarStyle(); + + if ( !(style & TBSTYLE_FLAT) ) + ::SendMessage(GetHwnd(), TB_SETSTYLE, 0, style | TBSTYLE_FLAT); + } +#endif // wxUSE_UXTHEME + + return true; +} + +bool wxToolBar::MSWCreateToolbar(const wxPoint& pos, const wxSize& size) +{ + if ( !MSWCreateControl(TOOLBARCLASSNAME, wxEmptyString, pos, size) ) + return false; + + // toolbar-specific post initialisation + ::SendMessage(GetHwnd(), TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + + // Fix a bug on e.g. the Silver theme on WinXP where control backgrounds + // are incorrectly drawn, by forcing the background to a specific colour. + int majorVersion, minorVersion; + wxGetOsVersion(& majorVersion, & minorVersion); + if (majorVersion < 6) + SetBackgroundColour(GetBackgroundColour()); + + return true; +} + +void wxToolBar::Recreate() +{ + const HWND hwndOld = GetHwnd(); + if ( !hwndOld ) + { + // we haven't been created yet, no need to recreate + return; + } + + // get the position and size before unsubclassing the old toolbar + const wxPoint pos = GetPosition(); + const wxSize size = GetSize(); + + UnsubclassWin(); + + if ( !MSWCreateToolbar(pos, size) ) + { + // what can we do? + wxFAIL_MSG( _T("recreating the toolbar failed") ); + + return; + } + + // reparent all our children under the new toolbar + for ( wxWindowList::compatibility_iterator node = m_children.GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + ::SetParent(GetHwndOf(win), GetHwnd()); + } + + // only destroy the old toolbar now -- + // after all the children had been reparented + ::DestroyWindow(hwndOld); + + // it is for the old bitmap control and can't be used with the new one + if ( m_hBitmap ) + { + ::DeleteObject((HBITMAP) m_hBitmap); + m_hBitmap = 0; + } + + if ( m_disabledImgList ) + { + delete m_disabledImgList; + m_disabledImgList = NULL; + } + + Realize(); +} + +wxToolBar::~wxToolBar() +{ + // we must refresh the frame size when the toolbar is deleted but the frame + // is not - otherwise toolbar leaves a hole in the place it used to occupy + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); + if ( frame && !frame->IsBeingDeleted() ) + frame->SendSizeEvent(); + + if ( m_hBitmap ) + ::DeleteObject((HBITMAP) m_hBitmap); + + delete m_disabledImgList; +} + +wxSize wxToolBar::DoGetBestSize() const +{ + wxSize sizeBest; + + SIZE size; + if ( !::SendMessage(GetHwnd(), TB_GETMAXSIZE, 0, (LPARAM)&size) ) + { + // maybe an old (< 0x400) Windows version? try to approximate the + // toolbar size ourselves + sizeBest = GetToolSize(); + sizeBest.y += 2 * ::GetSystemMetrics(SM_CYBORDER); // Add borders + sizeBest.x *= GetToolsCount(); + + // reverse horz and vertical components if necessary + if ( IsVertical() ) + { + int t = sizeBest.x; + sizeBest.x = sizeBest.y; + sizeBest.y = t; + } + } + else // TB_GETMAXSIZE succeeded + { + // but it could still return an incorrect result due to what appears to + // be a bug in old comctl32.dll versions which don't handle controls in + // the toolbar correctly, so work around it (see SF patch 1902358) + if ( !IsVertical() && wxApp::GetComCtl32Version() < 600 ) + { + // calculate the toolbar width in alternative way + RECT rcFirst, rcLast; + if ( ::SendMessage(GetHwnd(), TB_GETITEMRECT, 0, (LPARAM)&rcFirst) + && ::SendMessage(GetHwnd(), TB_GETITEMRECT, + GetToolsCount() - 1, (LPARAM)&rcLast) ) + { + const int widthAlt = rcLast.right - rcFirst.left; + if ( widthAlt > size.cx ) + size.cx = widthAlt; + } + } + + sizeBest.x = size.cx; + sizeBest.y = size.cy; + } + + if (!IsVertical()) + { + // Without the extra height, DoGetBestSize can report a size that's + // smaller than the actual window, causing windows to overlap slightly + // in some circumstances, leading to missing borders (especially noticeable + // in AUI layouts). + if (!(GetWindowStyle() & wxTB_NODIVIDER)) + sizeBest.y += 2; + sizeBest.y ++; + } + + CacheBestSize(sizeBest); + + return sizeBest; +} + +WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const +{ + // toolbars never have border, giving one to them results in broken + // appearance + WXDWORD msStyle = wxControl::MSWGetStyle + ( + (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle + ); + + if ( !(style & wxTB_NO_TOOLTIPS) ) + msStyle |= TBSTYLE_TOOLTIPS; + + if ( style & (wxTB_FLAT | wxTB_HORZ_LAYOUT) ) + { + // static as it doesn't change during the program lifetime + static const int s_verComCtl = wxApp::GetComCtl32Version(); + + // comctl32.dll 4.00 doesn't support the flat toolbars and using this + // style with 6.00 (part of Windows XP) leads to the toolbar with + // incorrect background colour - and not using it still results in the + // correct (flat) toolbar, so don't use it there + if ( s_verComCtl > 400 && s_verComCtl < 600 ) + msStyle |= TBSTYLE_FLAT | TBSTYLE_TRANSPARENT; + + if ( s_verComCtl >= 470 && style & wxTB_HORZ_LAYOUT ) + msStyle |= TBSTYLE_LIST; + } + + if ( style & wxTB_NODIVIDER ) + msStyle |= CCS_NODIVIDER; + + if ( style & wxTB_NOALIGN ) + msStyle |= CCS_NOPARENTALIGN; + + if ( style & wxTB_VERTICAL ) + msStyle |= CCS_VERT; + + if( style & wxTB_BOTTOM ) + msStyle |= CCS_BOTTOM; + + if ( style & wxTB_RIGHT ) + msStyle |= CCS_RIGHT; + + return msStyle; +} + +// ---------------------------------------------------------------------------- +// adding/removing tools +// ---------------------------------------------------------------------------- + +bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool) +{ + // nothing special to do here - we really create the toolbar buttons in + // Realize() later + tool->Attach(this); + + InvalidateBestSize(); + return true; +} + +bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) +{ + // the main difficulty we have here is with the controls in the toolbars: + // as we (sometimes) use several separators to cover up the space used by + // them, the indices are not the same for us and the toolbar + + // first determine the position of the first button to delete: it may be + // different from pos if we use several separators to cover the space used + // by a control + wxToolBarToolsList::compatibility_iterator node; + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + wxToolBarToolBase *tool2 = node->GetData(); + if ( tool2 == tool ) + { + // let node point to the next node in the list + node = node->GetNext(); + + break; + } + + if ( tool2->IsControl() ) + pos += ((wxToolBarTool *)tool2)->GetSeparatorsCount() - 1; + } + + // now determine the number of buttons to delete and the area taken by them + size_t nButtonsToDelete = 1; + + // get the size of the button we're going to delete + RECT r; + if ( !::SendMessage(GetHwnd(), TB_GETITEMRECT, pos, (LPARAM)&r) ) + { + wxLogLastError(_T("TB_GETITEMRECT")); + } + + int width = r.right - r.left; + + if ( tool->IsControl() ) + { + nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount(); + width *= nButtonsToDelete; + tool->GetControl()->Destroy(); + } + + // do delete all buttons + m_nButtons -= nButtonsToDelete; + while ( nButtonsToDelete-- > 0 ) + { + if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, pos, 0) ) + { + wxLogLastError(wxT("TB_DELETEBUTTON")); + + return false; + } + } + + tool->Detach(); + + // and finally reposition all the controls after this button (the toolbar + // takes care of all normal items) + for ( /* node -> first after deleted */ ; node; node = node->GetNext() ) + { + wxToolBarToolBase *tool2 = node->GetData(); + if ( tool2->IsControl() ) + { + int x; + wxControl *control = tool2->GetControl(); + control->GetPosition(&x, NULL); + control->Move(x - width, wxDefaultCoord); + } + } + + InvalidateBestSize(); + + return true; +} + +void wxToolBar::CreateDisabledImageList() +{ + if (m_disabledImgList != NULL) + { + delete m_disabledImgList; + m_disabledImgList = NULL; + } + + // as we can't use disabled image list with older versions of comctl32.dll, + // don't even bother creating it + if ( wxApp::GetComCtl32Version() >= 470 ) + { + // search for the first disabled button img in the toolbar, if any + for ( wxToolBarToolsList::compatibility_iterator + node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + wxToolBarToolBase *tool = node->GetData(); + wxBitmap bmpDisabled = tool->GetDisabledBitmap(); + if ( bmpDisabled.Ok() ) + { + m_disabledImgList = new wxImageList + ( + m_defaultWidth, + m_defaultHeight, + bmpDisabled.GetMask() != NULL, + GetToolsCount() + ); + break; + } + } + + // we don't have any disabled bitmaps + } +} + +void wxToolBar::AdjustToolBitmapSize() +{ + wxSize s(m_defaultWidth, m_defaultHeight); + const wxSize orig_s(s); + + for ( wxToolBarToolsList::const_iterator i = m_tools.begin(); + i != m_tools.end(); + ++i ) + { + const wxBitmap& bmp = (*i)->GetNormalBitmap(); + s.IncTo(wxSize(bmp.GetWidth(), bmp.GetHeight())); + } + + if ( s != orig_s ) + SetToolBitmapSize(s); +} + +bool wxToolBar::Realize() +{ + const size_t nTools = GetToolsCount(); + if ( nTools == 0 ) + // nothing to do + return true; + + // make sure tool size is larger enough for all all bitmaps to fit in + // (this is consistent with what other ports do): + AdjustToolBitmapSize(); + +#ifdef wxREMAP_BUTTON_COLOURS + // don't change the values of these constants, they can be set from the + // user code via wxSystemOptions + enum + { + Remap_None = -1, + Remap_Bg, + Remap_Buttons, + Remap_TransparentBg + }; + + // the user-specified option overrides anything, but if it wasn't set, only + // remap the buttons on 8bpp displays as otherwise the bitmaps usually look + // much worse after remapping + static const wxChar *remapOption = wxT("msw.remap"); + const int remapValue = wxSystemOptions::HasOption(remapOption) + ? wxSystemOptions::GetOptionInt(remapOption) + : wxDisplayDepth() <= 8 ? Remap_Buttons + : Remap_None; + +#endif // wxREMAP_BUTTON_COLOURS + + // delete all old buttons, if any + for ( size_t pos = 0; pos < m_nButtons; pos++ ) + { + if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, 0, 0) ) + { + wxLogDebug(wxT("TB_DELETEBUTTON failed")); + } + } + + // First, add the bitmap: we use one bitmap for all toolbar buttons + // ---------------------------------------------------------------- + + wxToolBarToolsList::compatibility_iterator node; + int bitmapId = 0; + + wxSize sizeBmp; + if ( HasFlag(wxTB_NOICONS) ) + { + // no icons, don't leave space for them + sizeBmp.x = + sizeBmp.y = 0; + } + else // do show icons + { + // if we already have a bitmap, we'll replace the existing one -- + // otherwise we'll install a new one + HBITMAP oldToolBarBitmap = (HBITMAP)m_hBitmap; + + sizeBmp.x = m_defaultWidth; + sizeBmp.y = m_defaultHeight; + + const wxCoord totalBitmapWidth = m_defaultWidth * + wx_truncate_cast(wxCoord, nTools), + totalBitmapHeight = m_defaultHeight; + + // Create a bitmap and copy all the tool bitmaps into it + wxMemoryDC dcAllButtons; + wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight); + dcAllButtons.SelectObject(bitmap); + +#ifdef wxREMAP_BUTTON_COLOURS + if ( remapValue != Remap_TransparentBg ) +#endif // wxREMAP_BUTTON_COLOURS + { + // VZ: why do we hardcode grey colour for CE? + dcAllButtons.SetBackground(wxBrush( +#ifdef __WXWINCE__ + wxColour(0xc0, 0xc0, 0xc0) +#else // !__WXWINCE__ + GetBackgroundColour() +#endif // __WXWINCE__/!__WXWINCE__ + )); + dcAllButtons.Clear(); + } + + m_hBitmap = bitmap.GetHBITMAP(); + HBITMAP hBitmap = (HBITMAP)m_hBitmap; + +#ifdef wxREMAP_BUTTON_COLOURS + if ( remapValue == Remap_Bg ) + { + dcAllButtons.SelectObject(wxNullBitmap); + + // Even if we're not remapping the bitmap + // content, we still have to remap the background. + hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap, + totalBitmapWidth, totalBitmapHeight); + + dcAllButtons.SelectObject(bitmap); + } +#endif // wxREMAP_BUTTON_COLOURS + + // the button position + wxCoord x = 0; + + // the number of buttons (not separators) + int nButtons = 0; + + CreateDisabledImageList(); + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + wxToolBarToolBase *tool = node->GetData(); + if ( tool->IsButton() ) + { + const wxBitmap& bmp = tool->GetNormalBitmap(); + + const int w = bmp.GetWidth(); + const int h = bmp.GetHeight(); + + if ( bmp.Ok() ) + { + int xOffset = wxMax(0, (m_defaultWidth - w)/2); + int yOffset = wxMax(0, (m_defaultHeight - h)/2); + + // notice the last parameter: do use mask + dcAllButtons.DrawBitmap(bmp, x + xOffset, yOffset, true); + } + else + { + wxFAIL_MSG( _T("invalid tool button bitmap") ); + } + + // also deal with disabled bitmap if we want to use them + if ( m_disabledImgList ) + { + wxBitmap bmpDisabled = tool->GetDisabledBitmap(); +#if wxUSE_IMAGE && wxUSE_WXDIB + if ( !bmpDisabled.Ok() ) + { + // no disabled bitmap specified but we still need to + // fill the space in the image list with something, so + // we grey out the normal bitmap + wxImage imgGreyed; + wxCreateGreyedImage(bmp.ConvertToImage(), imgGreyed); + +#ifdef wxREMAP_BUTTON_COLOURS + if ( remapValue == Remap_Buttons ) + { + // we need to have light grey background colour for + // MapBitmap() to work correctly + for ( int y = 0; y < h; y++ ) + { + for ( int x = 0; x < w; x++ ) + { + if ( imgGreyed.IsTransparent(x, y) ) + imgGreyed.SetRGB(x, y, + wxLIGHT_GREY->Red(), + wxLIGHT_GREY->Green(), + wxLIGHT_GREY->Blue()); + } + } + } +#endif // wxREMAP_BUTTON_COLOURS + + bmpDisabled = wxBitmap(imgGreyed); + } +#endif // wxUSE_IMAGE + +#ifdef wxREMAP_BUTTON_COLOURS + if ( remapValue == Remap_Buttons ) + MapBitmap(bmpDisabled.GetHBITMAP(), w, h); +#endif // wxREMAP_BUTTON_COLOURS + + m_disabledImgList->Add(bmpDisabled); + } + + // still inc width and number of buttons because otherwise the + // subsequent buttons will all be shifted which is rather confusing + // (and like this you'd see immediately which bitmap was bad) + x += m_defaultWidth; + nButtons++; + } + } + + dcAllButtons.SelectObject(wxNullBitmap); + + // don't delete this HBITMAP! + bitmap.SetHBITMAP(0); + +#ifdef wxREMAP_BUTTON_COLOURS + if ( remapValue == Remap_Buttons ) + { + // Map to system colours + hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap, + totalBitmapWidth, totalBitmapHeight); + } +#endif // wxREMAP_BUTTON_COLOURS + + bool addBitmap = true; + + if ( oldToolBarBitmap ) + { +#ifdef TB_REPLACEBITMAP + if ( wxApp::GetComCtl32Version() >= 400 ) + { + TBREPLACEBITMAP replaceBitmap; + replaceBitmap.hInstOld = NULL; + replaceBitmap.hInstNew = NULL; + replaceBitmap.nIDOld = (UINT) oldToolBarBitmap; + replaceBitmap.nIDNew = (UINT) hBitmap; + replaceBitmap.nButtons = nButtons; + if ( !::SendMessage(GetHwnd(), TB_REPLACEBITMAP, + 0, (LPARAM) &replaceBitmap) ) + { + wxFAIL_MSG(wxT("Could not replace the old bitmap")); + } + + ::DeleteObject(oldToolBarBitmap); + + // already done + addBitmap = false; + } + else +#endif // TB_REPLACEBITMAP + { + // we can't replace the old bitmap, so we will add another one + // (awfully inefficient, but what else to do?) and shift the bitmap + // indices accordingly + addBitmap = true; + + bitmapId = m_nButtons; + } + } + + if ( addBitmap ) // no old bitmap or we can't replace it + { + TBADDBITMAP addBitmap; + addBitmap.hInst = 0; + addBitmap.nID = (UINT) hBitmap; + if ( ::SendMessage(GetHwnd(), TB_ADDBITMAP, + (WPARAM) nButtons, (LPARAM)&addBitmap) == -1 ) + { + wxFAIL_MSG(wxT("Could not add bitmap to toolbar")); + } + } + + // disable image lists are only supported in comctl32.dll 4.70+ + if ( wxApp::GetComCtl32Version() >= 470 ) + { + HIMAGELIST hil = m_disabledImgList + ? GetHimagelistOf(m_disabledImgList) + : 0; + + // notice that we set the image list even if don't have one right + // now as we could have it before and need to reset it in this case + HIMAGELIST oldImageList = (HIMAGELIST) + ::SendMessage(GetHwnd(), TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hil); + + // delete previous image list if any + if ( oldImageList ) + ::DeleteObject(oldImageList); + } + } + + // don't call SetToolBitmapSize() as we don't want to change the values of + // m_defaultWidth/Height + if ( !::SendMessage(GetHwnd(), TB_SETBITMAPSIZE, 0, + MAKELONG(sizeBmp.x, sizeBmp.y)) ) + { + wxLogLastError(_T("TB_SETBITMAPSIZE")); + } + + // Next add the buttons and separators + // ----------------------------------- + + TBBUTTON *buttons = new TBBUTTON[nTools]; + + // this array will hold the indices of all controls in the toolbar + wxArrayInt controlIds; + + bool lastWasRadio = false; + int i = 0; + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + wxToolBarToolBase *tool = node->GetData(); + + // don't add separators to the vertical toolbar with old comctl32.dll + // versions as they didn't handle this properly + if ( IsVertical() && tool->IsSeparator() && + wxApp::GetComCtl32Version() <= 472 ) + { + continue; + } + + TBBUTTON& button = buttons[i]; + + wxZeroMemory(button); + + bool isRadio = false; + switch ( tool->GetStyle() ) + { + case wxTOOL_STYLE_CONTROL: + button.idCommand = tool->GetId(); + // fall through: create just a separator too + + case wxTOOL_STYLE_SEPARATOR: + button.fsState = TBSTATE_ENABLED; + button.fsStyle = TBSTYLE_SEP; + break; + + case wxTOOL_STYLE_BUTTON: + if ( !HasFlag(wxTB_NOICONS) ) + button.iBitmap = bitmapId; + + if ( HasFlag(wxTB_TEXT) ) + { + const wxString& label = tool->GetLabel(); + if ( !label.empty() ) + button.iString = (int)label.c_str(); + } + + button.idCommand = tool->GetId(); + + if ( tool->IsEnabled() ) + button.fsState |= TBSTATE_ENABLED; + if ( tool->IsToggled() ) + button.fsState |= TBSTATE_CHECKED; + + switch ( tool->GetKind() ) + { + case wxITEM_RADIO: + button.fsStyle = TBSTYLE_CHECKGROUP; + + if ( !lastWasRadio ) + { + // the first item in the radio group is checked by + // default to be consistent with wxGTK and the menu + // radio items + button.fsState |= TBSTATE_CHECKED; + + if (tool->Toggle(true)) + { + DoToggleTool(tool, true); + } + } + else if ( tool->IsToggled() ) + { + wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); + int prevIndex = i - 1; + while ( nodePrev ) + { + TBBUTTON& prevButton = buttons[prevIndex]; + wxToolBarToolBase *tool = nodePrev->GetData(); + if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) + break; + + if ( tool->Toggle(false) ) + DoToggleTool(tool, false); + + prevButton.fsState &= ~TBSTATE_CHECKED; + nodePrev = nodePrev->GetPrevious(); + prevIndex--; + } + } + + isRadio = true; + break; + + case wxITEM_CHECK: + button.fsStyle = TBSTYLE_CHECK; + break; + + case wxITEM_NORMAL: + button.fsStyle = TBSTYLE_BUTTON; + break; + + default: + wxFAIL_MSG( _T("unexpected toolbar button kind") ); + button.fsStyle = TBSTYLE_BUTTON; + break; + } + + bitmapId++; + break; + } + + lastWasRadio = isRadio; + + i++; + } + + if ( !::SendMessage(GetHwnd(), TB_ADDBUTTONS, (WPARAM)i, (LPARAM)buttons) ) + { + wxLogLastError(wxT("TB_ADDBUTTONS")); + } + + delete [] buttons; + + // Deal with the controls finally + // ------------------------------ + + // adjust the controls size to fit nicely in the toolbar + int y = 0; + size_t index = 0; + for ( node = m_tools.GetFirst(); node; node = node->GetNext(), index++ ) + { + wxToolBarToolBase *tool = node->GetData(); + + // we calculate the running y coord for vertical toolbars so we need to + // get the items size for all items but for the horizontal ones we + // don't need to deal with the non controls + bool isControl = tool->IsControl(); + if ( !isControl && !IsVertical() ) + continue; + + // note that we use TB_GETITEMRECT and not TB_GETRECT because the + // latter only appeared in v4.70 of comctl32.dll + RECT r; + if ( !::SendMessage(GetHwnd(), TB_GETITEMRECT, + index, (LPARAM)(LPRECT)&r) ) + { + wxLogLastError(wxT("TB_GETITEMRECT")); + } + + if ( !isControl ) + { + // can only be control if isVertical + y += r.bottom - r.top; + + continue; + } + + wxControl *control = tool->GetControl(); + wxSize size = control->GetSize(); + + // the position of the leftmost controls corner + int left = wxDefaultCoord; + + // TB_SETBUTTONINFO message is only supported by comctl32.dll 4.71+ +#ifdef TB_SETBUTTONINFO + // available in headers, now check whether it is available now + // (during run-time) + if ( wxApp::GetComCtl32Version() >= 471 ) + { + // set the (underlying) separators width to be that of the + // control + TBBUTTONINFO tbbi; + tbbi.cbSize = sizeof(tbbi); + tbbi.dwMask = TBIF_SIZE; + tbbi.cx = (WORD)size.x; + if ( !::SendMessage(GetHwnd(), TB_SETBUTTONINFO, + tool->GetId(), (LPARAM)&tbbi) ) + { + // the id is probably invalid? + wxLogLastError(wxT("TB_SETBUTTONINFO")); + } + } + else +#endif // comctl32.dll 4.71 + // TB_SETBUTTONINFO unavailable + { + // try adding several separators to fit the controls width + int widthSep = r.right - r.left; + left = r.left; + + TBBUTTON tbb; + wxZeroMemory(tbb); + tbb.idCommand = 0; + tbb.fsState = TBSTATE_ENABLED; + tbb.fsStyle = TBSTYLE_SEP; + + size_t nSeparators = size.x / widthSep; + for ( size_t nSep = 0; nSep < nSeparators; nSep++ ) + { + if ( !::SendMessage(GetHwnd(), TB_INSERTBUTTON, + index, (LPARAM)&tbb) ) + { + wxLogLastError(wxT("TB_INSERTBUTTON")); + } + + index++; + } + + // remember the number of separators we used - we'd have to + // delete all of them later + ((wxToolBarTool *)tool)->SetSeparatorsCount(nSeparators); + + // adjust the controls width to exactly cover the separators + control->SetSize((nSeparators + 1)*widthSep, wxDefaultCoord); + } + + // position the control itself correctly vertically + int height = r.bottom - r.top; + int diff = height - size.y; + if ( diff < 0 ) + { + // the control is too high, resize to fit + control->SetSize(wxDefaultCoord, height - 2); + + diff = 2; + } + + int top; + if ( IsVertical() ) + { + left = 0; + top = y; + + y += height + 2 * GetMargins().y; + } + else // horizontal toolbar + { + if ( left == wxDefaultCoord ) + left = r.left; + + top = r.top; + } + + control->Move(left, top + (diff + 1) / 2); + } + + // the max index is the "real" number of buttons - i.e. counting even the + // separators which we added just for aligning the controls + m_nButtons = index; + + if ( !IsVertical() ) + { + if ( m_maxRows == 0 ) + // if not set yet, only one row + SetRows(1); + } + else if ( m_nButtons > 0 ) // vertical non empty toolbar + { + // if not set yet, have one column + m_maxRows = 1; + SetRows(m_nButtons); + } + + InvalidateBestSize(); + UpdateSize(); + + return true; +} + +// ---------------------------------------------------------------------------- +// message handlers +// ---------------------------------------------------------------------------- + +bool wxToolBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id) +{ + wxToolBarToolBase *tool = FindById((int)id); + if ( !tool ) + return false; + + bool toggled = false; // just to suppress warnings + + LRESULT state = ::SendMessage(GetHwnd(), TB_GETSTATE, id, 0); + + if ( tool->CanBeToggled() ) + { + toggled = (state & TBSTATE_CHECKED) != 0; + + // ignore the event when a radio button is released, as this doesn't + // seem to happen at all, and is handled otherwise + if ( tool->GetKind() == wxITEM_RADIO && !toggled ) + return true; + + tool->Toggle(toggled); + UnToggleRadioGroup(tool); + } + + // Without the two lines of code below, if the toolbar was repainted during + // OnLeftClick(), then it could end up without the tool bitmap temporarily + // (see http://lists.nongnu.org/archive/html/lmi/2008-10/msg00014.html). + // The Update() call bellow ensures that this won't happen, by repainting + // invalidated areas of the toolbar immediately. + // + // To complicate matters, the tool would be drawn in depressed state (this + // code is called when mouse button is released, not pressed). That's not + // ideal, having the tool pressed for the duration of OnLeftClick() + // provides the user with useful visual clue that the app is busy reacting + // to the event. So we manually put the tool into pressed state, handle the + // event and then finally restore tool's original state. + ::SendMessage(GetHwnd(), TB_SETSTATE, id, MAKELONG(state | TBSTATE_PRESSED, 0)); + Update(); + + bool allowLeftClick = OnLeftClick((int)id, toggled); + + // Restore the unpressed state. Enabled/toggled state might have been + // changed since so take care of it. + if (tool->IsEnabled()) + state |= TBSTATE_ENABLED; + else + state &= ~TBSTATE_ENABLED; + if (tool->IsToggled()) + state |= TBSTATE_CHECKED; + else + state &= ~TBSTATE_CHECKED; + ::SendMessage(GetHwnd(), TB_SETSTATE, id, MAKELONG(state, 0)); + + // OnLeftClick() can veto the button state change - for buttons which + // may be toggled only, of couse + if ( !allowLeftClick && tool->CanBeToggled() ) + { + // revert back + tool->Toggle(!toggled); + + ::SendMessage(GetHwnd(), TB_CHECKBUTTON, id, MAKELONG(!toggled, 0)); + } + + return true; +} + +bool wxToolBar::MSWOnNotify(int WXUNUSED(idCtrl), + WXLPARAM lParam, + WXLPARAM *WXUNUSED(result)) +{ + if( !HasFlag(wxTB_NO_TOOLTIPS) ) + { +#if wxUSE_TOOLTIPS + // First check if this applies to us + NMHDR *hdr = (NMHDR *)lParam; + + // the tooltips control created by the toolbar is sometimes Unicode, even + // in an ANSI application - this seems to be a bug in comctl32.dll v5 + UINT code = hdr->code; + if ( (code != (UINT) TTN_NEEDTEXTA) && (code != (UINT) TTN_NEEDTEXTW) ) + return false; + + HWND toolTipWnd = (HWND)::SendMessage(GetHwnd(), TB_GETTOOLTIPS, 0, 0); + if ( toolTipWnd != hdr->hwndFrom ) + return false; + + LPTOOLTIPTEXT ttText = (LPTOOLTIPTEXT)lParam; + int id = (int)ttText->hdr.idFrom; + + wxToolBarToolBase *tool = FindById(id); + if ( tool ) + return HandleTooltipNotify(code, lParam, tool->GetShortHelp()); +#else + wxUnusedVar(lParam); +#endif + } + + return false; +} + +// ---------------------------------------------------------------------------- +// toolbar geometry +// ---------------------------------------------------------------------------- + +void wxToolBar::SetToolBitmapSize(const wxSize& size) +{ + wxToolBarBase::SetToolBitmapSize(size); + + ::SendMessage(GetHwnd(), TB_SETBITMAPSIZE, 0, MAKELONG(size.x, size.y)); +} + +void wxToolBar::SetRows(int nRows) +{ + if ( nRows == m_maxRows ) + { + // avoid resizing the frame uselessly + return; + } + + // TRUE in wParam means to create at least as many rows, FALSE - + // at most as many + RECT rect; + ::SendMessage(GetHwnd(), TB_SETROWS, + MAKEWPARAM(nRows, !(GetWindowStyle() & wxTB_VERTICAL)), + (LPARAM) &rect); + + m_maxRows = nRows; + + UpdateSize(); +} + +// The button size is bigger than the bitmap size +wxSize wxToolBar::GetToolSize() const +{ + // TB_GETBUTTONSIZE is supported from version 4.70 +#if defined(_WIN32_IE) && (_WIN32_IE >= 0x300 ) \ + && !( defined(__GNUWIN32__) && !wxCHECK_W32API_VERSION( 1, 0 ) ) \ + && !defined (__DIGITALMARS__) + if ( wxApp::GetComCtl32Version() >= 470 ) + { + DWORD dw = ::SendMessage(GetHwnd(), TB_GETBUTTONSIZE, 0, 0); + + return wxSize(LOWORD(dw), HIWORD(dw)); + } + else +#endif // comctl32.dll 4.70+ + { + // defaults + return wxSize(m_defaultWidth + 8, m_defaultHeight + 7); + } +} + +static +wxToolBarToolBase *GetItemSkippingDummySpacers(const wxToolBarToolsList& tools, + size_t index ) +{ + wxToolBarToolsList::compatibility_iterator current = tools.GetFirst(); + + for ( ; current ; current = current->GetNext() ) + { + if ( index == 0 ) + return current->GetData(); + + wxToolBarTool *tool = (wxToolBarTool *)current->GetData(); + size_t separators = tool->GetSeparatorsCount(); + + // if it is a normal button, sepcount == 0, so skip 1 item (the button) + // otherwise, skip as many items as the separator count, plus the + // control itself + index -= separators ? separators + 1 : 1; + } + + return 0; +} + +wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const +{ + POINT pt; + pt.x = x; + pt.y = y; + int index = (int)::SendMessage(GetHwnd(), TB_HITTEST, 0, (LPARAM)&pt); + + // MBN: when the point ( x, y ) is close to the toolbar border + // TB_HITTEST returns m_nButtons ( not -1 ) + if ( index < 0 || (size_t)index >= m_nButtons ) + // it's a separator or there is no tool at all there + return (wxToolBarToolBase *)NULL; + + // when TB_SETBUTTONINFO is available (both during compile- and run-time), + // we don't use the dummy separators hack +#ifdef TB_SETBUTTONINFO + if ( wxApp::GetComCtl32Version() >= 471 ) + { + return m_tools.Item((size_t)index)->GetData(); + } + else +#endif // TB_SETBUTTONINFO + { + return GetItemSkippingDummySpacers( m_tools, (size_t) index ); + } +} + +void wxToolBar::UpdateSize() +{ + wxPoint pos = GetPosition(); + ::SendMessage(GetHwnd(), TB_AUTOSIZE, 0, 0); + if (pos != GetPosition()) + Move(pos); + + // In case Realize is called after the initial display (IOW the programmer + // may have rebuilt the toolbar) give the frame the option of resizing the + // toolbar to full width again, but only if the parent is a frame and the + // toolbar is managed by the frame. Otherwise assume that some other + // layout mechanism is controlling the toolbar size and leave it alone. + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); + if ( frame && frame->GetToolBar() == this ) + { + frame->SendSizeEvent(); + } +} + +// ---------------------------------------------------------------------------- +// toolbar styles +// --------------------------------------------------------------------------- + +// get the TBSTYLE of the given toolbar window +long wxToolBar::GetMSWToolbarStyle() const +{ + return ::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L); +} + +void wxToolBar::SetWindowStyleFlag(long style) +{ + // the style bits whose changes force us to recreate the toolbar + static const long MASK_NEEDS_RECREATE = wxTB_TEXT | wxTB_NOICONS; + + const long styleOld = GetWindowStyle(); + + wxToolBarBase::SetWindowStyleFlag(style); + + // don't recreate an empty toolbar: not only this is unnecessary, but it is + // also fatal as we'd then try to recreate the toolbar when it's just being + // created + if ( GetToolsCount() && + (style & MASK_NEEDS_RECREATE) != (styleOld & MASK_NEEDS_RECREATE) ) + { + // to remove the text labels, simply re-realizing the toolbar is enough + // but I don't know of any way to add the text to an existing toolbar + // other than by recreating it entirely + Recreate(); + } +} + +// ---------------------------------------------------------------------------- +// tool state +// ---------------------------------------------------------------------------- + +void wxToolBar::DoEnableTool(wxToolBarToolBase *tool, bool enable) +{ + ::SendMessage(GetHwnd(), TB_ENABLEBUTTON, + (WPARAM)tool->GetId(), (LPARAM)MAKELONG(enable, 0)); +} + +void wxToolBar::DoToggleTool(wxToolBarToolBase *tool, bool toggle) +{ + ::SendMessage(GetHwnd(), TB_CHECKBUTTON, + (WPARAM)tool->GetId(), (LPARAM)MAKELONG(toggle, 0)); +} + +void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle)) +{ + // VZ: AFAIK, the button has to be created either with TBSTYLE_CHECK or + // without, so we really need to delete the button and recreate it here + wxFAIL_MSG( _T("not implemented") ); +} + +void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetNormalBitmap(bitmap); + Realize(); + } +} + +void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetDisabledBitmap(bitmap); + Realize(); + } +} + +// ---------------------------------------------------------------------------- +// event handlers +// ---------------------------------------------------------------------------- + +// Responds to colour changes, and passes event on to children. +void wxToolBar::OnSysColourChanged(wxSysColourChangedEvent& event) +{ + wxRGBToColour(m_backgroundColour, ::GetSysColor(COLOR_BTNFACE)); + + // Remap the buttons + Realize(); + + // Relayout the toolbar + int nrows = m_maxRows; + m_maxRows = 0; // otherwise SetRows() wouldn't do anything + SetRows(nrows); + + Refresh(); + + // let the event propagate further + event.Skip(); +} + +void wxToolBar::OnMouseEvent(wxMouseEvent& event) +{ + if (event.Leaving() && m_pInTool) + { + OnMouseEnter( -1 ); + event.Skip(); + return; + } + + if ( event.RightDown() ) + { + // find the tool under the mouse + wxCoord x = 0, y = 0; + event.GetPosition(&x, &y); + + wxToolBarToolBase *tool = FindToolForPosition(x, y); + OnRightClick(tool ? tool->GetId() : -1, x, y); + } + else + { + event.Skip(); + } +} + +// This handler is required to allow the toolbar to be set to a non-default +// colour: for example, when it must blend in with a notebook page. +void wxToolBar::OnEraseBackground(wxEraseEvent& event) +{ + RECT rect = wxGetClientRect(GetHwnd()); + HDC hdc = GetHdcOf((*event.GetDC())); + + int majorVersion, minorVersion; + wxGetOsVersion(& majorVersion, & minorVersion); + +#if wxUSE_UXTHEME + // we may need to draw themed colour so that we appear correctly on + // e.g. notebook page under XP with themes but only do it if the parent + // draws themed background itself + if ( !UseBgCol() && !GetParent()->UseBgCol() ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + HRESULT + hr = theme->DrawThemeParentBackground(GetHwnd(), hdc, &rect); + if ( hr == S_OK ) + return; + + // it can also return S_FALSE which seems to simply say that it + // didn't draw anything but no error really occurred + if ( FAILED(hr) ) + wxLogApiError(_T("DrawThemeParentBackground(toolbar)"), hr); + } + } + + // Only draw a rebar theme on Vista, since it doesn't jive so well with XP + if ( !UseBgCol() && majorVersion >= 6 ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + wxUxThemeHandle hTheme(this, L"REBAR"); + + RECT r; + wxRect rect = GetClientRect(); + wxCopyRectToRECT(rect, r); + + HRESULT hr = theme->DrawThemeBackground(hTheme, hdc, 0, 0, & r, NULL); + if ( hr == S_OK ) + return; + + // it can also return S_FALSE which seems to simply say that it + // didn't draw anything but no error really occurred + if ( FAILED(hr) ) + wxLogApiError(_T("DrawThemeBackground(toolbar)"), hr); + } + } + +#endif // wxUSE_UXTHEME + + if ( UseBgCol() || (GetMSWToolbarStyle() & TBSTYLE_TRANSPARENT) ) + { + // do draw our background + // + // notice that this 'dumb' implementation may cause flicker for some of + // the controls in which case they should intercept wxEraseEvent and + // process it themselves somehow + AutoHBRUSH hBrush(wxColourToRGB(GetBackgroundColour())); + + wxCHANGE_HDC_MAP_MODE(hdc, MM_TEXT); + ::FillRect(hdc, &rect, hBrush); + } + else // we have no non default background colour + { + // let the system do it for us + event.Skip(); + } +} + +bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) +{ + // calculate our minor dimension ourselves - we're confusing the standard + // logic (TB_AUTOSIZE) with our horizontal toolbars and other hacks + RECT r; + if ( ::SendMessage(GetHwnd(), TB_GETITEMRECT, 0, (LPARAM)&r) ) + { + int w, h; + + if ( IsVertical() ) + { + w = r.right - r.left; + if ( m_maxRows ) + { + w *= (m_nButtons + m_maxRows - 1)/m_maxRows; + } + h = HIWORD(lParam); + } + else + { + w = LOWORD(lParam); + if (HasFlag( wxTB_FLAT )) + h = r.bottom - r.top - 3; + else + h = r.bottom - r.top; + if ( m_maxRows ) + { + // FIXME: hardcoded separator line height... + h += HasFlag(wxTB_NODIVIDER) ? 4 : 6; + h *= m_maxRows; + } + } + + if ( MAKELPARAM(w, h) != lParam ) + { + // size really changed + SetSize(w, h); + } + + // message processed + return true; + } + + return false; +} + +bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) +{ + // erase any dummy separators which were used + // for aligning the controls if any here + + // first of all, are there any controls at all? + wxToolBarToolsList::compatibility_iterator node; + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + if ( node->GetData()->IsControl() ) + break; + } + + if ( !node ) + // no controls, nothing to erase + return false; + + wxSize clientSize = GetClientSize(); + int majorVersion, minorVersion; + wxGetOsVersion(& majorVersion, & minorVersion); + + // prepare the DC on which we'll be drawing + // prepare the DC on which we'll be drawing + wxClientDC dc(this); + dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); + dc.SetPen(*wxTRANSPARENT_PEN); + + RECT r; + if ( !::GetUpdateRect(GetHwnd(), &r, FALSE) ) + // nothing to redraw anyhow + return false; + + wxRect rectUpdate; + wxCopyRECTToRect(r, rectUpdate); + + dc.SetClippingRegion(rectUpdate); + + // draw the toolbar tools, separators &c normally + wxControl::MSWWindowProc(WM_PAINT, wParam, lParam); + + // for each control in the toolbar find all the separators intersecting it + // and erase them + // + // NB: this is really the only way to do it as we don't know if a separator + // corresponds to a control (i.e. is a dummy one) or a real one + // otherwise + for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) + { + wxToolBarToolBase *tool = node->GetData(); + if ( tool->IsControl() ) + { + // get the control rect in our client coords + wxControl *control = tool->GetControl(); + wxRect rectCtrl = control->GetRect(); + + // iterate over all buttons + TBBUTTON tbb; + int count = ::SendMessage(GetHwnd(), TB_BUTTONCOUNT, 0, 0); + for ( int n = 0; n < count; n++ ) + { + // is it a separator? + if ( !::SendMessage(GetHwnd(), TB_GETBUTTON, + n, (LPARAM)&tbb) ) + { + wxLogDebug(_T("TB_GETBUTTON failed?")); + + continue; + } + + if ( tbb.fsStyle != TBSTYLE_SEP ) + continue; + + // get the bounding rect of the separator + RECT r; + if ( !::SendMessage(GetHwnd(), TB_GETITEMRECT, + n, (LPARAM)&r) ) + { + wxLogDebug(_T("TB_GETITEMRECT failed?")); + + continue; + } + + // does it intersect the control? + wxRect rectItem; + wxCopyRECTToRect(r, rectItem); + if ( rectCtrl.Intersects(rectItem) ) + { + // yes, do erase it! + + bool haveRefreshed = false; + +#if wxUSE_UXTHEME + if ( !UseBgCol() && !GetParent()->UseBgCol() ) + { + // Don't use DrawThemeBackground + } + else if (!UseBgCol() && majorVersion >= 6 ) + { + wxUxThemeEngine *theme = wxUxThemeEngine::GetIfActive(); + if ( theme ) + { + wxUxThemeHandle hTheme(this, L"REBAR"); + + RECT clipRect = r; + + // Draw the whole background since the pattern may be position sensitive; + // but clip it to the area of interest. + r.left = 0; + r.right = clientSize.x; + r.top = 0; + r.bottom = clientSize.y; + + HRESULT hr = theme->DrawThemeBackground(hTheme, (HDC) dc.GetHDC(), 0, 0, & r, & clipRect); + if ( hr == S_OK ) + haveRefreshed = true; + } + } +#endif + + if (!haveRefreshed) + dc.DrawRectangle(rectItem); + + // Necessary in case we use a no-paint-on-size + // style in the parent: the controls can disappear + control->Refresh(false); + } + } + } + } + + return true; +} + +void wxToolBar::HandleMouseMove(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) +{ + wxCoord x = GET_X_LPARAM(lParam), + y = GET_Y_LPARAM(lParam); + wxToolBarToolBase* tool = FindToolForPosition( x, y ); + + // cursor left current tool + if ( tool != m_pInTool && !tool ) + { + m_pInTool = 0; + OnMouseEnter( -1 ); + } + + // cursor entered a tool + if ( tool != m_pInTool && tool ) + { + m_pInTool = tool; + OnMouseEnter( tool->GetId() ); + } +} + +WXLRESULT wxToolBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) +{ + switch ( nMsg ) + { + case WM_MOUSEMOVE: + // we don't handle mouse moves, so always pass the message to + // wxControl::MSWWindowProc (HandleMouseMove just calls OnMouseEnter) + HandleMouseMove(wParam, lParam); + break; + + case WM_SIZE: + if ( HandleSize(wParam, lParam) ) + return 0; + break; + +#ifndef __WXWINCE__ + case WM_PAINT: + if ( HandlePaint(wParam, lParam) ) + return 0; +#endif + + default: + break; + } + + return wxControl::MSWWindowProc(nMsg, wParam, lParam); +} + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +#ifdef wxREMAP_BUTTON_COLOURS + +WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height) +{ + MemoryHDC hdcMem; + + if ( !hdcMem ) + { + wxLogLastError(_T("CreateCompatibleDC")); + + return bitmap; + } + + SelectInHDC bmpInHDC(hdcMem, (HBITMAP)bitmap); + + if ( !bmpInHDC ) + { + wxLogLastError(_T("SelectObject")); + + return bitmap; + } + + wxCOLORMAP *cmap = wxGetStdColourMap(); + + for ( int i = 0; i < width; i++ ) + { + for ( int j = 0; j < height; j++ ) + { + COLORREF pixel = ::GetPixel(hdcMem, i, j); + + for ( size_t k = 0; k < wxSTD_COL_MAX; k++ ) + { + COLORREF col = cmap[k].from; + if ( abs(GetRValue(pixel) - GetRValue(col)) < 10 && + abs(GetGValue(pixel) - GetGValue(col)) < 10 && + abs(GetBValue(pixel) - GetBValue(col)) < 10 ) + { + if ( cmap[k].to != pixel ) + ::SetPixel(hdcMem, i, j, cmap[k].to); + break; + } + } + } + } + + return bitmap; +} + +#endif // wxREMAP_BUTTON_COLOURS + +#endif // wxUSE_TOOLBAR diff --git a/Source/3rd Party/wx/src/msw/utils.cpp b/Source/3rd Party/wx/src/msw/utils.cpp index 611a75fe7..4f2ae25b8 100644 --- a/Source/3rd Party/wx/src/msw/utils.cpp +++ b/Source/3rd Party/wx/src/msw/utils.cpp @@ -20,6 +20,10 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if defined(__WXMSW__) +#include +#endif + #ifdef __BORLANDC__ #pragma hdrstop #endif diff --git a/Source/3rd Party/wx/wx_base.vcproj b/Source/3rd Party/wx/wx_base.vcproj index 7bb4facf2..cb168334c 100644 --- a/Source/3rd Party/wx/wx_base.vcproj +++ b/Source/3rd Party/wx/wx_base.vcproj @@ -41,7 +41,6 @@ PreprocessorDefinitions="_LIB;__WXMSW__;WXBUILDING;wxUSE_GUI=0;wxUSE_BASE=1" PrecompiledHeaderThrough="wx/wxprec.h" DisableSpecificWarnings="4005" - UndefinePreprocessorDefinitions="WIN32_LEAN_AND_MEAN" /> + + @@ -491,6 +496,10 @@ RelativePath="src\common\textcmn.cpp" > + + @@ -779,6 +788,10 @@ /> + + @@ -951,6 +964,10 @@ RelativePath="src\msw\statbox.cpp" > + + @@ -959,6 +976,10 @@ RelativePath="src\msw\stattext.cpp" > + + @@ -967,6 +988,10 @@ RelativePath="src\msw\tglbtn.cpp" > + + @@ -3738,11 +3763,11 @@ > diff --git a/Source/GlideHQ/GlideHQ.vcproj b/Source/GlideHQ/GlideHQ.vcproj index 14fd33857..774dcd597 100644 --- a/Source/GlideHQ/GlideHQ.vcproj +++ b/Source/GlideHQ/GlideHQ.vcproj @@ -91,7 +91,7 @@ /> diff --git a/Source/Glitch64/Glitch64.vcproj b/Source/Glitch64/Glitch64.vcproj index a7b5b14a2..ccb49320c 100644 --- a/Source/Glitch64/Glitch64.vcproj +++ b/Source/Glitch64/Glitch64.vcproj @@ -91,7 +91,7 @@ />