/*
* 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
*/
#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;
return FALSE;
}
+/** @brief Determine whether the edit menu's select none option should be sensitive
+ *
+ * TODO not implemented, see also choose_selectnone_activate()
+ */
+static int choose_selectnone_sensitive(GtkWidget attribute((unused)) *w) {
+ return FALSE;
+}
+
/** @brief Called when the edit menu's properties option is activated */
static void choose_properties_activate(GtkWidget attribute((unused)) *w) {
activate_track_properties(0, 0);
static void choose_selectall_activate(GtkWidget attribute((unused)) *w) {
}
+/** @brief Called when the edit menu's select none option is activated
+ *
+ * TODO not implemented, see choose_selectnone_sensitive() */
+static void choose_selectnone_activate(GtkWidget attribute((unused)) *w) {
+}
+
/** @brief Main menu callbacks for Choose screen */
static const struct tabtype tabtype_choose = {
choose_properties_sensitive,
choose_selectall_sensitive,
+ choose_selectnone_sensitive,
choose_properties_activate,
choose_selectall_activate,
+ choose_selectnone_activate,
};
/* Public entry points ----------------------------------------------------- */
/* 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 */