*/
#include "disobedience.h"
+#include "timeval.h"
/* Choose track ------------------------------------------------------------ */
+#if TDEBUG
+/* Timing */
+static struct {
+ struct timeval total;
+ struct timeval gtkbits;
+ struct timeval menuupdate;
+ struct timeval new_widgets;
+ struct timeval undisplay;
+ struct timeval colors;
+ struct timeval markers;
+ struct timeval location;
+ struct timeval selection;
+} times;
+
+#define BEGIN(WHAT) do { \
+ struct timeval started##WHAT, finished##WHAT; \
+ xgettimeofday(&started##WHAT, 0)
+
+#define END(WHAT) \
+ xgettimeofday(&finished##WHAT, 0); \
+ times.WHAT = tvadd(times.WHAT, tvsub(finished##WHAT, started##WHAT)); \
+} while(0)
+
+#define INIT() memset(×, 0, sizeof times)
+
+#define REPORT() do { \
+ fprintf(stderr, "total=%g\n" \
+ "gtkbits=%g\n" \
+ "menuupdate=%g\n" \
+ "new_widgets=%g\n" \
+ "undisplay=%g\n" \
+ "colors=%g\n" \
+ "markers=%g\n" \
+ "location=%g\n" \
+ "selection=%g\n" \
+ "accumulation=%g\n" \
+ "\n", \
+ tvdouble(times.total), \
+ tvdouble(times.gtkbits), \
+ tvdouble(times.menuupdate), \
+ tvdouble(times.new_widgets), \
+ tvdouble(times.undisplay), \
+ tvdouble(times.colors), \
+ tvdouble(times.markers), \
+ tvdouble(times.location), \
+ tvdouble(times.selection), \
+ (tvdouble(times.gtkbits) \
+ + tvdouble(times.menuupdate) \
+ + tvdouble(times.new_widgets) \
+ + tvdouble(times.undisplay) \
+ + tvdouble(times.colors) \
+ + tvdouble(times.markers) \
+ + tvdouble(times.location) \
+ + tvdouble(times.selection))); \
+} while(0)
+#else
+#define BEGIN(WHAT) do {
+#define END(WHAT) } while(0)
+#define INIT() ((void)0)
+#define REPORT() ((void)0)
+#endif
+
WT(label);
WT(event_box);
WT(menu);
/*fprintf(stderr, "redisplay_tree %s suppressed\n", why);*/
return;
}
+ if(gets_in_flight) {
+ /*fprintf(stderr, "redisplay_tree %s suppressed (gets_in_flight)\n", why);*/
+ return;
+ }
+ INIT();
+ BEGIN(total);
/*fprintf(stderr, "redisplay_tree %s *** NOT SUPPRESSED ***\n", why);*/
/* We'll count these up empirically each time */
files_selected = 0;
sizeof (struct choosenode *)) : 0;
d = display_tree(root, 0, 0);
MTAG_POP();
+
+ BEGIN(gtkbits);
/* We must set the total size or scrolling will not work (it wouldn't be hard
* for GtkLayout to figure it out for itself but presumably you're supposed
* to be able to have widgets off the edge of the layuot.)
if(oldwidth > d.width || oldheight > d.height)
gtk_widget_queue_draw(chooselayout);
gtk_layout_set_size(GTK_LAYOUT(chooselayout), d.width, d.height);
+ END(gtkbits);
/* Notify the main menu of any recent changes */
+ BEGIN(menuupdate);
menu_update(-1);
+ END(menuupdate);
+ END(total);
+ REPORT();
}
/** @brief Recursive step for redisplay_tree()
* A non-expandable item has just a text label and no arrow.
*/
if(!cn->container) {
+ BEGIN(new_widgets);
MTAG_PUSH("make_widgets_1");
/* Widgets need to be created */
NW(hbox);
/* Show everything by default */
gtk_widget_show_all(cn->container);
MTAG_POP();
+ END(new_widgets);
}
assert(cn->container);
/* Set colors */
- if(search_result)
- gtk_widget_modify_bg(cn->container, GTK_STATE_NORMAL, &search_bg);
- else
- gtk_widget_modify_bg(cn->container, GTK_STATE_NORMAL, &layout_bg);
- gtk_widget_modify_bg(cn->container, GTK_STATE_SELECTED, &selected_bg);
- gtk_widget_modify_bg(cn->container, GTK_STATE_PRELIGHT, &selected_bg);
- gtk_widget_modify_fg(cn->label, GTK_STATE_NORMAL, &item_fg);
- gtk_widget_modify_fg(cn->label, GTK_STATE_SELECTED, &selected_fg);
- gtk_widget_modify_fg(cn->label, GTK_STATE_PRELIGHT, &selected_fg);
+ BEGIN(colors);
+ if(search_result) {
+ gtk_widget_set_style(cn->container, search_style);
+ gtk_widget_set_style(cn->label, search_style);
+ } else {
+ gtk_widget_set_style(cn->container, layout_style);
+ gtk_widget_set_style(cn->label, layout_style);
+ }
+ END(colors);
/* Make sure the icon is right */
+ BEGIN(markers);
if(cn->flags & CN_EXPANDABLE)
gtk_arrow_set(GTK_ARROW(cn->arrow),
cn->flags & CN_EXPANDED ? GTK_ARROW_DOWN : GTK_ARROW_RIGHT,
/* Make sure the queued marker is right */
/* TODO: doesn't always work */
(queued(cn->path) ? gtk_widget_show : gtk_widget_hide)(cn->marker);
+ END(markers);
/* Put the widget in the right place */
+ BEGIN(location);
if(cn->flags & CN_DISPLAYED)
gtk_layout_move(GTK_LAYOUT(chooselayout), cn->container, x, y);
else {
/* Now chooselayout has a ref to the container */
g_object_unref(cn->container);
}
+ END(location);
/* Set the widget's selection status */
+ BEGIN(selection);
if(!(cn->flags & CN_EXPANDABLE))
display_selection(cn);
+ END(selection);
/* Find the size used so we can get vertical positioning right. */
gtk_widget_size_request(cn->container, &req);
d.width = x + req.width;
d.height = cd.height;
}
} else {
+ BEGIN(undisplay);
for(n = 0; n < cn->children.nvec; ++n)
undisplay_tree(cn->children.vec[n]);
+ END(undisplay);
}
if(!(cn->flags & CN_EXPANDABLE)) {
++files_visible;
/* Text entry box for search terms */
NW(entry);
searchentry = gtk_entry_new();
+ gtk_widget_set_style(searchentry, tool_style);
g_signal_connect(searchentry, "changed", G_CALLBACK(searchentry_changed), 0);
gtk_tooltips_set_tip(tips, searchentry, "Enter search terms here; search is automatic", "");
/* Cancel button to clear the search */
NW(button);
clearsearch = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_NORMAL, &tool_bg);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_ACTIVE, &tool_active);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_PRELIGHT, &tool_active);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_SELECTED, &tool_active);
+ gtk_widget_set_style(clearsearch, tool_style);
g_signal_connect(G_OBJECT(clearsearch), "clicked",
G_CALLBACK(clearsearch_clicked), 0);
gtk_tooltips_set_tip(tips, clearsearch, "Clear search terms", "");
prevsearch = iconbutton("up.png", "Previous search result");
g_signal_connect(G_OBJECT(prevsearch), "clicked",
G_CALLBACK(prev_clicked), 0);
+ gtk_widget_set_style(prevsearch, tool_style);
gtk_widget_set_sensitive(prevsearch, 0);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_NORMAL, &tool_bg);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_ACTIVE, &tool_active);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_PRELIGHT, &tool_active);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_SELECTED, &tool_active);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_INSENSITIVE, &tool_active);
nextsearch = iconbutton("down.png", "Next search result");
g_signal_connect(G_OBJECT(nextsearch), "clicked",
G_CALLBACK(next_clicked), 0);
+ gtk_widget_set_style(nextsearch, tool_style);
gtk_widget_set_sensitive(nextsearch, 0);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_NORMAL, &tool_bg);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_ACTIVE, &tool_active);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_PRELIGHT, &tool_active);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_SELECTED, &tool_active);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_INSENSITIVE, &tool_active);
/* hbox packs the search tools button together on a line */
NW(hbox);
* namespace */
NW(layout);
chooselayout = gtk_layout_new(0, 0);
- gtk_widget_modify_bg(chooselayout, GTK_STATE_NORMAL, &layout_bg);
+ gtk_widget_set_style(chooselayout, layout_style);
choose_reset();
register_reset(choose_reset);
/* Create the popup menus */
NW(menu);
track_menu = gtk_menu_new();
+ gtk_widget_set_style(track_menu, tool_style);
g_signal_connect(track_menu, "destroy", G_CALLBACK(gtk_widget_destroyed),
&track_menu);
for(n = 0; track_menuitems[n].name; ++n) {
NW(menu_item);
track_menuitems[n].w =
gtk_menu_item_new_with_label(track_menuitems[n].name);
+ gtk_widget_set_style(track_menuitems[n].w, tool_style);
gtk_menu_attach(GTK_MENU(track_menu), track_menuitems[n].w,
0, 1, n, n + 1);
}
NW(menu);
dir_menu = gtk_menu_new();
+ gtk_widget_set_style(dir_menu, tool_style);
g_signal_connect(dir_menu, "destroy", G_CALLBACK(gtk_widget_destroyed),
&dir_menu);
for(n = 0; dir_menuitems[n].name; ++n) {
NW(menu_item);
dir_menuitems[n].w =
gtk_menu_item_new_with_label(dir_menuitems[n].name);
+ gtk_widget_set_style(dir_menuitems[n].w, tool_style);
gtk_menu_attach(GTK_MENU(dir_menu), dir_menuitems[n].w,
0, 1, n, n + 1);
}