X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/02761f6cd478e3c2c97cf6f93442747f7b029833..f51723055aa4334a355a19e87bb2b478b4204d15:/src/gtk/artgtk.cpp diff --git a/src/gtk/artgtk.cpp b/src/gtk/artgtk.cpp index 9d4c51c768..7bc18ba46c 100644 --- a/src/gtk/artgtk.cpp +++ b/src/gtk/artgtk.cpp @@ -20,18 +20,9 @@ #pragma hdrstop #endif -#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) - #include "wx/artprov.h" - -#ifndef WX_PRECOMP - #include "wx/module.h" -#endif - #include "wx/gtk/private.h" -#include - // compatibility with older GTK+ versions: #ifndef GTK_STOCK_FILE #define GTK_STOCK_FILE "gtk-file" @@ -54,14 +45,17 @@ protected: /*static*/ void wxArtProvider::InitNativeProvider() { - wxArtProvider::PushProvider(new wxGTK2ArtProvider); + Push(new wxGTK2ArtProvider); } // ---------------------------------------------------------------------------- // CreateBitmap routine // ---------------------------------------------------------------------------- -static const char *wxArtIDToStock(const wxArtID& id) +namespace +{ + +const char *wxArtIDToStock(const wxArtID& id) { #define ART(wxid, gtkid) \ if (id == wxid) return gtkid; @@ -92,17 +86,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) @@ -124,14 +115,13 @@ 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 } -GtkIconSize wxArtClientToIconSize(const wxArtClient& client) +GtkIconSize ArtClientToIconSize(const wxArtClient& client) { if (client == wxART_TOOLBAR) return GTK_ICON_SIZE_LARGE_TOOLBAR; @@ -145,7 +135,7 @@ GtkIconSize wxArtClientToIconSize(const wxArtClient& client) return GTK_ICON_SIZE_INVALID; // this is arbitrary } -static GtkIconSize FindClosestIconSize(const wxSize& size) +GtkIconSize FindClosestIconSize(const wxSize& size) { #define NUM_SIZES 6 static struct @@ -192,10 +182,7 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) return best; } - -static GtkStyle *gs_gtkStyle = NULL; - -static GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) +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 @@ -205,27 +192,18 @@ static GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) // 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(gs_gtkStyle); - gtk_widget_destroy(widget); - } - - GtkIconSet *iconset = gtk_style_lookup_icon_set(gs_gtkStyle, stockid); + GtkStyle* style = wxGTKPrivate::GetButtonWidget()->style; + GtkIconSet* iconset = gtk_style_lookup_icon_set(style, stockid); if (!iconset) return NULL; - return gtk_icon_set_render_icon(iconset, gs_gtkStyle, + return gtk_icon_set_render_icon(iconset, style, gtk_widget_get_default_direction(), GTK_STATE_NORMAL, size, NULL, NULL); } -#ifdef __WXGTK24__ -static GdkPixbuf *CreateThemeIcon(const char *iconname, +GdkPixbuf *CreateThemeIcon(const char *iconname, GtkIconSize iconsize, const wxSize& sz) { wxSize size(sz); @@ -240,7 +218,8 @@ static GdkPixbuf *CreateThemeIcon(const char *iconname, size.x, (GtkIconLookupFlags)0, NULL); } -#endif + +} // anonymous namespace wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, @@ -248,7 +227,7 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, { wxCharBuffer stockid = wxArtIDToStock(id); GtkIconSize stocksize = (size == wxDefaultSize) ? - wxArtClientToIconSize(client) : + ArtClientToIconSize(client) : FindClosestIconSize(size); // we must have some size, this is arbitrary @@ -260,14 +239,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) || @@ -282,37 +255,26 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, } } - 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; } // ---------------------------------------------------------------------------- -// Cleanup +// wxArtProvider::GetNativeSizeHint() // ---------------------------------------------------------------------------- -class wxArtGtkModule: public wxModule +/*static*/ +wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client) { -public: - bool OnInit() { return true; } - void OnExit() - { - if (gs_gtkStyle) - { - g_object_unref(gs_gtkStyle); - gs_gtkStyle = NULL; - } - } - - DECLARE_DYNAMIC_CLASS(wxArtGtkModule) -}; - -IMPLEMENT_DYNAMIC_CLASS(wxArtGtkModule, wxModule) - -#endif // defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + // Gtk has specific sizes for each client, see artgtk.cpp + GtkIconSize gtk_size = ArtClientToIconSize(client); + // no size hints for this client + if (gtk_size == GTK_ICON_SIZE_INVALID) + return wxDefaultSize; + gint width, height; + gtk_icon_size_lookup( gtk_size, &width, &height); + return wxSize(width, height); +}