implemented freedesktop.org spec support for GTK version of wxTaskBarIcon
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27544 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
63c5efa344
commit
33d4eef0b9
61
Makefile.in
61
Makefile.in
@ -822,6 +822,10 @@ CORELIB_OBJECTS = \
|
|||||||
$(__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_5) \
|
$(__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_5) \
|
||||||
$(__CORE_SRC_OBJECTS_3)
|
$(__CORE_SRC_OBJECTS_3)
|
||||||
CORELIB_ODEP = $(___pch_wxprec_corelib_wx_wxprec_h_gch___depname)
|
CORELIB_ODEP = $(___pch_wxprec_corelib_wx_wxprec_h_gch___depname)
|
||||||
|
ADVDLL_CFLAGS = $(__advdll_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
|
||||||
|
$(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \
|
||||||
|
$(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) -DWXUSINGDLL \
|
||||||
|
-DWXMAKINGDLL_ADV $(PIC_FLAG) $(CPPFLAGS) $(CFLAGS)
|
||||||
ADVDLL_CXXFLAGS = $(__advdll_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
|
ADVDLL_CXXFLAGS = $(__advdll_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
|
||||||
$(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \
|
$(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \
|
||||||
$(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) -DWXUSINGDLL \
|
$(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) -DWXUSINGDLL \
|
||||||
@ -840,6 +844,9 @@ ADVDLL_OBJECTS = \
|
|||||||
$(__ADVANCED_PLATFORM_SRC_OBJECTS_2) \
|
$(__ADVANCED_PLATFORM_SRC_OBJECTS_2) \
|
||||||
$(__PLUGIN_ADV_SRC_OBJECTS_2)
|
$(__PLUGIN_ADV_SRC_OBJECTS_2)
|
||||||
ADVDLL_ODEP = $(___pch_wxprec_advdll_wx_wxprec_h_gch___depname)
|
ADVDLL_ODEP = $(___pch_wxprec_advdll_wx_wxprec_h_gch___depname)
|
||||||
|
ADVLIB_CFLAGS = $(__advlib_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
|
||||||
|
$(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \
|
||||||
|
$(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) $(CPPFLAGS) $(CFLAGS)
|
||||||
ADVLIB_CXXFLAGS = $(__advlib_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
|
ADVLIB_CXXFLAGS = $(__advlib_PCH_INC) -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
|
||||||
$(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \
|
$(__INC_TIFF_p) $(__INC_JPEG_p) $(__INC_PNG_p) $(__INC_ZLIB_p) \
|
||||||
$(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) $(CPPFLAGS) $(CXXFLAGS)
|
$(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) $(CPPFLAGS) $(CXXFLAGS)
|
||||||
@ -3021,7 +3028,9 @@ COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS = \
|
|||||||
monodll_taskbarcmn.o \
|
monodll_taskbarcmn.o \
|
||||||
monodll_joystick.o \
|
monodll_joystick.o \
|
||||||
monodll_sound.o \
|
monodll_sound.o \
|
||||||
monodll_taskbarx11.o
|
monodll_taskbarx11.o \
|
||||||
|
monodll_taskbar.o \
|
||||||
|
monodll_eggtrayicon.o
|
||||||
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS)
|
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS = $(COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS)
|
||||||
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS = \
|
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS = \
|
||||||
@COND_TOOLKIT_MAC@ monodll_joystick.o monodll_sound.o
|
@COND_TOOLKIT_MAC@ monodll_joystick.o monodll_sound.o
|
||||||
@ -3877,7 +3886,9 @@ COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_1 = \
|
|||||||
monolib_taskbarcmn.o \
|
monolib_taskbarcmn.o \
|
||||||
monolib_joystick.o \
|
monolib_joystick.o \
|
||||||
monolib_sound.o \
|
monolib_sound.o \
|
||||||
monolib_taskbarx11.o
|
monolib_taskbarx11.o \
|
||||||
|
monolib_taskbar.o \
|
||||||
|
monolib_eggtrayicon.o
|
||||||
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS_1 = $(COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_1)
|
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS_1 = $(COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_1)
|
||||||
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS_1 = \
|
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS_1 = \
|
||||||
@COND_TOOLKIT_MAC@ monolib_joystick.o monolib_sound.o
|
@COND_TOOLKIT_MAC@ monolib_joystick.o monolib_sound.o
|
||||||
@ -5669,9 +5680,14 @@ COND_USE_SOSYMLINKS_1___advdll___so_symlinks_inst_cmd = rm -f \
|
|||||||
$(DLLPREFIX)$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_adv$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)$(dll___targetsuf2) \
|
$(DLLPREFIX)$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_adv$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)$(dll___targetsuf2) \
|
||||||
$(LIBPREFIX)wx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_adv-2.5$(HOST_SUFFIX).$(DLLIMP_SUFFIX)
|
$(LIBPREFIX)wx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_adv-2.5$(HOST_SUFFIX).$(DLLIMP_SUFFIX)
|
||||||
@COND_USE_SOSYMLINKS_1@__advdll___so_symlinks_inst_cmd = $(COND_USE_SOSYMLINKS_1___advdll___so_symlinks_inst_cmd)
|
@COND_USE_SOSYMLINKS_1@__advdll___so_symlinks_inst_cmd = $(COND_USE_SOSYMLINKS_1___advdll___so_symlinks_inst_cmd)
|
||||||
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
|
COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
|
||||||
@COND_TOOLKIT_GTK@ advdll_taskbarcmn.o advdll_joystick.o advdll_sound.o \
|
advdll_taskbarcmn.o \
|
||||||
@COND_TOOLKIT_GTK@ advdll_taskbarx11.o
|
advdll_joystick.o \
|
||||||
|
advdll_sound.o \
|
||||||
|
advdll_taskbarx11.o \
|
||||||
|
advdll_taskbar.o \
|
||||||
|
advdll_eggtrayicon.o
|
||||||
|
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = $(COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_2)
|
||||||
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
|
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
|
||||||
@COND_TOOLKIT_MAC@ advdll_joystick.o advdll_sound.o
|
@COND_TOOLKIT_MAC@ advdll_joystick.o advdll_sound.o
|
||||||
@COND_TOOLKIT_MOTIF@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
|
@COND_TOOLKIT_MOTIF@__ADVANCED_PLATFORM_SRC_OBJECTS_2 = \
|
||||||
@ -5697,9 +5713,14 @@ COND_MONOLITHIC_0_SHARED_0_USE_GUI_1___advlib___depname = \
|
|||||||
@COND_GCC_PCH_1@__advlib_PCH_INC = -I.pch/wxprec_advlib
|
@COND_GCC_PCH_1@__advlib_PCH_INC = -I.pch/wxprec_advlib
|
||||||
@COND_GCC_PCH_1@___pch_wxprec_advlib_wx_wxprec_h_gch___depname \
|
@COND_GCC_PCH_1@___pch_wxprec_advlib_wx_wxprec_h_gch___depname \
|
||||||
@COND_GCC_PCH_1@ = .pch/wxprec_advlib/wx/wxprec.h.gch
|
@COND_GCC_PCH_1@ = .pch/wxprec_advlib/wx/wxprec.h.gch
|
||||||
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
|
COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
|
||||||
@COND_TOOLKIT_GTK@ advlib_taskbarcmn.o advlib_joystick.o advlib_sound.o \
|
advlib_taskbarcmn.o \
|
||||||
@COND_TOOLKIT_GTK@ advlib_taskbarx11.o
|
advlib_joystick.o \
|
||||||
|
advlib_sound.o \
|
||||||
|
advlib_taskbarx11.o \
|
||||||
|
advlib_taskbar.o \
|
||||||
|
advlib_eggtrayicon.o
|
||||||
|
@COND_TOOLKIT_GTK@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = $(COND_TOOLKIT_GTK___ADVANCED_PLATFORM_SRC_OBJECTS_3)
|
||||||
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
|
@COND_TOOLKIT_MAC@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
|
||||||
@COND_TOOLKIT_MAC@ advlib_joystick.o advlib_sound.o
|
@COND_TOOLKIT_MAC@ advlib_joystick.o advlib_sound.o
|
||||||
@COND_TOOLKIT_MOTIF@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
|
@COND_TOOLKIT_MOTIF@__ADVANCED_PLATFORM_SRC_OBJECTS_3 = \
|
||||||
@ -8213,6 +8234,9 @@ monodll_tipdlg.o: $(srcdir)/src/generic/tipdlg.cpp $(MONODLL_ODEP)
|
|||||||
monodll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONODLL_ODEP)
|
monodll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONODLL_ODEP)
|
||||||
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
||||||
|
|
||||||
|
monodll_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(MONODLL_ODEP)
|
||||||
|
$(CCC) -c -o $@ $(MONODLL_CFLAGS) $<
|
||||||
|
|
||||||
monodll_helpbest.o: $(srcdir)/src/msw/helpbest.cpp $(MONODLL_ODEP)
|
monodll_helpbest.o: $(srcdir)/src/msw/helpbest.cpp $(MONODLL_ODEP)
|
||||||
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -10697,6 +10721,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
|
|||||||
@COND_TOOLKIT_WINCE_USE_GUI_1@monodll_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(MONODLL_ODEP)
|
@COND_TOOLKIT_WINCE_USE_GUI_1@monodll_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(MONODLL_ODEP)
|
||||||
@COND_TOOLKIT_WINCE_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
@COND_TOOLKIT_WINCE_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
||||||
|
|
||||||
|
@COND_TOOLKIT_GTK_USE_GUI_1@monodll_taskbar.o: $(srcdir)/src/gtk/taskbar.cpp $(MONODLL_ODEP)
|
||||||
|
@COND_TOOLKIT_GTK_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
||||||
|
|
||||||
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_joystick.o: $(srcdir)/src/msw/joystick.cpp $(MONODLL_ODEP)
|
@COND_TOOLKIT_MSW_USE_GUI_1@monodll_joystick.o: $(srcdir)/src/msw/joystick.cpp $(MONODLL_ODEP)
|
||||||
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -11144,6 +11171,9 @@ monolib_tipdlg.o: $(srcdir)/src/generic/tipdlg.cpp $(MONOLIB_ODEP)
|
|||||||
monolib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONOLIB_ODEP)
|
monolib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONOLIB_ODEP)
|
||||||
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
|
monolib_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(MONOLIB_ODEP)
|
||||||
|
$(CCC) -c -o $@ $(MONOLIB_CFLAGS) $<
|
||||||
|
|
||||||
monolib_helpbest.o: $(srcdir)/src/msw/helpbest.cpp $(MONOLIB_ODEP)
|
monolib_helpbest.o: $(srcdir)/src/msw/helpbest.cpp $(MONOLIB_ODEP)
|
||||||
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -13628,6 +13658,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
|
|||||||
@COND_TOOLKIT_WINCE_USE_GUI_1@monolib_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(MONOLIB_ODEP)
|
@COND_TOOLKIT_WINCE_USE_GUI_1@monolib_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(MONOLIB_ODEP)
|
||||||
@COND_TOOLKIT_WINCE_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
@COND_TOOLKIT_WINCE_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
|
@COND_TOOLKIT_GTK_USE_GUI_1@monolib_taskbar.o: $(srcdir)/src/gtk/taskbar.cpp $(MONOLIB_ODEP)
|
||||||
|
@COND_TOOLKIT_GTK_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_joystick.o: $(srcdir)/src/msw/joystick.cpp $(MONOLIB_ODEP)
|
@COND_TOOLKIT_MSW_USE_GUI_1@monolib_joystick.o: $(srcdir)/src/msw/joystick.cpp $(MONOLIB_ODEP)
|
||||||
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
@COND_TOOLKIT_MSW_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -19241,6 +19274,9 @@ advdll_tipdlg.o: $(srcdir)/src/generic/tipdlg.cpp $(ADVDLL_ODEP)
|
|||||||
advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
|
advdll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVDLL_ODEP)
|
||||||
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
||||||
|
|
||||||
|
advdll_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(ADVDLL_ODEP)
|
||||||
|
$(CCC) -c -o $@ $(ADVDLL_CFLAGS) $<
|
||||||
|
|
||||||
advdll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVDLL_ODEP)
|
advdll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVDLL_ODEP)
|
||||||
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -19286,6 +19322,9 @@ advdll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVDLL_ODEP)
|
|||||||
@COND_TOOLKIT_WINCE@advdll_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(ADVDLL_ODEP)
|
@COND_TOOLKIT_WINCE@advdll_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(ADVDLL_ODEP)
|
||||||
@COND_TOOLKIT_WINCE@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
@COND_TOOLKIT_WINCE@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
||||||
|
|
||||||
|
@COND_TOOLKIT_GTK@advdll_taskbar.o: $(srcdir)/src/gtk/taskbar.cpp $(ADVDLL_ODEP)
|
||||||
|
@COND_TOOLKIT_GTK@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
||||||
|
|
||||||
@COND_TOOLKIT_MSW@advdll_joystick.o: $(srcdir)/src/msw/joystick.cpp $(ADVDLL_ODEP)
|
@COND_TOOLKIT_MSW@advdll_joystick.o: $(srcdir)/src/msw/joystick.cpp $(ADVDLL_ODEP)
|
||||||
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -19343,6 +19382,9 @@ advlib_tipdlg.o: $(srcdir)/src/generic/tipdlg.cpp $(ADVLIB_ODEP)
|
|||||||
advlib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVLIB_ODEP)
|
advlib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(ADVLIB_ODEP)
|
||||||
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
|
advlib_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(ADVLIB_ODEP)
|
||||||
|
$(CCC) -c -o $@ $(ADVLIB_CFLAGS) $<
|
||||||
|
|
||||||
advlib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVLIB_ODEP)
|
advlib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVLIB_ODEP)
|
||||||
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
@ -19388,6 +19430,9 @@ advlib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVLIB_ODEP)
|
|||||||
@COND_TOOLKIT_WINCE@advlib_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(ADVLIB_ODEP)
|
@COND_TOOLKIT_WINCE@advlib_taskbar.o: $(srcdir)/src/msw/taskbar.cpp $(ADVLIB_ODEP)
|
||||||
@COND_TOOLKIT_WINCE@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
@COND_TOOLKIT_WINCE@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
|
@COND_TOOLKIT_GTK@advlib_taskbar.o: $(srcdir)/src/gtk/taskbar.cpp $(ADVLIB_ODEP)
|
||||||
|
@COND_TOOLKIT_GTK@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
@COND_TOOLKIT_MSW@advlib_joystick.o: $(srcdir)/src/msw/joystick.cpp $(ADVLIB_ODEP)
|
@COND_TOOLKIT_MSW@advlib_joystick.o: $(srcdir)/src/msw/joystick.cpp $(ADVLIB_ODEP)
|
||||||
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
@COND_TOOLKIT_MSW@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
|
||||||
|
|
||||||
|
@ -2196,6 +2196,11 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
wx/unix/taskbarx11.h
|
wx/unix/taskbarx11.h
|
||||||
</set>
|
</set>
|
||||||
|
|
||||||
|
<set var="ADVANCED_GTK_SRC" hints="files">
|
||||||
|
src/gtk/taskbar.cpp
|
||||||
|
src/gtk/eggtrayicon.c
|
||||||
|
</set>
|
||||||
|
|
||||||
|
|
||||||
<!-- ====================================================================== -->
|
<!-- ====================================================================== -->
|
||||||
<!-- wxHTML -->
|
<!-- wxHTML -->
|
||||||
@ -2450,7 +2455,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
|
|||||||
<if cond="TOOLKIT=='WINCE'">$(ADVANCED_MSW_SRC)</if>
|
<if cond="TOOLKIT=='WINCE'">$(ADVANCED_MSW_SRC)</if>
|
||||||
<if cond="TOOLKIT=='MAC'">$(ADVANCED_MAC_SRC)</if>
|
<if cond="TOOLKIT=='MAC'">$(ADVANCED_MAC_SRC)</if>
|
||||||
<if cond="TOOLKIT=='MOTIF'">$(ADVANCED_UNIX_SRC)</if>
|
<if cond="TOOLKIT=='MOTIF'">$(ADVANCED_UNIX_SRC)</if>
|
||||||
<if cond="TOOLKIT=='GTK'">$(ADVANCED_UNIX_SRC)</if>
|
<if cond="TOOLKIT=='GTK'">$(ADVANCED_UNIX_SRC) $(ADVANCED_GTK_SRC)</if>
|
||||||
<if cond="TOOLKIT=='X11'">$(ADVANCED_UNIX_SRC)</if>
|
<if cond="TOOLKIT=='X11'">$(ADVANCED_UNIX_SRC)</if>
|
||||||
<if cond="TOOLKIT=='PM'">$(ADVANCED_OS2_SRC)</if>
|
<if cond="TOOLKIT=='PM'">$(ADVANCED_OS2_SRC)</if>
|
||||||
</set>
|
</set>
|
||||||
|
@ -94,6 +94,14 @@ versions, please update your code to not use them.
|
|||||||
OTHER CHANGES
|
OTHER CHANGES
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
2.5.3
|
||||||
|
-----
|
||||||
|
|
||||||
|
Unix:
|
||||||
|
|
||||||
|
- wxTaskBarIcon now supports freedesktop.org System Tray protocol
|
||||||
|
|
||||||
|
|
||||||
2.5.2
|
2.5.2
|
||||||
-----
|
-----
|
||||||
|
|
||||||
@ -162,10 +170,12 @@ wxHTML:
|
|||||||
- <div> handling fix (Xavier Nodet)
|
- <div> handling fix (Xavier Nodet)
|
||||||
|
|
||||||
Unix:
|
Unix:
|
||||||
|
|
||||||
- fixed priorities of mailcap entries (David Hart)
|
- fixed priorities of mailcap entries (David Hart)
|
||||||
- added "wx-config --libs=std,<extra>" syntax (i.e. support for "std")
|
- added "wx-config --libs=std,<extra>" syntax (i.e. support for "std")
|
||||||
|
|
||||||
wxODBC:
|
wxODBC:
|
||||||
|
|
||||||
- Full Unicode support is now available
|
- Full Unicode support is now available
|
||||||
- BLOB support is working
|
- BLOB support is working
|
||||||
|
|
||||||
|
@ -1,9 +1,25 @@
|
|||||||
\section{\class{wxTaskBarIcon}}\label{wxtaskbaricon}
|
\section{\class{wxTaskBarIcon}}\label{wxtaskbaricon}
|
||||||
|
|
||||||
This class represents a taskbar icon, appearing in the `system tray' and responding to
|
This class represents a taskbar icon, appearing in the `system tray' and
|
||||||
mouse clicks. An icon has an optional tooltip. This class is only supported for Windows 95/NT and for
|
responding to mouse clicks. An icon has an optional tooltip. This class is only
|
||||||
X Window System ports (wxGTK, wxMotif, wxX11), assuming the window manager supports KDE and GNOME 1.2
|
supported under Windows 95/NT and in X Window System ports (wxGTK, wxMotif,
|
||||||
systray methods.
|
wxX11).
|
||||||
|
|
||||||
|
\wxheading{X Window System Note}
|
||||||
|
|
||||||
|
Under X Window System, the window manager must support either
|
||||||
|
the \urlref{System Tray Protocol by freedesktop.org}{http://freedesktop.org/Standards/systemtray-spec}
|
||||||
|
(WMs used by modern desktop environments such as GNOME >= 2, KDE
|
||||||
|
>= 3 and XFCE >= 4 all do) or the older methods used in GNOME 1.2 and
|
||||||
|
KDE 1 and 2. If it doesn't, the icon will appear as a toplevel window on
|
||||||
|
user's desktop.
|
||||||
|
|
||||||
|
Because not all window managers have system tray, there's no guarantee that
|
||||||
|
wxTaskBarIcon will work correctly under X Window System and so the applications
|
||||||
|
should use it only as an optional component of their user interface. The user
|
||||||
|
should be required to explicitly enable the taskbar icon on Unix, it shouldn't
|
||||||
|
be on by default.
|
||||||
|
|
||||||
|
|
||||||
\wxheading{Derived from}
|
\wxheading{Derived from}
|
||||||
|
|
||||||
|
31
include/wx/gtk/taskbarpriv.h
Normal file
31
include/wx/gtk/taskbarpriv.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// File: wx/gtk/taskbarpriv.h
|
||||||
|
// Purpose: wxTaskBarIcon (src/unix/taskbarx11.cpp) helper for GTK2
|
||||||
|
// Author: Vaclav Slavik
|
||||||
|
// Modified by:
|
||||||
|
// Created: 2004/05/29
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Vaclav Slavik, 2004
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_TASKBARPRIV_H_
|
||||||
|
#define _WX_TASKBARPRIV_H_
|
||||||
|
|
||||||
|
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
|
||||||
|
#pragma interface "taskbarpriv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/toplevel.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
|
||||||
|
class WXDLLIMPEXP_ADV wxTaskBarIconAreaBase : public wxTopLevelWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxTaskBarIconAreaBase();
|
||||||
|
|
||||||
|
// Returns true if SYSTRAY protocol is supported by the desktop
|
||||||
|
bool IsProtocolSupported();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _WX_TASKBARPRIV_H_
|
31
include/wx/gtk1/taskbarpriv.h
Normal file
31
include/wx/gtk1/taskbarpriv.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// File: wx/gtk/taskbarpriv.h
|
||||||
|
// Purpose: wxTaskBarIcon (src/unix/taskbarx11.cpp) helper for GTK2
|
||||||
|
// Author: Vaclav Slavik
|
||||||
|
// Modified by:
|
||||||
|
// Created: 2004/05/29
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Vaclav Slavik, 2004
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_TASKBARPRIV_H_
|
||||||
|
#define _WX_TASKBARPRIV_H_
|
||||||
|
|
||||||
|
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
|
||||||
|
#pragma interface "taskbarpriv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/toplevel.h"
|
||||||
|
#include "wx/bitmap.h"
|
||||||
|
|
||||||
|
class WXDLLIMPEXP_ADV wxTaskBarIconAreaBase : public wxTopLevelWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxTaskBarIconAreaBase();
|
||||||
|
|
||||||
|
// Returns true if SYSTRAY protocol is supported by the desktop
|
||||||
|
bool IsProtocolSupported();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _WX_TASKBARPRIV_H_
|
345
src/gtk/eggtrayicon.c
Normal file
345
src/gtk/eggtrayicon.c
Normal file
@ -0,0 +1,345 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||||
|
/* eggtrayicon.c
|
||||||
|
* Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
#include "eggtrayicon.h"
|
||||||
|
|
||||||
|
#define SYSTEM_TRAY_REQUEST_DOCK 0
|
||||||
|
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
|
||||||
|
#define SYSTEM_TRAY_CANCEL_MESSAGE 2
|
||||||
|
|
||||||
|
static GtkPlugClass *parent_class = NULL;
|
||||||
|
|
||||||
|
static void egg_tray_icon_init (EggTrayIcon *icon);
|
||||||
|
static void egg_tray_icon_class_init (EggTrayIconClass *klass);
|
||||||
|
|
||||||
|
static void egg_tray_icon_unrealize (GtkWidget *widget);
|
||||||
|
|
||||||
|
static void egg_tray_icon_update_manager_window (EggTrayIcon *icon);
|
||||||
|
|
||||||
|
GType
|
||||||
|
egg_tray_icon_get_type (void)
|
||||||
|
{
|
||||||
|
static GType our_type = 0;
|
||||||
|
|
||||||
|
if (our_type == 0)
|
||||||
|
{
|
||||||
|
static const GTypeInfo our_info =
|
||||||
|
{
|
||||||
|
sizeof (EggTrayIconClass),
|
||||||
|
(GBaseInitFunc) NULL,
|
||||||
|
(GBaseFinalizeFunc) NULL,
|
||||||
|
(GClassInitFunc) egg_tray_icon_class_init,
|
||||||
|
NULL, /* class_finalize */
|
||||||
|
NULL, /* class_data */
|
||||||
|
sizeof (EggTrayIcon),
|
||||||
|
0, /* n_preallocs */
|
||||||
|
(GInstanceInitFunc) egg_tray_icon_init
|
||||||
|
};
|
||||||
|
|
||||||
|
our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return our_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_init (EggTrayIcon *icon)
|
||||||
|
{
|
||||||
|
icon->stamp = 1;
|
||||||
|
|
||||||
|
gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_class_init (EggTrayIconClass *klass)
|
||||||
|
{
|
||||||
|
GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
|
||||||
|
|
||||||
|
parent_class = g_type_class_peek_parent (klass);
|
||||||
|
|
||||||
|
widget_class->unrealize = egg_tray_icon_unrealize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkFilterReturn
|
||||||
|
egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data)
|
||||||
|
{
|
||||||
|
EggTrayIcon *icon = user_data;
|
||||||
|
XEvent *xev = (XEvent *)xevent;
|
||||||
|
|
||||||
|
if (xev->xany.type == ClientMessage &&
|
||||||
|
xev->xclient.message_type == icon->manager_atom &&
|
||||||
|
xev->xclient.data.l[1] == icon->selection_atom)
|
||||||
|
{
|
||||||
|
egg_tray_icon_update_manager_window (icon);
|
||||||
|
}
|
||||||
|
else if (xev->xany.window == icon->manager_window)
|
||||||
|
{
|
||||||
|
if (xev->xany.type == DestroyNotify)
|
||||||
|
{
|
||||||
|
egg_tray_icon_update_manager_window (icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_unrealize (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
EggTrayIcon *icon = EGG_TRAY_ICON (widget);
|
||||||
|
GdkWindow *root_window;
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
{
|
||||||
|
GdkWindow *gdkwin;
|
||||||
|
|
||||||
|
gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget),
|
||||||
|
icon->manager_window);
|
||||||
|
|
||||||
|
gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
|
||||||
|
|
||||||
|
gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon);
|
||||||
|
|
||||||
|
if (GTK_WIDGET_CLASS (parent_class)->unrealize)
|
||||||
|
(* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_send_manager_message (EggTrayIcon *icon,
|
||||||
|
long message,
|
||||||
|
Window window,
|
||||||
|
long data1,
|
||||||
|
long data2,
|
||||||
|
long data3)
|
||||||
|
{
|
||||||
|
XClientMessageEvent ev;
|
||||||
|
Display *display;
|
||||||
|
|
||||||
|
ev.type = ClientMessage;
|
||||||
|
ev.window = window;
|
||||||
|
ev.message_type = icon->system_tray_opcode_atom;
|
||||||
|
ev.format = 32;
|
||||||
|
ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window);
|
||||||
|
ev.data.l[1] = message;
|
||||||
|
ev.data.l[2] = data1;
|
||||||
|
ev.data.l[3] = data2;
|
||||||
|
ev.data.l[4] = data3;
|
||||||
|
|
||||||
|
display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
gdk_error_trap_push ();
|
||||||
|
XSendEvent (display,
|
||||||
|
icon->manager_window, False, NoEventMask, (XEvent *)&ev);
|
||||||
|
XSync (display, False);
|
||||||
|
gdk_error_trap_pop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_send_dock_request (EggTrayIcon *icon)
|
||||||
|
{
|
||||||
|
egg_tray_icon_send_manager_message (icon,
|
||||||
|
SYSTEM_TRAY_REQUEST_DOCK,
|
||||||
|
icon->manager_window,
|
||||||
|
gtk_plug_get_id (GTK_PLUG (icon)),
|
||||||
|
0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_update_manager_window (EggTrayIcon *icon)
|
||||||
|
{
|
||||||
|
Display *xdisplay;
|
||||||
|
|
||||||
|
xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
{
|
||||||
|
GdkWindow *gdkwin;
|
||||||
|
|
||||||
|
gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
|
||||||
|
icon->manager_window);
|
||||||
|
|
||||||
|
gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
XGrabServer (xdisplay);
|
||||||
|
|
||||||
|
icon->manager_window = XGetSelectionOwner (xdisplay,
|
||||||
|
icon->selection_atom);
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
XSelectInput (xdisplay,
|
||||||
|
icon->manager_window, StructureNotifyMask);
|
||||||
|
|
||||||
|
XUngrabServer (xdisplay);
|
||||||
|
XFlush (xdisplay);
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
{
|
||||||
|
GdkWindow *gdkwin;
|
||||||
|
|
||||||
|
gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
|
||||||
|
icon->manager_window);
|
||||||
|
|
||||||
|
gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon);
|
||||||
|
|
||||||
|
/* Send a request that we'd like to dock */
|
||||||
|
egg_tray_icon_send_dock_request (icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EggTrayIcon *
|
||||||
|
egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
|
||||||
|
{
|
||||||
|
EggTrayIcon *icon;
|
||||||
|
char buffer[256];
|
||||||
|
GdkWindow *root_window;
|
||||||
|
GdkDisplay *display;
|
||||||
|
GdkScreen *screen;
|
||||||
|
|
||||||
|
g_return_val_if_fail (xscreen != NULL, NULL);
|
||||||
|
|
||||||
|
icon = g_object_new (EGG_TYPE_TRAY_ICON, NULL);
|
||||||
|
gtk_window_set_title (GTK_WINDOW (icon), name);
|
||||||
|
|
||||||
|
display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen));
|
||||||
|
screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen));
|
||||||
|
|
||||||
|
gtk_plug_construct_for_display (GTK_PLUG (icon),
|
||||||
|
display, 0);
|
||||||
|
|
||||||
|
gtk_window_set_screen (GTK_WINDOW (icon), screen);
|
||||||
|
|
||||||
|
gtk_widget_realize (GTK_WIDGET (icon));
|
||||||
|
|
||||||
|
/* Now see if there's a manager window around */
|
||||||
|
g_snprintf (buffer, sizeof (buffer),
|
||||||
|
"_NET_SYSTEM_TRAY_S%d",
|
||||||
|
XScreenNumberOfScreen (xscreen));
|
||||||
|
|
||||||
|
icon->selection_atom = XInternAtom (DisplayOfScreen (xscreen),
|
||||||
|
buffer, False);
|
||||||
|
|
||||||
|
icon->manager_atom = XInternAtom (DisplayOfScreen (xscreen),
|
||||||
|
"MANAGER", False);
|
||||||
|
|
||||||
|
icon->system_tray_opcode_atom = XInternAtom (DisplayOfScreen (xscreen),
|
||||||
|
"_NET_SYSTEM_TRAY_OPCODE", False);
|
||||||
|
|
||||||
|
egg_tray_icon_update_manager_window (icon);
|
||||||
|
|
||||||
|
root_window = gdk_screen_get_root_window (gtk_widget_get_screen (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
/* Add a root window filter so that we get changes on MANAGER */
|
||||||
|
gdk_window_add_filter (root_window,
|
||||||
|
egg_tray_icon_manager_filter, icon);
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
EggTrayIcon *
|
||||||
|
egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
|
||||||
|
|
||||||
|
return egg_tray_icon_new_for_xscreen (GDK_SCREEN_XSCREEN (screen), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
EggTrayIcon*
|
||||||
|
egg_tray_icon_new (const gchar *name)
|
||||||
|
{
|
||||||
|
return egg_tray_icon_new_for_xscreen (DefaultScreenOfDisplay (gdk_display), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
guint
|
||||||
|
egg_tray_icon_send_message (EggTrayIcon *icon,
|
||||||
|
gint timeout,
|
||||||
|
const gchar *message,
|
||||||
|
gint len)
|
||||||
|
{
|
||||||
|
guint stamp;
|
||||||
|
|
||||||
|
g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);
|
||||||
|
g_return_val_if_fail (timeout >= 0, 0);
|
||||||
|
g_return_val_if_fail (message != NULL, 0);
|
||||||
|
|
||||||
|
if (icon->manager_window == None)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (len < 0)
|
||||||
|
len = strlen (message);
|
||||||
|
|
||||||
|
stamp = icon->stamp++;
|
||||||
|
|
||||||
|
/* Get ready to send the message */
|
||||||
|
egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,
|
||||||
|
(Window)gtk_plug_get_id (GTK_PLUG (icon)),
|
||||||
|
timeout, len, stamp);
|
||||||
|
|
||||||
|
/* Now to send the actual message */
|
||||||
|
gdk_error_trap_push ();
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
XClientMessageEvent ev;
|
||||||
|
Display *xdisplay;
|
||||||
|
|
||||||
|
xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
ev.type = ClientMessage;
|
||||||
|
ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
|
||||||
|
ev.format = 8;
|
||||||
|
ev.message_type = XInternAtom (xdisplay,
|
||||||
|
"_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
|
||||||
|
if (len > 20)
|
||||||
|
{
|
||||||
|
memcpy (&ev.data, message, 20);
|
||||||
|
len -= 20;
|
||||||
|
message += 20;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy (&ev.data, message, len);
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSendEvent (xdisplay,
|
||||||
|
icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);
|
||||||
|
XSync (xdisplay, False);
|
||||||
|
}
|
||||||
|
gdk_error_trap_pop ();
|
||||||
|
|
||||||
|
return stamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
egg_tray_icon_cancel_message (EggTrayIcon *icon,
|
||||||
|
guint id)
|
||||||
|
{
|
||||||
|
g_return_if_fail (EGG_IS_TRAY_ICON (icon));
|
||||||
|
g_return_if_fail (id > 0);
|
||||||
|
|
||||||
|
egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,
|
||||||
|
(Window)gtk_plug_get_id (GTK_PLUG (icon)),
|
||||||
|
id, 0, 0);
|
||||||
|
}
|
74
src/gtk/eggtrayicon.h
Normal file
74
src/gtk/eggtrayicon.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||||
|
/* eggtrayicon.h
|
||||||
|
* Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EGG_TRAY_ICON_H__
|
||||||
|
#define __EGG_TRAY_ICON_H__
|
||||||
|
|
||||||
|
#include <gtk/gtkplug.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ())
|
||||||
|
#define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon))
|
||||||
|
#define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
|
||||||
|
#define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON))
|
||||||
|
#define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON))
|
||||||
|
#define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
|
||||||
|
|
||||||
|
typedef struct _EggTrayIcon EggTrayIcon;
|
||||||
|
typedef struct _EggTrayIconClass EggTrayIconClass;
|
||||||
|
|
||||||
|
struct _EggTrayIcon
|
||||||
|
{
|
||||||
|
GtkPlug parent_instance;
|
||||||
|
|
||||||
|
guint stamp;
|
||||||
|
|
||||||
|
Atom selection_atom;
|
||||||
|
Atom manager_atom;
|
||||||
|
Atom system_tray_opcode_atom;
|
||||||
|
Window manager_window;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _EggTrayIconClass
|
||||||
|
{
|
||||||
|
GtkPlugClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType egg_tray_icon_get_type (void);
|
||||||
|
|
||||||
|
EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen,
|
||||||
|
const gchar *name);
|
||||||
|
|
||||||
|
EggTrayIcon *egg_tray_icon_new (const gchar *name);
|
||||||
|
|
||||||
|
guint egg_tray_icon_send_message (EggTrayIcon *icon,
|
||||||
|
gint timeout,
|
||||||
|
const char *message,
|
||||||
|
gint len);
|
||||||
|
void egg_tray_icon_cancel_message (EggTrayIcon *icon,
|
||||||
|
guint id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __EGG_TRAY_ICON_H__ */
|
65
src/gtk/taskbar.cpp
Normal file
65
src/gtk/taskbar.cpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// File: taskbar.cpp
|
||||||
|
// Purpose: wxTaskBarIcon (src/unix/taskbarx11.cpp) helper for GTK2
|
||||||
|
// Author: Vaclav Slavik
|
||||||
|
// Modified by:
|
||||||
|
// Created: 2004/05/29
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Vaclav Slavik, 2004
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
|
||||||
|
#pragma implementation "taskbarpriv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
|
||||||
|
#include "wx/gtk/taskbarpriv.h"
|
||||||
|
#include "eggtrayicon.h"
|
||||||
|
|
||||||
|
wxTaskBarIconAreaBase::wxTaskBarIconAreaBase()
|
||||||
|
{
|
||||||
|
if (IsProtocolSupported())
|
||||||
|
{
|
||||||
|
m_widget = GTK_WIDGET(egg_tray_icon_new("systray icon"));
|
||||||
|
gtk_window_set_resizable(GTK_WINDOW(m_widget), false);
|
||||||
|
|
||||||
|
wxLogTrace(_T("systray"), _T("using freedesktop.org systray spec"));
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTopLevelWindow::Create(
|
||||||
|
NULL, wxID_ANY, _T("systray icon"),
|
||||||
|
wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR | wxSIMPLE_BORDER |
|
||||||
|
wxFRAME_SHAPED,
|
||||||
|
wxEmptyString /*eggtray doesn't like setting wmclass*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTaskBarIconAreaBase::IsProtocolSupported()
|
||||||
|
{
|
||||||
|
static int s_supported = -1;
|
||||||
|
if (s_supported == -1)
|
||||||
|
{
|
||||||
|
Display *display = GDK_DISPLAY();
|
||||||
|
Screen *screen = DefaultScreenOfDisplay(display);
|
||||||
|
|
||||||
|
wxString name;
|
||||||
|
name.Printf(_T("_NET_SYSTEM_TRAY_S%d"), XScreenNumberOfScreen(screen));
|
||||||
|
Atom atom = XInternAtom(display, name.ToAscii(), False);
|
||||||
|
|
||||||
|
Window manager = XGetSelectionOwner(display, atom);
|
||||||
|
|
||||||
|
s_supported = (manager != None);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bool)s_supported;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __WXGTK20__
|
345
src/gtk1/eggtrayicon.c
Normal file
345
src/gtk1/eggtrayicon.c
Normal file
@ -0,0 +1,345 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||||
|
/* eggtrayicon.c
|
||||||
|
* Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
#include "eggtrayicon.h"
|
||||||
|
|
||||||
|
#define SYSTEM_TRAY_REQUEST_DOCK 0
|
||||||
|
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
|
||||||
|
#define SYSTEM_TRAY_CANCEL_MESSAGE 2
|
||||||
|
|
||||||
|
static GtkPlugClass *parent_class = NULL;
|
||||||
|
|
||||||
|
static void egg_tray_icon_init (EggTrayIcon *icon);
|
||||||
|
static void egg_tray_icon_class_init (EggTrayIconClass *klass);
|
||||||
|
|
||||||
|
static void egg_tray_icon_unrealize (GtkWidget *widget);
|
||||||
|
|
||||||
|
static void egg_tray_icon_update_manager_window (EggTrayIcon *icon);
|
||||||
|
|
||||||
|
GType
|
||||||
|
egg_tray_icon_get_type (void)
|
||||||
|
{
|
||||||
|
static GType our_type = 0;
|
||||||
|
|
||||||
|
if (our_type == 0)
|
||||||
|
{
|
||||||
|
static const GTypeInfo our_info =
|
||||||
|
{
|
||||||
|
sizeof (EggTrayIconClass),
|
||||||
|
(GBaseInitFunc) NULL,
|
||||||
|
(GBaseFinalizeFunc) NULL,
|
||||||
|
(GClassInitFunc) egg_tray_icon_class_init,
|
||||||
|
NULL, /* class_finalize */
|
||||||
|
NULL, /* class_data */
|
||||||
|
sizeof (EggTrayIcon),
|
||||||
|
0, /* n_preallocs */
|
||||||
|
(GInstanceInitFunc) egg_tray_icon_init
|
||||||
|
};
|
||||||
|
|
||||||
|
our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return our_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_init (EggTrayIcon *icon)
|
||||||
|
{
|
||||||
|
icon->stamp = 1;
|
||||||
|
|
||||||
|
gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_class_init (EggTrayIconClass *klass)
|
||||||
|
{
|
||||||
|
GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
|
||||||
|
|
||||||
|
parent_class = g_type_class_peek_parent (klass);
|
||||||
|
|
||||||
|
widget_class->unrealize = egg_tray_icon_unrealize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkFilterReturn
|
||||||
|
egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data)
|
||||||
|
{
|
||||||
|
EggTrayIcon *icon = user_data;
|
||||||
|
XEvent *xev = (XEvent *)xevent;
|
||||||
|
|
||||||
|
if (xev->xany.type == ClientMessage &&
|
||||||
|
xev->xclient.message_type == icon->manager_atom &&
|
||||||
|
xev->xclient.data.l[1] == icon->selection_atom)
|
||||||
|
{
|
||||||
|
egg_tray_icon_update_manager_window (icon);
|
||||||
|
}
|
||||||
|
else if (xev->xany.window == icon->manager_window)
|
||||||
|
{
|
||||||
|
if (xev->xany.type == DestroyNotify)
|
||||||
|
{
|
||||||
|
egg_tray_icon_update_manager_window (icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_unrealize (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
EggTrayIcon *icon = EGG_TRAY_ICON (widget);
|
||||||
|
GdkWindow *root_window;
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
{
|
||||||
|
GdkWindow *gdkwin;
|
||||||
|
|
||||||
|
gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget),
|
||||||
|
icon->manager_window);
|
||||||
|
|
||||||
|
gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
|
||||||
|
|
||||||
|
gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon);
|
||||||
|
|
||||||
|
if (GTK_WIDGET_CLASS (parent_class)->unrealize)
|
||||||
|
(* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_send_manager_message (EggTrayIcon *icon,
|
||||||
|
long message,
|
||||||
|
Window window,
|
||||||
|
long data1,
|
||||||
|
long data2,
|
||||||
|
long data3)
|
||||||
|
{
|
||||||
|
XClientMessageEvent ev;
|
||||||
|
Display *display;
|
||||||
|
|
||||||
|
ev.type = ClientMessage;
|
||||||
|
ev.window = window;
|
||||||
|
ev.message_type = icon->system_tray_opcode_atom;
|
||||||
|
ev.format = 32;
|
||||||
|
ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window);
|
||||||
|
ev.data.l[1] = message;
|
||||||
|
ev.data.l[2] = data1;
|
||||||
|
ev.data.l[3] = data2;
|
||||||
|
ev.data.l[4] = data3;
|
||||||
|
|
||||||
|
display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
gdk_error_trap_push ();
|
||||||
|
XSendEvent (display,
|
||||||
|
icon->manager_window, False, NoEventMask, (XEvent *)&ev);
|
||||||
|
XSync (display, False);
|
||||||
|
gdk_error_trap_pop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_send_dock_request (EggTrayIcon *icon)
|
||||||
|
{
|
||||||
|
egg_tray_icon_send_manager_message (icon,
|
||||||
|
SYSTEM_TRAY_REQUEST_DOCK,
|
||||||
|
icon->manager_window,
|
||||||
|
gtk_plug_get_id (GTK_PLUG (icon)),
|
||||||
|
0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
egg_tray_icon_update_manager_window (EggTrayIcon *icon)
|
||||||
|
{
|
||||||
|
Display *xdisplay;
|
||||||
|
|
||||||
|
xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
{
|
||||||
|
GdkWindow *gdkwin;
|
||||||
|
|
||||||
|
gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
|
||||||
|
icon->manager_window);
|
||||||
|
|
||||||
|
gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
XGrabServer (xdisplay);
|
||||||
|
|
||||||
|
icon->manager_window = XGetSelectionOwner (xdisplay,
|
||||||
|
icon->selection_atom);
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
XSelectInput (xdisplay,
|
||||||
|
icon->manager_window, StructureNotifyMask);
|
||||||
|
|
||||||
|
XUngrabServer (xdisplay);
|
||||||
|
XFlush (xdisplay);
|
||||||
|
|
||||||
|
if (icon->manager_window != None)
|
||||||
|
{
|
||||||
|
GdkWindow *gdkwin;
|
||||||
|
|
||||||
|
gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
|
||||||
|
icon->manager_window);
|
||||||
|
|
||||||
|
gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon);
|
||||||
|
|
||||||
|
/* Send a request that we'd like to dock */
|
||||||
|
egg_tray_icon_send_dock_request (icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EggTrayIcon *
|
||||||
|
egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
|
||||||
|
{
|
||||||
|
EggTrayIcon *icon;
|
||||||
|
char buffer[256];
|
||||||
|
GdkWindow *root_window;
|
||||||
|
GdkDisplay *display;
|
||||||
|
GdkScreen *screen;
|
||||||
|
|
||||||
|
g_return_val_if_fail (xscreen != NULL, NULL);
|
||||||
|
|
||||||
|
icon = g_object_new (EGG_TYPE_TRAY_ICON, NULL);
|
||||||
|
gtk_window_set_title (GTK_WINDOW (icon), name);
|
||||||
|
|
||||||
|
display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen));
|
||||||
|
screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen));
|
||||||
|
|
||||||
|
gtk_plug_construct_for_display (GTK_PLUG (icon),
|
||||||
|
display, 0);
|
||||||
|
|
||||||
|
gtk_window_set_screen (GTK_WINDOW (icon), screen);
|
||||||
|
|
||||||
|
gtk_widget_realize (GTK_WIDGET (icon));
|
||||||
|
|
||||||
|
/* Now see if there's a manager window around */
|
||||||
|
g_snprintf (buffer, sizeof (buffer),
|
||||||
|
"_NET_SYSTEM_TRAY_S%d",
|
||||||
|
XScreenNumberOfScreen (xscreen));
|
||||||
|
|
||||||
|
icon->selection_atom = XInternAtom (DisplayOfScreen (xscreen),
|
||||||
|
buffer, False);
|
||||||
|
|
||||||
|
icon->manager_atom = XInternAtom (DisplayOfScreen (xscreen),
|
||||||
|
"MANAGER", False);
|
||||||
|
|
||||||
|
icon->system_tray_opcode_atom = XInternAtom (DisplayOfScreen (xscreen),
|
||||||
|
"_NET_SYSTEM_TRAY_OPCODE", False);
|
||||||
|
|
||||||
|
egg_tray_icon_update_manager_window (icon);
|
||||||
|
|
||||||
|
root_window = gdk_screen_get_root_window (gtk_widget_get_screen (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
/* Add a root window filter so that we get changes on MANAGER */
|
||||||
|
gdk_window_add_filter (root_window,
|
||||||
|
egg_tray_icon_manager_filter, icon);
|
||||||
|
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
EggTrayIcon *
|
||||||
|
egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
|
||||||
|
|
||||||
|
return egg_tray_icon_new_for_xscreen (GDK_SCREEN_XSCREEN (screen), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
EggTrayIcon*
|
||||||
|
egg_tray_icon_new (const gchar *name)
|
||||||
|
{
|
||||||
|
return egg_tray_icon_new_for_xscreen (DefaultScreenOfDisplay (gdk_display), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
guint
|
||||||
|
egg_tray_icon_send_message (EggTrayIcon *icon,
|
||||||
|
gint timeout,
|
||||||
|
const gchar *message,
|
||||||
|
gint len)
|
||||||
|
{
|
||||||
|
guint stamp;
|
||||||
|
|
||||||
|
g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);
|
||||||
|
g_return_val_if_fail (timeout >= 0, 0);
|
||||||
|
g_return_val_if_fail (message != NULL, 0);
|
||||||
|
|
||||||
|
if (icon->manager_window == None)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (len < 0)
|
||||||
|
len = strlen (message);
|
||||||
|
|
||||||
|
stamp = icon->stamp++;
|
||||||
|
|
||||||
|
/* Get ready to send the message */
|
||||||
|
egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,
|
||||||
|
(Window)gtk_plug_get_id (GTK_PLUG (icon)),
|
||||||
|
timeout, len, stamp);
|
||||||
|
|
||||||
|
/* Now to send the actual message */
|
||||||
|
gdk_error_trap_push ();
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
XClientMessageEvent ev;
|
||||||
|
Display *xdisplay;
|
||||||
|
|
||||||
|
xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
|
||||||
|
|
||||||
|
ev.type = ClientMessage;
|
||||||
|
ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
|
||||||
|
ev.format = 8;
|
||||||
|
ev.message_type = XInternAtom (xdisplay,
|
||||||
|
"_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
|
||||||
|
if (len > 20)
|
||||||
|
{
|
||||||
|
memcpy (&ev.data, message, 20);
|
||||||
|
len -= 20;
|
||||||
|
message += 20;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy (&ev.data, message, len);
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSendEvent (xdisplay,
|
||||||
|
icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);
|
||||||
|
XSync (xdisplay, False);
|
||||||
|
}
|
||||||
|
gdk_error_trap_pop ();
|
||||||
|
|
||||||
|
return stamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
egg_tray_icon_cancel_message (EggTrayIcon *icon,
|
||||||
|
guint id)
|
||||||
|
{
|
||||||
|
g_return_if_fail (EGG_IS_TRAY_ICON (icon));
|
||||||
|
g_return_if_fail (id > 0);
|
||||||
|
|
||||||
|
egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,
|
||||||
|
(Window)gtk_plug_get_id (GTK_PLUG (icon)),
|
||||||
|
id, 0, 0);
|
||||||
|
}
|
74
src/gtk1/eggtrayicon.h
Normal file
74
src/gtk1/eggtrayicon.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||||
|
/* eggtrayicon.h
|
||||||
|
* Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EGG_TRAY_ICON_H__
|
||||||
|
#define __EGG_TRAY_ICON_H__
|
||||||
|
|
||||||
|
#include <gtk/gtkplug.h>
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ())
|
||||||
|
#define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon))
|
||||||
|
#define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
|
||||||
|
#define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON))
|
||||||
|
#define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON))
|
||||||
|
#define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
|
||||||
|
|
||||||
|
typedef struct _EggTrayIcon EggTrayIcon;
|
||||||
|
typedef struct _EggTrayIconClass EggTrayIconClass;
|
||||||
|
|
||||||
|
struct _EggTrayIcon
|
||||||
|
{
|
||||||
|
GtkPlug parent_instance;
|
||||||
|
|
||||||
|
guint stamp;
|
||||||
|
|
||||||
|
Atom selection_atom;
|
||||||
|
Atom manager_atom;
|
||||||
|
Atom system_tray_opcode_atom;
|
||||||
|
Window manager_window;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _EggTrayIconClass
|
||||||
|
{
|
||||||
|
GtkPlugClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
GType egg_tray_icon_get_type (void);
|
||||||
|
|
||||||
|
EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen,
|
||||||
|
const gchar *name);
|
||||||
|
|
||||||
|
EggTrayIcon *egg_tray_icon_new (const gchar *name);
|
||||||
|
|
||||||
|
guint egg_tray_icon_send_message (EggTrayIcon *icon,
|
||||||
|
gint timeout,
|
||||||
|
const char *message,
|
||||||
|
gint len);
|
||||||
|
void egg_tray_icon_cancel_message (EggTrayIcon *icon,
|
||||||
|
guint id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __EGG_TRAY_ICON_H__ */
|
65
src/gtk1/taskbar.cpp
Normal file
65
src/gtk1/taskbar.cpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// File: taskbar.cpp
|
||||||
|
// Purpose: wxTaskBarIcon (src/unix/taskbarx11.cpp) helper for GTK2
|
||||||
|
// Author: Vaclav Slavik
|
||||||
|
// Modified by:
|
||||||
|
// Created: 2004/05/29
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Vaclav Slavik, 2004
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
|
||||||
|
#pragma implementation "taskbarpriv.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
|
#include "wx/wxprec.h"
|
||||||
|
|
||||||
|
#include "wx/log.h"
|
||||||
|
#include "wx/frame.h"
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
|
||||||
|
#include "wx/gtk/taskbarpriv.h"
|
||||||
|
#include "eggtrayicon.h"
|
||||||
|
|
||||||
|
wxTaskBarIconAreaBase::wxTaskBarIconAreaBase()
|
||||||
|
{
|
||||||
|
if (IsProtocolSupported())
|
||||||
|
{
|
||||||
|
m_widget = GTK_WIDGET(egg_tray_icon_new("systray icon"));
|
||||||
|
gtk_window_set_resizable(GTK_WINDOW(m_widget), false);
|
||||||
|
|
||||||
|
wxLogTrace(_T("systray"), _T("using freedesktop.org systray spec"));
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTopLevelWindow::Create(
|
||||||
|
NULL, wxID_ANY, _T("systray icon"),
|
||||||
|
wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR | wxSIMPLE_BORDER |
|
||||||
|
wxFRAME_SHAPED,
|
||||||
|
wxEmptyString /*eggtray doesn't like setting wmclass*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxTaskBarIconAreaBase::IsProtocolSupported()
|
||||||
|
{
|
||||||
|
static int s_supported = -1;
|
||||||
|
if (s_supported == -1)
|
||||||
|
{
|
||||||
|
Display *display = GDK_DISPLAY();
|
||||||
|
Screen *screen = DefaultScreenOfDisplay(display);
|
||||||
|
|
||||||
|
wxString name;
|
||||||
|
name.Printf(_T("_NET_SYSTEM_TRAY_S%d"), XScreenNumberOfScreen(screen));
|
||||||
|
Atom atom = XInternAtom(display, name.ToAscii(), False);
|
||||||
|
|
||||||
|
Window manager = XGetSelectionOwner(display, atom);
|
||||||
|
|
||||||
|
s_supported = (manager != None);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bool)s_supported;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __WXGTK20__
|
@ -14,13 +14,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// NB: This implementation does *not* work with every X11 window manager.
|
// NB: This implementation does *not* work with every X11 window manager.
|
||||||
// Currently only GNOME 1.2 and KDE 1,2,3 methods are implemented.
|
// Currently only GNOME 1.2 and KDE 1,2,3 methods are implemented here.
|
||||||
//
|
// Freedesktop.org's System Tray specification is implemented in
|
||||||
// FIXME: implement:
|
// src/gtk/taskbar.cpp and used from here under wxGTK.
|
||||||
// - GNOME 2 support (see www.freedesktop.org for specification;
|
|
||||||
// KDE 3 uses this method as well, even though legacy KDE
|
|
||||||
// method we implement works as well)
|
|
||||||
// - IceWM support (?)
|
|
||||||
//
|
//
|
||||||
// Thanks to Ian Campbell, author of XMMS Status Docklet, for publishing
|
// Thanks to Ian Campbell, author of XMMS Status Docklet, for publishing
|
||||||
// KDE and GNOME 1.2 methods.
|
// KDE and GNOME 1.2 methods.
|
||||||
@ -35,6 +31,7 @@
|
|||||||
#include "wx/statbmp.h"
|
#include "wx/statbmp.h"
|
||||||
#include "wx/sizer.h"
|
#include "wx/sizer.h"
|
||||||
#include "wx/dcclient.h"
|
#include "wx/dcclient.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
|
||||||
#ifdef __VMS
|
#ifdef __VMS
|
||||||
#pragma message disable nosimpint
|
#pragma message disable nosimpint
|
||||||
@ -45,6 +42,27 @@
|
|||||||
#pragma message enable nosimpint
|
#pragma message enable nosimpint
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// base class that implements toolkit-specific method:
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
#include "wx/gtk/taskbarpriv.h"
|
||||||
|
#else
|
||||||
|
class WXDLLIMPEXP_ADV wxTaskBarIconAreaBase : public wxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxTaskBarIconAreaBase()
|
||||||
|
: wxFrame(NULL, wxID_ANY, _T("systray icon"),
|
||||||
|
wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR |
|
||||||
|
wxSIMPLE_BORDER | wxFRAME_SHAPED) {}
|
||||||
|
|
||||||
|
bool IsProtocolSupported() const { return false; }
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// toolkit dependent methods to set properties on helper window:
|
// toolkit dependent methods to set properties on helper window:
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -68,46 +86,85 @@
|
|||||||
// wxTaskBarIconArea is the real window that shows the icon:
|
// wxTaskBarIconArea is the real window that shows the icon:
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
class WXDLLIMPEXP_ADV wxTaskBarIconArea : public wxFrame
|
class WXDLLIMPEXP_ADV wxTaskBarIconArea : public wxTaskBarIconAreaBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp)
|
wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp);
|
||||||
: wxFrame(NULL, -1, wxT("taskbar icon"),
|
void SetTrayIcon(const wxBitmap& bmp);
|
||||||
wxDefaultPosition, wxDefaultSize,
|
|
||||||
wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR |
|
|
||||||
wxSIMPLE_BORDER | wxFRAME_SHAPED),
|
|
||||||
m_icon(icon), m_bmp(bmp)
|
|
||||||
{
|
|
||||||
SetWMProperties();
|
|
||||||
SetSize(wxSize(bmp.GetWidth(), bmp.GetHeight()));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsOk() { return true; }
|
bool IsOk() { return true; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void SetWMProperties();
|
void SetLegacyWMProperties();
|
||||||
|
|
||||||
|
void OnSizeChange(wxSizeEvent& event);
|
||||||
void OnPaint(wxPaintEvent& evt);
|
void OnPaint(wxPaintEvent& evt);
|
||||||
void OnWindowCreate(wxWindowCreateEvent& event);
|
|
||||||
void OnMouseEvent(wxMouseEvent& event);
|
void OnMouseEvent(wxMouseEvent& event);
|
||||||
void OnMenuEvent(wxCommandEvent& event);
|
void OnMenuEvent(wxCommandEvent& event);
|
||||||
|
|
||||||
wxTaskBarIcon *m_icon;
|
wxTaskBarIcon *m_icon;
|
||||||
wxBitmap m_bmp;
|
wxPoint m_pos;
|
||||||
|
wxBitmap m_bmp;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(wxTaskBarIconArea, wxFrame)
|
BEGIN_EVENT_TABLE(wxTaskBarIconArea, wxTaskBarIconAreaBase)
|
||||||
|
EVT_SIZE(wxTaskBarIconArea::OnSizeChange)
|
||||||
EVT_MOUSE_EVENTS(wxTaskBarIconArea::OnMouseEvent)
|
EVT_MOUSE_EVENTS(wxTaskBarIconArea::OnMouseEvent)
|
||||||
EVT_MENU(-1, wxTaskBarIconArea::OnMenuEvent)
|
EVT_MENU(-1, wxTaskBarIconArea::OnMenuEvent)
|
||||||
EVT_PAINT(wxTaskBarIconArea::OnPaint)
|
EVT_PAINT(wxTaskBarIconArea::OnPaint)
|
||||||
#ifdef __WXGTK__
|
|
||||||
EVT_WINDOW_CREATE(wxTaskBarIconArea::OnWindowCreate)
|
|
||||||
#endif
|
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
wxTaskBarIconArea::wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp)
|
||||||
|
: wxTaskBarIconAreaBase(), m_icon(icon), m_pos(0,0)
|
||||||
|
{
|
||||||
|
if (!IsProtocolSupported())
|
||||||
|
{
|
||||||
|
wxLogTrace(_T("systray"),
|
||||||
|
_T("using legacy KDE1,2 and GNOME 1.2 methods"));
|
||||||
|
SetLegacyWMProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial size to bitmap size (tray manager may and often will
|
||||||
|
// change it):
|
||||||
|
SetSize(wxSize(bmp.GetWidth(), bmp.GetHeight()));
|
||||||
|
|
||||||
|
SetTrayIcon(bmp);
|
||||||
|
}
|
||||||
|
|
||||||
void wxTaskBarIconArea::SetWMProperties()
|
void wxTaskBarIconArea::SetTrayIcon(const wxBitmap& bmp)
|
||||||
|
{
|
||||||
|
m_bmp = bmp;
|
||||||
|
|
||||||
|
// determine suitable bitmap size:
|
||||||
|
wxSize winsize(GetSize());
|
||||||
|
wxSize bmpsize(m_bmp.GetWidth(), m_bmp.GetHeight());
|
||||||
|
wxSize iconsize(wxMin(winsize.x, bmpsize.x), wxMin(winsize.y, bmpsize.y));
|
||||||
|
|
||||||
|
// rescale the bitmap to fit into the tray icon window:
|
||||||
|
if (bmpsize != iconsize)
|
||||||
|
{
|
||||||
|
wxImage img = m_bmp.ConvertToImage();
|
||||||
|
img.Rescale(iconsize.x, iconsize.y);
|
||||||
|
m_bmp = wxBitmap(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRegion region(m_bmp);
|
||||||
|
|
||||||
|
// if the bitmap is smaller than the window, offset it:
|
||||||
|
if (winsize != iconsize)
|
||||||
|
{
|
||||||
|
m_pos.x = (winsize.x - iconsize.x) / 2;
|
||||||
|
m_pos.y = (winsize.y - iconsize.y) / 2;
|
||||||
|
region.Offset(m_pos.x, m_pos.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set frame's shape to correct value and redraw:
|
||||||
|
SetShape(region);
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTaskBarIconArea::SetLegacyWMProperties()
|
||||||
{
|
{
|
||||||
#ifdef __WXGTK__
|
#ifdef __WXGTK__
|
||||||
gtk_widget_realize(m_widget);
|
gtk_widget_realize(m_widget);
|
||||||
@ -134,22 +191,26 @@ void wxTaskBarIconArea::SetWMProperties()
|
|||||||
PropModeReplace, (unsigned char*)data, 1);
|
PropModeReplace, (unsigned char*)data, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTaskBarIconArea::OnWindowCreate(wxWindowCreateEvent& WXUNUSED(event))
|
void wxTaskBarIconArea::OnSizeChange(wxSizeEvent& event)
|
||||||
{
|
{
|
||||||
SetShape(wxRegion(m_bmp));
|
wxLogTrace(_T("systray"), _T("icon size changed to %i x %i"),
|
||||||
|
GetSize().x, GetSize().y);
|
||||||
|
// rescale or reposition the icon as needed:
|
||||||
|
wxBitmap bmp(m_bmp);
|
||||||
|
SetTrayIcon(bmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTaskBarIconArea::OnPaint(wxPaintEvent& WXUNUSED(event))
|
void wxTaskBarIconArea::OnPaint(wxPaintEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
wxPaintDC dc(this);
|
wxPaintDC dc(this);
|
||||||
dc.DrawBitmap(m_bmp, 0, 0, true);
|
dc.DrawBitmap(m_bmp, m_pos.x, m_pos.y, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTaskBarIconArea::OnMouseEvent(wxMouseEvent& event)
|
void wxTaskBarIconArea::OnMouseEvent(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
wxEventType type = 0;
|
wxEventType type = 0;
|
||||||
wxEventType mtype = event.GetEventType();
|
wxEventType mtype = event.GetEventType();
|
||||||
|
|
||||||
if (mtype == wxEVT_LEFT_DOWN)
|
if (mtype == wxEVT_LEFT_DOWN)
|
||||||
type = wxEVT_TASKBAR_LEFT_DOWN;
|
type = wxEVT_TASKBAR_LEFT_DOWN;
|
||||||
else if (mtype == wxEVT_LEFT_UP)
|
else if (mtype == wxEVT_LEFT_UP)
|
||||||
@ -204,29 +265,35 @@ bool wxTaskBarIcon::IsIconInstalled() const
|
|||||||
|
|
||||||
bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
|
bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
|
||||||
{
|
{
|
||||||
if (m_iconWnd)
|
|
||||||
RemoveIcon();
|
|
||||||
|
|
||||||
wxBitmap bmp;
|
wxBitmap bmp;
|
||||||
bmp.CopyFromIcon(icon);
|
bmp.CopyFromIcon(icon);
|
||||||
|
|
||||||
m_iconWnd = new wxTaskBarIconArea(this, bmp);
|
|
||||||
|
|
||||||
#if wxUSE_TOOLTIPS
|
if (!m_iconWnd)
|
||||||
if (!tooltip.empty())
|
|
||||||
m_iconWnd->SetToolTip(tooltip);
|
|
||||||
#endif
|
|
||||||
if (m_iconWnd->IsOk())
|
|
||||||
{
|
{
|
||||||
m_iconWnd->Show();
|
m_iconWnd = new wxTaskBarIconArea(this, bmp);
|
||||||
return true;
|
if (m_iconWnd->IsOk())
|
||||||
|
{
|
||||||
|
m_iconWnd->Show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_iconWnd->Destroy();
|
||||||
|
m_iconWnd = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_iconWnd->Destroy();
|
m_iconWnd->SetTrayIcon(bmp);
|
||||||
m_iconWnd = NULL;
|
}
|
||||||
return false;
|
|
||||||
}
|
#if wxUSE_TOOLTIPS
|
||||||
|
if (!tooltip.empty())
|
||||||
|
m_iconWnd->SetToolTip(tooltip);
|
||||||
|
else
|
||||||
|
m_iconWnd->SetToolTip(NULL);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxTaskBarIcon::RemoveIcon()
|
bool wxTaskBarIcon::RemoveIcon()
|
||||||
|
Loading…
Reference in New Issue
Block a user