X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/ffc4dbaf1ee655263fd979d6c554ead000bef8e1..ec7109f36e878732d30e592279c2b160b28e6955:/disobedience/misc.c diff --git a/disobedience/misc.c b/disobedience/misc.c index cc23814..8c4ed09 100644 --- a/disobedience/misc.c +++ b/disobedience/misc.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2006, 2007 Richard Kettlewell + * Copyright (C) 2006-2008 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,8 +33,6 @@ struct image { /* Miscellaneous GTK+ stuff ------------------------------------------------ */ -WT(cached_image); - /* Functions */ /** @brief Put scrollbars around a widget @@ -51,7 +49,8 @@ GtkWidget *scroll_widget(GtkWidget *child) { gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - if(GTK_IS_LAYOUT(child)) { + if(GTK_IS_LAYOUT(child) + || GTK_IS_TREE_VIEW(child)) { /* Child widget has native scroll support */ gtk_container_add(GTK_CONTAINER(scroller), child); /* Fix up the step increments if they are 0 (seems like an odd default?) */ @@ -72,6 +71,24 @@ GtkWidget *scroll_widget(GtkWidget *child) { return scroller; } +/** @brief Put a frame round a widget + * @param w Widget + * @param label Label or NULL + * @return Frame widget + */ +GtkWidget *frame_widget(GtkWidget *w, const char *label) { + GtkWidget *const frame = gtk_frame_new(label); + GtkWidget *const hbox = gtk_hbox_new(FALSE, 0); + GtkWidget *const vbox = gtk_vbox_new(FALSE, 0); + /* We want 4 pixels outside the frame boundary... */ + gtk_container_set_border_width(GTK_CONTAINER(frame), 4); + /* ...and 4 pixels inside */ + gtk_box_pack_start(GTK_BOX(hbox), w, TRUE/*expand*/, TRUE/*fill*/, 4); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE/*expand*/, TRUE/*fill*/, 4); + gtk_container_add(GTK_CONTAINER(frame), vbox); + return frame; +} + /** @brief Find an image * @param name Relative path to image * @return pixbuf containing image @@ -90,7 +107,7 @@ GdkPixbuf *find_image(const char *name) { int n; if(!(pb = (GdkPixbuf *)cache_get(&image_cache_type, name))) { - if((n = TABLE_FIND(images, struct image, name, name)) >= 0) { + if((n = TABLE_FIND(images, 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); @@ -104,7 +121,6 @@ GdkPixbuf *find_image(const char *name) { return 0; } } - NW(cached_image); cache_put(&image_cache_type, name, pb); } return pb; @@ -112,9 +128,13 @@ GdkPixbuf *find_image(const char *name) { /** @brief Pop up a message */ void popup_msg(GtkMessageType mt, const char *msg) { + popup_submsg(toplevel, mt, msg); +} + +void popup_submsg(GtkWidget *parent, GtkMessageType mt, const char *msg) { GtkWidget *w; - w = gtk_message_dialog_new(GTK_WINDOW(toplevel), + w = gtk_message_dialog_new(GTK_WINDOW(parent), GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, mt, GTK_BUTTONS_CLOSE, @@ -144,13 +164,10 @@ GtkWidget *iconbutton(const char *path, const char *tip) { GtkWidget *button, *content; GdkPixbuf *pb; - NW(button); button = gtk_button_new(); if((pb = find_image(path))) { - NW(image); content = gtk_image_new_from_pixbuf(pb); } else { - NW(label); content = gtk_label_new(path); } gtk_widget_set_style(button, tool_style); @@ -162,24 +179,24 @@ GtkWidget *iconbutton(const char *path, const char *tip) { } /** @brief Create buttons and pack them into a box, which is returned */ -GtkWidget *create_buttons_box(const struct button *buttons, +GtkWidget *create_buttons_box(struct button *buttons, size_t nbuttons, GtkWidget *box) { size_t n; for(n = 0; n < nbuttons; ++n) { - GtkWidget *const button = gtk_button_new_from_stock(buttons[n].stock); - gtk_widget_set_style(button, tool_style); - g_signal_connect(G_OBJECT(button), "clicked", + buttons[n].widget = gtk_button_new_from_stock(buttons[n].stock); + gtk_widget_set_style(buttons[n].widget, tool_style); + g_signal_connect(G_OBJECT(buttons[n].widget), "clicked", G_CALLBACK(buttons[n].clicked), 0); - gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 1); - gtk_tooltips_set_tip(tips, button, buttons[n].tip, ""); + gtk_box_pack_start(GTK_BOX(box), buttons[n].widget, FALSE, FALSE, 1); + gtk_tooltips_set_tip(tips, buttons[n].widget, buttons[n].tip, ""); } return box; } /** @brief Create buttons and pack them into an hbox */ -GtkWidget *create_buttons(const struct button *buttons, +GtkWidget *create_buttons(struct button *buttons, size_t nbuttons) { return create_buttons_box(buttons, nbuttons, gtk_hbox_new(FALSE, 1));