Draw small buttons in runtime, do not use builtin black pixbufs

master
Yevgen Muntyan 2007-12-29 21:37:37 -06:00
parent f07347a5b5
commit 22d186fb5a
7 changed files with 201 additions and 78 deletions

View File

@ -2269,7 +2269,7 @@ setup_notebook (MooEditWindow *window)
G_CALLBACK (action_close_tab), window);
moo_bind_bool_property (button, "sensitive", window, "has-open-document", FALSE);
icon = gtk_image_new_from_stock (MOO_STOCK_CLOSE, MOO_ICON_SIZE_REAL_SMALL);
icon = _moo_create_small_icon (MOO_SMALL_ICON_CLOSE);
gtk_container_add (GTK_CONTAINER (button), icon);
gtk_container_add (GTK_CONTAINER (frame), button);

View File

@ -72,11 +72,6 @@ _moo_utils_mod_init (void)
add_constant (mod, "STOCK_TERMINAL", MOO_STOCK_TERMINAL);
add_constant (mod, "STOCK_KEYBOARD", MOO_STOCK_KEYBOARD);
add_constant (mod, "STOCK_RESTART", MOO_STOCK_RESTART);
add_constant (mod, "STOCK_CLOSE", MOO_STOCK_CLOSE);
add_constant (mod, "STOCK_STICKY", MOO_STOCK_STICKY);
add_constant (mod, "STOCK_DETACH", MOO_STOCK_DETACH);
add_constant (mod, "STOCK_ATTACH", MOO_STOCK_ATTACH);
add_constant (mod, "STOCK_KEEP_ON_TOP", MOO_STOCK_KEEP_ON_TOP);
add_constant (mod, "STOCK_DOC_DELETED", MOO_STOCK_DOC_DELETED);
add_constant (mod, "STOCK_DOC_MODIFIED_ON_DISK", MOO_STOCK_DOC_MODIFIED_ON_DISK);
add_constant (mod, "STOCK_DOC_DELETED", MOO_STOCK_DOC_DELETED);

View File

@ -123,6 +123,7 @@ mooutils_sources = \
mooutils-treeview.h \
mooutils-treeview.c \
moowindow.c \
stock-medit.h \
stock-file-24.h \
stock-file-selector-24.h \
stock-select-all-16.h \
@ -200,7 +201,6 @@ CLEANFILES += $(glade_sources)
EXTRA_DIST += $(glade_files)
mooutils_pixmaps = \
$(srcdir)/pixmaps/medit.png \
$(srcdir)/pixmaps/hide.png \
$(srcdir)/pixmaps/close.png \
$(srcdir)/pixmaps/detach.png \
@ -208,12 +208,11 @@ mooutils_pixmaps = \
$(srcdir)/pixmaps/keepontop.png \
$(srcdir)/pixmaps/sticky.png
CLEANFILES += stock-moo.h
BUILT_SOURCES += stock-moo.h
nodist_mooutils_sources += stock-moo.h
CLEANFILES += stock-moo.h stock-medit.h
BUILT_SOURCES += stock-moo.h stock-medit.h
nodist_mooutils_sources += stock-moo.h stock-medit.h
stock-moo.h: $(mooutils_pixmaps)
gdk-pixbuf-csource --static --build-list \
MEDIT_ICON $(srcdir)/pixmaps/medit.png \
MOO_HIDE_ICON $(srcdir)/pixmaps/hide.png \
MOO_CLOSE_ICON $(srcdir)/pixmaps/close.png \
MOO_STICKY_ICON $(srcdir)/pixmaps/sticky.png \
@ -221,6 +220,10 @@ stock-moo.h: $(mooutils_pixmaps)
MOO_ATTACH_ICON $(srcdir)/pixmaps/attach.png \
MOO_KEEP_ON_TOP_ICON $(srcdir)/pixmaps/keepontop.png \
> $@.tmp && mv $@.tmp $@
stock-medit.h: pixmaps/medit.png
gdk-pixbuf-csource --static --build-list \
MEDIT_ICON $(srcdir)/pixmaps/medit.png \
> $@.tmp && mv $@.tmp $@
noinst_LTLIBRARIES = libmooutils.la
libmooutils_la_SOURCES = $(mooutils_sources)

View File

@ -16,6 +16,7 @@
#include "moomarshals.h"
#include "moopaned.h"
#include "stock-moo.h"
#include <string.h>
#include <gdk/gdkkeysyms.h>
@ -25,7 +26,6 @@
#ifdef MOO_COMPILATION
#include "moostock.h"
#include "mooutils-misc.h"
#include "moohelp.h"
#include "mooutils-gobject.h"
@ -35,15 +35,6 @@
#define _(s) s
#include "stock-moo.h"
#define MOO_STOCK_HIDE ((const char*)MOO_HIDE_ICON)
#define MOO_STOCK_STICKY ((const char*)MOO_STICKY_ICON)
#define MOO_STOCK_CLOSE ((const char*)MOO_CLOSE_ICON)
#define MOO_STOCK_DETACH ((const char*)MOO_DETACH_ICON)
#define MOO_STOCK_ATTACH ((const char*)MOO_ATTACH_ICON)
#define MOO_STOCK_KEEP_ON_TOP ((const char*)MOO_KEEP_ON_TOP_ICON)
static void
_moo_widget_set_tooltip (GtkWidget *widget,
const char *tip)
@ -390,10 +381,6 @@ moo_pane_init (MooPane *pane)
pane->window = NULL;
pane->keep_on_top_button = NULL;
pane->window_child_holder = NULL;
#ifdef MOO_COMPILATION
_moo_stock_init ();
#endif
}
static void
@ -543,15 +530,15 @@ update_sticky_button (MooPane *pane)
static GtkWidget *
create_button (MooPane *pane,
GtkWidget *toolbar,
const char *tip,
gboolean toggle,
int padding,
const char *data)
create_button (MooPane *pane,
GtkWidget *toolbar,
const char *tip,
gboolean toggle,
int padding,
MooSmallIcon icon)
{
GtkWidget *button;
GtkWidget *icon;
GtkWidget *icon_widget;
if (toggle)
button = gtk_toggle_button_new ();
@ -563,18 +550,8 @@ create_button (MooPane *pane,
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
_moo_widget_set_tooltip (button, tip);
#ifdef MOO_COMPILATION
icon = gtk_image_new_from_stock (data, MOO_ICON_SIZE_REAL_SMALL);
#else
{
GdkPixbuf *pixbuf;
pixbuf = gdk_pixbuf_new_from_inline (-1, (const guchar*)data, FALSE, NULL);
icon = gtk_image_new_from_pixbuf (pixbuf);
g_object_unref (pixbuf);
}
#endif
gtk_container_add (GTK_CONTAINER (button), icon);
icon_widget = _moo_create_small_icon (icon);
gtk_container_add (GTK_CONTAINER (button), icon_widget);
gtk_box_pack_end (GTK_BOX (toolbar), button, FALSE, FALSE, padding);
gtk_widget_show_all (button);
@ -604,7 +581,7 @@ create_frame_widget (MooPane *pane,
pane->close_button = create_button (pane, toolbar,
_("Remove pane"), FALSE, 3,
MOO_STOCK_CLOSE);
MOO_SMALL_ICON_CLOSE);
g_object_set_data (G_OBJECT (pane->close_button), "moo-pane", pane);
g_signal_connect_swapped (pane->close_button, "clicked",
G_CALLBACK (close_button_clicked),
@ -612,15 +589,15 @@ create_frame_widget (MooPane *pane,
hide_button = create_button (pane, toolbar,
_("Hide pane"), FALSE, 0,
MOO_STOCK_HIDE);
MOO_SMALL_ICON_HIDE);
pane->sticky_button = create_button (pane, toolbar,
_("Sticky"), TRUE, 0,
MOO_STOCK_STICKY);
MOO_SMALL_ICON_STICKY);
pane->detach_button = create_button (pane, toolbar,
_("Detach pane"), FALSE, 0,
MOO_STOCK_DETACH);
MOO_SMALL_ICON_DETACH);
g_signal_connect_swapped (hide_button, "clicked",
G_CALLBACK (hide_button_clicked), pane);
@ -633,11 +610,11 @@ create_frame_widget (MooPane *pane,
attach_button = create_button (pane, toolbar,
_("Attach"), FALSE, 0,
MOO_STOCK_ATTACH);
MOO_SMALL_ICON_ATTACH);
pane->keep_on_top_button = create_button (pane, toolbar,
_("Keep on top"), TRUE, 0,
MOO_STOCK_KEEP_ON_TOP);
MOO_SMALL_ICON_KEEP_ON_TOP);
g_object_set_data (G_OBJECT (attach_button), "moo-pane", pane);
g_signal_connect_swapped (attach_button, "clicked",
@ -1289,3 +1266,167 @@ moo_pane_get_index (MooPane *pane)
else
return -1;
}
typedef struct {
GtkWidget base;
GdkPixbuf **pixbufs;
const guchar *data;
} MooIconWidget;
typedef struct {
GtkWidgetClass base_class;
} MooIconWidgetClass;
GType _moo_icon_widget_get_type (void) G_GNUC_CONST;
G_DEFINE_TYPE (MooIconWidget, _moo_icon_widget, GTK_TYPE_WIDGET)
static void
_moo_icon_widget_init (MooIconWidget *icon)
{
GTK_WIDGET_SET_FLAGS (icon, GTK_NO_WINDOW);
icon->pixbufs = NULL;
icon->data = NULL;
}
static void
free_pixbufs (MooIconWidget *icon)
{
if (icon->pixbufs)
{
int i;
for (i = 0; i < 5 /* magic */; ++i)
g_object_unref (icon->pixbufs[i]);
g_free (icon->pixbufs);
icon->pixbufs = NULL;
}
}
static void
moo_icon_widget_style_set (GtkWidget *widget,
GtkStyle *old_style)
{
GTK_WIDGET_CLASS (_moo_icon_widget_parent_class)->style_set (widget, old_style);
free_pixbufs ((MooIconWidget*) widget);
}
static GdkPixbuf *
get_pixbuf (MooIconWidget *icon)
{
if (!icon->pixbufs)
{
int state;
GtkWidget *widget = GTK_WIDGET (icon);
g_return_val_if_fail (icon->data != NULL, NULL);
icon->pixbufs = g_new0 (GdkPixbuf*, 5 /* magic */);
for (state = 0; state < 5 /* magic */; ++state)
{
GdkPixbuf *pixbuf;
guchar *pixels, *p;
int width, height, rowstride, n_channels;
GdkColor *color;
int x, y;
pixbuf = gdk_pixbuf_new_from_inline (-1, icon->data, TRUE, NULL);
g_return_val_if_fail (pixbuf != NULL, NULL);
icon->pixbufs[state] = pixbuf;
pixels = gdk_pixbuf_get_pixels (pixbuf);
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
n_channels = gdk_pixbuf_get_n_channels (pixbuf);
g_assert (n_channels == 4);
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
color = &widget->style->fg[state];
for (x = 0; x < width; ++x)
{
for (y = 0; y < height; ++y)
{
p = pixels + y * rowstride + x * n_channels;
if (p[3] != 0)
{
p[0] = color->red >> 8;
p[1] = color->green >> 8;
p[2] = color->blue >> 8;
}
}
}
}
}
return icon->pixbufs[GTK_WIDGET_STATE (icon)];
}
static gboolean
moo_icon_widget_expose_event (GtkWidget *widget,
GdkEventExpose *event)
{
GdkPixbuf *pixbuf;
pixbuf = get_pixbuf ((MooIconWidget*) widget);
g_return_val_if_fail (pixbuf != NULL, FALSE);
gdk_draw_pixbuf (event->window,
widget->style->black_gc,
pixbuf,
0, 0,
widget->allocation.x, widget->allocation.y,
gdk_pixbuf_get_width (pixbuf),
gdk_pixbuf_get_height (pixbuf),
GDK_RGB_DITHER_NORMAL, 0, 0);
return FALSE;
}
static void
_moo_icon_widget_class_init (MooIconWidgetClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->style_set = moo_icon_widget_style_set;
widget_class->expose_event = moo_icon_widget_expose_event;
}
GtkWidget *
_moo_create_small_icon (MooSmallIcon icon)
{
MooIconWidget *icon_widget;
const guchar *data = NULL;
switch (icon)
{
case MOO_SMALL_ICON_HIDE:
data = MOO_HIDE_ICON;
break;
case MOO_SMALL_ICON_STICKY:
data = MOO_STICKY_ICON;
break;
case MOO_SMALL_ICON_CLOSE:
data = MOO_CLOSE_ICON;
break;
case MOO_SMALL_ICON_DETACH:
data = MOO_DETACH_ICON;
break;
case MOO_SMALL_ICON_ATTACH:
data = MOO_ATTACH_ICON;
break;
case MOO_SMALL_ICON_KEEP_ON_TOP:
data = MOO_KEEP_ON_TOP_ICON;
break;
}
g_return_val_if_fail (data != NULL, NULL);
icon_widget = g_object_new (_moo_icon_widget_get_type (), NULL);
icon_widget->data = data;
gtk_widget_set_size_request (GTK_WIDGET (icon_widget), 7, 7 /* magic */);
return GTK_WIDGET (icon_widget);
}

View File

@ -121,6 +121,17 @@ void _moo_pane_set_parent (MooPane *pane,
void _moo_pane_unparent (MooPane *pane);
void _moo_pane_try_remove (MooPane *pane);
typedef enum {
MOO_SMALL_ICON_HIDE,
MOO_SMALL_ICON_STICKY,
MOO_SMALL_ICON_CLOSE,
MOO_SMALL_ICON_DETACH,
MOO_SMALL_ICON_ATTACH,
MOO_SMALL_ICON_KEEP_ON_TOP
} MooSmallIcon;
GtkWidget *_moo_create_small_icon (MooSmallIcon icon);
G_END_DECLS

View File

@ -15,7 +15,7 @@
#include "mooutils/stock-terminal-24.h"
#include "mooutils/stock-file-selector-24.h"
#include "mooutils/stock-file-24.h"
#include "mooutils/stock-moo.h"
#include "mooutils/stock-medit.h"
#include "mooutils/mooi18n.h"
#include <gtk/gtk.h>
#include <string.h>
@ -158,18 +158,6 @@ static void add_icon2 (GtkIconFactory *factory,
#endif /* !GTK_CHECK_VERSION(2,10,0) */
GtkIconSize
_moo_get_icon_size_real_small (void)
{
static GtkIconSize size = 0;
if (!size)
size = gtk_icon_size_register ("moo-real-small", 4, 4);
return size;
}
static void
register_stock_icon_alias (GtkIconFactory *factory,
const char *stock_id,
@ -233,12 +221,6 @@ _moo_stock_init (void)
add_icon (factory, MOO_STOCK_TERMINAL, "terminal", 24, MOO_GNOME_TERMINAL_ICON);
add_icon (factory, MOO_STOCK_MEDIT, "medit", 24, MEDIT_ICON);
add_icon (factory, MOO_STOCK_HIDE, NULL, REAL_SMALL, MOO_HIDE_ICON);
add_icon (factory, MOO_STOCK_CLOSE, NULL, REAL_SMALL, MOO_CLOSE_ICON);
add_icon (factory, MOO_STOCK_STICKY, NULL, REAL_SMALL, MOO_STICKY_ICON);
add_icon (factory, MOO_STOCK_DETACH, NULL, REAL_SMALL, MOO_DETACH_ICON);
add_icon (factory, MOO_STOCK_ATTACH, NULL, REAL_SMALL, MOO_ATTACH_ICON);
add_icon (factory, MOO_STOCK_KEEP_ON_TOP, NULL, REAL_SMALL, MOO_KEEP_ON_TOP_ICON);
#if !GTK_CHECK_VERSION(2,10,0)
add_icon2 (factory, GTK_STOCK_SELECT_ALL, "edit-select-all",

View File

@ -24,12 +24,6 @@ G_BEGIN_DECLS
#define MOO_STOCK_KEYBOARD GTK_STOCK_SELECT_FONT
#define MOO_STOCK_MENU GTK_STOCK_INDEX
#define MOO_STOCK_RESTART GTK_STOCK_REFRESH
#define MOO_STOCK_HIDE "moo-hide"
#define MOO_STOCK_CLOSE "moo-close"
#define MOO_STOCK_STICKY "moo-sticky"
#define MOO_STOCK_DETACH "moo-detach"
#define MOO_STOCK_ATTACH "moo-attach"
#define MOO_STOCK_KEEP_ON_TOP "moo-keep-on-top"
#define MOO_STOCK_DOC_DELETED GTK_STOCK_DIALOG_ERROR
#define MOO_STOCK_DOC_MODIFIED_ON_DISK GTK_STOCK_DIALOG_WARNING
@ -46,8 +40,6 @@ G_BEGIN_DECLS
#define MOO_STOCK_SAVE_NONE "moo-save-none"
#define MOO_STOCK_SAVE_SELECTED "moo-save-selected"
#define MOO_ICON_SIZE_REAL_SMALL (_moo_get_icon_size_real_small ())
#define MOO_STOCK_NEW_PROJECT "moo-new-project"
#define MOO_STOCK_OPEN_PROJECT "moo-open-project"
#define MOO_STOCK_CLOSE_PROJECT "moo-close-project"
@ -71,7 +63,6 @@ G_BEGIN_DECLS
void _moo_stock_init (void);
GtkIconSize _moo_get_icon_size_real_small (void) G_GNUC_CONST;
G_END_DECLS