load icons from current icon theme under GTK >= 2.4, too
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28970 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -251,7 +251,8 @@ wxGTK:
|
|||||||
freedesktop.org's wm-spec (Mart Raudsepp)
|
freedesktop.org's wm-spec (Mart Raudsepp)
|
||||||
- wxEVT_CONTEXT_MENU is now generated for right mouse press, not release
|
- wxEVT_CONTEXT_MENU is now generated for right mouse press, not release
|
||||||
- implemented alpha channel support in wxBitmap
|
- implemented alpha channel support in wxBitmap
|
||||||
- added native GTK+2 wxArtProvider implementation
|
- added native GTK+2 wxArtProvider implementation with ability to load
|
||||||
|
icons from icon theme in addition to recognized stock art
|
||||||
|
|
||||||
wxMotif:
|
wxMotif:
|
||||||
|
|
||||||
|
@@ -76,8 +76,18 @@ constants in the \helpref{artprov}{sampleartprovider} sample):
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Additionally, any string recognized by custom art providers registered using
|
Additionally, any string recognized by custom art providers registered using
|
||||||
\helpref{PushProvider}{wxartproviderpushprovider} may be used. When running
|
\helpref{PushProvider}{wxartproviderpushprovider} may be used.
|
||||||
under GTK+ 2, GTK+ stock item IDs (e.g. {\tt "gtk-cdrom"}) may be used as well.
|
|
||||||
|
\wxheading{GTK+ Note}
|
||||||
|
|
||||||
|
When running under GTK+ 2, GTK+ stock item IDs (e.g. {\tt "gtk-cdrom"}) may
|
||||||
|
be used as well. Additionally, if wxGTK was compiled against GTK+ >= 2.4, then
|
||||||
|
it is also possible to load icons from current icon theme by specifying their
|
||||||
|
name (without extension and directory components). Icon themes recognized
|
||||||
|
by GTK+ follow the
|
||||||
|
\urlref{freedesktop.org Icon Themes specification}{http://freedesktop.org/Standards/icon-theme-spec}. Note that themes are not guaranteed to contain all
|
||||||
|
icons, so wxArtProvider may return {\tt wxNullBitmap} or {\tt wxNullIcon}.
|
||||||
|
Default theme is typically installed in {\tt /usr/share/icons/hicolor}.
|
||||||
|
|
||||||
\membersection{Clients}
|
\membersection{Clients}
|
||||||
|
|
||||||
|
@@ -159,6 +159,45 @@ static GtkIconSize FindClosestIconSize(const wxSize& size)
|
|||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
GtkStyle *style = gtk_widget_get_default_style();
|
||||||
|
GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid);
|
||||||
|
|
||||||
|
if (!iconset)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return gtk_icon_set_render_icon(iconset, style,
|
||||||
|
gtk_widget_get_default_direction(),
|
||||||
|
GTK_STATE_NORMAL, size, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION(2,4,0)
|
||||||
|
static GdkPixbuf *CreateThemeIcon(const char *iconname,
|
||||||
|
GtkIconSize iconsize, const wxSize& sz)
|
||||||
|
{
|
||||||
|
wxSize size(sz);
|
||||||
|
if (size == wxDefaultSize)
|
||||||
|
{
|
||||||
|
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 // GTK+ >= 2.4.0
|
||||||
|
|
||||||
wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id,
|
wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id,
|
||||||
const wxArtClient& client,
|
const wxArtClient& client,
|
||||||
const wxSize& size)
|
const wxSize& size)
|
||||||
@@ -172,24 +211,12 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id,
|
|||||||
if (!stockid)
|
if (!stockid)
|
||||||
stockid = id.ToAscii();
|
stockid = id.ToAscii();
|
||||||
|
|
||||||
// FIXME: This code is not 100% correct, because stock pixmap are
|
GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize);
|
||||||
// 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.
|
|
||||||
|
|
||||||
GtkStyle *style = gtk_widget_get_default_style();
|
#if GTK_CHECK_VERSION(2,4,0)
|
||||||
GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid);
|
if (!pixbuf)
|
||||||
|
pixbuf = CreateThemeIcon(stockid, stocksize, size);
|
||||||
if (!iconset)
|
#endif
|
||||||
return wxNullBitmap;
|
|
||||||
|
|
||||||
GdkPixbuf *pixbuf =
|
|
||||||
gtk_icon_set_render_icon(iconset, style,
|
|
||||||
gtk_widget_get_default_direction(),
|
|
||||||
GTK_STATE_NORMAL, stocksize, NULL, NULL);
|
|
||||||
|
|
||||||
if (pixbuf && size != wxDefaultSize &&
|
if (pixbuf && size != wxDefaultSize &&
|
||||||
(size.x != gdk_pixbuf_get_width(pixbuf) ||
|
(size.x != gdk_pixbuf_get_width(pixbuf) ||
|
||||||
|
@@ -159,6 +159,45 @@ static GtkIconSize FindClosestIconSize(const wxSize& size)
|
|||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
GtkStyle *style = gtk_widget_get_default_style();
|
||||||
|
GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid);
|
||||||
|
|
||||||
|
if (!iconset)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return gtk_icon_set_render_icon(iconset, style,
|
||||||
|
gtk_widget_get_default_direction(),
|
||||||
|
GTK_STATE_NORMAL, size, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GTK_CHECK_VERSION(2,4,0)
|
||||||
|
static GdkPixbuf *CreateThemeIcon(const char *iconname,
|
||||||
|
GtkIconSize iconsize, const wxSize& sz)
|
||||||
|
{
|
||||||
|
wxSize size(sz);
|
||||||
|
if (size == wxDefaultSize)
|
||||||
|
{
|
||||||
|
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 // GTK+ >= 2.4.0
|
||||||
|
|
||||||
wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id,
|
wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id,
|
||||||
const wxArtClient& client,
|
const wxArtClient& client,
|
||||||
const wxSize& size)
|
const wxSize& size)
|
||||||
@@ -172,24 +211,12 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id,
|
|||||||
if (!stockid)
|
if (!stockid)
|
||||||
stockid = id.ToAscii();
|
stockid = id.ToAscii();
|
||||||
|
|
||||||
// FIXME: This code is not 100% correct, because stock pixmap are
|
GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize);
|
||||||
// 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.
|
|
||||||
|
|
||||||
GtkStyle *style = gtk_widget_get_default_style();
|
#if GTK_CHECK_VERSION(2,4,0)
|
||||||
GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid);
|
if (!pixbuf)
|
||||||
|
pixbuf = CreateThemeIcon(stockid, stocksize, size);
|
||||||
if (!iconset)
|
#endif
|
||||||
return wxNullBitmap;
|
|
||||||
|
|
||||||
GdkPixbuf *pixbuf =
|
|
||||||
gtk_icon_set_render_icon(iconset, style,
|
|
||||||
gtk_widget_get_default_direction(),
|
|
||||||
GTK_STATE_NORMAL, stocksize, NULL, NULL);
|
|
||||||
|
|
||||||
if (pixbuf && size != wxDefaultSize &&
|
if (pixbuf && size != wxDefaultSize &&
|
||||||
(size.x != gdk_pixbuf_get_width(pixbuf) ||
|
(size.x != gdk_pixbuf_get_width(pixbuf) ||
|
||||||
|
Reference in New Issue
Block a user