X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34a246df34d95ef815476d06363b57049e46035b..11866e8e33b2034ba70102940177a3f9b460e4a1:/src/gtk/artgtk.cpp diff --git a/src/gtk/artgtk.cpp b/src/gtk/artgtk.cpp index 6b401aee09..6153868e5c 100644 --- a/src/gtk/artgtk.cpp +++ b/src/gtk/artgtk.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: artstd.cpp +// Name: src/gtk/artstd.cpp // Purpose: stock wxArtProvider instance with native GTK+ stock icons // Author: Vaclav Slavik // Modified by: @@ -20,11 +20,19 @@ #pragma hdrstop #endif -#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) +#if !defined(__WXUNIVERSAL__) #include "wx/artprov.h" -#include "wx/module.h" +#ifndef WX_PRECOMP + #include "wx/module.h" +#endif + +#include +#if GTK_CHECK_VERSION(2, 9, 0) + // gtk_object_sink + #undef GTK_DISABLE_DEPRECATED +#endif #include // compatibility with older GTK+ versions: @@ -49,7 +57,7 @@ protected: /*static*/ void wxArtProvider::InitNativeProvider() { - wxArtProvider::PushProvider(new wxGTK2ArtProvider); + Push(new wxGTK2ArtProvider); } // ---------------------------------------------------------------------------- @@ -60,12 +68,12 @@ static const char *wxArtIDToStock(const wxArtID& id) { #define ART(wxid, gtkid) \ if (id == wxid) return gtkid; - + ART(wxART_ERROR, GTK_STOCK_DIALOG_ERROR) ART(wxART_INFORMATION, GTK_STOCK_DIALOG_INFO) ART(wxART_WARNING, GTK_STOCK_DIALOG_WARNING) ART(wxART_QUESTION, GTK_STOCK_DIALOG_QUESTION) - + //ART(wxART_HELP_SIDE_PANEL, ) ART(wxART_HELP_SETTINGS, GTK_STOCK_SELECT_FONT) //ART(wxART_HELP_BOOK, ) @@ -87,17 +95,14 @@ static const char *wxArtIDToStock(const wxArtID& id) //ART(wxART_REPORT_VIEW, ) //ART(wxART_LIST_VIEW, ) //ART(wxART_NEW_DIR, ) -#ifdef __WXGTK24__ ART(wxART_FOLDER, GTK_STOCK_DIRECTORY) ART(wxART_FOLDER_OPEN, GTK_STOCK_DIRECTORY) -#endif //ART(wxART_GO_DIR_UP, ) ART(wxART_EXECUTABLE_FILE, GTK_STOCK_EXECUTE) ART(wxART_NORMAL_FILE, GTK_STOCK_FILE) ART(wxART_TICK_MARK, GTK_STOCK_APPLY) ART(wxART_CROSS_MARK, GTK_STOCK_CANCEL) -#ifdef __WXGTK24__ ART(wxART_FLOPPY, GTK_STOCK_FLOPPY) ART(wxART_CDROM, GTK_STOCK_CDROM) ART(wxART_HARDDISK, GTK_STOCK_HARDDISK) @@ -119,10 +124,9 @@ static const char *wxArtIDToStock(const wxArtID& id) ART(wxART_FIND, GTK_STOCK_FIND) ART(wxART_FIND_AND_REPLACE, GTK_STOCK_FIND_AND_REPLACE) -#endif - + return NULL; - + #undef ART } @@ -160,26 +164,8 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) s_sizes[5].icon = GTK_ICON_SIZE_DIALOG; for (size_t i = 0; i < NUM_SIZES; i++) { -#if !defined(GDK_MULTITHREAD_SAFE) - gtk_icon_size_lookup( - s_sizes[i].icon, - &s_sizes[i].x, &s_sizes[i].y); -#else -#if GTK_VERSION_CHECK(2,2,0) - if (!gtk_verson_check(2,2,0)) - gtk_icon_size_lookup_for_settings( - gtk_settings_get_for_screen(gdk_screen_get_default()), - s_sizes[i].icon, - &s_sizes[i].x, &s_sizes[i].y); - else -#else // pre-GTK 2.2 - { - // FIXME - gtk_icon_size_lookup(s_sizes[i].icon, + gtk_icon_size_lookup(s_sizes[i].icon, &s_sizes[i].x, &s_sizes[i].y); - } -#endif -#endif } s_sizesInitialized = true; } @@ -191,8 +177,8 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) // only use larger bitmaps, scaling down looks better than scaling up: if (size.x > s_sizes[i].x || size.y > s_sizes[i].y) continue; - - unsigned dist = (size.x - s_sizes[i].x) * (size.x - s_sizes[i].x) + + + unsigned dist = (size.x - s_sizes[i].x) * (size.x - s_sizes[i].x) + (size.y - s_sizes[i].y) * (size.y - s_sizes[i].y); if (dist == 0) return s_sizes[i].icon; @@ -200,7 +186,7 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) { distance = dist; best = s_sizes[i].icon; - } + } } return best; } @@ -213,18 +199,18 @@ static GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) // FIXME: This code is not 100% correct, because stock pixmap are // context-dependent and may be affected by theme engine, the // correct value can only be obtained for given GtkWidget object. - // + // // Fool-proof implementation of stock bitmaps would extend wxBitmap // with "stock-id" representation (in addition to pixmap and pixbuf // ones) and would convert it to pixbuf when rendered. - + if (gs_gtkStyle == NULL) { GtkWidget *widget = gtk_button_new(); gs_gtkStyle = gtk_rc_get_style(widget); wxASSERT( gs_gtkStyle != NULL ); - g_object_ref(G_OBJECT(gs_gtkStyle)); - gtk_widget_destroy(widget); + g_object_ref(gs_gtkStyle); + gtk_object_sink((GtkObject*)widget); } GtkIconSet *iconset = gtk_style_lookup_icon_set(gs_gtkStyle, stockid); @@ -237,7 +223,6 @@ static GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) GTK_STATE_NORMAL, size, NULL, NULL); } -#ifdef __WXGTK24__ static GdkPixbuf *CreateThemeIcon(const char *iconname, GtkIconSize iconsize, const wxSize& sz) { @@ -246,14 +231,13 @@ static GdkPixbuf *CreateThemeIcon(const char *iconname, { gtk_icon_size_lookup(iconsize, &size.x, &size.y); } - + return gtk_icon_theme_load_icon( gtk_icon_theme_get_default(), iconname, size.x, (GtkIconLookupFlags)0, NULL); } -#endif wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, @@ -261,7 +245,7 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, { wxCharBuffer stockid = wxArtIDToStock(id); GtkIconSize stocksize = (size == wxDefaultSize) ? - wxArtClientToIconSize(client) : + wxArtClientToIconSize(client) : FindClosestIconSize(size); // we must have some size, this is arbitrary @@ -273,14 +257,8 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, stockid = id.ToAscii(); GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize); - -#ifdef __WXGTK24__ - if (!gtk_check_version(2,4,0)) - { - if (!pixbuf) - pixbuf = CreateThemeIcon(stockid, stocksize, size); - } -#endif + if (!pixbuf) + pixbuf = CreateThemeIcon(stockid, stocksize, size); if (pixbuf && size != wxDefaultSize && (size.x != gdk_pixbuf_get_width(pixbuf) || @@ -290,18 +268,14 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, GDK_INTERP_BILINEAR); if (p2) { - gdk_pixbuf_unref(pixbuf); + g_object_unref (pixbuf); pixbuf = p2; } } - - if (!pixbuf) - return wxNullBitmap; wxBitmap bmp; - bmp.SetWidth(gdk_pixbuf_get_width(pixbuf)); - bmp.SetHeight(gdk_pixbuf_get_height(pixbuf)); - bmp.SetPixbuf(pixbuf); + if (pixbuf != NULL) + bmp.SetPixbuf(pixbuf); return bmp; } @@ -318,7 +292,7 @@ public: { if (gs_gtkStyle) { - g_object_unref(G_OBJECT(gs_gtkStyle)); + g_object_unref(gs_gtkStyle); gs_gtkStyle = NULL; } } @@ -328,4 +302,4 @@ public: IMPLEMENT_DYNAMIC_CLASS(wxArtGtkModule, wxModule) -#endif // defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) +#endif // !defined(__WXUNIVERSAL__)