diff --git a/Makefile.in b/Makefile.in
index fa2b09effe..336279d83c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -3135,6 +3135,7 @@ COND_TOOLKIT_MSW_GUI_HDR = \
wx/msw/toplevel.h \
wx/msw/treectrl.h \
wx/msw/window.h \
+ wx/msw/rt/utils.h \
wx/msw/checklst.h \
wx/msw/fdrepdlg.h \
wx/msw/fontdlg.h \
@@ -3373,13 +3374,11 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION__ADVANCED_PLATFORM_HDR = \
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_@ADVANCED_PLATFORM_HDR = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION__ADVANCED_PLATFORM_HDR)
COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_ADVANCED_PLATFORM_HDR = \
$(ADVANCED_GTK_PLATFORM_HDR) \
- wx/gtk/notifmsg.h \
wx/gtk/taskbar.h \
wx/generic/activityindicator.h
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@ADVANCED_PLATFORM_HDR = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_ADVANCED_PLATFORM_HDR)
COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_ADVANCED_PLATFORM_HDR = \
$(ADVANCED_GTK_PLATFORM_HDR) \
- wx/gtk/notifmsg.h \
wx/gtk/taskbar.h \
wx/generic/activityindicator.h
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3@ADVANCED_PLATFORM_HDR = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_ADVANCED_PLATFORM_HDR)
@@ -3390,9 +3389,8 @@ COND_TOOLKIT_MOTIF_ADVANCED_PLATFORM_HDR = \
wx/generic/animate.h \
wx/generic/animateanimate.h
@COND_TOOLKIT_MOTIF@ADVANCED_PLATFORM_HDR = $(COND_TOOLKIT_MOTIF_ADVANCED_PLATFORM_HDR)
-@COND_TOOLKIT_MSW@ADVANCED_PLATFORM_HDR = \
-@COND_TOOLKIT_MSW@ wx/msw/notifmsg.h wx/msw/sound.h wx/msw/taskbar.h \
-@COND_TOOLKIT_MSW@ wx/msw/joystick.h
+@COND_TOOLKIT_MSW@ADVANCED_PLATFORM_HDR = wx/msw/sound.h \
+@COND_TOOLKIT_MSW@ wx/msw/taskbar.h wx/msw/joystick.h
COND_TOOLKIT_OSX_COCOA_ADVANCED_PLATFORM_HDR = \
wx/generic/animate.h \
wx/osx/activityindicator.h \
@@ -4921,6 +4919,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS = \
monodll_uxtheme.o \
monodll_msw_window.o \
monodll_graphicsd2d.o \
+ monodll_utilsrt.o \
monodll_helpchm.o \
monodll_helpwin.o \
monodll_automtn.o \
@@ -5623,6 +5622,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_1 = \
monodll_uxtheme.o \
monodll_msw_window.o \
monodll_graphicsd2d.o \
+ monodll_utilsrt.o \
monodll_helpchm.o \
monodll_helpwin.o \
monodll_automtn.o \
@@ -5795,6 +5795,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS = \
monodll_treelist.o \
monodll_wizard.o \
monodll_addremovectrl.o \
+ monodll_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS) \
$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS)
@COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS)
@@ -5833,6 +5834,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS = \
monodll_treelist.o \
monodll_wizard.o \
monodll_addremovectrl.o \
+ monodll_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_1) \
$(__ADVANCED_UNIV_SRC_OBJECTS)
@COND_WXUNIV_1@__ADVANCED_SRC_OBJECTS = $(COND_WXUNIV_1___ADVANCED_SRC_OBJECTS)
@@ -5879,6 +5881,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS = \
monodll_richtooltip.o \
monodll_msw_sound.o \
monodll_msw_taskbar.o \
+ monodll_notifmsgrt.o \
monodll_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS = \
@@ -5896,7 +5899,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS = \
monodll_cocoa_datetimectrl.o \
monodll_osx_cocoa_taskbar.o \
monodll_hidjoystick.o \
- monodll_cocoa_activityindicator.o
+ monodll_cocoa_activityindicator.o \
+ monodll_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS \
@COND_TOOLKIT_OSX_IPHONE@ = monodll_animateg.o monodll_sound_osx.o \
@@ -5993,6 +5997,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_1 = \
monodll_richtooltip.o \
monodll_msw_sound.o \
monodll_msw_taskbar.o \
+ monodll_notifmsgrt.o \
monodll_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_1 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_1)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_1 = \
@@ -6010,7 +6015,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_1 = \
monodll_cocoa_datetimectrl.o \
monodll_osx_cocoa_taskbar.o \
monodll_hidjoystick.o \
- monodll_cocoa_activityindicator.o
+ monodll_cocoa_activityindicator.o \
+ monodll_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_1 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_1)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_1 \
@COND_TOOLKIT_OSX_IPHONE@ = monodll_animateg.o monodll_sound_osx.o \
@@ -6918,6 +6924,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_2 = \
monolib_uxtheme.o \
monolib_msw_window.o \
monolib_graphicsd2d.o \
+ monolib_utilsrt.o \
monolib_helpchm.o \
monolib_helpwin.o \
monolib_automtn.o \
@@ -7620,6 +7627,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_3 = \
monolib_uxtheme.o \
monolib_msw_window.o \
monolib_graphicsd2d.o \
+ monolib_utilsrt.o \
monolib_helpchm.o \
monolib_helpwin.o \
monolib_automtn.o \
@@ -7792,6 +7800,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 = \
monolib_treelist.o \
monolib_wizard.o \
monolib_addremovectrl.o \
+ monolib_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_2) \
$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_1)
@COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS_1 = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1)
@@ -7830,6 +7839,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1 = \
monolib_treelist.o \
monolib_wizard.o \
monolib_addremovectrl.o \
+ monolib_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_3) \
$(__ADVANCED_UNIV_SRC_OBJECTS_1)
@COND_WXUNIV_1@__ADVANCED_SRC_OBJECTS_1 = $(COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1)
@@ -7876,6 +7886,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
monolib_richtooltip.o \
monolib_msw_sound.o \
monolib_msw_taskbar.o \
+ monolib_notifmsgrt.o \
monolib_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_2)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
@@ -7893,7 +7904,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
monolib_cocoa_datetimectrl.o \
monolib_osx_cocoa_taskbar.o \
monolib_hidjoystick.o \
- monolib_cocoa_activityindicator.o
+ monolib_cocoa_activityindicator.o \
+ monolib_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_2)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_2 \
@COND_TOOLKIT_OSX_IPHONE@ = monolib_animateg.o monolib_sound_osx.o \
@@ -7990,6 +8002,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
monolib_richtooltip.o \
monolib_msw_sound.o \
monolib_msw_taskbar.o \
+ monolib_notifmsgrt.o \
monolib_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_3)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
@@ -8007,7 +8020,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
monolib_cocoa_datetimectrl.o \
monolib_osx_cocoa_taskbar.o \
monolib_hidjoystick.o \
- monolib_cocoa_activityindicator.o
+ monolib_cocoa_activityindicator.o \
+ monolib_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_3)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_3 \
@COND_TOOLKIT_OSX_IPHONE@ = monolib_animateg.o monolib_sound_osx.o \
@@ -9058,6 +9072,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_4 = \
coredll_uxtheme.o \
coredll_msw_window.o \
coredll_graphicsd2d.o \
+ coredll_utilsrt.o \
coredll_helpchm.o \
coredll_helpwin.o \
coredll_automtn.o \
@@ -9760,6 +9775,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_5 = \
coredll_uxtheme.o \
coredll_msw_window.o \
coredll_graphicsd2d.o \
+ coredll_utilsrt.o \
coredll_helpchm.o \
coredll_helpwin.o \
coredll_automtn.o \
@@ -10523,6 +10539,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_6 = \
corelib_uxtheme.o \
corelib_msw_window.o \
corelib_graphicsd2d.o \
+ corelib_utilsrt.o \
corelib_helpchm.o \
corelib_helpwin.o \
corelib_automtn.o \
@@ -11225,6 +11242,7 @@ COND_TOOLKIT_MSW___LOWLEVEL_SRC_OBJECTS_7 = \
corelib_uxtheme.o \
corelib_msw_window.o \
corelib_graphicsd2d.o \
+ corelib_utilsrt.o \
corelib_helpchm.o \
corelib_helpwin.o \
corelib_automtn.o \
@@ -11466,6 +11484,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 = \
advdll_treelist.o \
advdll_wizard.o \
advdll_addremovectrl.o \
+ advdll_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_4) \
$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_2)
@COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS_2 = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2)
@@ -11504,6 +11523,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2 = \
advdll_treelist.o \
advdll_wizard.o \
advdll_addremovectrl.o \
+ advdll_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_5) \
$(__ADVANCED_UNIV_SRC_OBJECTS_2)
@COND_WXUNIV_1@__ADVANCED_SRC_OBJECTS_2 = $(COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2)
@@ -11550,6 +11570,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_4 = \
advdll_richtooltip.o \
advdll_msw_sound.o \
advdll_msw_taskbar.o \
+ advdll_notifmsgrt.o \
advdll_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_4 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_4)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_4 = \
@@ -11567,7 +11588,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_4 = \
advdll_cocoa_datetimectrl.o \
advdll_osx_cocoa_taskbar.o \
advdll_hidjoystick.o \
- advdll_cocoa_activityindicator.o
+ advdll_cocoa_activityindicator.o \
+ advdll_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_4 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_4)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_4 \
@COND_TOOLKIT_OSX_IPHONE@ = advdll_animateg.o advdll_sound_osx.o \
@@ -11664,6 +11686,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_5 = \
advdll_richtooltip.o \
advdll_msw_sound.o \
advdll_msw_taskbar.o \
+ advdll_notifmsgrt.o \
advdll_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_5 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_5)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_5 = \
@@ -11681,7 +11704,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_5 = \
advdll_cocoa_datetimectrl.o \
advdll_osx_cocoa_taskbar.o \
advdll_hidjoystick.o \
- advdll_cocoa_activityindicator.o
+ advdll_cocoa_activityindicator.o \
+ advdll_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_5 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_5)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_5 \
@COND_TOOLKIT_OSX_IPHONE@ = advdll_animateg.o advdll_sound_osx.o \
@@ -11758,6 +11782,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 = \
advlib_treelist.o \
advlib_wizard.o \
advlib_addremovectrl.o \
+ advlib_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_6) \
$(__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_3)
@COND_WXUNIV_0@__ADVANCED_SRC_OBJECTS_3 = $(COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3)
@@ -11796,6 +11821,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3 = \
advlib_treelist.o \
advlib_wizard.o \
advlib_addremovectrl.o \
+ advlib_notifmsgcmn.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_7) \
$(__ADVANCED_UNIV_SRC_OBJECTS_3)
@COND_WXUNIV_1@__ADVANCED_SRC_OBJECTS_3 = $(COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3)
@@ -11842,6 +11868,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_6 = \
advlib_richtooltip.o \
advlib_msw_sound.o \
advlib_msw_taskbar.o \
+ advlib_notifmsgrt.o \
advlib_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_6 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_6)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_6 = \
@@ -11859,7 +11886,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_6 = \
advlib_cocoa_datetimectrl.o \
advlib_osx_cocoa_taskbar.o \
advlib_hidjoystick.o \
- advlib_cocoa_activityindicator.o
+ advlib_cocoa_activityindicator.o \
+ advlib_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_6 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_6)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_6 \
@COND_TOOLKIT_OSX_IPHONE@ = advlib_animateg.o advlib_sound_osx.o \
@@ -11956,6 +11984,7 @@ COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_7 = \
advlib_richtooltip.o \
advlib_msw_sound.o \
advlib_msw_taskbar.o \
+ advlib_notifmsgrt.o \
advlib_msw_joystick.o
@COND_TOOLKIT_MSW@__ADVANCED_PLATFORM_SRC_OBJECTS_7 = $(COND_TOOLKIT_MSW___ADVANCED_PLATFORM_SRC_OBJECTS_7)
COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_7 = \
@@ -11973,7 +12002,8 @@ COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_7 = \
advlib_cocoa_datetimectrl.o \
advlib_osx_cocoa_taskbar.o \
advlib_hidjoystick.o \
- advlib_cocoa_activityindicator.o
+ advlib_cocoa_activityindicator.o \
+ advlib_cocoa_notifmsg.o
@COND_TOOLKIT_OSX_COCOA@__ADVANCED_PLATFORM_SRC_OBJECTS_7 = $(COND_TOOLKIT_OSX_COCOA___ADVANCED_PLATFORM_SRC_OBJECTS_7)
@COND_TOOLKIT_OSX_IPHONE@__ADVANCED_PLATFORM_SRC_OBJECTS_7 \
@COND_TOOLKIT_OSX_IPHONE@ = advlib_animateg.o advlib_sound_osx.o \
@@ -17982,6 +18012,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_graphicsd2d.o: $(srcdir)/src/msw/graphicsd2d.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/graphicsd2d.cpp
+@COND_TOOLKIT_MSW_USE_GUI_1@monodll_utilsrt.o: $(srcdir)/src/msw/rt/utilsrt.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/rt/utilsrt.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_helpchm.o: $(srcdir)/src/msw/helpchm.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/helpchm.cpp
@@ -19953,6 +19986,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@monodll_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/addremovectrl.cpp
+@COND_USE_GUI_1@monodll_notifmsgcmn.o: $(srcdir)/src/common/notifmsgcmn.cpp $(MONODLL_ODEP)
+@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/notifmsgcmn.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
@@ -20013,6 +20049,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_msw_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/taskbar.cpp
+@COND_TOOLKIT_MSW_USE_GUI_1@monodll_notifmsgrt.o: $(srcdir)/src/msw/rt/notifmsgrt.cpp $(MONODLL_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/rt/notifmsgrt.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_msw_joystick.o: $(srcdir)/src/msw/joystick.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/joystick.cpp
@@ -20097,6 +20136,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@monodll_cocoa_activityindicator.o: $(srcdir)/src/osx/cocoa/activityindicator.mm $(MONODLL_ODEP)
@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/activityindicator.mm
+@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@monodll_cocoa_notifmsg.o: $(srcdir)/src/osx/cocoa/notifmsg.mm $(MONODLL_ODEP)
+@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/notifmsg.mm
+
@COND_TOOLKIT_COCOA_USE_GUI_1@monodll_src_cocoa_taskbar.o: $(srcdir)/src/cocoa/taskbar.mm $(MONODLL_ODEP)
@COND_TOOLKIT_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_OBJCXXFLAGS) $(srcdir)/src/cocoa/taskbar.mm
@@ -22788,6 +22830,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_graphicsd2d.o: $(srcdir)/src/msw/graphicsd2d.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/graphicsd2d.cpp
+@COND_TOOLKIT_MSW_USE_GUI_1@monolib_utilsrt.o: $(srcdir)/src/msw/rt/utilsrt.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/rt/utilsrt.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_helpchm.o: $(srcdir)/src/msw/helpchm.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/helpchm.cpp
@@ -24759,6 +24804,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@monolib_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/addremovectrl.cpp
+@COND_USE_GUI_1@monolib_notifmsgcmn.o: $(srcdir)/src/common/notifmsgcmn.cpp $(MONOLIB_ODEP)
+@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/notifmsgcmn.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
@@ -24819,6 +24867,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_msw_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/taskbar.cpp
+@COND_TOOLKIT_MSW_USE_GUI_1@monolib_notifmsgrt.o: $(srcdir)/src/msw/rt/notifmsgrt.cpp $(MONOLIB_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/rt/notifmsgrt.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_msw_joystick.o: $(srcdir)/src/msw/joystick.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/joystick.cpp
@@ -24903,6 +24954,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@monolib_cocoa_activityindicator.o: $(srcdir)/src/osx/cocoa/activityindicator.mm $(MONOLIB_ODEP)
@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/activityindicator.mm
+@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@monolib_cocoa_notifmsg.o: $(srcdir)/src/osx/cocoa/notifmsg.mm $(MONOLIB_ODEP)
+@COND_TOOLKIT_OSX_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/notifmsg.mm
+
@COND_TOOLKIT_COCOA_USE_GUI_1@monolib_src_cocoa_taskbar.o: $(srcdir)/src/cocoa/taskbar.mm $(MONOLIB_ODEP)
@COND_TOOLKIT_COCOA_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_OBJCXXFLAGS) $(srcdir)/src/cocoa/taskbar.mm
@@ -27651,6 +27705,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@coredll_graphicsd2d.o: $(srcdir)/src/msw/graphicsd2d.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/graphicsd2d.cpp
+@COND_TOOLKIT_MSW_USE_GUI_1@coredll_utilsrt.o: $(srcdir)/src/msw/rt/utilsrt.cpp $(COREDLL_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/rt/utilsrt.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@coredll_helpchm.o: $(srcdir)/src/msw/helpchm.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/helpchm.cpp
@@ -31035,6 +31092,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@corelib_graphicsd2d.o: $(srcdir)/src/msw/graphicsd2d.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/graphicsd2d.cpp
+@COND_TOOLKIT_MSW_USE_GUI_1@corelib_utilsrt.o: $(srcdir)/src/msw/rt/utilsrt.cpp $(CORELIB_ODEP)
+@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/rt/utilsrt.cpp
+
@COND_TOOLKIT_MSW_USE_GUI_1@corelib_helpchm.o: $(srcdir)/src/msw/helpchm.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/helpchm.cpp
@@ -33030,6 +33090,9 @@ advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
advdll_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(ADVDLL_ODEP)
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/addremovectrl.cpp
+advdll_notifmsgcmn.o: $(srcdir)/src/common/notifmsgcmn.cpp $(ADVDLL_ODEP)
+ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/notifmsgcmn.cpp
+
@COND_TOOLKIT_MSW@advdll_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(ADVDLL_ODEP)
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
@@ -33090,6 +33153,9 @@ advdll_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(ADVDLL_ODEP)
@COND_TOOLKIT_MSW@advdll_msw_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(ADVDLL_ODEP)
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/taskbar.cpp
+@COND_TOOLKIT_MSW@advdll_notifmsgrt.o: $(srcdir)/src/msw/rt/notifmsgrt.cpp $(ADVDLL_ODEP)
+@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/rt/notifmsgrt.cpp
+
@COND_TOOLKIT_MSW@advdll_msw_joystick.o: $(srcdir)/src/msw/joystick.cpp $(ADVDLL_ODEP)
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/msw/joystick.cpp
@@ -33174,6 +33240,9 @@ advdll_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(ADVDLL_ODEP)
@COND_TOOLKIT_OSX_COCOA@advdll_cocoa_activityindicator.o: $(srcdir)/src/osx/cocoa/activityindicator.mm $(ADVDLL_ODEP)
@COND_TOOLKIT_OSX_COCOA@ $(CXXC) -c -o $@ $(ADVDLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/activityindicator.mm
+@COND_TOOLKIT_OSX_COCOA@advdll_cocoa_notifmsg.o: $(srcdir)/src/osx/cocoa/notifmsg.mm $(ADVDLL_ODEP)
+@COND_TOOLKIT_OSX_COCOA@ $(CXXC) -c -o $@ $(ADVDLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/notifmsg.mm
+
@COND_TOOLKIT_COCOA@advdll_src_cocoa_taskbar.o: $(srcdir)/src/cocoa/taskbar.mm $(ADVDLL_ODEP)
@COND_TOOLKIT_COCOA@ $(CXXC) -c -o $@ $(ADVDLL_OBJCXXFLAGS) $(srcdir)/src/cocoa/taskbar.mm
@@ -33471,6 +33540,9 @@ advlib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVLIB_ODEP)
advlib_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(ADVLIB_ODEP)
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/addremovectrl.cpp
+advlib_notifmsgcmn.o: $(srcdir)/src/common/notifmsgcmn.cpp $(ADVLIB_ODEP)
+ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/notifmsgcmn.cpp
+
@COND_TOOLKIT_MSW@advlib_taskbarcmn.o: $(srcdir)/src/common/taskbarcmn.cpp $(ADVLIB_ODEP)
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/common/taskbarcmn.cpp
@@ -33531,6 +33603,9 @@ advlib_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(ADVLIB_ODEP)
@COND_TOOLKIT_MSW@advlib_msw_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(ADVLIB_ODEP)
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/taskbar.cpp
+@COND_TOOLKIT_MSW@advlib_notifmsgrt.o: $(srcdir)/src/msw/rt/notifmsgrt.cpp $(ADVLIB_ODEP)
+@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/rt/notifmsgrt.cpp
+
@COND_TOOLKIT_MSW@advlib_msw_joystick.o: $(srcdir)/src/msw/joystick.cpp $(ADVLIB_ODEP)
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/msw/joystick.cpp
@@ -33615,6 +33690,9 @@ advlib_addremovectrl.o: $(srcdir)/src/common/addremovectrl.cpp $(ADVLIB_ODEP)
@COND_TOOLKIT_OSX_COCOA@advlib_cocoa_activityindicator.o: $(srcdir)/src/osx/cocoa/activityindicator.mm $(ADVLIB_ODEP)
@COND_TOOLKIT_OSX_COCOA@ $(CXXC) -c -o $@ $(ADVLIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/activityindicator.mm
+@COND_TOOLKIT_OSX_COCOA@advlib_cocoa_notifmsg.o: $(srcdir)/src/osx/cocoa/notifmsg.mm $(ADVLIB_ODEP)
+@COND_TOOLKIT_OSX_COCOA@ $(CXXC) -c -o $@ $(ADVLIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/notifmsg.mm
+
@COND_TOOLKIT_COCOA@advlib_src_cocoa_taskbar.o: $(srcdir)/src/cocoa/taskbar.mm $(ADVLIB_ODEP)
@COND_TOOLKIT_COCOA@ $(CXXC) -c -o $@ $(ADVLIB_OBJCXXFLAGS) $(srcdir)/src/cocoa/taskbar.mm
diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl
index 2dc17a155d..6d7516b21c 100644
--- a/build/bakefiles/files.bkl
+++ b/build/bakefiles/files.bkl
@@ -1896,6 +1896,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/msw/uxtheme.cpp
src/msw/window.cpp
src/msw/graphicsd2d.cpp
+ src/msw/rt/utilsrt.cpp
wx/msw/nonownedwnd.h
@@ -2076,6 +2077,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
wx/msw/toplevel.h
wx/msw/treectrl.h
wx/msw/window.h
+ wx/msw/rt/utils.h
@@ -2664,6 +2666,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/generic/treelist.cpp
src/generic/wizard.cpp
src/common/addremovectrl.cpp
+ src/common/notifmsgcmn.cpp
@@ -2727,9 +2730,9 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/msw/richtooltip.cpp
src/msw/sound.cpp
src/msw/taskbar.cpp
+ src/msw/rt/notifmsgrt.cpp
- wx/msw/notifmsg.h
wx/msw/sound.h
wx/msw/taskbar.h
@@ -2783,6 +2786,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/osx/cocoa/taskbar.mm
src/osx/core/hidjoystick.cpp
src/osx/cocoa/activityindicator.mm
+ src/osx/cocoa/notifmsg.mm
@@ -2880,7 +2884,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
$(ADVANCED_GTK_PLATFORM_HDR)
- wx/gtk/notifmsg.h
wx/gtk/taskbar.h
wx/generic/activityindicator.h
diff --git a/build/files b/build/files
index bb330ce31b..800fae5604 100644
--- a/build/files
+++ b/build/files
@@ -1551,6 +1551,7 @@ MSW_LOWLEVEL_SRC =
src/msw/printwin.cpp
src/msw/region.cpp
src/msw/renderer.cpp
+ src/msw/rt/utilsrt.cpp
src/msw/settings.cpp
src/msw/textmeasure.cpp
src/msw/tooltip.cpp
@@ -1717,6 +1718,7 @@ MSW_HDR =
wx/msw/region.h
wx/msw/rcdefs.h
wx/msw/richmsgdlg.h
+ wx/msw/rt/utils.h
wx/msw/scrolbar.h
wx/msw/slider.h
wx/msw/spinbutt.h
@@ -2254,6 +2256,7 @@ ADVANCED_CMN_SRC =
src/common/datavcmn.cpp
src/common/gridcmn.cpp
src/common/hyperlnkcmn.cpp
+ src/common/notifmsgcmn.cpp
src/common/odcombocmn.cpp
src/common/richtooltipcmn.cpp
src/generic/aboutdlgg.cpp
@@ -2339,11 +2342,11 @@ ADVANCED_MSW_SRC =
src/common/taskbarcmn.cpp
src/msw/aboutdlg.cpp
src/msw/notifmsg.cpp
+ src/msw/rt/notifmsgrt.cpp
src/msw/richtooltip.cpp
src/msw/sound.cpp
src/msw/taskbar.cpp
ADVANCED_MSW_HDR =
- wx/msw/notifmsg.h
wx/msw/sound.h
wx/msw/taskbar.h
@@ -2390,6 +2393,7 @@ ADVANCED_OSX_COCOA_SRC =
src/osx/dataview_osx.cpp
src/osx/cocoa/dataview.mm
src/osx/cocoa/datetimectrl.mm
+ src/osx/cocoa/notifmsg.mm
src/osx/cocoa/taskbar.mm
src/osx/core/hidjoystick.cpp
@@ -2465,7 +2469,6 @@ ADVANCED_GTK2_SRC =
ADVANCED_GTK_HDR =
$(ADVANCED_GTK_PLATFORM_HDR)
wx/generic/activityindicator.h
- wx/gtk/notifmsg.h
wx/gtk/taskbar.h
ADVANCED_GTK2_HDR =
$(ADVANCED_GTK_HDR)
diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc
index 0aa60bc73b..7d1006dd90 100644
--- a/build/msw/makefile.bcc
+++ b/build/msw/makefile.bcc
@@ -1827,6 +1827,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_uxtheme.obj \
$(OBJS)\monodll_window.obj \
$(OBJS)\monodll_graphicsd2d.obj \
+ $(OBJS)\monodll_utilsrt.obj \
$(OBJS)\monodll_helpchm.obj \
$(OBJS)\monodll_helpwin.obj \
$(OBJS)\monodll_automtn.obj \
@@ -2113,6 +2114,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_uxtheme.obj \
$(OBJS)\monodll_window.obj \
$(OBJS)\monodll_graphicsd2d.obj \
+ $(OBJS)\monodll_utilsrt.obj \
$(OBJS)\monodll_helpchm.obj \
$(OBJS)\monodll_helpwin.obj \
$(OBJS)\monodll_automtn.obj \
@@ -2374,12 +2376,14 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_treelist.obj \
$(OBJS)\monodll_wizard.obj \
$(OBJS)\monodll_addremovectrl.obj \
+ $(OBJS)\monodll_notifmsgcmn.obj \
$(OBJS)\monodll_taskbarcmn.obj \
$(OBJS)\monodll_aboutdlg.obj \
$(OBJS)\monodll_notifmsg.obj \
$(OBJS)\monodll_richtooltip.obj \
$(OBJS)\monodll_sound.obj \
$(OBJS)\monodll_taskbar.obj \
+ $(OBJS)\monodll_notifmsgrt.obj \
$(OBJS)\monodll_joystick.obj \
$(OBJS)\monodll_animateg.obj \
$(OBJS)\monodll_bmpcbox.obj \
@@ -2428,12 +2432,14 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_treelist.obj \
$(OBJS)\monodll_wizard.obj \
$(OBJS)\monodll_addremovectrl.obj \
+ $(OBJS)\monodll_notifmsgcmn.obj \
$(OBJS)\monodll_taskbarcmn.obj \
$(OBJS)\monodll_aboutdlg.obj \
$(OBJS)\monodll_notifmsg.obj \
$(OBJS)\monodll_richtooltip.obj \
$(OBJS)\monodll_sound.obj \
$(OBJS)\monodll_taskbar.obj \
+ $(OBJS)\monodll_notifmsgrt.obj \
$(OBJS)\monodll_joystick.obj \
$(OBJS)\monodll_animateg.obj
!endif
@@ -2650,6 +2656,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_uxtheme.obj \
$(OBJS)\monolib_window.obj \
$(OBJS)\monolib_graphicsd2d.obj \
+ $(OBJS)\monolib_utilsrt.obj \
$(OBJS)\monolib_helpchm.obj \
$(OBJS)\monolib_helpwin.obj \
$(OBJS)\monolib_automtn.obj \
@@ -2936,6 +2943,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_uxtheme.obj \
$(OBJS)\monolib_window.obj \
$(OBJS)\monolib_graphicsd2d.obj \
+ $(OBJS)\monolib_utilsrt.obj \
$(OBJS)\monolib_helpchm.obj \
$(OBJS)\monolib_helpwin.obj \
$(OBJS)\monolib_automtn.obj \
@@ -3197,12 +3205,14 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_treelist.obj \
$(OBJS)\monolib_wizard.obj \
$(OBJS)\monolib_addremovectrl.obj \
+ $(OBJS)\monolib_notifmsgcmn.obj \
$(OBJS)\monolib_taskbarcmn.obj \
$(OBJS)\monolib_aboutdlg.obj \
$(OBJS)\monolib_notifmsg.obj \
$(OBJS)\monolib_richtooltip.obj \
$(OBJS)\monolib_sound.obj \
$(OBJS)\monolib_taskbar.obj \
+ $(OBJS)\monolib_notifmsgrt.obj \
$(OBJS)\monolib_joystick.obj \
$(OBJS)\monolib_animateg.obj \
$(OBJS)\monolib_bmpcbox.obj \
@@ -3251,12 +3261,14 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_treelist.obj \
$(OBJS)\monolib_wizard.obj \
$(OBJS)\monolib_addremovectrl.obj \
+ $(OBJS)\monolib_notifmsgcmn.obj \
$(OBJS)\monolib_taskbarcmn.obj \
$(OBJS)\monolib_aboutdlg.obj \
$(OBJS)\monolib_notifmsg.obj \
$(OBJS)\monolib_richtooltip.obj \
$(OBJS)\monolib_sound.obj \
$(OBJS)\monolib_taskbar.obj \
+ $(OBJS)\monolib_notifmsgrt.obj \
$(OBJS)\monolib_joystick.obj \
$(OBJS)\monolib_animateg.obj
!endif
@@ -3345,6 +3357,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_uxtheme.obj \
$(OBJS)\coredll_window.obj \
$(OBJS)\coredll_graphicsd2d.obj \
+ $(OBJS)\coredll_utilsrt.obj \
$(OBJS)\coredll_helpchm.obj \
$(OBJS)\coredll_helpwin.obj \
$(OBJS)\coredll_automtn.obj \
@@ -3631,6 +3644,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_uxtheme.obj \
$(OBJS)\coredll_window.obj \
$(OBJS)\coredll_graphicsd2d.obj \
+ $(OBJS)\coredll_utilsrt.obj \
$(OBJS)\coredll_helpchm.obj \
$(OBJS)\coredll_helpwin.obj \
$(OBJS)\coredll_automtn.obj \
@@ -3913,6 +3927,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_uxtheme.obj \
$(OBJS)\corelib_window.obj \
$(OBJS)\corelib_graphicsd2d.obj \
+ $(OBJS)\corelib_utilsrt.obj \
$(OBJS)\corelib_helpchm.obj \
$(OBJS)\corelib_helpwin.obj \
$(OBJS)\corelib_automtn.obj \
@@ -4199,6 +4214,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_uxtheme.obj \
$(OBJS)\corelib_window.obj \
$(OBJS)\corelib_graphicsd2d.obj \
+ $(OBJS)\corelib_utilsrt.obj \
$(OBJS)\corelib_helpchm.obj \
$(OBJS)\corelib_helpwin.obj \
$(OBJS)\corelib_automtn.obj \
@@ -4470,12 +4486,14 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\advdll_treelist.obj \
$(OBJS)\advdll_wizard.obj \
$(OBJS)\advdll_addremovectrl.obj \
+ $(OBJS)\advdll_notifmsgcmn.obj \
$(OBJS)\advdll_taskbarcmn.obj \
$(OBJS)\advdll_aboutdlg.obj \
$(OBJS)\advdll_notifmsg.obj \
$(OBJS)\advdll_richtooltip.obj \
$(OBJS)\advdll_sound.obj \
$(OBJS)\advdll_taskbar.obj \
+ $(OBJS)\advdll_notifmsgrt.obj \
$(OBJS)\advdll_joystick.obj \
$(OBJS)\advdll_animateg.obj \
$(OBJS)\advdll_bmpcbox.obj \
@@ -4524,12 +4542,14 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\advdll_treelist.obj \
$(OBJS)\advdll_wizard.obj \
$(OBJS)\advdll_addremovectrl.obj \
+ $(OBJS)\advdll_notifmsgcmn.obj \
$(OBJS)\advdll_taskbarcmn.obj \
$(OBJS)\advdll_aboutdlg.obj \
$(OBJS)\advdll_notifmsg.obj \
$(OBJS)\advdll_richtooltip.obj \
$(OBJS)\advdll_sound.obj \
$(OBJS)\advdll_taskbar.obj \
+ $(OBJS)\advdll_notifmsgrt.obj \
$(OBJS)\advdll_joystick.obj \
$(OBJS)\advdll_animateg.obj
!endif
@@ -4573,12 +4593,14 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\advlib_treelist.obj \
$(OBJS)\advlib_wizard.obj \
$(OBJS)\advlib_addremovectrl.obj \
+ $(OBJS)\advlib_notifmsgcmn.obj \
$(OBJS)\advlib_taskbarcmn.obj \
$(OBJS)\advlib_aboutdlg.obj \
$(OBJS)\advlib_notifmsg.obj \
$(OBJS)\advlib_richtooltip.obj \
$(OBJS)\advlib_sound.obj \
$(OBJS)\advlib_taskbar.obj \
+ $(OBJS)\advlib_notifmsgrt.obj \
$(OBJS)\advlib_joystick.obj \
$(OBJS)\advlib_animateg.obj \
$(OBJS)\advlib_bmpcbox.obj \
@@ -4627,12 +4649,14 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\advlib_treelist.obj \
$(OBJS)\advlib_wizard.obj \
$(OBJS)\advlib_addremovectrl.obj \
+ $(OBJS)\advlib_notifmsgcmn.obj \
$(OBJS)\advlib_taskbarcmn.obj \
$(OBJS)\advlib_aboutdlg.obj \
$(OBJS)\advlib_notifmsg.obj \
$(OBJS)\advlib_richtooltip.obj \
$(OBJS)\advlib_sound.obj \
$(OBJS)\advlib_taskbar.obj \
+ $(OBJS)\advlib_notifmsgrt.obj \
$(OBJS)\advlib_joystick.obj \
$(OBJS)\advlib_animateg.obj
!endif
@@ -7763,6 +7787,11 @@ $(OBJS)\monodll_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -8808,6 +8837,11 @@ $(OBJS)\monodll_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -8838,6 +8872,11 @@ $(OBJS)\monodll_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\taskbar.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\joystick.cpp
@@ -10276,6 +10315,11 @@ $(OBJS)\monolib_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -11321,6 +11365,11 @@ $(OBJS)\monolib_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -11351,6 +11400,11 @@ $(OBJS)\monolib_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\taskbar.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\joystick.cpp
@@ -12720,6 +12774,11 @@ $(OBJS)\coredll_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\coredll_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -14189,6 +14248,11 @@ $(OBJS)\corelib_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\corelib_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -15199,6 +15263,9 @@ $(OBJS)\advdll_wizard.obj: ..\..\src\generic\wizard.cpp
$(OBJS)\advdll_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
+$(OBJS)\advdll_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+
$(OBJS)\advdll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -15217,6 +15284,9 @@ $(OBJS)\advdll_sound.obj: ..\..\src\msw\sound.cpp
$(OBJS)\advdll_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\taskbar.cpp
+$(OBJS)\advdll_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+
$(OBJS)\advdll_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) -q -c -P -o$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\joystick.cpp
@@ -15355,6 +15425,9 @@ $(OBJS)\advlib_wizard.obj: ..\..\src\generic\wizard.cpp
$(OBJS)\advlib_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
+$(OBJS)\advlib_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+
$(OBJS)\advlib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -15373,6 +15446,9 @@ $(OBJS)\advlib_sound.obj: ..\..\src\msw\sound.cpp
$(OBJS)\advlib_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\taskbar.cpp
+$(OBJS)\advlib_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+
$(OBJS)\advlib_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) -q -c -P -o$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\joystick.cpp
diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc
index fee1481005..d2f0052f62 100644
--- a/build/msw/makefile.gcc
+++ b/build/msw/makefile.gcc
@@ -1846,6 +1846,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_uxtheme.o \
$(OBJS)\monodll_window.o \
$(OBJS)\monodll_graphicsd2d.o \
+ $(OBJS)\monodll_utilsrt.o \
$(OBJS)\monodll_helpchm.o \
$(OBJS)\monodll_helpwin.o \
$(OBJS)\monodll_automtn.o \
@@ -2134,6 +2135,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_uxtheme.o \
$(OBJS)\monodll_window.o \
$(OBJS)\monodll_graphicsd2d.o \
+ $(OBJS)\monodll_utilsrt.o \
$(OBJS)\monodll_helpchm.o \
$(OBJS)\monodll_helpwin.o \
$(OBJS)\monodll_automtn.o \
@@ -2396,12 +2398,14 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_treelist.o \
$(OBJS)\monodll_wizard.o \
$(OBJS)\monodll_addremovectrl.o \
+ $(OBJS)\monodll_notifmsgcmn.o \
$(OBJS)\monodll_taskbarcmn.o \
$(OBJS)\monodll_aboutdlg.o \
$(OBJS)\monodll_notifmsg.o \
$(OBJS)\monodll_richtooltip.o \
$(OBJS)\monodll_sound.o \
$(OBJS)\monodll_taskbar.o \
+ $(OBJS)\monodll_notifmsgrt.o \
$(OBJS)\monodll_joystick.o \
$(OBJS)\monodll_animateg.o \
$(OBJS)\monodll_bmpcbox.o \
@@ -2450,12 +2454,14 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_treelist.o \
$(OBJS)\monodll_wizard.o \
$(OBJS)\monodll_addremovectrl.o \
+ $(OBJS)\monodll_notifmsgcmn.o \
$(OBJS)\monodll_taskbarcmn.o \
$(OBJS)\monodll_aboutdlg.o \
$(OBJS)\monodll_notifmsg.o \
$(OBJS)\monodll_richtooltip.o \
$(OBJS)\monodll_sound.o \
$(OBJS)\monodll_taskbar.o \
+ $(OBJS)\monodll_notifmsgrt.o \
$(OBJS)\monodll_joystick.o \
$(OBJS)\monodll_animateg.o
endif
@@ -2675,6 +2681,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_uxtheme.o \
$(OBJS)\monolib_window.o \
$(OBJS)\monolib_graphicsd2d.o \
+ $(OBJS)\monolib_utilsrt.o \
$(OBJS)\monolib_helpchm.o \
$(OBJS)\monolib_helpwin.o \
$(OBJS)\monolib_automtn.o \
@@ -2963,6 +2970,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_uxtheme.o \
$(OBJS)\monolib_window.o \
$(OBJS)\monolib_graphicsd2d.o \
+ $(OBJS)\monolib_utilsrt.o \
$(OBJS)\monolib_helpchm.o \
$(OBJS)\monolib_helpwin.o \
$(OBJS)\monolib_automtn.o \
@@ -3225,12 +3233,14 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_treelist.o \
$(OBJS)\monolib_wizard.o \
$(OBJS)\monolib_addremovectrl.o \
+ $(OBJS)\monolib_notifmsgcmn.o \
$(OBJS)\monolib_taskbarcmn.o \
$(OBJS)\monolib_aboutdlg.o \
$(OBJS)\monolib_notifmsg.o \
$(OBJS)\monolib_richtooltip.o \
$(OBJS)\monolib_sound.o \
$(OBJS)\monolib_taskbar.o \
+ $(OBJS)\monolib_notifmsgrt.o \
$(OBJS)\monolib_joystick.o \
$(OBJS)\monolib_animateg.o \
$(OBJS)\monolib_bmpcbox.o \
@@ -3279,12 +3289,14 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_treelist.o \
$(OBJS)\monolib_wizard.o \
$(OBJS)\monolib_addremovectrl.o \
+ $(OBJS)\monolib_notifmsgcmn.o \
$(OBJS)\monolib_taskbarcmn.o \
$(OBJS)\monolib_aboutdlg.o \
$(OBJS)\monolib_notifmsg.o \
$(OBJS)\monolib_richtooltip.o \
$(OBJS)\monolib_sound.o \
$(OBJS)\monolib_taskbar.o \
+ $(OBJS)\monolib_notifmsgrt.o \
$(OBJS)\monolib_joystick.o \
$(OBJS)\monolib_animateg.o
endif
@@ -3386,6 +3398,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_uxtheme.o \
$(OBJS)\coredll_window.o \
$(OBJS)\coredll_graphicsd2d.o \
+ $(OBJS)\coredll_utilsrt.o \
$(OBJS)\coredll_helpchm.o \
$(OBJS)\coredll_helpwin.o \
$(OBJS)\coredll_automtn.o \
@@ -3674,6 +3687,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_uxtheme.o \
$(OBJS)\coredll_window.o \
$(OBJS)\coredll_graphicsd2d.o \
+ $(OBJS)\coredll_utilsrt.o \
$(OBJS)\coredll_helpchm.o \
$(OBJS)\coredll_helpwin.o \
$(OBJS)\coredll_automtn.o \
@@ -3962,6 +3976,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_uxtheme.o \
$(OBJS)\corelib_window.o \
$(OBJS)\corelib_graphicsd2d.o \
+ $(OBJS)\corelib_utilsrt.o \
$(OBJS)\corelib_helpchm.o \
$(OBJS)\corelib_helpwin.o \
$(OBJS)\corelib_automtn.o \
@@ -4250,6 +4265,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_uxtheme.o \
$(OBJS)\corelib_window.o \
$(OBJS)\corelib_graphicsd2d.o \
+ $(OBJS)\corelib_utilsrt.o \
$(OBJS)\corelib_helpchm.o \
$(OBJS)\corelib_helpwin.o \
$(OBJS)\corelib_automtn.o \
@@ -4526,12 +4542,14 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\advdll_treelist.o \
$(OBJS)\advdll_wizard.o \
$(OBJS)\advdll_addremovectrl.o \
+ $(OBJS)\advdll_notifmsgcmn.o \
$(OBJS)\advdll_taskbarcmn.o \
$(OBJS)\advdll_aboutdlg.o \
$(OBJS)\advdll_notifmsg.o \
$(OBJS)\advdll_richtooltip.o \
$(OBJS)\advdll_sound.o \
$(OBJS)\advdll_taskbar.o \
+ $(OBJS)\advdll_notifmsgrt.o \
$(OBJS)\advdll_joystick.o \
$(OBJS)\advdll_animateg.o \
$(OBJS)\advdll_bmpcbox.o \
@@ -4580,12 +4598,14 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\advdll_treelist.o \
$(OBJS)\advdll_wizard.o \
$(OBJS)\advdll_addremovectrl.o \
+ $(OBJS)\advdll_notifmsgcmn.o \
$(OBJS)\advdll_taskbarcmn.o \
$(OBJS)\advdll_aboutdlg.o \
$(OBJS)\advdll_notifmsg.o \
$(OBJS)\advdll_richtooltip.o \
$(OBJS)\advdll_sound.o \
$(OBJS)\advdll_taskbar.o \
+ $(OBJS)\advdll_notifmsgrt.o \
$(OBJS)\advdll_joystick.o \
$(OBJS)\advdll_animateg.o
endif
@@ -4633,12 +4653,14 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\advlib_treelist.o \
$(OBJS)\advlib_wizard.o \
$(OBJS)\advlib_addremovectrl.o \
+ $(OBJS)\advlib_notifmsgcmn.o \
$(OBJS)\advlib_taskbarcmn.o \
$(OBJS)\advlib_aboutdlg.o \
$(OBJS)\advlib_notifmsg.o \
$(OBJS)\advlib_richtooltip.o \
$(OBJS)\advlib_sound.o \
$(OBJS)\advlib_taskbar.o \
+ $(OBJS)\advlib_notifmsgrt.o \
$(OBJS)\advlib_joystick.o \
$(OBJS)\advlib_animateg.o \
$(OBJS)\advlib_bmpcbox.o \
@@ -4687,12 +4709,14 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\advlib_treelist.o \
$(OBJS)\advlib_wizard.o \
$(OBJS)\advlib_addremovectrl.o \
+ $(OBJS)\advlib_notifmsgcmn.o \
$(OBJS)\advlib_taskbarcmn.o \
$(OBJS)\advlib_aboutdlg.o \
$(OBJS)\advlib_notifmsg.o \
$(OBJS)\advlib_richtooltip.o \
$(OBJS)\advlib_sound.o \
$(OBJS)\advlib_taskbar.o \
+ $(OBJS)\advlib_notifmsgrt.o \
$(OBJS)\advlib_joystick.o \
$(OBJS)\advlib_animateg.o
endif
@@ -7938,6 +7962,11 @@ $(OBJS)\monodll_graphicsd2d.o: ../../src/msw/graphicsd2d.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_utilsrt.o: ../../src/msw/rt/utilsrt.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_helpchm.o: ../../src/msw/helpchm.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -8983,6 +9012,11 @@ $(OBJS)\monodll_addremovectrl.o: ../../src/common/addremovectrl.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_notifmsgcmn.o: ../../src/common/notifmsgcmn.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -9013,6 +9047,11 @@ $(OBJS)\monodll_taskbar.o: ../../src/msw/taskbar.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\monodll_notifmsgrt.o: ../../src/msw/rt/notifmsgrt.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_joystick.o: ../../src/msw/joystick.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $<
@@ -10451,6 +10490,11 @@ $(OBJS)\monolib_graphicsd2d.o: ../../src/msw/graphicsd2d.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_utilsrt.o: ../../src/msw/rt/utilsrt.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_helpchm.o: ../../src/msw/helpchm.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -11496,6 +11540,11 @@ $(OBJS)\monolib_addremovectrl.o: ../../src/common/addremovectrl.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_notifmsgcmn.o: ../../src/common/notifmsgcmn.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -11526,6 +11575,11 @@ $(OBJS)\monolib_taskbar.o: ../../src/msw/taskbar.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\monolib_notifmsgrt.o: ../../src/msw/rt/notifmsgrt.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_joystick.o: ../../src/msw/joystick.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -12895,6 +12949,11 @@ $(OBJS)\coredll_graphicsd2d.o: ../../src/msw/graphicsd2d.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\coredll_utilsrt.o: ../../src/msw/rt/utilsrt.cpp
+ $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_helpchm.o: ../../src/msw/helpchm.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -14364,6 +14423,11 @@ $(OBJS)\corelib_graphicsd2d.o: ../../src/msw/graphicsd2d.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
endif
+ifeq ($(USE_GUI),1)
+$(OBJS)\corelib_utilsrt.o: ../../src/msw/rt/utilsrt.cpp
+ $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
+endif
+
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_helpchm.o: ../../src/msw/helpchm.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $<
@@ -15374,6 +15438,9 @@ $(OBJS)\advdll_wizard.o: ../../src/generic/wizard.cpp
$(OBJS)\advdll_addremovectrl.o: ../../src/common/addremovectrl.cpp
$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\advdll_notifmsgcmn.o: ../../src/common/notifmsgcmn.cpp
+ $(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\advdll_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -15392,6 +15459,9 @@ $(OBJS)\advdll_sound.o: ../../src/msw/sound.cpp
$(OBJS)\advdll_taskbar.o: ../../src/msw/taskbar.cpp
$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\advdll_notifmsgrt.o: ../../src/msw/rt/notifmsgrt.cpp
+ $(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\advdll_joystick.o: ../../src/msw/joystick.cpp
$(CXX) -c -o $@ $(ADVDLL_CXXFLAGS) $(CPPDEPS) $<
@@ -15530,6 +15600,9 @@ $(OBJS)\advlib_wizard.o: ../../src/generic/wizard.cpp
$(OBJS)\advlib_addremovectrl.o: ../../src/common/addremovectrl.cpp
$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\advlib_notifmsgcmn.o: ../../src/common/notifmsgcmn.cpp
+ $(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\advlib_taskbarcmn.o: ../../src/common/taskbarcmn.cpp
$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
@@ -15548,6 +15621,9 @@ $(OBJS)\advlib_sound.o: ../../src/msw/sound.cpp
$(OBJS)\advlib_taskbar.o: ../../src/msw/taskbar.cpp
$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\advlib_notifmsgrt.o: ../../src/msw/rt/notifmsgrt.cpp
+ $(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\advlib_joystick.o: ../../src/msw/joystick.cpp
$(CXX) -c -o $@ $(ADVLIB_CXXFLAGS) $(CPPDEPS) $<
diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc
index d14b7fbbf0..5607fac77b 100644
--- a/build/msw/makefile.vc
+++ b/build/msw/makefile.vc
@@ -2127,6 +2127,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_uxtheme.obj \
$(OBJS)\monodll_window.obj \
$(OBJS)\monodll_graphicsd2d.obj \
+ $(OBJS)\monodll_utilsrt.obj \
$(OBJS)\monodll_helpchm.obj \
$(OBJS)\monodll_helpwin.obj \
$(OBJS)\monodll_automtn.obj \
@@ -2413,6 +2414,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_uxtheme.obj \
$(OBJS)\monodll_window.obj \
$(OBJS)\monodll_graphicsd2d.obj \
+ $(OBJS)\monodll_utilsrt.obj \
$(OBJS)\monodll_helpchm.obj \
$(OBJS)\monodll_helpwin.obj \
$(OBJS)\monodll_automtn.obj \
@@ -2674,12 +2676,14 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_treelist.obj \
$(OBJS)\monodll_wizard.obj \
$(OBJS)\monodll_addremovectrl.obj \
+ $(OBJS)\monodll_notifmsgcmn.obj \
$(OBJS)\monodll_taskbarcmn.obj \
$(OBJS)\monodll_aboutdlg.obj \
$(OBJS)\monodll_notifmsg.obj \
$(OBJS)\monodll_richtooltip.obj \
$(OBJS)\monodll_sound.obj \
$(OBJS)\monodll_taskbar.obj \
+ $(OBJS)\monodll_notifmsgrt.obj \
$(OBJS)\monodll_joystick.obj \
$(OBJS)\monodll_animateg.obj \
$(OBJS)\monodll_bmpcbox.obj \
@@ -2728,12 +2732,14 @@ ____ADVANCED_SRC_FILENAMES_OBJECTS = \
$(OBJS)\monodll_treelist.obj \
$(OBJS)\monodll_wizard.obj \
$(OBJS)\monodll_addremovectrl.obj \
+ $(OBJS)\monodll_notifmsgcmn.obj \
$(OBJS)\monodll_taskbarcmn.obj \
$(OBJS)\monodll_aboutdlg.obj \
$(OBJS)\monodll_notifmsg.obj \
$(OBJS)\monodll_richtooltip.obj \
$(OBJS)\monodll_sound.obj \
$(OBJS)\monodll_taskbar.obj \
+ $(OBJS)\monodll_notifmsgrt.obj \
$(OBJS)\monodll_joystick.obj \
$(OBJS)\monodll_animateg.obj
!endif
@@ -2956,6 +2962,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_uxtheme.obj \
$(OBJS)\monolib_window.obj \
$(OBJS)\monolib_graphicsd2d.obj \
+ $(OBJS)\monolib_utilsrt.obj \
$(OBJS)\monolib_helpchm.obj \
$(OBJS)\monolib_helpwin.obj \
$(OBJS)\monolib_automtn.obj \
@@ -3242,6 +3249,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_uxtheme.obj \
$(OBJS)\monolib_window.obj \
$(OBJS)\monolib_graphicsd2d.obj \
+ $(OBJS)\monolib_utilsrt.obj \
$(OBJS)\monolib_helpchm.obj \
$(OBJS)\monolib_helpwin.obj \
$(OBJS)\monolib_automtn.obj \
@@ -3503,12 +3511,14 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_treelist.obj \
$(OBJS)\monolib_wizard.obj \
$(OBJS)\monolib_addremovectrl.obj \
+ $(OBJS)\monolib_notifmsgcmn.obj \
$(OBJS)\monolib_taskbarcmn.obj \
$(OBJS)\monolib_aboutdlg.obj \
$(OBJS)\monolib_notifmsg.obj \
$(OBJS)\monolib_richtooltip.obj \
$(OBJS)\monolib_sound.obj \
$(OBJS)\monolib_taskbar.obj \
+ $(OBJS)\monolib_notifmsgrt.obj \
$(OBJS)\monolib_joystick.obj \
$(OBJS)\monolib_animateg.obj \
$(OBJS)\monolib_bmpcbox.obj \
@@ -3557,12 +3567,14 @@ ____ADVANCED_SRC_FILENAMES_1_OBJECTS = \
$(OBJS)\monolib_treelist.obj \
$(OBJS)\monolib_wizard.obj \
$(OBJS)\monolib_addremovectrl.obj \
+ $(OBJS)\monolib_notifmsgcmn.obj \
$(OBJS)\monolib_taskbarcmn.obj \
$(OBJS)\monolib_aboutdlg.obj \
$(OBJS)\monolib_notifmsg.obj \
$(OBJS)\monolib_richtooltip.obj \
$(OBJS)\monolib_sound.obj \
$(OBJS)\monolib_taskbar.obj \
+ $(OBJS)\monolib_notifmsgrt.obj \
$(OBJS)\monolib_joystick.obj \
$(OBJS)\monolib_animateg.obj
!endif
@@ -3717,6 +3729,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_uxtheme.obj \
$(OBJS)\coredll_window.obj \
$(OBJS)\coredll_graphicsd2d.obj \
+ $(OBJS)\coredll_utilsrt.obj \
$(OBJS)\coredll_helpchm.obj \
$(OBJS)\coredll_helpwin.obj \
$(OBJS)\coredll_automtn.obj \
@@ -4003,6 +4016,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\coredll_uxtheme.obj \
$(OBJS)\coredll_window.obj \
$(OBJS)\coredll_graphicsd2d.obj \
+ $(OBJS)\coredll_utilsrt.obj \
$(OBJS)\coredll_helpchm.obj \
$(OBJS)\coredll_helpwin.obj \
$(OBJS)\coredll_automtn.obj \
@@ -4291,6 +4305,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_uxtheme.obj \
$(OBJS)\corelib_window.obj \
$(OBJS)\corelib_graphicsd2d.obj \
+ $(OBJS)\corelib_utilsrt.obj \
$(OBJS)\corelib_helpchm.obj \
$(OBJS)\corelib_helpwin.obj \
$(OBJS)\corelib_automtn.obj \
@@ -4577,6 +4592,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\corelib_uxtheme.obj \
$(OBJS)\corelib_window.obj \
$(OBJS)\corelib_graphicsd2d.obj \
+ $(OBJS)\corelib_utilsrt.obj \
$(OBJS)\corelib_helpchm.obj \
$(OBJS)\corelib_helpwin.obj \
$(OBJS)\corelib_automtn.obj \
@@ -4866,12 +4882,14 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\advdll_treelist.obj \
$(OBJS)\advdll_wizard.obj \
$(OBJS)\advdll_addremovectrl.obj \
+ $(OBJS)\advdll_notifmsgcmn.obj \
$(OBJS)\advdll_taskbarcmn.obj \
$(OBJS)\advdll_aboutdlg.obj \
$(OBJS)\advdll_notifmsg.obj \
$(OBJS)\advdll_richtooltip.obj \
$(OBJS)\advdll_sound.obj \
$(OBJS)\advdll_taskbar.obj \
+ $(OBJS)\advdll_notifmsgrt.obj \
$(OBJS)\advdll_joystick.obj \
$(OBJS)\advdll_animateg.obj \
$(OBJS)\advdll_bmpcbox.obj \
@@ -4920,12 +4938,14 @@ ____ADVANCED_SRC_FILENAMES_2_OBJECTS = \
$(OBJS)\advdll_treelist.obj \
$(OBJS)\advdll_wizard.obj \
$(OBJS)\advdll_addremovectrl.obj \
+ $(OBJS)\advdll_notifmsgcmn.obj \
$(OBJS)\advdll_taskbarcmn.obj \
$(OBJS)\advdll_aboutdlg.obj \
$(OBJS)\advdll_notifmsg.obj \
$(OBJS)\advdll_richtooltip.obj \
$(OBJS)\advdll_sound.obj \
$(OBJS)\advdll_taskbar.obj \
+ $(OBJS)\advdll_notifmsgrt.obj \
$(OBJS)\advdll_joystick.obj \
$(OBJS)\advdll_animateg.obj
!endif
@@ -4975,12 +4995,14 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\advlib_treelist.obj \
$(OBJS)\advlib_wizard.obj \
$(OBJS)\advlib_addremovectrl.obj \
+ $(OBJS)\advlib_notifmsgcmn.obj \
$(OBJS)\advlib_taskbarcmn.obj \
$(OBJS)\advlib_aboutdlg.obj \
$(OBJS)\advlib_notifmsg.obj \
$(OBJS)\advlib_richtooltip.obj \
$(OBJS)\advlib_sound.obj \
$(OBJS)\advlib_taskbar.obj \
+ $(OBJS)\advlib_notifmsgrt.obj \
$(OBJS)\advlib_joystick.obj \
$(OBJS)\advlib_animateg.obj \
$(OBJS)\advlib_bmpcbox.obj \
@@ -5029,12 +5051,14 @@ ____ADVANCED_SRC_FILENAMES_3_OBJECTS = \
$(OBJS)\advlib_treelist.obj \
$(OBJS)\advlib_wizard.obj \
$(OBJS)\advlib_addremovectrl.obj \
+ $(OBJS)\advlib_notifmsgcmn.obj \
$(OBJS)\advlib_taskbarcmn.obj \
$(OBJS)\advlib_aboutdlg.obj \
$(OBJS)\advlib_notifmsg.obj \
$(OBJS)\advlib_richtooltip.obj \
$(OBJS)\advlib_sound.obj \
$(OBJS)\advlib_taskbar.obj \
+ $(OBJS)\advlib_notifmsgrt.obj \
$(OBJS)\advlib_joystick.obj \
$(OBJS)\advlib_animateg.obj
!endif
@@ -8455,6 +8479,11 @@ $(OBJS)\monodll_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -9500,6 +9529,11 @@ $(OBJS)\monodll_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -9530,6 +9564,11 @@ $(OBJS)\monodll_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\taskbar.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monodll_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\msw\joystick.cpp
@@ -10968,6 +11007,11 @@ $(OBJS)\monolib_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -12013,6 +12057,11 @@ $(OBJS)\monolib_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -12043,6 +12092,11 @@ $(OBJS)\monolib_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\taskbar.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\monolib_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\msw\joystick.cpp
@@ -13412,6 +13466,11 @@ $(OBJS)\coredll_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\coredll_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -14881,6 +14940,11 @@ $(OBJS)\corelib_graphicsd2d.obj: ..\..\src\msw\graphicsd2d.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\graphicsd2d.cpp
!endif
+!if "$(USE_GUI)" == "1"
+$(OBJS)\corelib_utilsrt.obj: ..\..\src\msw\rt\utilsrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\rt\utilsrt.cpp
+!endif
+
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_helpchm.obj: ..\..\src\msw\helpchm.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) ..\..\src\msw\helpchm.cpp
@@ -15891,6 +15955,9 @@ $(OBJS)\advdll_wizard.obj: ..\..\src\generic\wizard.cpp
$(OBJS)\advdll_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
+$(OBJS)\advdll_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+
$(OBJS)\advdll_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -15909,6 +15976,9 @@ $(OBJS)\advdll_sound.obj: ..\..\src\msw\sound.cpp
$(OBJS)\advdll_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\taskbar.cpp
+$(OBJS)\advdll_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+
$(OBJS)\advdll_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVDLL_CXXFLAGS) ..\..\src\msw\joystick.cpp
@@ -16047,6 +16117,9 @@ $(OBJS)\advlib_wizard.obj: ..\..\src\generic\wizard.cpp
$(OBJS)\advlib_addremovectrl.obj: ..\..\src\common\addremovectrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\addremovectrl.cpp
+$(OBJS)\advlib_notifmsgcmn.obj: ..\..\src\common\notifmsgcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\notifmsgcmn.cpp
+
$(OBJS)\advlib_taskbarcmn.obj: ..\..\src\common\taskbarcmn.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\common\taskbarcmn.cpp
@@ -16065,6 +16138,9 @@ $(OBJS)\advlib_sound.obj: ..\..\src\msw\sound.cpp
$(OBJS)\advlib_taskbar.obj: ..\..\src\msw\taskbar.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\taskbar.cpp
+$(OBJS)\advlib_notifmsgrt.obj: ..\..\src\msw\rt\notifmsgrt.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\rt\notifmsgrt.cpp
+
$(OBJS)\advlib_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) /c /nologo /TP /Fo$@ $(ADVLIB_CXXFLAGS) ..\..\src\msw\joystick.cpp
diff --git a/build/msw/wx_adv.vcxproj b/build/msw/wx_adv.vcxproj
index f4259082c1..ad0522f3e8 100644
--- a/build/msw/wx_adv.vcxproj
+++ b/build/msw/wx_adv.vcxproj
@@ -462,6 +462,7 @@
+
@@ -507,6 +508,7 @@
+
@@ -544,7 +546,6 @@
-
diff --git a/build/msw/wx_adv.vcxproj.filters b/build/msw/wx_adv.vcxproj.filters
index 982ac7865a..d180183885 100644
--- a/build/msw/wx_adv.vcxproj.filters
+++ b/build/msw/wx_adv.vcxproj.filters
@@ -48,6 +48,9 @@
Common Sources
+
+ Common Sources
+
Common Sources
@@ -171,6 +174,9 @@
MSW Sources
+
+ MSW Sources
+
MSW Sources
@@ -331,9 +337,6 @@
MSW Headers
-
- MSW Headers
-
MSW Headers
@@ -388,4 +391,4 @@
MSW Headers
-
+
\ No newline at end of file
diff --git a/build/msw/wx_core.vcxproj b/build/msw/wx_core.vcxproj
index e2a32a8e80..425d1e1845 100644
--- a/build/msw/wx_core.vcxproj
+++ b/build/msw/wx_core.vcxproj
@@ -1,4 +1,4 @@
-
+
@@ -1006,6 +1006,7 @@
+
@@ -1377,6 +1378,7 @@
+
diff --git a/build/msw/wx_core.vcxproj.filters b/build/msw/wx_core.vcxproj.filters
index 6b958042db..39e16aeb8f 100644
--- a/build/msw/wx_core.vcxproj.filters
+++ b/build/msw/wx_core.vcxproj.filters
@@ -813,6 +813,9 @@
MSW Sources
+
+ MSW Sources
+
MSW Sources
@@ -1606,6 +1609,9 @@
MSW Headers
+
+ MSW Headers
+
MSW Headers
diff --git a/build/msw/wx_vc7_adv.vcproj b/build/msw/wx_vc7_adv.vcproj
index 1401d0f420..38a4a7347d 100644
--- a/build/msw/wx_vc7_adv.vcproj
+++ b/build/msw/wx_vc7_adv.vcproj
@@ -324,6 +324,9 @@
+
+
@@ -388,6 +391,9 @@
Name="Release|Win32"
ExcludedFromBuild="TRUE"/>
+
+
-
-
diff --git a/build/msw/wx_vc7_core.vcproj b/build/msw/wx_vc7_core.vcproj
index e6de0509c8..ded38518a1 100644
--- a/build/msw/wx_vc7_core.vcproj
+++ b/build/msw/wx_vc7_core.vcproj
@@ -1051,6 +1051,9 @@
+
+
-
-
@@ -1637,6 +1637,9 @@
+
+
+
+
@@ -930,6 +934,10 @@
ExcludedFromBuild="true"
/>
+
+
-
-
diff --git a/build/msw/wx_vc8_core.vcproj b/build/msw/wx_vc8_core.vcproj
index 190a85c20e..9590ed5350 100644
--- a/build/msw/wx_vc8_core.vcproj
+++ b/build/msw/wx_vc8_core.vcproj
@@ -1814,6 +1814,10 @@
RelativePath="..\..\src\msw\window.cpp"
>
+
+
-
-
@@ -2685,6 +2685,10 @@
RelativePath="..\..\include\wx\msw\window.h"
>
+
+
+
+
@@ -926,6 +930,10 @@
ExcludedFromBuild="true"
/>
+
+
-
-
diff --git a/build/msw/wx_vc9_core.vcproj b/build/msw/wx_vc9_core.vcproj
index 565d9c845f..8eeb914937 100644
--- a/build/msw/wx_vc9_core.vcproj
+++ b/build/msw/wx_vc9_core.vcproj
@@ -1810,6 +1810,10 @@
RelativePath="..\..\src\msw\window.cpp"
>
+
+
-
-
@@ -2681,6 +2681,10 @@
RelativePath="..\..\include\wx\msw\window.h"
>
+
+
-// Licence: wxWindows licence
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef _WX_GTK_NOTIFMSG_H_
-#define _WX_GTK_NOTIFMSG_H_
-
-typedef struct _NotifyNotification NotifyNotification;
-
-// ----------------------------------------------------------------------------
-// wxNotificationMessage
-// ----------------------------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxNotificationMessage : public wxNotificationMessageBase
-{
-public:
- wxNotificationMessage() { Init(); }
- wxNotificationMessage(const wxString& title,
- const wxString& message = wxString(),
- wxWindow *parent = NULL,
- int flags = wxICON_INFORMATION)
- : wxNotificationMessageBase(title, message, parent, flags)
- {
- Init();
- }
-
- virtual ~wxNotificationMessage();
-
-
- virtual bool Show(int timeout = Timeout_Auto) wxOVERRIDE;
- virtual bool Close() wxOVERRIDE;
-
- // Set the name of the icon to use, overriding the default icon determined
- // by the flags. Call with empty string to reset custom icon.
- bool GTKSetIconName(const wxString& name);
-
-private:
- void Init() { m_notification = NULL; }
-
- NotifyNotification* m_notification;
- wxString m_iconName;
-
- wxDECLARE_NO_COPY_CLASS(wxNotificationMessage);
-};
-
-#endif // _WX_GTK_NOTIFMSG_H_
diff --git a/include/wx/gtk/setup0.h b/include/wx/gtk/setup0.h
index d189fb3e32..c734961a4d 100644
--- a/include/wx/gtk/setup0.h
+++ b/include/wx/gtk/setup0.h
@@ -1553,6 +1553,19 @@
// Recommended setting: 1, required by wxMediaCtrl
#define wxUSE_ACTIVEX 1
+// Enable WinRT support
+//
+// Default is 1 for compilers which support it, i.e. VS2012+ currently. If you
+// use an earlier MSVC version or another compiler and installed the necessary
+// SDK components manually, you need to change this setting.
+//
+// Recommended setting: 1
+#if defined(_MSC_VER) && _MSC_VER >= 1700
+ #define wxUSE_WINRT 1
+#else
+ #define wxUSE_WINRT 0
+#endif
+
// wxDC caching implementation
#define wxUSE_DC_CACHEING 1
diff --git a/include/wx/msw/chkconf.h b/include/wx/msw/chkconf.h
index f3d0b0f8ea..656ef98017 100644
--- a/include/wx/msw/chkconf.h
+++ b/include/wx/msw/chkconf.h
@@ -22,6 +22,14 @@
# endif
#endif /* !defined(wxUSE_ACTIVEX) */
+#ifndef wxUSE_WINRT
+# ifdef wxABORT_ON_CONFIG_ERROR
+# error "wxUSE_WINRT must be defined."
+# else
+# define wxUSE_WINRT 0
+# endif
+#endif /* !defined(wxUSE_ACTIVEX) */
+
#ifndef wxUSE_CRASHREPORT
# ifdef wxABORT_ON_CONFIG_ERROR
# error "wxUSE_CRASHREPORT must be defined."
diff --git a/include/wx/msw/notifmsg.h b/include/wx/msw/notifmsg.h
deleted file mode 100644
index b7e0e0e867..0000000000
--- a/include/wx/msw/notifmsg.h
+++ /dev/null
@@ -1,74 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// Name: wx/msw/notifmsg.h
-// Purpose: implementation of wxNotificationMessage for Windows
-// Author: Vadim Zeitlin
-// Created: 2007-12-01
-// Copyright: (c) 2007 Vadim Zeitlin
-// Licence: wxWindows licence
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef _WX_MSW_NOTIFMSG_H_
-#define _WX_MSW_NOTIFMSG_H_
-
-class WXDLLIMPEXP_FWD_ADV wxTaskBarIcon;
-
-// ----------------------------------------------------------------------------
-// wxNotificationMessage
-// ----------------------------------------------------------------------------
-
-class WXDLLIMPEXP_ADV wxNotificationMessage : public wxNotificationMessageBase
-{
-public:
- wxNotificationMessage() { Init(); }
- wxNotificationMessage(const wxString& title,
- const wxString& message = wxString(),
- wxWindow *parent = NULL,
- int flags = wxICON_INFORMATION)
- : wxNotificationMessageBase(title, message, parent, flags)
- {
- Init();
- }
-
- virtual ~wxNotificationMessage();
-
-
- virtual bool Show(int timeout = Timeout_Auto);
- virtual bool Close();
-
- // MSW implementation-specific methods
-
- // by default, wxNotificationMessage under MSW creates a temporary taskbar
- // icon to which it attaches the notification, if there is an existing
- // taskbar icon object in the application you may want to call this method
- // to attach the notification to it instead (we won't take ownership of it
- // and you can also pass NULL to not use the icon for notifications any
- // more)
- //
- // returns the task bar icon which was used previously (may be NULL)
- static wxTaskBarIcon *UseTaskBarIcon(wxTaskBarIcon *icon);
-
- // call this to always use the generic implementation, even if the system
- // supports the balloon tooltips used by the native one
- static void AlwaysUseGeneric(bool alwaysUseGeneric)
- {
- ms_alwaysUseGeneric = alwaysUseGeneric;
- }
-
-private:
- // common part of all ctors
- void Init() { m_impl = NULL; }
-
-
- // flag indicating whether we should always use generic implementation
- static bool ms_alwaysUseGeneric;
-
- // the real implementation of this class (selected during run-time because
- // the balloon task bar icons are not available in all Windows versions)
- class wxNotifMsgImpl *m_impl;
-
-
- wxDECLARE_NO_COPY_CLASS(wxNotificationMessage);
-};
-
-#endif // _WX_MSW_NOTIFMSG_H_
-
diff --git a/include/wx/msw/rt/private/notifmsg.h b/include/wx/msw/rt/private/notifmsg.h
new file mode 100644
index 0000000000..018218e9bb
--- /dev/null
+++ b/include/wx/msw/rt/private/notifmsg.h
@@ -0,0 +1,26 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name: wx/msw/rt/private/notifmsg.h
+// Purpose: WinRT implementation of wxNotificationMessageImpl
+// Author: Tobias Taschner
+// Created: 2015-09-13
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+#ifndef _WX_MSW_RT_PRIVATE_NOTIFMSG_H_
+#define _WX_MSW_RT_PRIVATE_NOTIFMSG_H_
+
+#include "wx/notifmsg.h"
+#include "wx/private/notifmsg.h"
+
+class wxToastNotificationHelper
+{
+public:
+ static bool UseToasts(const wxString& shortcutPath,
+ const wxString& appId);
+
+ static bool IsEnabled();
+
+ static wxNotificationMessageImpl* CreateInstance(wxNotificationMessageBase* notification);
+};
+
+#endif // _WX_MSW_RT_PRIVATE_NOTIFMSG_H_
diff --git a/include/wx/msw/rt/utils.h b/include/wx/msw/rt/utils.h
new file mode 100644
index 0000000000..b315531090
--- /dev/null
+++ b/include/wx/msw/rt/utils.h
@@ -0,0 +1,84 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/msw/rt/utils.h
+// Purpose: Windows Runtime Objects helper functions and objects
+// Author: Tobias Taschner
+// Created: 2015-09-05
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_MSW_RTUTILS_H
+#define _WX_MSW_RTUTILS_H
+
+#include "wx/defs.h"
+
+#if wxUSE_WINRT
+
+#include "wx/string.h"
+#include "wx/msw/wrapwin.h"
+
+#include
+
+namespace wxWinRT
+{
+
+bool WXDLLIMPEXP_CORE IsAvailable();
+
+bool WXDLLIMPEXP_CORE Initialize();
+
+void WXDLLIMPEXP_CORE Uninitialize();
+
+bool WXDLLIMPEXP_CORE GetActivationFactory(const wxString& activatableClassId, REFIID iid, void ** factory);
+
+// RAII class initializing WinRT in its ctor and undoing it in its dtor.
+class WXDLLIMPEXP_CORE Initializer
+{
+public:
+ Initializer()
+ : m_ok(Initialize())
+ {
+ }
+
+ bool IsOk() const
+ {
+ return m_ok;
+ }
+
+ ~Initializer()
+ {
+ if (m_ok)
+ Uninitialize();
+ }
+
+private:
+ const bool m_ok;
+
+ wxDECLARE_NO_COPY_CLASS(Initializer);
+};
+
+// Simple class to convert wxString to HSTRING
+// This just wraps a reference to the wxString object,
+// which needs a life time greater than the TempStringRef object
+class WXDLLIMPEXP_CORE TempStringRef
+{
+public:
+ HSTRING Get() const { return m_hstring; }
+
+ operator HSTRING() const { return m_hstring; };
+
+ static const TempStringRef Make(const wxString &str);
+
+private:
+ TempStringRef(const wxString &str);
+
+ HSTRING m_hstring;
+ HSTRING_HEADER m_header;
+
+ wxDECLARE_NO_COPY_CLASS(TempStringRef);
+};
+
+} // namespace wxWinRT
+
+#endif // wxUSE_WINRT
+
+#endif // _WX_MSW_RTUTILS_H
diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h
index f0c15456d5..d005bc3580 100644
--- a/include/wx/msw/setup0.h
+++ b/include/wx/msw/setup0.h
@@ -1553,6 +1553,19 @@
// Recommended setting: 1, required by wxMediaCtrl
#define wxUSE_ACTIVEX 1
+// Enable WinRT support
+//
+// Default is 1 for compilers which support it, i.e. VS2012+ currently. If you
+// use an earlier MSVC version or another compiler and installed the necessary
+// SDK components manually, you need to change this setting.
+//
+// Recommended setting: 1
+#if defined(_MSC_VER) && _MSC_VER >= 1700
+ #define wxUSE_WINRT 1
+#else
+ #define wxUSE_WINRT 0
+#endif
+
// wxDC caching implementation
#define wxUSE_DC_CACHEING 1
diff --git a/include/wx/msw/setup_inc.h b/include/wx/msw/setup_inc.h
index 20f2b40945..eb01cbd540 100644
--- a/include/wx/msw/setup_inc.h
+++ b/include/wx/msw/setup_inc.h
@@ -65,6 +65,19 @@
// Recommended setting: 1, required by wxMediaCtrl
#define wxUSE_ACTIVEX 1
+// Enable WinRT support
+//
+// Default is 1 for compilers which support it, i.e. VS2012+ currently. If you
+// use an earlier MSVC version or another compiler and installed the necessary
+// SDK components manually, you need to change this setting.
+//
+// Recommended setting: 1
+#if defined(_MSC_VER) && _MSC_VER >= 1700
+ #define wxUSE_WINRT 1
+#else
+ #define wxUSE_WINRT 0
+#endif
+
// wxDC caching implementation
#define wxUSE_DC_CACHEING 1
diff --git a/include/wx/msw/taskbar.h b/include/wx/msw/taskbar.h
index 5728a424f0..3fe5c9b61b 100644
--- a/include/wx/msw/taskbar.h
+++ b/include/wx/msw/taskbar.h
@@ -49,7 +49,8 @@ public:
bool ShowBalloon(const wxString& title,
const wxString& text,
unsigned msec = 0,
- int flags = 0);
+ int flags = 0,
+ const wxIcon& icon = wxNullIcon);
#endif // wxUSE_TASKBARICON_BALLOONS
protected:
diff --git a/include/wx/notifmsg.h b/include/wx/notifmsg.h
index a5298f8c45..82dc2ad8be 100644
--- a/include/wx/notifmsg.h
+++ b/include/wx/notifmsg.h
@@ -29,8 +29,7 @@ public:
// default ctor, use setters below to initialize it later
wxNotificationMessageBase()
{
- m_parent = NULL;
- m_flags = wxICON_INFORMATION;
+ Init();
}
// create a notification object with the given title and message (the
@@ -39,39 +38,38 @@ public:
const wxString& message = wxEmptyString,
wxWindow *parent = NULL,
int flags = wxICON_INFORMATION)
- : m_title(title),
- m_message(message),
- m_parent(parent)
{
- SetFlags(flags);
+ Init();
+ Create(title, message, parent, flags);
}
+ virtual ~wxNotificationMessageBase();
+
// note that the setters must be called before Show()
// set the title: short string, markup not allowed
- void SetTitle(const wxString& title) { m_title = title; }
+ void SetTitle(const wxString& title);
// set the text of the message: this is a longer string than the title and
// some platforms allow simple HTML-like markup in it
- void SetMessage(const wxString& message) { m_message = message; }
+ void SetMessage(const wxString& message);
// set the parent for this notification: we'll be associated with the top
// level parent of this window or, if this method is not called, with the
// main application window by default
- void SetParent(wxWindow *parent) { m_parent = parent; }
+ void SetParent(wxWindow *parent);
// this method can currently be used to choose a standard icon to use: the
// parameter may be one of wxICON_INFORMATION, wxICON_WARNING or
// wxICON_ERROR only (but not wxICON_QUESTION)
- void SetFlags(int flags)
- {
- wxASSERT_MSG( flags == wxICON_INFORMATION ||
- flags == wxICON_WARNING || flags == wxICON_ERROR,
- "Invalid icon flags specified" );
+ void SetFlags(int flags);
- m_flags = flags;
- }
+ // set a custom icon to use instead of the system provided specified via SetFlags
+ virtual void SetIcon(const wxIcon& icon);
+ // Add a button to the notification, returns false if the platform does not support
+ // actions in notifications
+ virtual bool AddAction(wxWindowID actionid, const wxString &label = wxString());
// showing and hiding
// ------------------
@@ -87,70 +85,97 @@ public:
// pass (special values Timeout_Auto and Timeout_Never can be used)
//
// returns false if an error occurred
- virtual bool Show(int timeout = Timeout_Auto) = 0;
+ bool Show(int timeout = Timeout_Auto);
// hide the notification, returns true if it was hidden or false if it
// couldn't be done (e.g. on some systems automatically hidden
// notifications can't be hidden manually)
- virtual bool Close() = 0;
+ bool Close();
protected:
- // accessors for the derived classes
- const wxString& GetTitle() const { return m_title; }
- const wxString& GetMessage() const { return m_message; }
- wxWindow *GetParent() const { return m_parent; }
- int GetFlags() const { return m_flags; }
-
- // return the concatenation of title and message separated by a new line,
- // this is suitable for simple implementation which have no support for
- // separate title and message parts of the notification
- wxString GetFullMessage() const
+ // Common part of all ctors.
+ void Create(const wxString& title = wxEmptyString,
+ const wxString& message = wxEmptyString,
+ wxWindow *parent = NULL,
+ int flags = wxICON_INFORMATION)
{
- wxString text(m_title);
- if ( !m_message.empty() )
- {
- text << "\n\n" << m_message;
- }
-
- return text;
+ SetTitle(title);
+ SetMessage(message);
+ SetParent(parent);
+ SetFlags(flags);
}
+ class wxNotificationMessageImpl* m_impl;
+
private:
- wxString m_title,
- m_message;
- wxWindow *m_parent;
-
- int m_flags;
+ void Init()
+ {
+ m_impl = NULL;
+ }
wxDECLARE_NO_COPY_CLASS(wxNotificationMessageBase);
};
-/*
- TODO: Implement under OS X using notification centre (10.8+) or
- Growl (http://growl.info/) for the previous versions.
- */
-#if defined(__WXGTK__) && wxUSE_LIBNOTIFY
- #include "wx/gtk/notifmsg.h"
-#elif defined(__WXMSW__) && wxUSE_TASKBARICON && wxUSE_TASKBARICON_BALLOONS
- #include "wx/msw/notifmsg.h"
-#else
- #include "wx/generic/notifmsg.h"
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_NOTIFICATION_MESSAGE_CLICK, wxCommandEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_NOTIFICATION_MESSAGE_DISMISSED, wxCommandEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_ADV, wxEVT_NOTIFICATION_MESSAGE_ACTION, wxCommandEvent );
- class wxNotificationMessage : public wxGenericNotificationMessage
- {
- public:
- wxNotificationMessage() { }
- wxNotificationMessage(const wxString& title,
- const wxString& message = wxEmptyString,
- wxWindow *parent = NULL,
- int flags = wxICON_INFORMATION)
- : wxGenericNotificationMessage(title, message, parent, flags)
- {
- }
- };
+#if (defined(__WXGTK__) && wxUSE_LIBNOTIFY) || \
+ (defined(__WXMSW__) && wxUSE_TASKBARICON && wxUSE_TASKBARICON_BALLOONS) || \
+ (defined(__WXOSX_COCOA__) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8))
+ #define wxHAS_NATIVE_NOTIFICATION_MESSAGE
#endif
+// ----------------------------------------------------------------------------
+// wxNotificationMessage
+// ----------------------------------------------------------------------------
+
+#ifdef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+
+#if defined(__WXMSW__)
+class WXDLLIMPEXP_FWD_ADV wxTaskBarIcon;
+#endif // defined(__WXMSW__)
+
+#else
+#include "wx/generic/notifmsg.h"
+#endif // wxHAS_NATIVE_NOTIFICATION_MESSAGE
+
+class WXDLLIMPEXP_ADV wxNotificationMessage : public
+#ifdef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+ wxNotificationMessageBase
+#else
+ wxGenericNotificationMessage
+#endif
+{
+public:
+ wxNotificationMessage() { Init(); }
+ wxNotificationMessage(const wxString& title,
+ const wxString& message = wxString(),
+ wxWindow *parent = NULL,
+ int flags = wxICON_INFORMATION)
+ {
+ Init();
+ Create(title, message, parent, flags);
+ }
+
+#if defined(__WXMSW__) && defined(wxHAS_NATIVE_NOTIFICATION_MESSAGE)
+ static bool MSWUseToasts(
+ const wxString& shortcutPath = wxString(),
+ const wxString& appId = wxString());
+
+ // returns the task bar icon which was used previously (may be NULL)
+ static wxTaskBarIcon *UseTaskBarIcon(wxTaskBarIcon *icon);
+
+#endif // defined(__WXMSW__) && defined(wxHAS_NATIVE_NOTIFICATION_MESSAGE)
+
+private:
+ // common part of all ctors
+ void Init();
+
+ wxDECLARE_NO_COPY_CLASS(wxNotificationMessage);
+};
+
#endif // wxUSE_NOTIFICATION_MESSAGE
#endif // _WX_NOTIFMSG_H_
diff --git a/include/wx/private/notifmsg.h b/include/wx/private/notifmsg.h
new file mode 100644
index 0000000000..772a9c308e
--- /dev/null
+++ b/include/wx/private/notifmsg.h
@@ -0,0 +1,76 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/private/notifmsg.h
+// Purpose: wxNotificationMessage declarations
+// Author: Tobias Taschner
+// Created: 2015-08-04
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_PRIVATE_NOTIFMSG_H_
+#define _WX_PRIVATE_NOTIFMSG_H_
+
+class wxNotificationMessageImpl
+{
+public:
+ wxNotificationMessageImpl(wxNotificationMessageBase* notification):
+ m_notification(notification),
+ m_active(false)
+ {
+
+ }
+
+ virtual ~wxNotificationMessageImpl() { }
+
+ virtual bool Show(int timeout) = 0;
+
+ virtual bool Close() = 0;
+
+ virtual void SetTitle(const wxString& title) = 0;
+
+ virtual void SetMessage(const wxString& message) = 0;
+
+ virtual void SetParent(wxWindow *parent) = 0;
+
+ virtual void SetFlags(int flags) = 0;
+
+ virtual void SetIcon(const wxIcon& icon) = 0;
+
+ virtual bool AddAction(wxWindowID actionid, const wxString &label) = 0;
+
+ virtual void Detach()
+ {
+ if (m_active)
+ m_notification = NULL;
+ else
+ delete this;
+ }
+
+ bool ProcessNotificationEvent(wxEvent& event)
+ {
+ if (m_notification)
+ return m_notification->ProcessEvent(event);
+ else
+ return false;
+ }
+
+ wxNotificationMessageBase* GetNotification() const
+ {
+ return m_notification;
+ }
+
+protected:
+ wxNotificationMessageBase* m_notification;
+ bool m_active;
+
+ void SetActive(bool active)
+ {
+ m_active = active;
+
+ // Delete the implementation if the notification is detached
+ if (!m_notification && !active)
+ delete this;
+ }
+};
+
+#endif // _WX_PRIVATE_NOTIFMSG_H_
diff --git a/interface/wx/notifmsg.h b/interface/wx/notifmsg.h
index 82d2769cd0..1b2a7a5056 100644
--- a/interface/wx/notifmsg.h
+++ b/interface/wx/notifmsg.h
@@ -10,12 +10,46 @@
This class allows to show the user a message non intrusively.
- Currently it is implemented natively for Windows and GTK and uses
- (non-modal) dialogs for the display of the notifications under the other
- platforms.
+ Currently it is implemented natively for Windows, OS X, GTK and uses
+ generic toast notifications under the other platforms. It's not recommended
+ but @c wxGenericNotificationMessage can be used instead of the native ones.
+ This might make sense if your application requires features not available in
+ the native implementation.
Notice that this class is not a window and so doesn't derive from wxWindow.
+ @section platform_notes Platform Notes
+
+ @par Windows
+ Up to Windows 8.1 balloon notifications are displayed from an icon in the
+ notification area of the taskbar. If your application uses a wxTaskBarIcon
+ you should call UseTaskBarIcon() to ensure that only one icon is shown in
+ the notification area. Windows 10 displays all notifications as popup
+ toasts. To suppress the additional icon in the notification area on
+ Windows 10 and for toast notification support on Windows 8 it is
+ recommended to call MSWUseToasts() before showing the first notification
+ message.
+
+ @par OS X
+ The OS X implementation uses Notification Center to display native notifications.
+ In order to use actions your notifications must use the alert style. This can
+ be enabled by the user in system settings or by setting the
+ @c NSUserNotificationAlertStyle value in Info.plist to @c alert. Please note
+ that the user always has the option to change the notification style.
+
+
+ @beginEventEmissionTable{wxCommandEvent}
+ @event{EVT_NOTIFICATION_MESSAGE_CLICK(id, func)}
+ Process a @c EVT_NOTIFICATION_MESSAGE_CLICK event, when a notification
+ is clicked.
+ @event{wxEVT_NOTIFICATION_MESSAGE_DISMISSED(id, func)}
+ Process a @c wxEVT_NOTIFICATION_MESSAGE_DISMISSED event, when a notification
+ is dismissed by the user or times out.
+ @event{wxEVT_NOTIFICATION_MESSAGE_ACTION(id, func)}
+ Process a @c wxEVT_NOTIFICATION_MESSAGE_ACTION event, when the user
+ selects on of the actions added by AddAction()
+ @endEventTable
+
@since 2.9.0
@library{wxadv}
@category{misc}
@@ -53,6 +87,17 @@ public:
*/
virtual ~wxNotificationMessage();
+ /**
+ Add an action to the notification. If supported by the implementation
+ this are usually buttons in the notification selectable by the user.
+
+ @return @false if the current implementation or OS version
+ does not support actions in notifications.
+
+ @since 3.1.0
+ */
+ bool AddAction(wxWindowID actionid, const wxString &label = wxString());
+
/**
Hides the notification.
@@ -69,9 +114,22 @@ public:
Valid values are @c wxICON_INFORMATION, @c wxICON_WARNING and
@c wxICON_ERROR (notice that @c wxICON_QUESTION is not allowed here).
Some implementations of this class may not support the icons.
+
+ @see SetIcon()
*/
void SetFlags(int flags);
+ /**
+ Specify a custom icon to be displayed in the notification.
+
+ Some implementations of this class may not support custom icons.
+
+ @see SetFlags()
+
+ @since 3.1.0
+ */
+ void SetIcon(const wxIcon& icon);
+
/**
Set the main text of the notification.
@@ -110,5 +168,51 @@ public:
@return @false if an error occurred.
*/
virtual bool Show(int timeout = Timeout_Auto);
+
+ /**
+ If the application already uses a wxTaskBarIcon, it should be connected
+ to notifications by using this method. This has no effect if toast
+ notifications are used.
+
+ @return the task bar icon which was used previously (may be @c NULL)
+
+ @onlyfor{wxmsw}
+ */
+ static wxTaskBarIcon *UseTaskBarIcon(wxTaskBarIcon *icon);
+
+
+ /**
+ Enables toast notifications available since Windows 8 and suppresses
+ the additional icon in the notification area on Windows 10.
+
+ Toast notifications @b require a shortcut to the application in the
+ start menu. The start menu shortcut needs to contain an Application
+ User Model ID. It is recommended that the applications setup creates the
+ shortcut and the application specifies the setup created shortcut in
+ @c shortcutPath. A call to this method will verify (and if necessary
+ modify) the shortcut before enabling toast notifications.
+
+ @param shortcutPath
+ Path to a shortcut file referencing the applications executable. If
+ the string is empty the applications display name will be used. If
+ not fully qualified, it will be used as a path relative to the
+ users start menu directory. The file extension .lnk is optional.
+ @param appId
+ The applications
+ Application User Model ID. If empty it will be extracted from
+ the shortcut. If the shortcut does not contain an id an id will be
+ automatically created from the applications vendor and app name.
+
+ @return @false if toast notifications could not be enabled.
+
+ @onlyfor{wxmsw}
+
+ @see wxAppConsole::SetAppName(), wxAppConsole::SetVendorName()
+
+ @since 3.1.0
+ */
+ static bool MSWUseToasts(
+ const wxString& shortcutPath = wxString(),
+ const wxString& appId = wxString());
};
diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp
index 5ee454bb09..8e5e133c0f 100644
--- a/samples/dialogs/dialogs.cpp
+++ b/samples/dialogs/dialogs.cpp
@@ -32,8 +32,13 @@
#include "wx/minifram.h"
#include "wx/sysopt.h"
#include "wx/notifmsg.h"
+#include "wx/generic/notifmsg.h"
#include "wx/modalhook.h"
+#if defined(__WXMSW__) && wxUSE_TASKBARICON
+#include "wx/taskbar.h"
+#endif
+
#if wxUSE_RICHMSGDLG
#include "wx/richmsgdlg.h"
#endif // wxUSE_RICHMSGDLG
@@ -267,9 +272,7 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(DIALOGS_REQUEST, MyFrame::OnRequestUserAttention)
#if wxUSE_NOTIFICATION_MESSAGE
- EVT_MENU(DIALOGS_NOTIFY_AUTO, MyFrame::OnNotifMsgAuto)
- EVT_MENU(DIALOGS_NOTIFY_SHOW, MyFrame::OnNotifMsgShow)
- EVT_MENU(DIALOGS_NOTIFY_HIDE, MyFrame::OnNotifMsgHide)
+ EVT_MENU(DIALOGS_NOTIFY_MSG, MyFrame::OnNotifMsg)
#endif // wxUSE_NOTIFICATION_MESSAGE
#if wxUSE_RICHTOOLTIP
@@ -553,9 +556,8 @@ bool MyApp::OnInit()
wxMenu *menuNotif = new wxMenu;
menuNotif->Append(DIALOGS_REQUEST, wxT("&Request user attention\tCtrl-Shift-R"));
#if wxUSE_NOTIFICATION_MESSAGE
- menuNotif->Append(DIALOGS_NOTIFY_AUTO, "&Automatically hidden notification");
- menuNotif->Append(DIALOGS_NOTIFY_SHOW, "&Show manual notification");
- menuNotif->Append(DIALOGS_NOTIFY_HIDE, "&Hide manual notification");
+ menuNotif->AppendSeparator();
+ menuNotif->Append(DIALOGS_NOTIFY_MSG, "User &Notification\tCtrl-Shift-N");
#endif // wxUSE_NOTIFICATION_MESSAGE
menuDlg->AppendSubMenu(menuNotif, "&User notifications");
@@ -632,10 +634,6 @@ MyFrame::MyFrame(const wxString& title)
}
#endif // wxUSE_COLOURDLG
-#if wxUSE_NOTIFICATION_MESSAGE
- m_notifMsg = NULL;
-#endif // wxUSE_NOTIFICATION_MESSAGE
-
#if wxUSE_STATUSBAR
CreateStatusBar();
#endif // wxUSE_STATUSBAR
@@ -708,9 +706,6 @@ MyFrame::MyFrame(const wxString& title)
MyFrame::~MyFrame()
{
-#if wxUSE_NOTIFICATION_MESSAGE
- delete m_notifMsg;
-#endif // wxUSE_NOTIFICATION_MESSAGE
}
#if wxUSE_COLOURDLG
@@ -1900,53 +1895,410 @@ void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event))
RequestUserAttention(wxUSER_ATTENTION_ERROR);
}
+#if wxUSE_RICHTOOLTIP || wxUSE_NOTIFICATION_MESSAGE
+
+#include "tip.xpm"
+
+#endif
+
#if wxUSE_NOTIFICATION_MESSAGE
-void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event))
+// ----------------------------------------------------------------------------
+// TestNotificationMessageDialog
+// ----------------------------------------------------------------------------
+
+class TestNotificationMessageWindow : public wxFrame
{
- // Notice that the notification remains shown even after the
- // wxNotificationMessage object itself is destroyed so we can show simple
- // notifications using temporary objects.
- if ( !wxNotificationMessage
- (
- "Automatic Notification",
- "Nothing important has happened\n"
- "this notification will disappear soon."
- ).Show() )
+public:
+ TestNotificationMessageWindow(wxWindow *parent) :
+ wxFrame(parent, wxID_ANY, "User Notification Test Dialog")
{
- wxLogStatus("Failed to show notification message");
+#ifdef __WXMSW__
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
+#endif
+ wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
+
+ wxSizer* sizerText = new wxStaticBoxSizer(wxVERTICAL, this, "Notification Texts");
+
+ sizerText->Add(new wxStaticText(this, wxID_ANY, "&Title:"),
+ wxSizerFlags());
+ m_textTitle = new wxTextCtrl(this, wxID_ANY, "Notification Title");
+ sizerText->Add(m_textTitle, wxSizerFlags().Expand());
+
+ sizerText->Add(new wxStaticText(this, wxID_ANY, "&Message:"),
+ wxSizerFlags());
+ m_textMessage = new wxTextCtrl(this, wxID_ANY, "A message within the notification",
+ wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
+ m_textMessage->SetMinSize(wxSize(300, -1));
+ sizerText->Add(m_textMessage, wxSizerFlags().Expand());
+
+ sizerTop->Add(sizerText, wxSizerFlags().Expand().Border());
+
+ const wxString icons[] =
+ {
+ "De&fault",
+ "None",
+ "&Information",
+ "&Warning",
+ "&Error",
+ "&Custom"
+ };
+ wxCOMPILE_TIME_ASSERT(WXSIZEOF(icons) == Icon_Max, IconMismatch);
+ m_icons = new wxRadioBox(this, wxID_ANY, "Ic&on in notification",
+ wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(icons), icons,
+ 1, wxRA_SPECIFY_ROWS);
+ m_icons->SetSelection(Icon_Default);
+ sizerTop->Add(m_icons, wxSizerFlags().Expand().Border());
+
+ const wxString timeouts[] =
+ {
+ "&Automatic",
+ "&Never",
+ "&5 sec",
+ "&15 sec"
+ };
+ m_showTimeout = new wxRadioBox(this, wxID_ANY, "&Timeout for notification",
+ wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(timeouts), timeouts,
+ 1, wxRA_SPECIFY_ROWS);
+ m_showTimeout->SetSelection(0);
+ sizerTop->Add(m_showTimeout, wxSizerFlags().Expand().Border());
+
+ wxSizer* sizerActions = new wxStaticBoxSizer(wxVERTICAL, this, "Additional Actions");
+
+ m_actionList = new wxListBox(this, wxID_ANY);
+ sizerActions->Add(m_actionList, wxSizerFlags().Expand());
+
+ wxSizer* sizerActionMod = new wxBoxSizer(wxHORIZONTAL);
+ sizerActionMod->Add(new wxStaticText(this, wxID_ANY, "ID:"), wxSizerFlags().Center());
+ const wxString actionIds[] =
+ {
+ "wxID_DELETE",
+ "wxID_CLOSE",
+ "wxID_OK",
+ "wxID_CANCEL"
+ };
+ m_actionChoice = new wxChoice(this, wxID_ANY,
+ wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(actionIds), actionIds
+ );
+ m_actionChoice->SetSelection(0);
+ sizerActionMod->Add(m_actionChoice);
+ sizerActionMod->Add(new wxStaticText(this, wxID_ANY, "Custom label:"), wxSizerFlags().Center());
+ m_actionCaption = new wxTextCtrl(this, wxID_ANY);
+ sizerActionMod->Add(m_actionCaption);
+ wxButton* actionAddBtn = new wxButton(this, wxID_ADD);
+ actionAddBtn->Bind(wxEVT_BUTTON, &TestNotificationMessageWindow::OnActionAddClicked, this);
+ sizerActionMod->Add(actionAddBtn);
+ wxButton* actionRemoveBtn = new wxButton(this, wxID_REMOVE);
+ actionRemoveBtn->Bind(wxEVT_BUTTON, &TestNotificationMessageWindow::OnActionRemoveClicked, this);
+ sizerActionMod->Add(actionRemoveBtn);
+
+ sizerActions->Add(sizerActionMod, wxSizerFlags().Border());
+
+ sizerTop->Add(sizerActions, wxSizerFlags().Expand().Border());
+
+ wxSizer* sizerSettings = new wxStaticBoxSizer(wxVERTICAL, this, "Notification Settings");
+
+#ifdef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+ m_useGeneric = new wxCheckBox(this, wxID_ANY, "Use &generic notifications");
+ sizerSettings->Add(m_useGeneric);
+#endif
+
+ m_delayShow = new wxCheckBox(this, wxID_ANY, "&Delay show");
+#if defined(__WXOSX__)
+ m_delayShow->SetValue(true);
+#endif
+ sizerSettings->Add(m_delayShow);
+
+ m_handleEvents = new wxCheckBox(this, wxID_ANY, "&Handle events");
+ m_handleEvents->SetValue(true);
+ sizerSettings->Add(m_handleEvents);
+
+#if defined(__WXMSW__) && wxUSE_TASKBARICON
+ m_taskbarIcon = NULL;
+ m_useTaskbar = new wxCheckBox(this, wxID_ANY, "Use persistent &taskbar icon");
+ m_useTaskbar->SetValue(false);
+ sizerSettings->Add(m_useTaskbar);
+#endif
+
+ sizerTop->Add(sizerSettings, wxSizerFlags().Expand().Border());
+
+ m_textStatus = new wxStaticText(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize,
+ wxST_NO_AUTORESIZE | wxALIGN_CENTRE_HORIZONTAL);
+ m_textStatus->SetForegroundColour(*wxBLUE);
+ sizerTop->Add(m_textStatus, wxSizerFlags().Expand().Border());
+
+ wxSizer* sizerButtons = new wxBoxSizer(wxHORIZONTAL);
+ sizerButtons->Add(new wxButton(this, wxID_NEW, "&Show"));
+ m_closeButton = new wxButton(this, wxID_CLOSE, "&Close");
+ m_closeButton->Disable();
+ sizerButtons->Add(m_closeButton);
+ sizerTop->Add(sizerButtons, wxSizerFlags().Center());
+
+ SetSizerAndFit(sizerTop);
+
+ Center();
+
+ Bind(wxEVT_BUTTON, &TestNotificationMessageWindow::OnShowClicked, this, wxID_NEW);
+ Bind(wxEVT_BUTTON, &TestNotificationMessageWindow::OnCloseClicked, this, wxID_CLOSE);
}
- // But it doesn't have to be a temporary, of course.
- wxNotificationMessage n("Dummy Warning", "Example of a warning notification.");
- n.SetFlags(wxICON_ERROR);
- n.Show(5); // Just for testing, use 5 second delay.
-}
+private:
+ enum
+ {
+ Icon_Default,
+ Icon_None,
+ Icon_Info,
+ Icon_Warning,
+ Icon_Error,
+ Icon_Custom,
+ Icon_Max
+ };
-void MyFrame::OnNotifMsgShow(wxCommandEvent& WXUNUSED(event))
+ class ActionInfo : public wxClientData
+ {
+ public:
+ ActionInfo(wxWindowID actionId, const wxString& actionCaption):
+ id(actionId),
+ customCaption(actionCaption)
+ {
+
+ }
+
+ wxWindowID id;
+ wxString customCaption;
+ };
+
+ wxTextCtrl* m_textTitle;
+ wxTextCtrl* m_textMessage;
+ wxRadioBox* m_icons;
+ wxRadioBox* m_showTimeout;
+ wxListBox* m_actionList;
+ wxChoice* m_actionChoice;
+ wxTextCtrl* m_actionCaption;
+#ifdef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+ wxCheckBox* m_useGeneric;
+#endif
+ wxCheckBox* m_delayShow;
+ wxCheckBox* m_handleEvents;
+ wxStaticText* m_textStatus;
+ wxButton* m_closeButton;
+
+#if defined(__WXMSW__) && wxUSE_TASKBARICON
+ wxCheckBox* m_useTaskbar;
+ wxTaskBarIcon* m_taskbarIcon;
+#endif
+
+ wxSharedPtr< wxNotificationMessageBase> m_notif;
+
+ void DoShowNotification()
+ {
+ if ( m_delayShow->GetValue() )
+ {
+ ShowStatus("Sleeping for 3 seconds to allow you to switch to another window");
+ wxYield();
+ wxSleep(3);
+ }
+
+ m_closeButton->Enable();
+ ShowStatus("Showing notification...");
+#ifdef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+ if ( m_useGeneric->GetValue() )
+ m_notif = new wxGenericNotificationMessage(
+ m_textTitle->GetValue(),
+ m_textMessage->GetValue(),
+ this);
+ else
+#endif
+ {
+ m_notif = new wxNotificationMessage(
+ m_textTitle->GetValue(),
+ m_textMessage->GetValue(),
+ this);
+
+#if defined(__WXMSW__) && wxUSE_TASKBARICON
+ if ( m_useTaskbar->GetValue() )
+ {
+ if ( !m_taskbarIcon )
+ {
+ m_taskbarIcon = new wxTaskBarIcon();
+ m_taskbarIcon->SetIcon(reinterpret_cast(GetParent())->GetIcon(),
+ "Dialogs Sample (Persistent)");
+ }
+ wxNotificationMessage::UseTaskBarIcon(m_taskbarIcon);
+ }
+ else
+ if ( m_taskbarIcon )
+ {
+ wxNotificationMessage::UseTaskBarIcon(NULL);
+ delete m_taskbarIcon;
+ m_taskbarIcon = NULL;
+ }
+#endif
+ }
+
+ switch (m_icons->GetSelection())
+ {
+ case Icon_Default:
+ // Don't call SetFlags or SetIcon to see the implementations default
+ break;
+ case Icon_None:
+ m_notif->SetFlags(0);
+ break;
+ case Icon_Info:
+ m_notif->SetFlags(wxICON_INFORMATION);
+ break;
+ case Icon_Warning:
+ m_notif->SetFlags(wxICON_WARNING);
+ break;
+ case Icon_Error:
+ m_notif->SetFlags(wxICON_ERROR);
+ break;
+ case Icon_Custom:
+ m_notif->SetIcon(tip_xpm);
+ break;
+ }
+
+ int timeout;
+ switch (m_showTimeout->GetSelection())
+ {
+ case 1:
+ timeout = wxNotificationMessage::Timeout_Never;
+ break;
+ case 2:
+ timeout = 5;
+ break;
+ case 3:
+ timeout = 10;
+ break;
+ default:
+ timeout = wxNotificationMessage::Timeout_Auto;
+ break;
+ }
+
+ for (unsigned int i = 0; i < m_actionList->GetCount(); i++)
+ {
+ ActionInfo* ai = reinterpret_cast(m_actionList->GetClientObject(i));
+ if ( !m_notif->AddAction(ai->id, ai->customCaption) )
+ wxLogWarning("Could not add action: %s", m_actionList->GetString(i));
+ }
+
+ if ( m_handleEvents->GetValue() )
+ {
+ m_notif->Bind(wxEVT_NOTIFICATION_MESSAGE_ACTION, &TestNotificationMessageWindow::OnNotificationAction, this);
+ m_notif->Bind(wxEVT_NOTIFICATION_MESSAGE_CLICK, &TestNotificationMessageWindow::OnNotificationClicked, this);
+ m_notif->Bind(wxEVT_NOTIFICATION_MESSAGE_DISMISSED, &TestNotificationMessageWindow::OnNotificationDismissed, this);
+ }
+
+ m_notif->Show(timeout);
+
+ // Free the notification if we don't handle it's events
+ if ( !m_handleEvents->GetValue() )
+ {
+ // Notice that the notification remains shown even after the
+ // wxNotificationMessage object itself is destroyed so we can show simple
+ // notifications using temporary objects.
+ m_notif.reset();
+ ShowStatus("Showing notification, deleted object");
+ }
+ }
+
+ void OnShowClicked(wxCommandEvent& WXUNUSED(event))
+ {
+ DoShowNotification();
+ }
+
+ void OnCloseClicked(wxCommandEvent& WXUNUSED(event))
+ {
+ if ( m_notif )
+ m_notif->Close();
+ }
+
+ void OnActionAddClicked(wxCommandEvent& WXUNUSED(event))
+ {
+ wxWindowID actionId;
+ switch (m_actionChoice->GetSelection())
+ {
+ case 1:
+ actionId = wxID_CLOSE;
+ break;
+ case 2:
+ actionId = wxID_OK;
+ break;
+ case 3:
+ actionId = wxID_CANCEL;
+ break;
+ default:
+ actionId = wxID_DELETE;
+ break;
+ }
+
+ wxString actionCaption = m_actionCaption->GetValue();
+ wxString desc = m_actionChoice->GetStringSelection();
+ if ( !actionCaption.empty() )
+ desc += " (" + actionCaption + ")";
+ m_actionList->SetSelection( m_actionList->Append( desc, new ActionInfo(actionId, actionCaption) ) );
+ }
+
+ void OnActionRemoveClicked(wxCommandEvent& WXUNUSED(event))
+ {
+ int pos = m_actionList->GetSelection();
+ if ( pos != wxNOT_FOUND )
+ {
+ m_actionList->Delete(pos);
+ if ( pos > 0 && m_actionList->GetCount() > 0 )
+ m_actionList->SetSelection(pos - 1);
+ }
+ else
+ wxLogError("No action selected");
+ }
+
+ void OnNotificationClicked(wxCommandEvent& event)
+ {
+ ShowStatus("Notification was clicked");
+
+ Raise();
+
+ event.Skip();
+ }
+
+ void OnNotificationDismissed(wxCommandEvent& event)
+ {
+ ShowStatus("Notification was dismissed");
+
+ Raise();
+
+ event.Skip();
+ }
+
+ void OnNotificationAction(wxCommandEvent& event)
+ {
+ ShowStatus(wxString::Format("Selected %s action in notification", wxGetStockLabel(event.GetId(), 0)) );
+
+ event.Skip();
+ }
+
+ void ShowStatus(const wxString& text)
+ {
+ m_textStatus->SetLabelText(text);
+ }
+
+};
+
+void MyFrame::OnNotifMsg(wxCommandEvent& WXUNUSED(event))
{
- if ( !m_notifMsg )
+#ifdef __WXMSW__
+ // Try to enable toast notifications (available since Win8)
+ if ( !wxNotificationMessage::MSWUseToasts() )
{
- m_notifMsg = new wxNotificationMessage
- (
- "wxWidgets Manual Notification",
- "You can hide this notification from the menu",
- this
- );
+ wxLogDebug("Toast notifications not available.");
}
+#endif
- if ( !m_notifMsg->Show(wxNotificationMessage::Timeout_Never) )
- {
- wxLogStatus("Failed to show manual notification message");
- }
-}
-
-void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
-{
- if ( m_notifMsg && !m_notifMsg->Close() )
- {
- wxLogStatus("Failed to hide manual notification message");
- }
+ TestNotificationMessageWindow* dlg = new TestNotificationMessageWindow(this);
+ dlg->Show();
}
#endif // wxUSE_NOTIFICATION_MESSAGE
@@ -1955,8 +2307,6 @@ void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
#include "wx/richtooltip.h"
-#include "tip.xpm"
-
class RichTipDialog : public wxDialog
{
public:
@@ -2225,7 +2575,7 @@ TestDefaultActionDialog::TestDefaultActionDialog( wxWindow *parent ) :
main_sizer->Add( grid_sizer, 0, wxALL, 10 );
wxSizer *button_sizer = CreateSeparatedButtonSizer( wxOK|wxCANCEL );
- if (button_sizer)
+ if ( button_sizer )
main_sizer->Add( button_sizer, 0, wxALL|wxGROW, 5 );
SetSizerAndFit( main_sizer );
diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h
index c3f8b4cfda..e611a355db 100644
--- a/samples/dialogs/dialogs.h
+++ b/samples/dialogs/dialogs.h
@@ -485,9 +485,7 @@ public:
void OnRequestUserAttention(wxCommandEvent& event);
#if wxUSE_NOTIFICATION_MESSAGE
- void OnNotifMsgAuto(wxCommandEvent& event);
- void OnNotifMsgShow(wxCommandEvent& event);
- void OnNotifMsgHide(wxCommandEvent& event);
+ void OnNotifMsg(wxCommandEvent& event);
#endif // wxUSE_NOTIFICATION_MESSAGE
#if wxUSE_RICHTOOLTIP
@@ -517,10 +515,6 @@ private:
*m_dlgReplace;
#endif // wxUSE_FINDREPLDLG
-#if wxUSE_NOTIFICATION_MESSAGE
- wxNotificationMessage *m_notifMsg;
-#endif // wxUSE_NOTIFICATION_MESSAGE
-
wxColourData m_clrData;
// just a window which we use to show the effect of font/colours selection
@@ -612,9 +606,7 @@ enum
DIALOGS_FIND,
DIALOGS_REPLACE,
DIALOGS_REQUEST,
- DIALOGS_NOTIFY_AUTO,
- DIALOGS_NOTIFY_SHOW,
- DIALOGS_NOTIFY_HIDE,
+ DIALOGS_NOTIFY_MSG,
DIALOGS_RICHTIP_DIALOG,
DIALOGS_PROPERTY_SHEET,
DIALOGS_PROPERTY_SHEET_TOOLBOOK,
diff --git a/setup.h.in b/setup.h.in
index 439e42afa4..ee9d346573 100644
--- a/setup.h.in
+++ b/setup.h.in
@@ -653,6 +653,12 @@
#define wxUSE_ACTIVEX 0
+#if defined(_MSC_VER) && _MSC_VER >= 1700
+ #define wxUSE_WINRT 0
+#else
+ #define wxUSE_WINRT 0
+#endif
+
#define wxUSE_DC_CACHEING 0
#define wxUSE_WXDIB 0
diff --git a/src/common/notifmsgcmn.cpp b/src/common/notifmsgcmn.cpp
new file mode 100644
index 0000000000..10033b96f9
--- /dev/null
+++ b/src/common/notifmsgcmn.cpp
@@ -0,0 +1,103 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: src/common/notifmsgcmn.cpp
+// Purpose: wxNotificationMessageBase implementation
+// Author: Tobias Taschner
+// Created: 2015-08-04
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#if wxUSE_NOTIFICATION_MESSAGE
+
+#include "wx/notifmsg.h"
+
+#include "wx/private/notifmsg.h"
+
+#ifndef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+#include "wx/generic/private/notifmsg.h"
+#endif
+
+wxDEFINE_EVENT( wxEVT_NOTIFICATION_MESSAGE_CLICK, wxCommandEvent );
+wxDEFINE_EVENT( wxEVT_NOTIFICATION_MESSAGE_DISMISSED, wxCommandEvent );
+wxDEFINE_EVENT( wxEVT_NOTIFICATION_MESSAGE_ACTION, wxCommandEvent );
+
+// ----------------------------------------------------------------------------
+// wxNotificationMessageBase
+// ----------------------------------------------------------------------------
+
+wxNotificationMessageBase::~wxNotificationMessageBase()
+{
+ m_impl->Detach();
+}
+
+bool wxNotificationMessageBase::Show(int timeout)
+{
+ return m_impl->Show(timeout);
+}
+
+bool wxNotificationMessageBase::Close()
+{
+ return m_impl->Close();
+}
+
+void wxNotificationMessageBase::SetTitle(const wxString& title)
+{
+ m_impl->SetTitle(title);
+}
+
+void wxNotificationMessageBase::SetMessage(const wxString& message)
+{
+ m_impl->SetMessage(message);
+}
+
+void wxNotificationMessageBase::SetParent(wxWindow *parent)
+{
+ m_impl->SetParent(parent);
+}
+
+void wxNotificationMessageBase::SetFlags(int flags)
+{
+ wxASSERT_MSG(flags == wxICON_INFORMATION ||
+ flags == wxICON_WARNING || flags == wxICON_ERROR ||
+ flags == 0,
+ "Invalid icon flags specified");
+
+ m_impl->SetFlags(flags);
+}
+
+void wxNotificationMessageBase::SetIcon(const wxIcon& icon)
+{
+ m_impl->SetIcon(icon);
+}
+
+bool wxNotificationMessageBase::AddAction(wxWindowID actionid, const wxString &label)
+{
+ return m_impl->AddAction(actionid, label);
+}
+
+//
+// wxNotificationMessage
+//
+
+#ifndef wxHAS_NATIVE_NOTIFICATION_MESSAGE
+
+void wxNotificationMessage::Init()
+{
+ m_impl = new wxGenericNotificationMessageImpl(this);
+}
+
+#endif
+
+#endif // wxUSE_NOTIFICATION_MESSAGE
diff --git a/src/generic/notifmsgg.cpp b/src/generic/notifmsgg.cpp
index 3118c3be6a..26fd26593a 100644
--- a/src/generic/notifmsgg.cpp
+++ b/src/generic/notifmsgg.cpp
@@ -25,13 +25,16 @@
#if wxUSE_NOTIFICATION_MESSAGE
#ifndef WX_PRECOMP
- #include "wx/dialog.h"
- #include "wx/timer.h"
+ #include "wx/frame.h"
+ #include "wx/timer.h"
#include "wx/sizer.h"
#include "wx/statbmp.h"
+ #include "wx/settings.h"
+ #include "wx/panel.h"
#endif //WX_PRECOMP
#include "wx/artprov.h"
+#include "wx/bmpbuttn.h"
// even if the platform has the native implementation, we still normally want
// to use the generic one (unless it's totally unsuitable for the target UI)
@@ -41,93 +44,220 @@
// uses the generic version, the second inclusion will do no harm)
#include "wx/notifmsg.h"
#include "wx/generic/notifmsg.h"
+#include "wx/generic/private/notifmsg.h"
+#include "wx/display.h"
+#include "wx/textwrapper.h"
// ----------------------------------------------------------------------------
-// wxNotificationMessageDialog
+// wxNotificationMessageWindow
// ----------------------------------------------------------------------------
-class wxNotificationMessageDialog : public wxDialog
+class wxNotificationMessageWindow : public wxFrame
{
public:
- wxNotificationMessageDialog(wxWindow *parent,
- const wxString& text,
- int timeout,
- int flags);
+ wxNotificationMessageWindow(wxGenericNotificationMessageImpl* notificationImpl);
- void Set(wxWindow *parent,
- const wxString& text,
- int timeout,
- int flags);
+ virtual ~wxNotificationMessageWindow();
- bool IsAutomatic() const { return m_timer.IsRunning(); }
- void SetDeleteOnHide() { m_deleteOnHide = true; }
+ void Set(int timeout);
+
+ bool Hide();
+
+ void SetMessageTitle(const wxString& title);
+
+ void SetMessage(const wxString& message);
+
+ void SetMessageIcon(const wxIcon& icon);
+
+ bool AddAction(wxWindowID actionid, const wxString &label);
private:
void OnClose(wxCloseEvent& event);
void OnTimer(wxTimerEvent& event);
+ void OnNotificationClicked(wxMouseEvent& event);
+ void OnNotificationMouseEnter(wxMouseEvent& event);
+ void OnNotificationMouseLeave(wxMouseEvent& event);
+ void OnCloseClicked(wxCommandEvent& event);
+ void OnActionButtonClicked(wxCommandEvent& event);
- // if true, delete the dialog when it should disappear, otherwise just hide
- // it (initially false)
- bool m_deleteOnHide;
+ // Dialog elements
+ wxPanel* m_messagePanel;
+ wxStaticBitmap* m_messageBmp;
+ wxStaticText* m_messageText;
+ wxStaticText* m_messageTitle;
+ wxBitmapButton* m_closeBtn;
+ wxBoxSizer* m_buttonSizer;
- // timer which will hide this dialog when it expires, if it's not running
- // it means we were created without timeout
wxTimer m_timer;
+ int m_timeout;
+ long m_timeoutTargetTime;
+ int m_mouseActiveCount;
+ wxGenericNotificationMessageImpl* m_notificationImpl;
+
+ void PrepareNotificationControl(wxWindow* ctrl, bool handleClick = true);
+
+ static wxPoint ms_presentationPos;
+
+ static int ms_presentationDirection;
+
+ static wxVector ms_visibleNotifications;
+
+ static void AddVisibleNotification(wxNotificationMessageWindow* notif);
+
+ static void RemoveVisibleNotification(wxNotificationMessageWindow* notif);
+
+ static void ResizeAndFitVisibleNotifications();
wxDECLARE_EVENT_TABLE();
- wxDECLARE_NO_COPY_CLASS(wxNotificationMessageDialog);
+ wxDECLARE_NO_COPY_CLASS(wxNotificationMessageWindow);
};
+int wxNotificationMessageWindow::ms_presentationDirection = 0;
+wxPoint wxNotificationMessageWindow::ms_presentationPos = wxDefaultPosition;
+
// ============================================================================
-// wxNotificationMessageDialog implementation
+// wxNotificationMessageWindow implementation
// ============================================================================
-wxBEGIN_EVENT_TABLE(wxNotificationMessageDialog, wxDialog)
- EVT_CLOSE(wxNotificationMessageDialog::OnClose)
+wxBEGIN_EVENT_TABLE(wxNotificationMessageWindow, wxFrame)
+ EVT_CLOSE(wxNotificationMessageWindow::OnClose)
- EVT_TIMER(wxID_ANY, wxNotificationMessageDialog::OnTimer)
+ EVT_TIMER(wxID_ANY, wxNotificationMessageWindow::OnTimer)
wxEND_EVENT_TABLE()
-wxNotificationMessageDialog::wxNotificationMessageDialog(wxWindow *parent,
- const wxString& text,
- int timeout,
- int flags)
- : wxDialog(parent, wxID_ANY, _("Notice"),
- wxDefaultPosition, wxDefaultSize,
- 0 /* no caption, no border styles */),
- m_timer(this)
-{
- m_deleteOnHide = false;
+wxVector wxNotificationMessageWindow::ms_visibleNotifications;
- Set(parent, text, timeout, flags);
+wxNotificationMessageWindow::wxNotificationMessageWindow(wxGenericNotificationMessageImpl* notificationImpl)
+ : wxFrame(NULL, wxID_ANY, _("Notice"),
+ wxDefaultPosition, wxDefaultSize,
+ wxBORDER_NONE | wxFRAME_TOOL_WINDOW | wxSTAY_ON_TOP /* no caption, no border styles */),
+ m_timer(this),
+ m_mouseActiveCount(0),
+ m_notificationImpl(notificationImpl)
+{
+ m_buttonSizer = NULL;
+
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW));
+
+ m_messagePanel = new wxPanel(this, wxID_ANY);
+ wxSizer * const msgSizer = new wxBoxSizer(wxHORIZONTAL);
+ m_messagePanel->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ m_messagePanel->SetSizer(msgSizer);
+ PrepareNotificationControl(m_messagePanel);
+
+ // Add message icon to layout
+ m_messageBmp = new wxStaticBitmap
+ (
+ m_messagePanel,
+ wxID_ANY,
+ wxArtProvider::GetMessageBoxIcon(wxICON_INFORMATION)
+ );
+ m_messageBmp->Hide();
+ PrepareNotificationControl(m_messageBmp);
+ msgSizer->Add(m_messageBmp, wxSizerFlags().Centre().DoubleBorder());
+
+ // Create title and message sizers
+ wxSizer* textSizer = new wxBoxSizer(wxVERTICAL);
+
+ m_messageTitle = new wxStaticText(m_messagePanel, wxID_ANY, wxString());
+ m_messageTitle->SetFont(m_messageTitle->GetFont().MakeBold());
+ textSizer->Add(m_messageTitle, wxSizerFlags(0).Border());
+ m_messageTitle->Hide();
+ PrepareNotificationControl(m_messageTitle);
+
+ m_messageText = new wxStaticText(m_messagePanel, wxID_ANY, wxString());
+ textSizer->Add(m_messageText, wxSizerFlags(0).Border(wxLEFT | wxRIGHT | wxBOTTOM));
+ PrepareNotificationControl(m_messageText);
+
+ msgSizer->Add(textSizer, wxSizerFlags(1).Center());
+
+ // Add a single close button if no actions are specified
+ m_closeBtn = wxBitmapButton::NewCloseButton(m_messagePanel, wxID_ANY);
+ msgSizer->Add(m_closeBtn, wxSizerFlags(0).Border(wxALL, 3).Top());
+ m_closeBtn->Bind(wxEVT_BUTTON, &wxNotificationMessageWindow::OnCloseClicked, this);
+ PrepareNotificationControl(m_closeBtn, false);
+
+ wxSizer * const sizerTop = new wxBoxSizer(wxHORIZONTAL);
+ sizerTop->Add(m_messagePanel, wxSizerFlags().Border(wxALL, FromDIP(1)));
+ SetSizer(sizerTop);
}
-void
-wxNotificationMessageDialog::Set(wxWindow * WXUNUSED(parent),
- const wxString& text,
- int timeout,
- int flags)
+wxNotificationMessageWindow::~wxNotificationMessageWindow()
{
- wxSizer * const sizerTop = new wxBoxSizer(wxHORIZONTAL);
- if ( flags & wxICON_MASK )
+ RemoveVisibleNotification(this);
+}
+
+void wxNotificationMessageWindow::PrepareNotificationControl(wxWindow* ctrl, bool handleClick)
+{
+ ctrl->Bind(wxEVT_ENTER_WINDOW, &wxNotificationMessageWindow::OnNotificationMouseEnter, this);
+ ctrl->Bind(wxEVT_LEAVE_WINDOW, &wxNotificationMessageWindow::OnNotificationMouseLeave, this);
+
+ if ( handleClick )
+ ctrl->Bind(wxEVT_LEFT_DOWN, &wxNotificationMessageWindow::OnNotificationClicked, this);
+}
+
+void wxNotificationMessageWindow::SetMessageTitle(const wxString& title)
+{
+ m_messageTitle->SetLabelText(title);
+ m_messageTitle->Show(!title.empty());
+}
+
+void wxNotificationMessageWindow::SetMessage(const wxString& message)
+{
+ m_messageText->SetLabelText(message);
+ m_messageText->Show(!message.empty());
+}
+
+void wxNotificationMessageWindow::SetMessageIcon(const wxIcon& icon)
+{
+ m_messageBmp->SetBitmap(icon);
+ m_messageBmp->Show(icon.IsOk());
+}
+
+bool wxNotificationMessageWindow::AddAction(wxWindowID actionid, const wxString &label)
+{
+ wxSizer* msgSizer = m_messagePanel->GetSizer();
+ if ( m_buttonSizer == NULL )
{
- sizerTop->Add(new wxStaticBitmap
- (
- this,
- wxID_ANY,
- wxArtProvider::GetMessageBoxIcon(flags)
- ),
- wxSizerFlags().Centre().Border());
+ msgSizer->Detach(m_closeBtn);
+ m_closeBtn->Hide();
+ m_buttonSizer = new wxBoxSizer(wxVERTICAL);
+ msgSizer->Add(m_buttonSizer, wxSizerFlags(0).Center().Border());
}
- sizerTop->Add(CreateTextSizer(text), wxSizerFlags(1).Border());
- SetSizerAndFit(sizerTop);
+ wxButton* actionButton = new wxButton(m_messagePanel, actionid, label);
+ actionButton->Bind(wxEVT_BUTTON, &wxNotificationMessageWindow::OnActionButtonClicked, this);
+ PrepareNotificationControl(actionButton, false);
+ int borderDir = (m_buttonSizer->GetChildren().empty()) ? 0 : wxTOP;
+ m_buttonSizer->Add(actionButton, wxSizerFlags(0).Border(borderDir).Expand());
+
+ return true;
+}
+
+
+bool wxNotificationMessageWindow::Hide()
+{
+ if ( m_timer.IsRunning() )
+ m_timer.Stop();
+
+ RemoveVisibleNotification(this);
+ return wxFrame::HideWithEffect(wxSHOW_EFFECT_BLEND);
+}
+
+void wxNotificationMessageWindow::Set(int timeout)
+{
+ Layout();
+ Fit();
+
+ AddVisibleNotification(this);
if ( timeout != wxGenericNotificationMessage::Timeout_Never )
{
// wxTimer uses ms, timeout is in seconds
- m_timer.Start(timeout*1000, true /* one shot only */);
+ m_timer.Start(500);
+ m_timeout = timeout;
+ m_timeoutTargetTime = wxGetUTCTime() + timeout;
}
else if ( m_timer.IsRunning() )
{
@@ -135,102 +265,263 @@ wxNotificationMessageDialog::Set(wxWindow * WXUNUSED(parent),
}
}
-void wxNotificationMessageDialog::OnClose(wxCloseEvent& event)
+void wxNotificationMessageWindow::OnClose(wxCloseEvent& WXUNUSED(event))
{
- if ( m_deleteOnHide )
- {
- // we don't need to keep this dialog alive any more
- Destroy();
- }
- else // don't really close, just hide, as we can be shown again later
- {
- event.Veto();
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_DISMISSED);
+ m_notificationImpl->ProcessNotificationEvent(evt);
- Hide();
+ if ( m_timer.IsRunning() )
+ m_timer.Stop();
+
+ m_notificationImpl->Close();
+}
+
+void wxNotificationMessageWindow::OnTimer(wxTimerEvent& WXUNUSED(event))
+{
+ if ( m_mouseActiveCount > 0 )
+ {
+ m_timeoutTargetTime = wxGetUTCTime() + m_timeout;
+ }
+ else if ( m_timeoutTargetTime != -1 &&
+ wxGetUTCTime() >= m_timeoutTargetTime )
+ {
+ m_notificationImpl->Close();
}
}
-void wxNotificationMessageDialog::OnTimer(wxTimerEvent& WXUNUSED(event))
+void wxNotificationMessageWindow::OnNotificationClicked(wxMouseEvent& WXUNUSED(event))
{
- if ( m_deleteOnHide )
- Destroy();
- else
- Hide();
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_CLICK);
+ m_notificationImpl->ProcessNotificationEvent(evt);
+
+ m_notificationImpl->Close();
+}
+
+void wxNotificationMessageWindow::OnNotificationMouseEnter(wxMouseEvent& WXUNUSED(event))
+{
+ m_mouseActiveCount++;
+}
+
+void wxNotificationMessageWindow::OnNotificationMouseLeave(wxMouseEvent& WXUNUSED(event))
+{
+ m_mouseActiveCount--;
+}
+
+void wxNotificationMessageWindow::OnCloseClicked(wxCommandEvent& WXUNUSED(event))
+{
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_DISMISSED);
+ m_notificationImpl->ProcessNotificationEvent(evt);
+
+ m_notificationImpl->Close();
+}
+
+void wxNotificationMessageWindow::OnActionButtonClicked(wxCommandEvent& event)
+{
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_ACTION, event.GetId());
+ m_notificationImpl->ProcessNotificationEvent(evt);
+
+ m_notificationImpl->Close();
+}
+
+void wxNotificationMessageWindow::AddVisibleNotification(wxNotificationMessageWindow* notif)
+{
+ bool found = false;
+ for ( wxVector::iterator it = ms_visibleNotifications.begin();
+ it != ms_visibleNotifications.end(); it++ )
+ {
+ if ( *it == notif )
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if ( !found )
+ ms_visibleNotifications.push_back(notif);
+
+ ResizeAndFitVisibleNotifications();
+}
+
+void wxNotificationMessageWindow::RemoveVisibleNotification(wxNotificationMessageWindow* notif)
+{
+ for ( wxVector::iterator it = ms_visibleNotifications.begin();
+ it != ms_visibleNotifications.end(); it++ )
+ {
+ if ( *it == notif )
+ {
+ ms_visibleNotifications.erase(it);
+ break;
+ }
+ }
+ ResizeAndFitVisibleNotifications();
+}
+
+void wxNotificationMessageWindow::ResizeAndFitVisibleNotifications()
+{
+ if ( ms_presentationDirection == 0 )
+ {
+ // Determine presentation position
+
+ wxDisplay display;
+ wxRect clientArea = display.GetClientArea();
+ wxRect geom = display.GetGeometry();
+ if ( clientArea.y > 0 ) // Taskbar is at top
+ {
+ ms_presentationDirection = 1;
+ ms_presentationPos = clientArea.GetTopRight();
+ }
+ else if ( clientArea.GetHeight() != geom.GetHeight() ) // Taskbar at bottom
+ {
+ ms_presentationDirection = -1;
+ ms_presentationPos = clientArea.GetBottomRight();
+ }
+ else // Default to upper right screen corner with some padding
+ {
+ ms_presentationDirection = 1;
+ ms_presentationPos.x = geom.GetWidth() - 30;
+ ms_presentationPos.y = 30;
+ }
+ }
+
+ int maxWidth = -1;
+
+ // Determine max width
+ for (wxVector::iterator notif = ms_visibleNotifications.begin();
+ notif != ms_visibleNotifications.end(); ++notif)
+ {
+ wxSize notifSize = (*notif)->GetSize();
+ if ( notifSize.GetWidth() > maxWidth )
+ maxWidth = notifSize.GetWidth();
+ }
+
+ int notifPadding = 2;
+
+ wxPoint presentPos = ms_presentationPos;
+ presentPos.x -= notifPadding + maxWidth;
+
+ int prevNotifHeight = 0;
+
+ for (wxVector::iterator notif = ms_visibleNotifications.begin();
+ notif != ms_visibleNotifications.end(); ++notif)
+ {
+ // Modify existing maxwidth
+ wxSize notifSize = (*notif)->GetSize();
+ if ( notifSize.GetWidth() < maxWidth )
+ {
+ notifSize.SetWidth(maxWidth);
+ (*notif)->SetSize(notifSize);
+ (*notif)->Layout();
+ }
+
+ if ( ms_presentationDirection > 0 )
+ {
+ presentPos.y += (notifPadding + prevNotifHeight);
+ prevNotifHeight = notifSize.GetHeight();
+ }
+ else
+ {
+ presentPos.y -= (notifPadding + notifSize.GetHeight());
+ }
+
+ (*notif)->SetPosition(presentPos);
+ }
}
// ============================================================================
// wxGenericNotificationMessage implementation
// ============================================================================
-int wxGenericNotificationMessage::ms_timeout = 10;
-
/* static */ void wxGenericNotificationMessage::SetDefaultTimeout(int timeout)
{
- wxASSERT_MSG( timeout > 0,
- "negative or zero default timeout doesn't make sense" );
-
- ms_timeout = timeout;
+ wxGenericNotificationMessageImpl::SetDefaultTimeout(timeout);
}
void wxGenericNotificationMessage::Init()
{
- m_dialog = NULL;
+ m_impl = new wxGenericNotificationMessageImpl(this);
}
-wxGenericNotificationMessage::~wxGenericNotificationMessage()
+// ----------------------------------------------------------------------------
+// wxGenericNotificationMessageImpl
+// ----------------------------------------------------------------------------
+
+int wxGenericNotificationMessageImpl::ms_timeout = 3;
+
+wxGenericNotificationMessageImpl::wxGenericNotificationMessageImpl(wxNotificationMessageBase* notification) :
+ wxNotificationMessageImpl(notification)
{
- if ( m_dialog->IsAutomatic() )
- {
- // we want to allow the user to create an automatically hidden
- // notification just by creating a local wxGenericNotificationMessage object
- // and so we shouldn't hide the notification when this object goes out
- // of scope
- m_dialog->SetDeleteOnHide();
- }
- else // manual dialog, hide it immediately
- {
- // OTOH for permanently shown dialogs only the code can hide them and
- // if the object is deleted, we must do it now as it won't be
- // accessible programmatically any more
- delete m_dialog;
- }
+ m_window = new wxNotificationMessageWindow(this);
}
-bool wxGenericNotificationMessage::Show(int timeout)
+wxGenericNotificationMessageImpl::~wxGenericNotificationMessageImpl()
{
- if ( timeout == Timeout_Auto )
+ m_window->Destroy();
+}
+
+/* static */ void wxGenericNotificationMessageImpl::SetDefaultTimeout(int timeout)
+{
+ wxASSERT_MSG(timeout > 0,
+ "negative or zero default timeout doesn't make sense");
+
+ ms_timeout = timeout;
+}
+
+bool wxGenericNotificationMessageImpl::Show(int timeout)
+{
+ if ( timeout == wxNotificationMessageBase::Timeout_Auto )
{
timeout = GetDefaultTimeout();
}
- if ( !m_dialog )
- {
- m_dialog = new wxNotificationMessageDialog
- (
- GetParent(),
- GetFullMessage(),
- timeout,
- GetFlags()
- );
- }
- else // update the existing dialog
- {
- m_dialog->Set(GetParent(), GetFullMessage(), timeout, GetFlags());
- }
+ SetActive(true);
+ m_window->Set(timeout);
- m_dialog->Show();
+ m_window->ShowWithEffect(wxSHOW_EFFECT_BLEND);
return true;
}
-bool wxGenericNotificationMessage::Close()
+bool wxGenericNotificationMessageImpl::Close()
{
- if ( !m_dialog )
+ if ( !m_window )
return false;
- m_dialog->Hide();
+ m_window->Hide();
+
+ SetActive(false);
return true;
}
+void wxGenericNotificationMessageImpl::SetTitle(const wxString& title)
+{
+ m_window->SetMessageTitle(title);
+}
+
+void wxGenericNotificationMessageImpl::SetMessage(const wxString& message)
+{
+ m_window->SetMessage(message);
+}
+
+void wxGenericNotificationMessageImpl::SetParent(wxWindow *WXUNUSED(parent))
+{
+
+}
+
+void wxGenericNotificationMessageImpl::SetFlags(int flags)
+{
+ m_window->SetMessageIcon( wxArtProvider::GetMessageBoxIcon(flags) );
+}
+
+void wxGenericNotificationMessageImpl::SetIcon(const wxIcon& icon)
+{
+ m_window->SetMessageIcon(icon);
+}
+
+bool wxGenericNotificationMessageImpl::AddAction(wxWindowID actionid, const wxString &label)
+{
+ return m_window->AddAction(actionid, label);
+}
+
+
#endif // wxUSE_NOTIFICATION_MESSAGE
diff --git a/src/gtk/notifmsg.cpp b/src/gtk/notifmsg.cpp
index 63670ee2a5..6f59041ad9 100644
--- a/src/gtk/notifmsg.cpp
+++ b/src/gtk/notifmsg.cpp
@@ -1,10 +1,10 @@
///////////////////////////////////////////////////////////////////////////////
-// Name: src/gtk/notifmsg.cpp
-// Purpose: wxNotificationMessage for wxGTK using libnotify.
-// Author: Vadim Zeitlin
-// Created: 2012-07-25
-// Copyright: (c) 2012 Vadim Zeitlin
-// Licence: wxWindows licence
+// Name: src/gtk/notifmsg.cpp
+// Purpose: wxNotificationMessage for wxGTK using libnotify.
+// Author: Vadim Zeitlin
+// Created: 2012-07-25
+// Copyright: (c) 2012 Vadim Zeitlin
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
@@ -28,11 +28,14 @@
#ifndef WX_PRECOMP
#include "wx/app.h"
+ #include "wx/icon.h"
#endif // WX_PRECOMP
#include
#include "wx/module.h"
+#include "wx/private/notifmsg.h"
+#include
// General note about error handling: as notifications are meant to be
// non-intrusive, we use wxLogDebug() and not wxLogError() if anything goes
@@ -82,136 +85,290 @@ wxIMPLEMENT_DYNAMIC_CLASS(wxLibnotifyModule, wxModule);
// wxNotificationMessage implementation
// ============================================================================
-bool wxNotificationMessage::GTKSetIconName(const wxString& name)
-{
- m_iconName = name;
+class wxLibNotifyMsgImpl;
- return true;
+void wxLibNotifyMsgImplActionCallback(NotifyNotification *notification,
+ char *action,
+ gpointer user_data);
+
+extern "C" {
+static gboolean closed_notification(NotifyNotification *notification,
+ const char* WXUNUSED(data), void* user_data);
}
-bool wxNotificationMessage::Show(int timeout)
+class wxLibNotifyMsgImpl : public wxNotificationMessageImpl
{
- if ( !wxLibnotifyModule::Initialize() )
- return false;
-
- // Determine the GTK+ icon to use from flags and also set the urgency
- // appropriately.
- const char* icon;
- NotifyUrgency urgency;
- switch ( GetFlags() )
+public:
+ wxLibNotifyMsgImpl(wxNotificationMessageBase* notification) :
+ wxNotificationMessageImpl(notification),
+ m_notification(NULL),
+ m_flags(wxICON_INFORMATION)
{
- case wxICON_INFORMATION:
- icon = "dialog-information";
- urgency = NOTIFY_URGENCY_LOW;
- break;
+ if ( !wxLibnotifyModule::Initialize() )
+ wxLogError(_("Could not initalize libnotify."));
+
+ }
- case wxICON_WARNING:
- icon = "dialog-warning";
- urgency = NOTIFY_URGENCY_NORMAL;
- break;
-
- case wxICON_ERROR:
- icon = "dialog-error";
- urgency = NOTIFY_URGENCY_CRITICAL;
- break;
-
- default:
- wxFAIL_MSG( "Unknown notification message flags." );
+ virtual ~wxLibNotifyMsgImpl()
+ {
+ if ( m_notification )
+ g_object_unref(m_notification);
+ }
+
+ bool CreateOrUpdateNotification()
+ {
+ if ( !wxLibnotifyModule::Initialize() )
return false;
- }
- // Explicitly specified icon name overrides the implicit one determined by
- // the flags.
- wxScopedCharBuffer buf;
- if ( !m_iconName.empty() )
- {
- buf = m_iconName.utf8_str();
- icon = buf;
- }
+ // Determine the GTK+ icon to use from flags and also set the urgency
+ // appropriately.
+ const char* icon;
+ switch ( m_flags )
+ {
+ case wxICON_INFORMATION:
+ icon = "dialog-information";
+ break;
- // Create the notification or update an existing one if we had already been
- // shown before.
- if ( !m_notification )
- {
- m_notification = notify_notification_new
- (
- GetTitle().utf8_str(),
- GetMessage().utf8_str(),
- icon
-#if !wxUSE_LIBNOTIFY_0_7
- // There used to be an "associated window"
- // parameter in this function but it has
- // disappeared by 0.7, so use it for previous
- // versions only.
- , 0
-#endif // libnotify < 0.7
- );
+ case wxICON_WARNING:
+ icon = "dialog-warning";
+ break;
+
+ case wxICON_ERROR:
+ icon = "dialog-error";
+ break;
+
+ default:
+ wxFAIL_MSG( "Unknown notification message flags." );
+ return false;
+ }
+
+ // Create the notification or update an existing one if we had already been
+ // shown before.
if ( !m_notification )
{
- wxLogDebug("Failed to creation notification.");
+ m_notification = notify_notification_new
+ (
+ m_title.utf8_str(),
+ m_message.utf8_str(),
+ icon
+#if !wxUSE_LIBNOTIFY_0_7
+ // There used to be an "associated window"
+ // parameter in this function but it has
+ // disappeared by 0.7, so use it for previous
+ // versions only.
+ , 0
+#endif // libnotify < 0.7
+ );
+ if ( !m_notification )
+ {
+ wxLogDebug("Failed to creation notification.");
+
+ return false;
+ }
+
+
+ g_signal_connect(m_notification, "closed", G_CALLBACK(closed_notification), this);
+
+ }
+ else
+ {
+ if ( !notify_notification_update
+ (
+ m_notification,
+ m_title.utf8_str(),
+ m_message.utf8_str(),
+ icon
+ ) )
+ {
+ wxLogDebug(wxS("notify_notification_update() unexpectedly failed."));
+ }
+ }
+
+ // Explicitly specified icon name overrides the implicit one determined by
+ // the flags.
+ if ( m_icon.IsOk() )
+ {
+#ifdef __WXGTK3__
+ notify_notification_set_image_from_pixbuf(
+ m_notification,
+ m_icon.GetPixbufNoMask()
+ );
+#endif
+ }
+
+ return true;
+ }
+
+ virtual bool Show(int timeout) wxOVERRIDE
+ {
+ if ( !CreateOrUpdateNotification() )
+ return false;
+
+ // Set the notification parameters not specified during creation.
+ notify_notification_set_timeout
+ (
+ m_notification,
+ timeout == wxNotificationMessage::Timeout_Auto ? NOTIFY_EXPIRES_DEFAULT
+ : timeout == wxNotificationMessage::Timeout_Never ? NOTIFY_EXPIRES_NEVER
+ : 1000*timeout
+ );
+
+ NotifyUrgency urgency;
+ switch ( m_flags )
+ {
+ case wxICON_INFORMATION:
+ urgency = NOTIFY_URGENCY_LOW;
+ break;
+
+ case wxICON_WARNING:
+ urgency = NOTIFY_URGENCY_NORMAL;
+ break;
+
+ case wxICON_ERROR:
+ urgency = NOTIFY_URGENCY_CRITICAL;
+ break;
+
+ default:
+ wxFAIL_MSG( "Unknown notification message flags." );
+ return false;
+ }
+ notify_notification_set_urgency(m_notification, urgency);
+
+
+ // Finally do show the notification.
+ wxGtkError error;
+ if ( !notify_notification_show(m_notification, error.Out()) )
+ {
+ wxLogDebug("Failed to shown notification: %s", error.GetMessage());
return false;
}
+
+ return true;
}
- else
+
+ virtual bool Close() wxOVERRIDE
{
- if ( !notify_notification_update
- (
- m_notification,
- GetTitle().utf8_str(),
- GetMessage().utf8_str(),
- icon
- ) )
+ wxCHECK_MSG( m_notification, false,
+ wxS("Can't close not shown notification.") );
+
+ wxGtkError error;
+ if ( !notify_notification_close(m_notification, error.Out()) )
{
- wxLogDebug(wxS("notify_notification_update() unexpectedly failed."));
+ wxLogDebug("Failed to hide notification: %s", error.GetMessage());
+
+ return false;
}
+
+ return true;
}
-
-
- // Set the notification parameters not specified during creation.
- notify_notification_set_timeout
- (
- m_notification,
- timeout == Timeout_Auto ? NOTIFY_EXPIRES_DEFAULT
- : timeout == Timeout_Never ? NOTIFY_EXPIRES_NEVER
- : 1000*timeout
- );
-
- notify_notification_set_urgency(m_notification, urgency);
-
-
- // Finally do show the notification.
- wxGtkError error;
- if ( !notify_notification_show(m_notification, error.Out()) )
+
+ virtual void SetTitle(const wxString& title) wxOVERRIDE
{
- wxLogDebug("Failed to shown notification: %s", error.GetMessage());
-
- return false;
+ m_title = title;
}
+
+ virtual void SetMessage(const wxString& message) wxOVERRIDE
+ {
+ m_message = message;
+ }
+
+ virtual void SetParent(wxWindow *WXUNUSED(parent)) wxOVERRIDE
+ {
+ }
+
+ virtual void SetFlags(int flags) wxOVERRIDE
+ {
+ m_flags = flags;
+ }
+
+ virtual void SetIcon(const wxIcon& icon) wxOVERRIDE
+ {
+ m_icon = icon;
+ CreateOrUpdateNotification();
+ }
+
+ virtual bool AddAction(wxWindowID actionid, const wxString &label)
+ {
+ if ( !CreateOrUpdateNotification() )
+ return false;
+
+ wxString labelStr = label;
+ if ( labelStr.empty() )
+ labelStr = wxGetStockLabel(actionid, wxSTOCK_NOFLAGS);
+
+ notify_notification_add_action
+ (
+ m_notification,
+ wxString::Format("%d", actionid).utf8_str(),
+ labelStr.utf8_str(),
+ &wxLibNotifyMsgImplActionCallback,
+ this,
+ NULL
+ );
+
+ return true;
+ }
+
+ void NotifyClose(int closeReason)
+ {
+ // Values according to the OpenDesktop specification at:
+ // https://developer.gnome.org/notification-spec/
+
+ switch (closeReason)
+ {
+ case 1: // Expired
+ case 2: // The notification was dismissed by the user.
+ {
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_DISMISSED);
+ ProcessNotificationEvent(evt);
+ break;
+ }
+ }
+
+ }
+
+ void NotifyAction(wxWindowID actionid)
+ {
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_ACTION, actionid);
+ ProcessNotificationEvent(evt);
+ }
+
+private:
+ NotifyNotification* m_notification;
+ wxString m_title;
+ wxString m_message;
+ wxIcon m_icon;
+ int m_flags;
+};
- return true;
+void wxLibNotifyMsgImplActionCallback(NotifyNotification *WXUNUSED(notification),
+ char *action,
+ gpointer user_data)
+{
+ wxLibNotifyMsgImpl* impl = (wxLibNotifyMsgImpl*) user_data;
+
+ impl->NotifyAction(wxAtoi(action));
}
-bool wxNotificationMessage::Close()
+extern "C" {
+static gboolean closed_notification(NotifyNotification *notification,
+ const char* WXUNUSED(data), void* user_data)
{
- wxCHECK_MSG( m_notification, false,
- wxS("Can't close not shown notification.") );
-
- wxGtkError error;
- if ( !notify_notification_close(m_notification, error.Out()) )
- {
- wxLogDebug("Failed to hide notification: %s", error.GetMessage());
-
- return false;
- }
-
+ wxLibNotifyMsgImpl* impl = (wxLibNotifyMsgImpl*) user_data;
+ gint closeReason = notify_notification_get_closed_reason(notification);
+ impl->NotifyClose(closeReason);
return true;
}
+}
-wxNotificationMessage::~wxNotificationMessage()
+// ----------------------------------------------------------------------------
+// wxNotificationMessage
+// ----------------------------------------------------------------------------
+
+void wxNotificationMessage::Init()
{
- if ( m_notification )
- g_object_unref(m_notification);
+ m_impl = new wxLibNotifyMsgImpl(this);
}
#endif // wxUSE_NOTIFICATION_MESSAGE && wxUSE_LIBNOTIFY
diff --git a/src/msw/notifmsg.cpp b/src/msw/notifmsg.cpp
index d25e9ab5fe..72c415c812 100644
--- a/src/msw/notifmsg.cpp
+++ b/src/msw/notifmsg.cpp
@@ -33,9 +33,11 @@
#include "wx/toplevel.h"
#include "wx/app.h"
#include "wx/string.h"
+ #include "wx/app.h"
#endif // WX_PRECOMP
-#include "wx/generic/notifmsg.h"
+#include "wx/private/notifmsg.h"
+#include "wx/msw/rt/private/notifmsg.h"
#include "wx/taskbar.h"
@@ -43,69 +45,62 @@
// different implementations used by wxNotificationMessage
// ----------------------------------------------------------------------------
-// base class for all available implementations
-class wxNotifMsgImpl
-{
-public:
- wxNotifMsgImpl() { }
- virtual ~wxNotifMsgImpl() { }
-
- virtual bool DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags) = 0;
- virtual bool DoClose() = 0;
-
-private:
- wxDECLARE_NO_COPY_CLASS(wxNotifMsgImpl);
-};
-
-// implementation which is simply a bridge to wxGenericNotificationMessage
-class wxGenericNotifMsgImpl : public wxNotifMsgImpl
-{
-public:
- wxGenericNotifMsgImpl() : m_notif(new wxGenericNotificationMessage) { }
- virtual ~wxGenericNotifMsgImpl() { delete m_notif; }
-
- virtual bool DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags)
- {
- m_notif->SetTitle(title);
- m_notif->SetMessage(message);
- m_notif->SetFlags(flags);
- return m_notif->Show(timeout);
- }
-
- virtual bool DoClose()
- {
- return m_notif->Close();
- }
-
-private:
- wxGenericNotificationMessage * const m_notif;
-};
-
-// common base class for implementations using a taskbar icon and balloons
-class wxBalloonNotifMsgImpl : public wxNotifMsgImpl
+// implementations using a taskbar icon and balloons
+class wxBalloonNotifMsgImpl : public wxNotificationMessageImpl
{
public:
// Ctor creates the associated taskbar icon (using the icon of the top
// level parent of the given window) unless UseTaskBarIcon() had been
// previously called which can be used to show an attached balloon later
// by the derived classes.
- wxBalloonNotifMsgImpl(wxWindow *win) { SetUpIcon(win); }
+ wxBalloonNotifMsgImpl(wxNotificationMessageBase* notification) :
+ wxNotificationMessageImpl(notification),
+ m_flags(0),
+ m_parent(NULL)
+ {
+
+ }
+
+ virtual ~wxBalloonNotifMsgImpl();
+
+ virtual bool Show(int timeout) wxOVERRIDE;
+
+ virtual bool Close() wxOVERRIDE;
+
+ virtual void SetTitle(const wxString& title) wxOVERRIDE
+ {
+ m_title = title;
+ }
+
+ virtual void SetMessage(const wxString& message) wxOVERRIDE
+ {
+ m_message = message;
+ }
+
+ virtual void SetParent(wxWindow *parent) wxOVERRIDE
+ {
+ m_parent = parent;
+ }
+
+ virtual void SetFlags(int flags) wxOVERRIDE
+ {
+ m_flags = flags;
+ }
+
+ virtual void SetIcon(const wxIcon& icon) wxOVERRIDE
+ {
+ m_icon = icon;
+ }
+
+ virtual bool AddAction(wxWindowID WXUNUSED(actionid), const wxString &WXUNUSED(label))
+ {
+ // Actions are not supported in balloon notifications
+ return false;
+ }
// implementation of wxNotificationMessage method with the same name
static wxTaskBarIcon *UseTaskBarIcon(wxTaskBarIcon *icon);
- virtual bool DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags);
-
-
// Returns true if we're using our own icon or false if we're hitching a
// ride on the application icon provided to us via UseTaskBarIcon().
static bool IsUsingOwnIcon()
@@ -124,7 +119,7 @@ public:
wxASSERT_MSG( ms_refCountIcon != -1,
wxS("Must not be called when not using own icon") );
- if ( !--ms_refCountIcon )
+ if ( ms_refCountIcon > 0 && !--ms_refCountIcon )
{
delete ms_icon;
ms_icon = NULL;
@@ -152,117 +147,25 @@ protected:
// the icon is only destroyed when it reaches 0.
static wxTaskBarIcon *ms_icon;
static int ms_refCountIcon;
-};
-
-// implementation for automatically hidden notifications
-class wxAutoNotifMsgImpl : public wxBalloonNotifMsgImpl
-{
-public:
- wxAutoNotifMsgImpl(wxWindow *win);
-
- virtual bool DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags);
-
- // can't close automatic notification [currently]
- virtual bool DoClose() { return false; }
-};
-
-// implementation for manually closed notifications
-class wxManualNotifMsgImpl : public wxBalloonNotifMsgImpl
-{
-public:
- wxManualNotifMsgImpl(wxWindow *win);
- virtual ~wxManualNotifMsgImpl();
-
- virtual bool DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags);
- virtual bool DoClose();
-
private:
- // store ctor parameter as we need it to recreate the icon later if we're
- // closed and shown again
- wxWindow * const m_win;
-};
+ wxString m_title;
+ wxString m_message;
+ int m_flags;
+ wxIcon m_icon;
+ wxWindow* m_parent;
-// ----------------------------------------------------------------------------
-// custom event handler for task bar icons
-// ----------------------------------------------------------------------------
-
-// normally we'd just use a custom taskbar icon class but this is impossible
-// because we can be asked to attach the notifications to an existing icon
-// which we didn't create, hence we install a special event handler allowing us
-// to get the events we need (and, crucially, to delete the icon when it's not
-// needed any more) in any case
-
-class wxNotificationIconEvtHandler : public wxEvtHandler
-{
-public:
- wxNotificationIconEvtHandler(wxTaskBarIcon *icon);
-
-private:
void OnTimeout(wxTaskBarIconEvent& event);
void OnClick(wxTaskBarIconEvent& event);
void OnIconHidden();
-
-
- wxTaskBarIcon * const m_icon;
-
- wxDECLARE_NO_COPY_CLASS(wxNotificationIconEvtHandler);
};
+// ----------------------------------------------------------------------------
+
// ============================================================================
// implementation
// ============================================================================
-// ----------------------------------------------------------------------------
-// wxNotificationIconEvtHandler
-// ----------------------------------------------------------------------------
-
-wxNotificationIconEvtHandler::wxNotificationIconEvtHandler(wxTaskBarIcon *icon)
- : m_icon(icon)
-{
- m_icon->Connect
- (
- wxEVT_TASKBAR_BALLOON_TIMEOUT,
- wxTaskBarIconEventHandler(wxNotificationIconEvtHandler::OnTimeout),
- NULL,
- this
- );
-
- m_icon->Connect
- (
- wxEVT_TASKBAR_BALLOON_CLICK,
- wxTaskBarIconEventHandler(wxNotificationIconEvtHandler::OnClick),
- NULL,
- this
- );
-}
-
-void wxNotificationIconEvtHandler::OnIconHidden()
-{
- wxBalloonNotifMsgImpl::ReleaseIcon();
-
- delete this;
-}
-
-void
-wxNotificationIconEvtHandler::OnTimeout(wxTaskBarIconEvent& WXUNUSED(event))
-{
- OnIconHidden();
-}
-
-void wxNotificationIconEvtHandler::OnClick(wxTaskBarIconEvent& WXUNUSED(event))
-{
- // TODO: generate an event notifying the user code?
-
- OnIconHidden();
-}
-
// ----------------------------------------------------------------------------
// wxBalloonNotifMsgImpl
// ----------------------------------------------------------------------------
@@ -282,6 +185,39 @@ wxTaskBarIcon *wxBalloonNotifMsgImpl::UseTaskBarIcon(wxTaskBarIcon *icon)
return iconOld;
}
+wxBalloonNotifMsgImpl::~wxBalloonNotifMsgImpl()
+{
+}
+
+void wxBalloonNotifMsgImpl::OnIconHidden()
+{
+ SetActive(false);
+ if ( ms_icon )
+ {
+ ms_icon->Unbind(wxEVT_TASKBAR_BALLOON_CLICK, &wxBalloonNotifMsgImpl::OnClick, this);
+ ms_icon->Unbind(wxEVT_TASKBAR_BALLOON_TIMEOUT, &wxBalloonNotifMsgImpl::OnTimeout, this);
+ }
+
+ if ( IsUsingOwnIcon() )
+ wxBalloonNotifMsgImpl::ReleaseIcon();
+}
+
+void wxBalloonNotifMsgImpl::OnTimeout(wxTaskBarIconEvent& WXUNUSED(event))
+{
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_DISMISSED);
+ ProcessNotificationEvent(evt);
+
+ OnIconHidden();
+}
+
+void wxBalloonNotifMsgImpl::OnClick(wxTaskBarIconEvent& WXUNUSED(event))
+{
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_CLICK);
+ ProcessNotificationEvent(evt);
+
+ OnIconHidden();
+}
+
void wxBalloonNotifMsgImpl::SetUpIcon(wxWindow *win)
{
if ( ms_icon )
@@ -322,12 +258,15 @@ void wxBalloonNotifMsgImpl::SetUpIcon(wxWindow *win)
}
}
-bool
-wxBalloonNotifMsgImpl::DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags)
+bool
+wxBalloonNotifMsgImpl::Show(int timeout)
{
+ // timout active event
+ wxTaskBarIconEvent event(wxEVT_TASKBAR_BALLOON_TIMEOUT, ms_icon);
+ OnTimeout(event);
+
+ SetUpIcon(m_parent);
+
if ( !ms_icon->IsIconInstalled() )
{
// If we failed to install the icon (which does happen sometimes,
@@ -346,54 +285,40 @@ wxBalloonNotifMsgImpl::DoShow(const wxString& title,
return false;
}
+ // Since Windows Vista timeout is ignored so this values are only for XP
+ if ( timeout == wxNotificationMessage::Timeout_Auto )
+ {
+ // choose a value more or less in the middle of the allowed range
+ timeout = 1;
+ }
+ else if ( timeout == wxNotificationMessage::Timeout_Never )
+ {
+ // use maximal (in Windows XP) timeout (but it will still
+ // disappear on its own)
+ timeout = 30;
+ }
+
timeout *= 1000; // Windows expresses timeout in milliseconds
- return ms_icon->ShowBalloon(title, message, timeout, flags);
-}
-
-// ----------------------------------------------------------------------------
-// wxManualNotifMsgImpl
-// ----------------------------------------------------------------------------
-
-wxManualNotifMsgImpl::wxManualNotifMsgImpl(wxWindow *win)
- : wxBalloonNotifMsgImpl(win),
- m_win(win)
-{
-}
-
-wxManualNotifMsgImpl::~wxManualNotifMsgImpl()
-{
- if ( ms_icon )
- DoClose();
-}
-
-bool
-wxManualNotifMsgImpl::DoShow(const wxString& title,
- const wxString& message,
- int WXUNUSED_UNLESS_DEBUG(timeout),
- int flags)
-{
- wxASSERT_MSG( timeout == wxNotificationMessage::Timeout_Never,
- wxT("shouldn't be used") );
-
- // base class creates the icon for us initially but we could have destroyed
- // it in DoClose(), recreate it if this was the case
- if ( !ms_icon )
- SetUpIcon(m_win);
-
- // use maximal (in current Windows versions) timeout (but it will still
- // disappear on its own)
- return wxBalloonNotifMsgImpl::DoShow(title, message, 30, flags);
-}
-
-bool wxManualNotifMsgImpl::DoClose()
-{
- if ( IsUsingOwnIcon() )
+ bool res = ms_icon->ShowBalloon(m_title, m_message, timeout, m_flags, m_icon);
+ if ( res )
{
- // we don't need the icon any more
- ReleaseIcon();
+ ms_icon->Bind(wxEVT_TASKBAR_BALLOON_CLICK, &wxBalloonNotifMsgImpl::OnClick, this);
+ ms_icon->Bind(wxEVT_TASKBAR_BALLOON_TIMEOUT, &wxBalloonNotifMsgImpl::OnTimeout, this);
+ SetActive(true);
}
- else // using an existing icon
+
+ return res;
+}
+
+bool wxBalloonNotifMsgImpl::Close()
+{
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_DISMISSED);
+ ProcessNotificationEvent(evt);
+
+ OnIconHidden();
+
+ if ( !IsUsingOwnIcon() && ms_icon )
{
// just hide the balloon
ms_icon->ShowBalloon("", "");
@@ -402,84 +327,29 @@ bool wxManualNotifMsgImpl::DoClose()
return true;
}
-// ----------------------------------------------------------------------------
-// wxAutoNotifMsgImpl
-// ----------------------------------------------------------------------------
-
-wxAutoNotifMsgImpl::wxAutoNotifMsgImpl(wxWindow *win)
- : wxBalloonNotifMsgImpl(win)
-{
- if ( ms_refCountIcon != -1 )
- {
- // This object will self-destruct and decrease the ref count of the
- // icon when the notification is hidden.
- new wxNotificationIconEvtHandler(ms_icon);
- }
-}
-
-bool
-wxAutoNotifMsgImpl::DoShow(const wxString& title,
- const wxString& message,
- int timeout,
- int flags)
-{
- wxASSERT_MSG( timeout != wxNotificationMessage::Timeout_Never,
- wxT("shouldn't be used") );
-
- if ( timeout == wxNotificationMessage::Timeout_Auto )
- {
- // choose a value more or less in the middle of the allowed range
- timeout = 1;
- }
-
- return wxBalloonNotifMsgImpl::DoShow(title, message, timeout, flags);
-}
-
// ----------------------------------------------------------------------------
// wxNotificationMessage
// ----------------------------------------------------------------------------
-/* static */
-bool wxNotificationMessage::ms_alwaysUseGeneric = false;
-
/* static */
wxTaskBarIcon *wxNotificationMessage::UseTaskBarIcon(wxTaskBarIcon *icon)
{
return wxBalloonNotifMsgImpl::UseTaskBarIcon(icon);
}
-bool wxNotificationMessage::Show(int timeout)
+bool wxNotificationMessage::MSWUseToasts(
+ const wxString& shortcutPath,
+ const wxString& appId)
{
- if ( !m_impl )
- {
- if ( !ms_alwaysUseGeneric )
- {
- if ( timeout == Timeout_Never )
- m_impl = new wxManualNotifMsgImpl(GetParent());
- else
- m_impl = new wxAutoNotifMsgImpl(GetParent());
- }
- else // no support for balloon tooltips
- {
- m_impl = new wxGenericNotifMsgImpl;
- }
- }
- //else: reuse the same implementation for the subsequent calls, it would
- // be too confusing if it changed
-
- return m_impl->DoShow(GetTitle(), GetMessage(), timeout, GetFlags());
+ return wxToastNotificationHelper::UseToasts(shortcutPath, appId);
}
-bool wxNotificationMessage::Close()
+void wxNotificationMessage::Init()
{
- wxCHECK_MSG( m_impl, false, "must show the notification first" );
-
- return m_impl->DoClose();
-}
-
-wxNotificationMessage::~wxNotificationMessage()
-{
- delete m_impl;
+ if ( wxToastNotificationHelper::IsEnabled() )
+ m_impl = wxToastNotificationHelper::CreateInstance(this);
+ else
+ m_impl = new wxBalloonNotifMsgImpl(this);
}
#endif // wxUSE_NOTIFICATION_MESSAGE && wxUSE_TASKBARICON
diff --git a/src/msw/rt/notifmsgrt.cpp b/src/msw/rt/notifmsgrt.cpp
new file mode 100644
index 0000000000..1d2808d685
--- /dev/null
+++ b/src/msw/rt/notifmsgrt.cpp
@@ -0,0 +1,545 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name: src/msw/notifmsgrt.cpp
+// Purpose: WinRT implementation of wxNotificationMessageImpl
+// Author: Tobias Taschner
+// Created: 2015-09-13
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+ #include "wx/string.h"
+#endif // WX_PRECOMP
+
+#include "wx/msw/rt/private/notifmsg.h"
+
+#if wxUSE_NOTIFICATION_MESSAGE && wxUSE_WINRT
+#include "wx/notifmsg.h"
+#include "wx/msw/rt/utils.h"
+#include "wx/msw/private/comptr.h"
+#include "wx/msw/wrapshl.h"
+#include "wx/msw/ole/oleutils.h"
+
+#include "wx/filename.h"
+#include "wx/stdpaths.h"
+
+#include
+#include
+#include
+#include
+#include
+
+using namespace ABI::Windows::UI::Notifications;
+using namespace ABI::Windows::Data::Xml::Dom;
+
+namespace rt = wxWinRT;
+
+typedef ABI::Windows::Foundation::ITypedEventHandler DesktopToastActivatedEventHandler;
+typedef ABI::Windows::Foundation::ITypedEventHandler DesktopToastDismissedEventHandler;
+typedef ABI::Windows::Foundation::ITypedEventHandler DesktopToastFailedEventHandler;
+
+class wxToastNotifMsgImpl;
+
+class wxToastEventHandler :
+ public Microsoft::WRL::Implements
+{
+public:
+ wxToastEventHandler(wxToastNotifMsgImpl* toastImpl) :
+ m_impl(toastImpl)
+ {
+
+ }
+
+ void Detach()
+ {
+ m_impl = NULL;
+ }
+
+ // DesktopToastActivatedEventHandler
+ IFACEMETHODIMP Invoke(IToastNotification *sender, IInspectable* args);
+
+ // DesktopToastDismissedEventHandler
+ IFACEMETHODIMP Invoke(IToastNotification *sender, IToastDismissedEventArgs *e);
+
+ // DesktopToastFailedEventHandler
+ IFACEMETHODIMP Invoke(IToastNotification *sender, IToastFailedEventArgs *e);
+
+ // IUnknown
+ IFACEMETHODIMP_(ULONG) AddRef()
+ {
+ return ++m_cRef;
+ }
+
+ IFACEMETHODIMP_(ULONG) Release()
+ {
+ if ( --m_cRef == wxAutoULong(0) )
+ {
+ delete this;
+ return 0;
+ }
+ else
+ return m_cRef;
+ }
+
+ IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv)
+ {
+ if ( IsEqualIID(riid, IID_IUnknown) )
+ *ppv = static_cast(static_cast(this));
+ else if ( IsEqualIID(riid, __uuidof(DesktopToastActivatedEventHandler)) )
+ *ppv = static_cast(this);
+ else if ( IsEqualIID(riid, __uuidof(DesktopToastDismissedEventHandler)) )
+ *ppv = static_cast(this);
+ else if ( IsEqualIID(riid, __uuidof(DesktopToastFailedEventHandler)) )
+ *ppv = static_cast(this);
+ else
+ *ppv = NULL;
+
+ if ( *ppv )
+ {
+ reinterpret_cast(*ppv)->AddRef();
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+ }
+
+private:
+ wxAutoULong m_cRef;
+
+ wxToastNotifMsgImpl* m_impl;
+};
+
+class wxToastNotifMsgImpl : public wxNotificationMessageImpl
+{
+public:
+ wxToastNotifMsgImpl(wxNotificationMessageBase* notification) :
+ wxNotificationMessageImpl(notification),
+ m_toastEventHandler(NULL)
+ {
+
+ }
+
+ virtual ~wxToastNotifMsgImpl()
+ {
+ if ( m_toastEventHandler )
+ m_toastEventHandler->Detach();
+ }
+
+ virtual bool Show(int WXUNUSED(timeout)) wxOVERRIDE
+ {
+ wxCOMPtr toastXml;
+ HRESULT hr = CreateToastXML(&toastXml);
+ if ( SUCCEEDED(hr) )
+ {
+ hr = CreateToast(toastXml);
+ }
+
+ return SUCCEEDED(hr);
+ }
+
+ virtual bool Close() wxOVERRIDE
+ {
+ if ( m_notifier.get() && m_toast.get() )
+ {
+ bool success = SUCCEEDED(m_notifier->Hide(m_toast));
+ ReleaseToast();
+ return success;
+ }
+ else
+ return false;
+ }
+
+ virtual void SetTitle(const wxString& title) wxOVERRIDE
+ {
+ m_title = title;
+ }
+
+ virtual void SetMessage(const wxString& message) wxOVERRIDE
+ {
+ m_message = message;
+ }
+
+ virtual void SetParent(wxWindow *WXUNUSED(parent)) wxOVERRIDE
+ {
+
+ }
+
+ virtual void SetFlags(int WXUNUSED(flags)) wxOVERRIDE
+ {
+
+ }
+
+ virtual void SetIcon(const wxIcon& WXUNUSED(icon)) wxOVERRIDE
+ {
+ // Icon would have to be saved to disk (temporarily?)
+ // to be used as a file:// url in the notifications XML
+ }
+
+ virtual bool AddAction(wxWindowID WXUNUSED(actionid), const wxString &WXUNUSED(label)) wxOVERRIDE
+ {
+ return false;
+ }
+
+ void ReleaseToast()
+ {
+ if ( m_toastEventHandler )
+ m_toastEventHandler->Detach();
+ m_notifier = NULL;
+ m_toast = NULL;
+ }
+
+ HRESULT CreateToast(IXmlDocument *xml)
+ {
+ HRESULT hr = ms_toastMgr->CreateToastNotifierWithId(rt::TempStringRef::Make(ms_appId), &m_notifier);
+ if ( SUCCEEDED(hr) )
+ {
+ wxCOMPtr factory;
+ hr = rt::GetActivationFactory(RuntimeClass_Windows_UI_Notifications_ToastNotification,
+ IID_IToastNotificationFactory, reinterpret_cast(&factory));
+ if ( SUCCEEDED(hr) )
+ {
+ hr = factory->CreateToastNotification(xml, &m_toast);
+ if ( SUCCEEDED(hr) )
+ {
+ // Register the event handlers
+ EventRegistrationToken activatedToken, dismissedToken, failedToken;
+ m_toastEventHandler = new wxToastEventHandler(this);
+ wxCOMPtr eventHandler(m_toastEventHandler);
+
+ hr = m_toast->add_Activated(eventHandler, &activatedToken);
+ if ( SUCCEEDED(hr) )
+ {
+ hr = m_toast->add_Dismissed(eventHandler, &dismissedToken);
+ if ( SUCCEEDED(hr) )
+ {
+ hr = m_toast->add_Failed(eventHandler, &failedToken);
+ if ( SUCCEEDED(hr) )
+ {
+ hr = m_notifier->Show(m_toast);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if ( FAILED(hr) )
+ ReleaseToast();
+
+ return hr;
+ }
+
+ HRESULT CreateToastXML(IXmlDocument** toastXml) const
+ {
+ HRESULT hr = ms_toastMgr->GetTemplateContent(ToastTemplateType_ToastText02, toastXml);
+ if ( SUCCEEDED(hr) )
+ {
+ wxCOMPtr nodeList;
+ hr = (*toastXml)->GetElementsByTagName(rt::TempStringRef::Make("text"), &nodeList);
+ if ( SUCCEEDED(hr) )
+ {
+ hr = SetNodeListValueString(0, m_title, nodeList, *toastXml);
+ if ( SUCCEEDED(hr) )
+ hr = SetNodeListValueString(1, m_message, nodeList, *toastXml);
+ }
+ }
+
+ return hr;
+ }
+
+ static HRESULT SetNodeListValueString(UINT32 index, const wxString& str, IXmlNodeList* nodeList, IXmlDocument *toastXml)
+ {
+ wxCOMPtr textNode;
+ // Set title node
+ HRESULT hr = nodeList->Item(index, &textNode);
+ if ( SUCCEEDED(hr) )
+ {
+ hr = SetNodeValueString(str, textNode, toastXml);
+ }
+
+ return hr;
+ }
+
+ static HRESULT SetNodeValueString(const wxString& str, IXmlNode *node, IXmlDocument *xml)
+ {
+ wxCOMPtr inputText;
+
+ HRESULT hr = xml->CreateTextNode(rt::TempStringRef::Make(str), &inputText);
+ if ( SUCCEEDED(hr) )
+ {
+ wxCOMPtr inputTextNode;
+
+ hr = inputText->QueryInterface(IID_IXmlNode, reinterpret_cast(&inputTextNode));
+ if ( SUCCEEDED(hr) )
+ {
+ wxCOMPtr pAppendedChild;
+ hr = node->AppendChild(inputTextNode, &pAppendedChild);
+ }
+ }
+
+ return hr;
+ }
+
+ static bool IsEnabled()
+ {
+ return ms_enabled;
+ }
+
+ static wxString BuildAppId()
+ {
+ // Build a Application User Model IDs based on app info
+ wxString vendorId = wxTheApp->GetVendorName();
+ if ( vendorId.empty() )
+ vendorId = "wxWidgetsApp";
+ wxString appId = vendorId + "." + wxTheApp->GetAppName();
+ // Remove potential spaces
+ appId.Replace(" ", "", true);
+ return appId;
+ }
+
+ static bool CheckShortcut(const wxFileName& filename)
+ {
+ // Prepare interfaces
+ wxCOMPtr shellLink;
+ if ( FAILED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+ IID_IShellLinkW, reinterpret_cast(&shellLink))) )
+ return false;
+ wxCOMPtr persistFile;
+ if ( FAILED(shellLink->QueryInterface(IID_IPersistFile, reinterpret_cast(&persistFile))) )
+ return false;
+ wxCOMPtr propertyStore;
+ if ( FAILED(shellLink->QueryInterface(IID_IPropertyStore, reinterpret_cast(&propertyStore))) )
+ return false;
+
+ bool writeShortcut = false;
+
+ if ( filename.Exists() )
+ {
+ // Check existing shortcut for application id
+ if ( SUCCEEDED(persistFile->Load(filename.GetFullPath().wc_str(), 0)) )
+ {
+ PROPVARIANT appIdPropVar;
+ if ( SUCCEEDED(propertyStore->GetValue(PKEY_AppUserModel_ID, &appIdPropVar)) )
+ {
+ wxString appId;
+ if ( appIdPropVar.vt == VT_LPWSTR )
+ appId = appIdPropVar.pwszVal;
+ if ( appId.empty() || (!ms_appId.empty() && ms_appId != appId) )
+ {
+ // Update shortcut if app id does not match or is empty
+ writeShortcut = true;
+ }
+ else if ( ms_appId.empty() )
+ {
+ // Use if no app id has been set
+ ms_appId = appId;
+ }
+ }
+ }
+ else
+ return false;
+ }
+ else
+ {
+ // Create new shortcut
+ if ( FAILED(shellLink->SetPath(wxStandardPaths::Get().GetExecutablePath().wc_str())) )
+ return false;
+ if ( FAILED(shellLink->SetArguments(L"")) )
+ return false;
+
+ writeShortcut = true;
+ }
+
+ if ( writeShortcut )
+ {
+ if ( ms_appId.empty() )
+ ms_appId = BuildAppId();
+
+ // Set application id in shortcut
+ PROPVARIANT appIdPropVar;
+ if ( FAILED(InitPropVariantFromString(ms_appId.wc_str(), &appIdPropVar)) )
+ return false;
+ if ( FAILED(propertyStore->SetValue(PKEY_AppUserModel_ID, appIdPropVar)) )
+ return false;
+ if ( FAILED(propertyStore->Commit()) )
+ return false;
+ if ( FAILED(persistFile->Save(filename.GetFullPath().wc_str(), TRUE)) )
+ return false;
+ }
+
+ return true;
+ }
+
+ static bool UseToasts(
+ const wxString& shortcutPath,
+ const wxString& appId)
+ {
+ ms_enabled = false;
+
+ // WinRT runtime is required (available since Win8)
+ if ( !rt::IsAvailable() )
+ return false;
+
+ // Toast notification manager has to be available
+ if ( ms_toastStaticsInitialized == -1 )
+ {
+ if ( SUCCEEDED(rt::GetActivationFactory(RuntimeClass_Windows_UI_Notifications_ToastNotificationManager,
+ IID_IToastNotificationManagerStatics, reinterpret_cast(&ms_toastMgr))) )
+ {
+ ms_toastStaticsInitialized = 1;
+ }
+ else
+ ms_toastStaticsInitialized = 0;
+ }
+
+ if ( ms_toastStaticsInitialized != 1 )
+ return false;
+
+ // Build/complete shortcut path
+ wxFileName shortcutFilename(shortcutPath);
+ if ( !shortcutFilename.HasName() )
+ shortcutFilename.SetName(wxTheApp->GetAppDisplayName());
+ if ( !shortcutFilename.HasExt() )
+ shortcutFilename.SetExt("lnk");
+ if ( shortcutFilename.IsRelative() )
+ shortcutFilename.MakeAbsolute(wxStandardPaths::MSWGetShellDir(CSIDL_STARTMENU));
+
+ ms_appId = appId;
+
+ if ( CheckShortcut(shortcutFilename) )
+ ms_enabled = true;
+
+ return ms_enabled;
+ }
+
+ static void Uninitalize()
+ {
+ if (ms_toastStaticsInitialized == 1)
+ {
+ ms_toastMgr = NULL;
+ ms_toastStaticsInitialized = -1;
+ }
+ }
+
+private:
+ wxString m_title;
+ wxString m_message;
+ wxCOMPtr m_notifier;
+ wxCOMPtr m_toast;
+ wxToastEventHandler* m_toastEventHandler;
+
+ static bool ms_enabled;
+ static wxString ms_appId;
+ static int ms_toastStaticsInitialized;
+ static wxCOMPtr ms_toastMgr;
+
+ friend class wxToastEventHandler;
+};
+
+bool wxToastNotifMsgImpl::ms_enabled = false;
+int wxToastNotifMsgImpl::ms_toastStaticsInitialized = -1;
+wxString wxToastNotifMsgImpl::ms_appId;
+wxCOMPtr wxToastNotifMsgImpl::ms_toastMgr;
+
+HRESULT wxToastEventHandler::Invoke(
+ IToastNotification *WXUNUSED(sender),
+ IInspectable *WXUNUSED(args))
+{
+ if ( m_impl )
+ {
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_CLICK);
+ m_impl->ProcessNotificationEvent(evt);
+ }
+
+ return S_OK;
+}
+
+HRESULT wxToastEventHandler::Invoke(
+ IToastNotification *WXUNUSED(sender),
+ IToastDismissedEventArgs *WXUNUSED(e))
+{
+ if ( m_impl )
+ {
+ wxCommandEvent evt(wxEVT_NOTIFICATION_MESSAGE_DISMISSED);
+ m_impl->ProcessNotificationEvent(evt);
+ }
+
+ return S_OK;
+}
+
+HRESULT wxToastEventHandler::Invoke(IToastNotification *WXUNUSED(sender),
+ IToastFailedEventArgs *WXUNUSED(e))
+{
+ //TODO: Handle toast failed event
+ return S_OK;
+}
+
+//
+// wxToastNotifMsgModule
+//
+
+class wxToastNotifMsgModule : public wxModule
+{
+public:
+ wxToastNotifMsgModule()
+ {
+ }
+
+ virtual bool OnInit() wxOVERRIDE
+ {
+ return true;
+ }
+
+ virtual void OnExit() wxOVERRIDE
+ {
+ wxToastNotifMsgImpl::Uninitalize();
+ }
+
+private:
+ wxDECLARE_DYNAMIC_CLASS(wxToastNotifMsgModule);
+};
+
+wxIMPLEMENT_DYNAMIC_CLASS(wxToastNotifMsgModule, wxModule);
+
+#endif // wxUSE_NOTIFICATION_MESSAGE && wxUSE_WINRT
+
+//
+// wxToastNotificationHelper
+//
+
+bool wxToastNotificationHelper::UseToasts(const wxString& shortcutPath,
+ const wxString& appId)
+{
+#if wxUSE_NOTIFICATION_MESSAGE && wxUSE_WINRT
+ return wxToastNotifMsgImpl::UseToasts(shortcutPath, appId);
+#else
+ wxUnusedVar(shortcutPath);
+ wxUnusedVar(appId);
+ return false;
+#endif
+}
+
+bool wxToastNotificationHelper::IsEnabled()
+{
+#if wxUSE_NOTIFICATION_MESSAGE && wxUSE_WINRT
+ return wxToastNotifMsgImpl::IsEnabled();
+#else
+ return false;
+#endif
+}
+
+wxNotificationMessageImpl* wxToastNotificationHelper::CreateInstance(wxNotificationMessageBase* notification)
+{
+#if wxUSE_NOTIFICATION_MESSAGE && wxUSE_WINRT
+ return new wxToastNotifMsgImpl(notification);
+#else
+ wxUnusedVar(notification);
+ return NULL;
+#endif
+}
diff --git a/src/msw/rt/utilsrt.cpp b/src/msw/rt/utilsrt.cpp
new file mode 100644
index 0000000000..ecc12be979
--- /dev/null
+++ b/src/msw/rt/utilsrt.cpp
@@ -0,0 +1,259 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: src/msw/rt/utilsrt.cpp
+// Purpose: Windows Runtime Objects helper functions and objects
+// Author: Tobias Taschner
+// Created: 2015-09-05
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// Declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if defined(__BORLANDC__)
+#pragma hdrstop
+#endif
+
+#include "wx/msw/rt/utils.h"
+
+#if wxUSE_WINRT
+
+#include
+
+#include "wx/dynlib.h"
+#include "wx/utils.h"
+#include "wx/module.h"
+
+// Core function typedefs
+typedef HRESULT (__stdcall *PFNWXROINITIALIZE)(RO_INIT_TYPE initType);
+typedef void (__stdcall *PFNWXROUNINITIALIZE)();
+typedef HRESULT (__stdcall *PFNWXROGETACTIVATIONFACTORY)(
+ HSTRING activatableClassId, REFIID iid, void ** factory);
+
+// String function typedefs
+typedef HRESULT (__stdcall *PFNWXWINDOWSCREATESTRINGREFERENCE)(
+ PCWSTR sourceString,
+ UINT32 length,
+ HSTRING_HEADER * hstringHeader,
+ HSTRING * string
+);
+typedef HRESULT (__stdcall *PFNWXWINDOWSDELETESTRING)(HSTRING string);
+
+namespace wxWinRT
+{
+
+//
+// RTCore
+//
+
+class RTCore
+{
+public:
+ static RTCore& Get()
+ {
+ if ( ms_isAvailable == -1 )
+ {
+ if ( !ms_rtcore.Initialize() )
+ {
+ ms_isAvailable = 0;
+ }
+ else
+ ms_isAvailable = 1;
+ }
+
+ return ms_rtcore;
+ }
+
+ static bool IsAvailable()
+ {
+ if (ms_isAvailable == -1)
+ Get();
+
+ return (ms_isAvailable == 1);
+ }
+
+ PFNWXROINITIALIZE RoInitialize;
+ PFNWXROUNINITIALIZE RoUninitialize;
+ PFNWXROGETACTIVATIONFACTORY RoGetActivationFactory;
+ PFNWXWINDOWSCREATESTRINGREFERENCE WindowsCreateStringReference;
+ PFNWXWINDOWSDELETESTRING WindowsDeleteString;
+
+ bool Initialize()
+ {
+#define RESOLVE_RT_FUNCTION(dll, type, funcname) \
+ funcname = (type)dll.GetSymbol(wxT(#funcname)); \
+ if ( !funcname ) \
+ return false
+
+#define RESOLVE_RTCORE_FUNCTION(type, funcname) \
+ RESOLVE_RT_FUNCTION(m_dllCore, type, funcname)
+
+#define RESOLVE_RTSTRING_FUNCTION(type, funcname) \
+ RESOLVE_RT_FUNCTION(m_dllString, type, funcname)
+
+ // WinRT is only available in Windows 8 or newer
+ if (!wxCheckOsVersion(6, 2))
+ return false;
+
+ // Initialize core functions
+ if (!m_dllCore.Load("api-ms-win-core-winrt-l1-1-0.dll"))
+ return false;
+
+ RESOLVE_RTCORE_FUNCTION(PFNWXROINITIALIZE, RoInitialize);
+ RESOLVE_RTCORE_FUNCTION(PFNWXROUNINITIALIZE, RoUninitialize);
+ RESOLVE_RTCORE_FUNCTION(PFNWXROGETACTIVATIONFACTORY, RoGetActivationFactory);
+
+ // Initialize string functions
+ if (!m_dllString.Load("api-ms-win-core-winrt-string-l1-1-0.dll"))
+ return false;
+
+ RESOLVE_RTSTRING_FUNCTION(PFNWXWINDOWSCREATESTRINGREFERENCE, WindowsCreateStringReference);
+ RESOLVE_RTSTRING_FUNCTION(PFNWXWINDOWSDELETESTRING, WindowsDeleteString);
+
+ return true;
+
+#undef RESOLVE_RT_FUNCTION
+#undef RESOLVE_RTCORE_FUNCTION
+#undef RESOLVE_RTSTRING_FUNCTION
+ }
+
+ void UnloadModules()
+ {
+ m_dllCore.Unload();
+ m_dllString.Unload();
+ }
+
+ static void Uninitalize()
+ {
+ if (ms_isAvailable == 1)
+ {
+ Get().UnloadModules();
+ ms_isAvailable = -1;
+ }
+ }
+
+private:
+ RTCore()
+ {
+
+ }
+
+ wxDynamicLibrary m_dllCore;
+ wxDynamicLibrary m_dllString;
+
+ static RTCore ms_rtcore;
+ static int ms_isAvailable;
+
+ wxDECLARE_NO_COPY_CLASS(RTCore);
+};
+
+RTCore RTCore::ms_rtcore;
+int RTCore::ms_isAvailable = -1;
+
+//
+// wxWinRT::TempStringRef
+//
+
+const TempStringRef TempStringRef::Make(const wxString &str)
+{
+ return TempStringRef(str);
+}
+
+TempStringRef::TempStringRef(const wxString &str)
+{
+ if ( !RTCore::IsAvailable() )
+ wxLogDebug("Can not create string reference without WinRT");
+
+ // This creates a fast-pass string which must not be deleted using WindowsDeleteString
+ HRESULT hr = RTCore::Get().WindowsCreateStringReference(
+ str.wc_str(), str.length(),
+ &m_header, &m_hstring);
+ if ( FAILED(hr) )
+ wxLogDebug("Could not create string reference %.8x", hr);
+}
+
+//
+// wrapper functions
+//
+
+bool IsAvailable()
+{
+ return RTCore::IsAvailable();
+}
+
+bool Initialize()
+{
+ if ( !RTCore::IsAvailable() )
+ return false;
+
+ HRESULT hr = RTCore::Get().RoInitialize(RO_INIT_SINGLETHREADED);
+ if ( FAILED(hr) )
+ {
+ wxLogDebug("RoInitialize failed %.8x", hr);
+ return false;
+ }
+ else
+ return true;
+}
+
+void Uninitialize()
+{
+ if ( !RTCore::IsAvailable() )
+ return;
+
+ RTCore::Get().RoUninitialize();
+}
+
+bool GetActivationFactory(const wxString& activatableClassId, REFIID iid, void ** factory)
+{
+ if ( !RTCore::IsAvailable() )
+ return false;
+
+ HRESULT hr = RTCore::Get().RoGetActivationFactory(TempStringRef::Make(activatableClassId), iid, factory);
+ if ( FAILED(hr) )
+ {
+ wxLogDebug("RoGetActivationFactory failed %.8x", hr);
+ return false;
+ }
+ else
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// Module ensuring all global/singleton objects are destroyed on shutdown.
+// ----------------------------------------------------------------------------
+
+class RTModule : public wxModule
+{
+public:
+ RTModule()
+ {
+ }
+
+ virtual bool OnInit() wxOVERRIDE
+ {
+ return true;
+ }
+
+ virtual void OnExit() wxOVERRIDE
+ {
+ RTCore::Uninitalize();
+ }
+
+private:
+ wxDECLARE_DYNAMIC_CLASS(RTModule);
+};
+
+wxIMPLEMENT_DYNAMIC_CLASS(RTModule, wxModule);
+
+} // namespace wxWinRT
+
+#endif // wxUSE_WINRT
diff --git a/src/msw/taskbar.cpp b/src/msw/taskbar.cpp
index a09cff9964..5d4e066993 100644
--- a/src/msw/taskbar.cpp
+++ b/src/msw/taskbar.cpp
@@ -30,6 +30,7 @@
#include
#include "wx/taskbar.h"
+#include "wx/platinfo.h"
#include "wx/msw/private.h"
#ifndef NIN_BALLOONTIMEOUT
@@ -109,13 +110,12 @@ struct NotifyIconData : public NOTIFYICONDATA
{
memset(this, 0, sizeof(NOTIFYICONDATA));
- // Do _not_ use sizeof(NOTIFYICONDATA) here, it may be too big if we're
- // compiled with newer headers but running on an older system and while
- // we could do complicated tests for the exact system version it's
- // easier to just use an old size which should be supported everywhere
- // from Windows 2000 up and which is all we need as we don't use any
- // newer features so far.
- cbSize = NOTIFYICONDATA_V2_SIZE;
+ // Since Vista there is a new member hBalloonIcon which will be used
+ // if a user specified icon is specified in ShowBalloon(). For XP
+ // use the old size
+ cbSize = wxPlatformInfo::Get().CheckOSVersion(6, 0)
+ ? sizeof(NOTIFYICONDATA)
+ : NOTIFYICONDATA_V2_SIZE;
hWnd = (HWND) hwnd;
uCallbackMessage = gs_msgTaskbar;
@@ -203,7 +203,8 @@ bool
wxTaskBarIcon::ShowBalloon(const wxString& title,
const wxString& text,
unsigned msec,
- int flags)
+ int flags,
+ const wxIcon& icon)
{
wxCHECK_MSG( m_iconAdded, false,
wxT("can't be used before the icon is created") );
@@ -229,6 +230,15 @@ wxTaskBarIcon::ShowBalloon(const wxString& title,
wxStrlcpy(notifyData.szInfoTitle, title.t_str(),
WXSIZEOF(notifyData.szInfoTitle));
+#ifdef NIIF_LARGE_ICON
+ // User specified icon is only supported since Vista
+ if ( icon.IsOk() && wxPlatformInfo::Get().CheckOSVersion(6, 0) )
+ {
+ notifyData.hBalloonIcon = GetHiconOf(icon);
+ notifyData.dwInfoFlags |= NIIF_USER | NIIF_LARGE_ICON;
+ }
+ else
+#endif
if ( flags & wxICON_INFORMATION )
notifyData.dwInfoFlags |= NIIF_INFO;
else if ( flags & wxICON_WARNING )
diff --git a/src/osx/cocoa/notifmsg.mm b/src/osx/cocoa/notifmsg.mm
new file mode 100644
index 0000000000..692efdaa4b
--- /dev/null
+++ b/src/osx/cocoa/notifmsg.mm
@@ -0,0 +1,254 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: src/osx/notifmsg.cpp
+// Purpose: implementation of wxNotificationMessage for OSX
+// Author: Tobias Taschner
+// Created: 2015-08-06
+// Copyright: (c) 2015 wxWidgets development team
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/notifmsg.h"
+
+#if wxUSE_NOTIFICATION_MESSAGE && defined(wxHAS_NATIVE_NOTIFICATION_MESSAGE)
+
+#ifndef WX_PRECOMP
+ #include "wx/string.h"
+#endif // WX_PRECOMP
+
+#include "wx/osx/private.h"
+#include "wx/generic/notifmsg.h"
+#include "wx/private/notifmsg.h"
+#include "wx/generic/private/notifmsg.h"
+#include "wx/timer.h"
+#include "wx/platinfo.h"
+#include "wx/artprov.h"
+#include "wx/vector.h"
+#include "wx/stockitem.h"
+
+#include "wx/utils.h"
+#include