X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/73f1b9f30c98dc525a5b6a540f6f135855d640a0..f6033c46c877646b95bc2e99ce69097203bc5c77:/disobedience/misc.c diff --git a/disobedience/misc.c b/disobedience/misc.c index 1cb6d5a..2a80053 100644 --- a/disobedience/misc.c +++ b/disobedience/misc.c @@ -22,6 +22,14 @@ */ #include "disobedience.h" +#include "table.h" + +struct image { + const char *name; + const guint8 *data; +}; + +#include "images.h" /* Miscellaneous GTK+ stuff ------------------------------------------------ */ @@ -31,11 +39,9 @@ WT(cached_image); /** @brief Put scrollbars around a widget * @param child Widget to surround - * @param widgetname Name for (both) widgets * @return Scroll widget */ -GtkWidget *scroll_widget(GtkWidget *child, - const char *widgetname) { +GtkWidget *scroll_widget(GtkWidget *child) { GtkWidget *scroller = gtk_scrolled_window_new(0, 0); GtkAdjustment *adj; @@ -58,10 +64,11 @@ GtkWidget *scroll_widget(GtkWidget *child, /* Child widget requires a viewport */ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroller), child); + gtk_widget_modify_bg(gtk_bin_get_child(GTK_BIN(scroller)), + GTK_STATE_NORMAL, &tool_bg); } - /* Apply a name to the widget so it can be recolored */ - gtk_widget_set_name(GTK_BIN(scroller)->child, widgetname); - gtk_widget_set_name(scroller, widgetname); + set_slider_colors(GTK_SCROLLED_WINDOW(scroller)->hscrollbar); + set_slider_colors(GTK_SCROLLED_WINDOW(scroller)->vscrollbar); return scroller; } @@ -80,12 +87,22 @@ GdkPixbuf *find_image(const char *name) { GdkPixbuf *pb; char *path; GError *err = 0; + int n; if(!(pb = (GdkPixbuf *)cache_get(&image_cache_type, name))) { - byte_xasprintf(&path, "%s/static/%s", pkgdatadir, name); - if(!(pb = gdk_pixbuf_new_from_file(path, &err))) { - error(0, "%s", err->message); - return 0; + if((n = TABLE_FIND(images, struct image, name, name)) >= 0) { + /* Use the built-in copy */ + if(!(pb = gdk_pixbuf_new_from_inline(-1, images[n].data, FALSE, &err))) { + error(0, "%s", err->message); + return 0; + } + } else { + /* See if there's a copy on disk */ + byte_xasprintf(&path, "%s/static/%s", pkgdatadir, name); + if(!(pb = gdk_pixbuf_new_from_file(path, &err))) { + error(0, "%s", err->message); + return 0; + } } NW(cached_image); cache_put(&image_cache_type, name, pb); @@ -93,13 +110,13 @@ GdkPixbuf *find_image(const char *name) { return pb; } -/** @brief Pop up an error message */ -void popup_error(const char *msg) { +/** @brief Pop up a message */ +void popup_msg(GtkMessageType mt, const char *msg) { GtkWidget *w; w = gtk_message_dialog_new(GTK_WINDOW(toplevel), GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, + mt, GTK_BUTTONS_CLOSE, "%s", msg); gtk_dialog_run(GTK_DIALOG(w)); @@ -107,14 +124,14 @@ void popup_error(const char *msg) { } /** @brief Pop up an error message */ -void fpopup_error(const char *fmt, ...) { +void fpopup_msg(GtkMessageType mt, const char *fmt, ...) { va_list ap; char *msg; va_start(ap, fmt); byte_xvasprintf(&msg, fmt, ap); va_end(ap); - popup_error(msg); + popup_msg(mt, msg); } /** @brief Create a button with an icon in it @@ -149,6 +166,16 @@ GtkWidget *create_buttons(const struct button *buttons, for(n = 0; n < nbuttons; ++n) { GtkWidget *const button = gtk_button_new_from_stock(buttons[n].stock); + gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &tool_bg); + gtk_widget_modify_bg(button, GTK_STATE_ACTIVE, &tool_active); + gtk_widget_modify_bg(button, GTK_STATE_PRELIGHT, &tool_active); + gtk_widget_modify_bg(button, GTK_STATE_SELECTED, &tool_active); + gtk_widget_modify_bg(button, GTK_STATE_INSENSITIVE, &tool_active); + gtk_widget_modify_fg(button, GTK_STATE_NORMAL, &tool_fg); + gtk_widget_modify_fg(button, GTK_STATE_ACTIVE, &tool_fg); + gtk_widget_modify_fg(button, GTK_STATE_PRELIGHT, &tool_fg); + gtk_widget_modify_fg(button, GTK_STATE_SELECTED, &tool_fg); + gtk_widget_modify_fg(button, GTK_STATE_INSENSITIVE, &tool_fg); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttons[n].clicked), 0); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1);