Add a class derived from GtkImage to support HiDPI bitmaps

And use it to get HiDPI support wherever we use GtkImage. This extends and
consolidates support for custom drawing of images which has already been added
somewhat redundantly in several places.
This commit is contained in:
Paul Cornett
2020-09-15 11:52:03 -07:00
parent cb04c35365
commit 85d63c3150
14 changed files with 314 additions and 134 deletions

View File

@@ -4995,6 +4995,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS = \
monodll_filectrl.o \ monodll_filectrl.o \
monodll_filehistory.o \ monodll_filehistory.o \
monodll_gtk_font.o \ monodll_gtk_font.o \
monodll_image_gtk.o \
monodll_gtk_sockgtk.o \ monodll_gtk_sockgtk.o \
monodll_gtk_minifram.o \ monodll_gtk_minifram.o \
monodll_gtk_nonownedwnd.o \ monodll_gtk_nonownedwnd.o \
@@ -5035,6 +5036,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS = \
monodll_filectrl.o \ monodll_filectrl.o \
monodll_filehistory.o \ monodll_filehistory.o \
monodll_gtk_font.o \ monodll_gtk_font.o \
monodll_image_gtk.o \
monodll_gtk_sockgtk.o \ monodll_gtk_sockgtk.o \
monodll_gtk_minifram.o \ monodll_gtk_minifram.o \
monodll_gtk_nonownedwnd.o \ monodll_gtk_nonownedwnd.o \
@@ -5072,6 +5074,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS = \
monodll_filectrl.o \ monodll_filectrl.o \
monodll_filehistory.o \ monodll_filehistory.o \
monodll_gtk_font.o \ monodll_gtk_font.o \
monodll_image_gtk.o \
monodll_gtk_sockgtk.o \ monodll_gtk_sockgtk.o \
monodll_gtk_minifram.o \ monodll_gtk_minifram.o \
monodll_gtk_nonownedwnd.o \ monodll_gtk_nonownedwnd.o \
@@ -5899,6 +5902,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_1 = \
monodll_filectrl.o \ monodll_filectrl.o \
monodll_filehistory.o \ monodll_filehistory.o \
monodll_gtk_font.o \ monodll_gtk_font.o \
monodll_image_gtk.o \
monodll_gtk_sockgtk.o \ monodll_gtk_sockgtk.o \
monodll_gtk_minifram.o \ monodll_gtk_minifram.o \
monodll_gtk_nonownedwnd.o \ monodll_gtk_nonownedwnd.o \
@@ -5939,6 +5943,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_1 = \
monodll_filectrl.o \ monodll_filectrl.o \
monodll_filehistory.o \ monodll_filehistory.o \
monodll_gtk_font.o \ monodll_gtk_font.o \
monodll_image_gtk.o \
monodll_gtk_sockgtk.o \ monodll_gtk_sockgtk.o \
monodll_gtk_minifram.o \ monodll_gtk_minifram.o \
monodll_gtk_nonownedwnd.o \ monodll_gtk_nonownedwnd.o \
@@ -5976,6 +5981,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_1 = \
monodll_filectrl.o \ monodll_filectrl.o \
monodll_filehistory.o \ monodll_filehistory.o \
monodll_gtk_font.o \ monodll_gtk_font.o \
monodll_image_gtk.o \
monodll_gtk_sockgtk.o \ monodll_gtk_sockgtk.o \
monodll_gtk_minifram.o \ monodll_gtk_minifram.o \
monodll_gtk_nonownedwnd.o \ monodll_gtk_nonownedwnd.o \
@@ -6976,6 +6982,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_2 = \
monolib_filectrl.o \ monolib_filectrl.o \
monolib_filehistory.o \ monolib_filehistory.o \
monolib_gtk_font.o \ monolib_gtk_font.o \
monolib_image_gtk.o \
monolib_gtk_sockgtk.o \ monolib_gtk_sockgtk.o \
monolib_gtk_minifram.o \ monolib_gtk_minifram.o \
monolib_gtk_nonownedwnd.o \ monolib_gtk_nonownedwnd.o \
@@ -7016,6 +7023,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_2 = \
monolib_filectrl.o \ monolib_filectrl.o \
monolib_filehistory.o \ monolib_filehistory.o \
monolib_gtk_font.o \ monolib_gtk_font.o \
monolib_image_gtk.o \
monolib_gtk_sockgtk.o \ monolib_gtk_sockgtk.o \
monolib_gtk_minifram.o \ monolib_gtk_minifram.o \
monolib_gtk_nonownedwnd.o \ monolib_gtk_nonownedwnd.o \
@@ -7053,6 +7061,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_2 = \
monolib_filectrl.o \ monolib_filectrl.o \
monolib_filehistory.o \ monolib_filehistory.o \
monolib_gtk_font.o \ monolib_gtk_font.o \
monolib_image_gtk.o \
monolib_gtk_sockgtk.o \ monolib_gtk_sockgtk.o \
monolib_gtk_minifram.o \ monolib_gtk_minifram.o \
monolib_gtk_nonownedwnd.o \ monolib_gtk_nonownedwnd.o \
@@ -7880,6 +7889,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_3 = \
monolib_filectrl.o \ monolib_filectrl.o \
monolib_filehistory.o \ monolib_filehistory.o \
monolib_gtk_font.o \ monolib_gtk_font.o \
monolib_image_gtk.o \
monolib_gtk_sockgtk.o \ monolib_gtk_sockgtk.o \
monolib_gtk_minifram.o \ monolib_gtk_minifram.o \
monolib_gtk_nonownedwnd.o \ monolib_gtk_nonownedwnd.o \
@@ -7920,6 +7930,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_3 = \
monolib_filectrl.o \ monolib_filectrl.o \
monolib_filehistory.o \ monolib_filehistory.o \
monolib_gtk_font.o \ monolib_gtk_font.o \
monolib_image_gtk.o \
monolib_gtk_sockgtk.o \ monolib_gtk_sockgtk.o \
monolib_gtk_minifram.o \ monolib_gtk_minifram.o \
monolib_gtk_nonownedwnd.o \ monolib_gtk_nonownedwnd.o \
@@ -7957,6 +7968,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_3 = \
monolib_filectrl.o \ monolib_filectrl.o \
monolib_filehistory.o \ monolib_filehistory.o \
monolib_gtk_font.o \ monolib_gtk_font.o \
monolib_image_gtk.o \
monolib_gtk_sockgtk.o \ monolib_gtk_sockgtk.o \
monolib_gtk_minifram.o \ monolib_gtk_minifram.o \
monolib_gtk_nonownedwnd.o \ monolib_gtk_nonownedwnd.o \
@@ -9103,6 +9115,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_4 = \
coredll_filectrl.o \ coredll_filectrl.o \
coredll_filehistory.o \ coredll_filehistory.o \
coredll_gtk_font.o \ coredll_gtk_font.o \
coredll_image_gtk.o \
coredll_gtk_sockgtk.o \ coredll_gtk_sockgtk.o \
coredll_gtk_minifram.o \ coredll_gtk_minifram.o \
coredll_gtk_nonownedwnd.o \ coredll_gtk_nonownedwnd.o \
@@ -9143,6 +9156,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_4 = \
coredll_filectrl.o \ coredll_filectrl.o \
coredll_filehistory.o \ coredll_filehistory.o \
coredll_gtk_font.o \ coredll_gtk_font.o \
coredll_image_gtk.o \
coredll_gtk_sockgtk.o \ coredll_gtk_sockgtk.o \
coredll_gtk_minifram.o \ coredll_gtk_minifram.o \
coredll_gtk_nonownedwnd.o \ coredll_gtk_nonownedwnd.o \
@@ -9180,6 +9194,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_4 = \
coredll_filectrl.o \ coredll_filectrl.o \
coredll_filehistory.o \ coredll_filehistory.o \
coredll_gtk_font.o \ coredll_gtk_font.o \
coredll_image_gtk.o \
coredll_gtk_sockgtk.o \ coredll_gtk_sockgtk.o \
coredll_gtk_minifram.o \ coredll_gtk_minifram.o \
coredll_gtk_nonownedwnd.o \ coredll_gtk_nonownedwnd.o \
@@ -10007,6 +10022,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_5 = \
coredll_filectrl.o \ coredll_filectrl.o \
coredll_filehistory.o \ coredll_filehistory.o \
coredll_gtk_font.o \ coredll_gtk_font.o \
coredll_image_gtk.o \
coredll_gtk_sockgtk.o \ coredll_gtk_sockgtk.o \
coredll_gtk_minifram.o \ coredll_gtk_minifram.o \
coredll_gtk_nonownedwnd.o \ coredll_gtk_nonownedwnd.o \
@@ -10047,6 +10063,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_5 = \
coredll_filectrl.o \ coredll_filectrl.o \
coredll_filehistory.o \ coredll_filehistory.o \
coredll_gtk_font.o \ coredll_gtk_font.o \
coredll_image_gtk.o \
coredll_gtk_sockgtk.o \ coredll_gtk_sockgtk.o \
coredll_gtk_minifram.o \ coredll_gtk_minifram.o \
coredll_gtk_nonownedwnd.o \ coredll_gtk_nonownedwnd.o \
@@ -10084,6 +10101,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_5 = \
coredll_filectrl.o \ coredll_filectrl.o \
coredll_filehistory.o \ coredll_filehistory.o \
coredll_gtk_font.o \ coredll_gtk_font.o \
coredll_image_gtk.o \
coredll_gtk_sockgtk.o \ coredll_gtk_sockgtk.o \
coredll_gtk_minifram.o \ coredll_gtk_minifram.o \
coredll_gtk_nonownedwnd.o \ coredll_gtk_nonownedwnd.o \
@@ -10820,6 +10838,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_6 = \
corelib_filectrl.o \ corelib_filectrl.o \
corelib_filehistory.o \ corelib_filehistory.o \
corelib_gtk_font.o \ corelib_gtk_font.o \
corelib_image_gtk.o \
corelib_gtk_sockgtk.o \ corelib_gtk_sockgtk.o \
corelib_gtk_minifram.o \ corelib_gtk_minifram.o \
corelib_gtk_nonownedwnd.o \ corelib_gtk_nonownedwnd.o \
@@ -10860,6 +10879,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_6 = \
corelib_filectrl.o \ corelib_filectrl.o \
corelib_filehistory.o \ corelib_filehistory.o \
corelib_gtk_font.o \ corelib_gtk_font.o \
corelib_image_gtk.o \
corelib_gtk_sockgtk.o \ corelib_gtk_sockgtk.o \
corelib_gtk_minifram.o \ corelib_gtk_minifram.o \
corelib_gtk_nonownedwnd.o \ corelib_gtk_nonownedwnd.o \
@@ -10897,6 +10917,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_6 = \
corelib_filectrl.o \ corelib_filectrl.o \
corelib_filehistory.o \ corelib_filehistory.o \
corelib_gtk_font.o \ corelib_gtk_font.o \
corelib_image_gtk.o \
corelib_gtk_sockgtk.o \ corelib_gtk_sockgtk.o \
corelib_gtk_minifram.o \ corelib_gtk_minifram.o \
corelib_gtk_nonownedwnd.o \ corelib_gtk_nonownedwnd.o \
@@ -11724,6 +11745,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_7 = \
corelib_filectrl.o \ corelib_filectrl.o \
corelib_filehistory.o \ corelib_filehistory.o \
corelib_gtk_font.o \ corelib_gtk_font.o \
corelib_image_gtk.o \
corelib_gtk_sockgtk.o \ corelib_gtk_sockgtk.o \
corelib_gtk_minifram.o \ corelib_gtk_minifram.o \
corelib_gtk_nonownedwnd.o \ corelib_gtk_nonownedwnd.o \
@@ -11764,6 +11786,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___LOWLEVEL_SRC_OBJECTS_7 = \
corelib_filectrl.o \ corelib_filectrl.o \
corelib_filehistory.o \ corelib_filehistory.o \
corelib_gtk_font.o \ corelib_gtk_font.o \
corelib_image_gtk.o \
corelib_gtk_sockgtk.o \ corelib_gtk_sockgtk.o \
corelib_gtk_minifram.o \ corelib_gtk_minifram.o \
corelib_gtk_nonownedwnd.o \ corelib_gtk_nonownedwnd.o \
@@ -11801,6 +11824,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_4___LOWLEVEL_SRC_OBJECTS_7 = \
corelib_filectrl.o \ corelib_filectrl.o \
corelib_filehistory.o \ corelib_filehistory.o \
corelib_gtk_font.o \ corelib_gtk_font.o \
corelib_image_gtk.o \
corelib_gtk_sockgtk.o \ corelib_gtk_sockgtk.o \
corelib_gtk_minifram.o \ corelib_gtk_minifram.o \
corelib_gtk_nonownedwnd.o \ corelib_gtk_nonownedwnd.o \
@@ -18333,6 +18357,15 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/font.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/font.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@monodll_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@monodll_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@monodll_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@monodll_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp
@@ -23592,6 +23625,15 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/font.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/font.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@monolib_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@monolib_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@monolib_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@monolib_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp
@@ -28932,6 +28974,15 @@ coredll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/font.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/font.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@coredll_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@coredll_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@coredll_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@coredll_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp
@@ -33180,6 +33231,15 @@ corelib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_gtk_font.o: $(srcdir)/src/gtk/font.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/font.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/font.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@corelib_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@corelib_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_image_gtk.o: $(srcdir)/src/gtk/image_gtk.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/image_gtk.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@corelib_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@corelib_gtk_sockgtk.o: $(srcdir)/src/gtk/sockgtk.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_4_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/sockgtk.cpp

View File

@@ -1397,6 +1397,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/gtk/filectrl.cpp src/gtk/filectrl.cpp
src/gtk/filehistory.cpp src/gtk/filehistory.cpp
src/gtk/font.cpp src/gtk/font.cpp
src/gtk/image_gtk.cpp
src/gtk/sockgtk.cpp src/gtk/sockgtk.cpp
src/gtk/minifram.cpp src/gtk/minifram.cpp
src/gtk/nonownedwnd.cpp src/gtk/nonownedwnd.cpp

View File

@@ -1281,6 +1281,7 @@ set(GTK_LOWLEVEL_SRC
src/gtk/filectrl.cpp src/gtk/filectrl.cpp
src/gtk/filehistory.cpp src/gtk/filehistory.cpp
src/gtk/font.cpp src/gtk/font.cpp
src/gtk/image_gtk.cpp
src/gtk/sockgtk.cpp src/gtk/sockgtk.cpp
src/gtk/mimetype.cpp src/gtk/mimetype.cpp
src/gtk/minifram.cpp src/gtk/minifram.cpp

View File

@@ -1293,6 +1293,7 @@ GTK_LOWLEVEL_SRC =
src/gtk/filectrl.cpp src/gtk/filectrl.cpp
src/gtk/filehistory.cpp src/gtk/filehistory.cpp
src/gtk/font.cpp src/gtk/font.cpp
src/gtk/image_gtk.cpp
src/gtk/sockgtk.cpp src/gtk/sockgtk.cpp
src/gtk/mimetype.cpp src/gtk/mimetype.cpp
src/gtk/minifram.cpp src/gtk/minifram.cpp

View File

@@ -0,0 +1,33 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/gtk/private/image.h
// Author: Paul Cornett
// Copyright: (c) 2020 Paul Cornett
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// Class that can be used in place of GtkImage, to allow drawing of alternate
// bitmaps, such as HiDPI or disabled.
class wxGtkImage: GtkImage
{
public:
struct BitmapProvider
{
virtual ~BitmapProvider() { }
virtual wxBitmap Get() const = 0;
virtual void Set(const wxBitmap&) { }
};
static GType Type();
static GtkWidget* New(BitmapProvider* provider);
static GtkWidget* New(wxWindow* win = NULL);
void Set(const wxBitmap& bitmap);
BitmapProvider* m_provider;
wxDECLARE_NO_COPY_CLASS(wxGtkImage);
wxGtkImage() wxMEMBER_DELETE;
~wxGtkImage() wxMEMBER_DELETE;
};
#define WX_GTK_IMAGE(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, wxGtkImage::Type(), wxGtkImage)

View File

@@ -19,6 +19,7 @@
#include "wx/stockitem.h" #include "wx/stockitem.h"
#include "wx/gtk/private/wrapgtk.h" #include "wx/gtk/private/wrapgtk.h"
#include "wx/gtk/private/image.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// GTK callbacks // GTK callbacks
@@ -191,7 +192,7 @@ void wxAnyButton::GTKDoShowBitmap(const wxBitmap& bitmap)
wxCHECK_RET(GTK_IS_IMAGE(image), "must have image widget"); wxCHECK_RET(GTK_IS_IMAGE(image), "must have image widget");
gtk_image_set_from_pixbuf(GTK_IMAGE(image), bitmap.GetPixbuf()); WX_GTK_IMAGE(image)->Set(bitmap);
} }
wxBitmap wxAnyButton::DoGetBitmap(State which) const wxBitmap wxAnyButton::DoGetBitmap(State which) const
@@ -222,7 +223,7 @@ void wxAnyButton::DoSetBitmap(const wxBitmap& bitmap, State which)
} }
else if ( !image && bitmap.IsOk() ) else if ( !image && bitmap.IsOk() )
{ {
image = gtk_image_new(); image = wxGtkImage::New(this);
gtk_button_set_image(GTK_BUTTON(m_widget), image); gtk_button_set_image(GTK_BUTTON(m_widget), image);
// Setting the image recreates the label, so we need to // Setting the image recreates the label, so we need to

View File

@@ -19,6 +19,7 @@
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/list.h" #include "wx/gtk/private/list.h"
#include "wx/gtk/private/image.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// GTK callbacks // GTK callbacks
@@ -98,7 +99,7 @@ bool wxButton::Create(wxWindow *parent,
{ {
m_widget = gtk_button_new(); m_widget = gtk_button_new();
GtkWidget *image = gtk_image_new(); GtkWidget* image = wxGtkImage::New(this);
gtk_widget_show(image); gtk_widget_show(image);
gtk_container_add(GTK_CONTAINER(m_widget), image); gtk_container_add(GTK_CONTAINER(m_widget), image);
} }

View File

@@ -35,6 +35,7 @@
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/event.h" #include "wx/gtk/private/event.h"
#include "wx/gtk/private/gdkconv.h" #include "wx/gtk/private/gdkconv.h"
#include "wx/gtk/private/image.h"
#include "wx/gtk/private/list.h" #include "wx/gtk/private/list.h"
#include "wx/gtk/private/treeview.h" #include "wx/gtk/private/treeview.h"
using namespace wxGTKImpl; using namespace wxGTKImpl;
@@ -3202,7 +3203,7 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width)
GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); GtkWidget* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
gtk_widget_show( box ); gtk_widget_show( box );
// gtk_container_set_border_width((GtkContainer*)box, 2); // gtk_container_set_border_width((GtkContainer*)box, 2);
m_image = gtk_image_new(); m_image = wxGtkImage::New();
gtk_box_pack_start(GTK_BOX(box), m_image, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(box), m_image, FALSE, FALSE, 1);
m_label = gtk_label_new(""); m_label = gtk_label_new("");
gtk_box_pack_end( GTK_BOX(box), GTK_WIDGET(m_label), FALSE, FALSE, 1 ); gtk_box_pack_end( GTK_BOX(box), GTK_WIDGET(m_label), FALSE, FALSE, 1 );
@@ -3273,9 +3274,7 @@ void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap )
if (bitmap.IsOk()) if (bitmap.IsOk())
{ {
GtkImage *gtk_image = GTK_IMAGE(m_image); WX_GTK_IMAGE(m_image)->Set(bitmap);
gtk_image_set_from_pixbuf(GTK_IMAGE(gtk_image), bitmap.GetPixbuf());
gtk_widget_show( m_image ); gtk_widget_show( m_image );
} }
else else

169
src/gtk/image_gtk.cpp Normal file
View File

@@ -0,0 +1,169 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/gtk/image_gtk.cpp
// Author: Paul Cornett
// Copyright: (c) 2020 Paul Cornett
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#include "wx/bitmap.h"
#include "wx/window.h"
#include "wx/gtk/private/wrapgtk.h"
#include "wx/gtk/private/image.h"
namespace
{
// Default provider for HiDPI common case
struct BitmapProviderDefault: wxGtkImage::BitmapProvider
{
#ifdef __WXGTK3__
BitmapProviderDefault(wxWindow* win) : m_win(win) { }
virtual wxBitmap Get() const wxOVERRIDE;
virtual void Set(const wxBitmap& bitmap) wxOVERRIDE;
wxWindow* const m_win;
wxBitmap m_bitmap;
wxBitmap m_bitmapDisabled;
#else
BitmapProviderDefault(wxWindow*) { }
virtual wxBitmap Get() const wxOVERRIDE { return wxBitmap(); }
#endif
};
#ifdef __WXGTK3__
wxBitmap BitmapProviderDefault::Get() const
{
return (m_win == NULL || m_win->IsEnabled()) ? m_bitmap : m_bitmapDisabled;
}
void BitmapProviderDefault::Set(const wxBitmap& bitmap)
{
m_bitmap.UnRef();
m_bitmapDisabled.UnRef();
if (bitmap.IsOk() && bitmap.GetScaleFactor() > 1)
{
m_bitmap = bitmap;
if (m_win)
m_bitmapDisabled = bitmap.CreateDisabled();
}
}
#endif // __WXGTK3__
} // namespace
extern "C" {
static void wxGtkImageClassInit(void* g_class, void* class_data);
}
GType wxGtkImage::Type()
{
static GType type;
if (type == 0)
{
const GTypeInfo info = {
sizeof(GtkImageClass),
NULL, NULL,
wxGtkImageClassInit, NULL, NULL,
sizeof(wxGtkImage), 0, NULL,
NULL
};
type = g_type_register_static(
GTK_TYPE_IMAGE, "wxGtkImage", &info, GTypeFlags(0));
}
return type;
}
GtkWidget* wxGtkImage::New(BitmapProvider* provider)
{
wxGtkImage* image = WX_GTK_IMAGE(g_object_new(Type(), NULL));
image->m_provider = provider;
return GTK_WIDGET(image);
}
GtkWidget* wxGtkImage::New(wxWindow* win)
{
return New(new BitmapProviderDefault(win));
}
void wxGtkImage::Set(const wxBitmap& bitmap)
{
m_provider->Set(bitmap);
GdkPixbuf* pixbuf = NULL;
GdkPixbuf* pixbufNew = NULL;
if (bitmap.IsOk())
{
if (bitmap.GetScaleFactor() <= 1)
pixbuf = bitmap.GetPixbuf();
else
{
// Placeholder pixbuf for correct size
pixbufNew =
pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8,
int(bitmap.GetScaledWidth()), int(bitmap.GetScaledHeight()));
}
}
gtk_image_set_from_pixbuf(GTK_IMAGE(this), pixbuf);
if (pixbufNew)
g_object_unref(pixbufNew);
}
static GtkWidgetClass* wxGtkImageParentClass;
extern "C"
{
#ifdef __WXGTK3__
static gboolean wxGtkImageDraw(GtkWidget* widget, cairo_t* cr)
#else
static gboolean wxGtkImageDraw(GtkWidget* widget, GdkEventExpose* event)
#endif
{
wxGtkImage* image = WX_GTK_IMAGE(widget);
const wxBitmap bitmap(image->m_provider->Get());
if (!bitmap.IsOk())
{
#ifdef __WXGTK3__
return wxGtkImageParentClass->draw(widget, cr);
#else
return wxGtkImageParentClass->expose_event(widget, event);
#endif
}
GtkAllocation alloc;
gtk_widget_get_allocation(widget, &alloc);
int x = (alloc.width - int(bitmap.GetScaledWidth() )) / 2;
int y = (alloc.height - int(bitmap.GetScaledHeight())) / 2;
#ifdef __WXGTK3__
gtk_render_background(gtk_widget_get_style_context(widget),
cr, 0, 0, alloc.width, alloc.height);
bitmap.Draw(cr, x, y);
#else
x += alloc.x;
y += alloc.y;
gdk_draw_pixbuf(
gtk_widget_get_window(widget), gtk_widget_get_style(widget)->black_gc, bitmap.GetPixbuf(),
0, 0, x, y,
-1, -1, GDK_RGB_DITHER_NORMAL, 0, 0);
#endif
return false;
}
static void wxGtkImageFinalize(GObject* object)
{
wxGtkImage* image = WX_GTK_IMAGE(object);
delete image->m_provider;
image->m_provider = NULL;
G_OBJECT_CLASS(wxGtkImageParentClass)->finalize(object);
}
static void wxGtkImageClassInit(void* g_class, void* /*class_data*/)
{
#ifdef __WXGTK3__
GTK_WIDGET_CLASS(g_class)->draw = wxGtkImageDraw;
#else
GTK_WIDGET_CLASS(g_class)->expose_event = wxGtkImageDraw;
#endif
G_OBJECT_CLASS(g_class)->finalize = wxGtkImageFinalize;
wxGtkImageParentClass = GTK_WIDGET_CLASS(g_type_class_peek_parent(g_class));
}
} // extern "C"

View File

@@ -26,6 +26,7 @@
#include "wx/stockitem.h" #include "wx/stockitem.h"
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/image.h"
#include "wx/gtk/private/mnemonics.h" #include "wx/gtk/private/mnemonics.h"
// Number of currently open modal dialogs, defined in src/gtk/toplevel.cpp. // Number of currently open modal dialogs, defined in src/gtk/toplevel.cpp.
@@ -911,9 +912,8 @@ void wxMenu::GtkAppend(wxMenuItem* mitem, int pos)
const wxBitmap& bitmap = mitem->GetBitmap(); const wxBitmap& bitmap = mitem->GetBitmap();
if (bitmap.IsOk()) if (bitmap.IsOk())
{ {
// always use pixbuf, because pixmap mask does not GtkWidget* image = wxGtkImage::New();
// work with disabled images in some themes WX_GTK_IMAGE(image)->Set(bitmap);
GtkWidget* image = gtk_image_new_from_pixbuf(bitmap.GetPixbuf());
menuItem = gtk_image_menu_item_new_with_label(""); menuItem = gtk_image_menu_item_new_with_label("");
gtk_widget_show(image); gtk_widget_show(image);
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuItem), image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuItem), image);

View File

@@ -25,6 +25,7 @@
#include "wx/fontutil.h" #include "wx/fontutil.h"
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/image.h"
#include "wx/gtk/private/stylecontext.h" #include "wx/gtk/private/stylecontext.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -285,23 +286,18 @@ bool wxNotebook::SetPageImage( size_t page, int image )
if (image >= 0) if (image >= 0)
{ {
wxCHECK_MSG(HasImageList(), false, "invalid notebook imagelist"); wxCHECK_MSG(HasImageList(), false, "invalid notebook imagelist");
const wxBitmap bitmap = GetImageList()->GetBitmap(image); if (pageData->m_image == NULL)
if (pageData->m_image)
{ {
gtk_image_set_from_pixbuf( pageData->m_image = wxGtkImage::New();
GTK_IMAGE(pageData->m_image), bitmap.GetPixbuf());
}
else
{
pageData->m_image = gtk_image_new_from_pixbuf(bitmap.GetPixbuf());
gtk_widget_show(pageData->m_image); gtk_widget_show(pageData->m_image);
gtk_box_pack_start(GTK_BOX(pageData->m_box), gtk_box_pack_start(GTK_BOX(pageData->m_box),
pageData->m_image, false, false, m_padding); pageData->m_image, false, false, m_padding);
} }
WX_GTK_IMAGE(pageData->m_image)->Set(GetImageList()->GetBitmap(image));
} }
else if (pageData->m_image) else if (pageData->m_image)
{ {
gtk_widget_destroy(pageData->m_image); gtk_container_remove(GTK_CONTAINER(pageData->m_box), pageData->m_image);
pageData->m_image = NULL; pageData->m_image = NULL;
} }
pageData->m_imageIndex = image; pageData->m_imageIndex = image;
@@ -491,7 +487,8 @@ bool wxNotebook::InsertPage( size_t position,
if (HasImageList()) if (HasImageList())
{ {
const wxBitmap bitmap = GetImageList()->GetBitmap(imageId); const wxBitmap bitmap = GetImageList()->GetBitmap(imageId);
pageData->m_image = gtk_image_new_from_pixbuf(bitmap.GetPixbuf()); pageData->m_image = wxGtkImage::New();
WX_GTK_IMAGE(pageData->m_image)->Set(bitmap);
gtk_box_pack_start(GTK_BOX(pageData->m_box), gtk_box_pack_start(GTK_BOX(pageData->m_box),
pageData->m_image, false, false, m_padding); pageData->m_image, false, false, m_padding);
} }

View File

@@ -14,29 +14,7 @@
#include "wx/statbmp.h" #include "wx/statbmp.h"
#include "wx/gtk/private/wrapgtk.h" #include "wx/gtk/private/wrapgtk.h"
#include "wx/gtk/private/image.h"
#ifdef __WXGTK3__
extern "C" {
static gboolean image_draw(GtkWidget* widget, cairo_t* cr, wxStaticBitmap* win)
{
wxBitmap bitmap(win->GetBitmap());
if (!bitmap.IsOk() || bitmap.GetScaleFactor() <= 1)
return false;
GtkAllocation alloc;
gtk_widget_get_allocation(widget, &alloc);
gtk_render_background(gtk_widget_get_style_context(widget),
cr, 0, 0, alloc.width, alloc.height);
const wxSize size(bitmap.GetScaledSize());
int x = (alloc.width - size.x) / 2;
int y = (alloc.height - size.y) / 2;
if (!win->IsEnabled())
bitmap = bitmap.CreateDisabled();
bitmap.Draw(cr, x, y);
return true;
}
}
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxStaticBitmap // wxStaticBitmap
@@ -64,7 +42,7 @@ bool wxStaticBitmap::Create( wxWindow *parent, wxWindowID id, const wxBitmap &bi
return false; return false;
} }
m_widget = gtk_image_new(); m_widget = wxGtkImage::New(this);
g_object_ref(m_widget); g_object_ref(m_widget);
if (bitmap.IsOk()) if (bitmap.IsOk())
@@ -72,9 +50,6 @@ bool wxStaticBitmap::Create( wxWindow *parent, wxWindowID id, const wxBitmap &bi
PostCreation(size); PostCreation(size);
m_parent->DoAddChild( this ); m_parent->DoAddChild( this );
#ifdef __WXGTK3__
g_signal_connect(m_widget, "draw", G_CALLBACK(image_draw), this);
#endif
return true; return true;
} }
@@ -82,30 +57,7 @@ bool wxStaticBitmap::Create( wxWindow *parent, wxWindowID id, const wxBitmap &bi
void wxStaticBitmap::SetBitmap( const wxBitmap &bitmap ) void wxStaticBitmap::SetBitmap( const wxBitmap &bitmap )
{ {
m_bitmap = bitmap; m_bitmap = bitmap;
WX_GTK_IMAGE(m_widget)->Set(bitmap);
// always use pixbuf, because pixmap mask does not
// work with disabled images in some themes
if (m_bitmap.IsOk())
{
#ifdef __WXGTK3__
if (bitmap.GetScaleFactor() > 1)
{
// Use a placeholder pixbuf with the correct size.
// The original will be used by our "draw" signal handler.
const wxSize size(bitmap.GetScaledSize());
GdkPixbuf* pixbuf =
gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, size.x, size.y);
gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget), pixbuf);
g_object_unref(pixbuf);
}
else
#endif
{
gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget), m_bitmap.GetPixbuf());
}
}
else
gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget), NULL);
InvalidateBestSize(); InvalidateBestSize();
SetSize(GetBestSize()); SetSize(GetBestSize());

View File

@@ -22,6 +22,7 @@
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/eventsdisabler.h" #include "wx/gtk/private/eventsdisabler.h"
#include "wx/gtk/private/image.h"
#include "wx/gtk/private/list.h" #include "wx/gtk/private/list.h"
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
@@ -103,7 +104,7 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
{ {
m_widget = gtk_toggle_button_new(); m_widget = gtk_toggle_button_new();
GtkWidget *image = gtk_image_new(); GtkWidget* image = wxGtkImage::New(this);
gtk_widget_show(image); gtk_widget_show(image);
gtk_container_add(GTK_CONTAINER(m_widget), image); gtk_container_add(GTK_CONTAINER(m_widget), image);
} }

View File

@@ -15,6 +15,7 @@
#include "wx/toolbar.h" #include "wx/toolbar.h"
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include "wx/gtk/private/image.h"
#include "wx/gtk/private/gtk3-compat.h" #include "wx/gtk/private/gtk3-compat.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -168,23 +169,29 @@ enter_notify_event(GtkWidget*, GdkEventCrossing* event, wxToolBarTool* tool)
} }
} }
//-----------------------------------------------------------------------------
// "expose_event" from GtkImage inside m_item
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
extern "C" { namespace
static gboolean {
#ifdef __WXGTK3__ struct BitmapProvider: wxGtkImage::BitmapProvider
image_draw(GtkWidget* widget, cairo_t* cr, wxToolBarTool* tool) {
#else BitmapProvider(wxToolBarTool* tool) : m_tool(tool) { }
image_expose_event(GtkWidget* widget, GdkEventExpose*, wxToolBarTool* tool) virtual wxBitmap Get() const wxOVERRIDE;
#endif wxToolBarTool* const m_tool;
};
wxBitmap BitmapProvider::Get() const
{ {
#ifdef __WXGTK3__ #ifdef __WXGTK3__
wxBitmap bitmap(tool->GetNormalBitmap()); wxBitmap bitmap(m_tool->GetNormalBitmap());
if (!tool->IsEnabled()) if (m_tool->IsEnabled())
{ {
wxBitmap disabled(tool->GetDisabledBitmap()); if (bitmap.IsOk() && bitmap.GetScaleFactor() <= 1)
bitmap.UnRef();
}
else
{
wxBitmap disabled(m_tool->GetDisabledBitmap());
// if no disabled bitmap and normal bitmap is scaled // if no disabled bitmap and normal bitmap is scaled
if (!disabled.IsOk() && bitmap.IsOk() && bitmap.GetScaleFactor() > 1) if (!disabled.IsOk() && bitmap.IsOk() && bitmap.GetScaleFactor() > 1)
{ {
@@ -193,33 +200,14 @@ image_expose_event(GtkWidget* widget, GdkEventExpose*, wxToolBarTool* tool)
} }
bitmap = disabled; bitmap = disabled;
} }
if (!bitmap.IsOk() || (tool->IsEnabled() && bitmap.GetScaleFactor() <= 1))
return false;
#else #else
const wxBitmap& bitmap = tool->GetDisabledBitmap(); wxBitmap bitmap;
if (tool->IsEnabled() || !bitmap.IsOk()) if (!m_tool->IsEnabled())
return false; bitmap = m_tool->GetDisabledBitmap();
#endif #endif
return bitmap;
GtkAllocation alloc;
gtk_widget_get_allocation(widget, &alloc);
int x = (alloc.width - bitmap.GetScaledWidth()) / 2;
int y = (alloc.height - bitmap.GetScaledHeight()) / 2;
#ifdef __WXGTK3__
gtk_render_background(gtk_widget_get_style_context(widget),
cr, 0, 0, alloc.width, alloc.height);
bitmap.Draw(cr, x, y);
#else
x += alloc.x;
y += alloc.y;
gdk_draw_pixbuf(
gtk_widget_get_window(widget), gtk_widget_get_style(widget)->black_gc, bitmap.GetPixbuf(),
0, 0, x, y,
-1, -1, GDK_RGB_DITHER_NORMAL, 0, 0);
#endif
return true;
}
} }
} // namespace
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "toggled" from dropdown menu button // "toggled" from dropdown menu button
@@ -281,26 +269,9 @@ void wxToolBar::AddChildGTK(wxWindowGTK* child)
void wxToolBarTool::SetImage() void wxToolBarTool::SetImage()
{ {
const wxBitmap& bitmap = GetNormalBitmap(); const wxBitmap& bitmap = GetNormalBitmap();
wxCHECK_RET(bitmap.IsOk(), "invalid bitmap for wxToolBar icon");
GtkWidget* image = gtk_tool_button_get_icon_widget(GTK_TOOL_BUTTON(m_item)); GtkWidget* image = gtk_tool_button_get_icon_widget(GTK_TOOL_BUTTON(m_item));
#ifdef __WXGTK3__ WX_GTK_IMAGE(image)->Set(bitmap);
if (bitmap.GetScaleFactor() > 1)
{
// Use a placeholder pixbuf with the correct size.
// The original will be used by our "draw" signal handler.
GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8,
bitmap.GetScaledWidth(), bitmap.GetScaledHeight());
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
g_object_unref(pixbuf);
}
else
#endif
{
// always use pixbuf, because pixmap mask does not
// work with disabled images in some themes
gtk_image_set_from_pixbuf(GTK_IMAGE(image), bitmap.GetPixbuf());
}
} }
// helper to create a dropdown menu item // helper to create a dropdown menu item
@@ -611,18 +582,11 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
} }
if (!HasFlag(wxTB_NOICONS)) if (!HasFlag(wxTB_NOICONS))
{ {
GtkWidget* image = gtk_image_new(); GtkWidget* image = wxGtkImage::New(new BitmapProvider(tool));
gtk_tool_button_set_icon_widget( gtk_tool_button_set_icon_widget(
GTK_TOOL_BUTTON(tool->m_item), image); GTK_TOOL_BUTTON(tool->m_item), image);
tool->SetImage(); tool->SetImage();
gtk_widget_show(image); gtk_widget_show(image);
#ifdef __WXGTK3__
g_signal_connect(image, "draw",
G_CALLBACK(image_draw), tool);
#else
g_signal_connect(image, "expose_event",
G_CALLBACK(image_expose_event), tool);
#endif
} }
if (!tool->GetLabel().empty()) if (!tool->GetLabel().empty())
{ {