From 33288048f694a84b9c40653f0b72b4ce44a94ab1 Mon Sep 17 00:00:00 2001 Message-Id: <33288048f694a84b9c40653f0b72b4ce44a94ab1.1714755261.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 11 Nov 2007 17:29:48 +0000 Subject: [PATCH] use GtkStyles everywhere instead of explicit colors. faster. Organization: Straylight/Edgeware From: Richard Kettlewell --- disobedience/choose.c | 43 +++----- disobedience/control.c | 22 +--- disobedience/disobedience.c | 8 +- disobedience/disobedience.h | 13 ++- disobedience/login.c | 7 +- disobedience/misc.c | 24 ++--- disobedience/properties.c | 23 ++--- disobedience/queue.c | 41 ++++---- disobedience/settings.c | 195 ++++++++++++++---------------------- 9 files changed, 145 insertions(+), 231 deletions(-) diff --git a/disobedience/choose.c b/disobedience/choose.c index b740008..aabc215 100644 --- a/disobedience/choose.c +++ b/disobedience/choose.c @@ -957,18 +957,13 @@ static struct displaydata display_tree(struct choosenode *cn, int x, int y) { assert(cn->container); /* Set colors */ BEGIN(colors); - /* This section turns out to reliably take >50% of the elapsed time when - * displaying the tree, both when it's largely unexpanded and when it's - * heavily expanded. */ - 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); + 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); @@ -1442,16 +1437,14 @@ GtkWidget *choose_widget(void) { /* 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", ""); @@ -1461,21 +1454,13 @@ GtkWidget *choose_widget(void) { 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); @@ -1493,29 +1478,33 @@ GtkWidget *choose_widget(void) { * 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); } diff --git a/disobedience/control.c b/disobedience/control.c index 0fde2d0..1468168 100644 --- a/disobedience/control.c +++ b/disobedience/control.c @@ -220,8 +220,6 @@ void control_monitor(void attribute((unused)) *u) { /** @brief Create the control bar */ GtkWidget *control_widget(void) { GtkWidget *hbox = gtk_hbox_new(FALSE, 1), *vbox; - GtkWidget *content; - GdkPixbuf *pb; GtkWidget *v, *b; int n; @@ -230,21 +228,7 @@ GtkWidget *control_widget(void) { assert(mainmenufactory); /* ordering must be right */ for(n = 0; n < NICONS; ++n) { NW(button); - icons[n].button = gtk_button_new(); - gtk_widget_modify_bg(icons[n].button, GTK_STATE_NORMAL, &tool_bg); - gtk_widget_modify_bg(icons[n].button, GTK_STATE_ACTIVE, &tool_active); - gtk_widget_modify_bg(icons[n].button, GTK_STATE_PRELIGHT, &tool_active); - gtk_widget_modify_bg(icons[n].button, GTK_STATE_SELECTED, &tool_active); - gtk_widget_modify_bg(icons[n].button, GTK_STATE_INSENSITIVE, &tool_active); - if((pb = find_image(icons[n].icon))) { - NW(image); - content = gtk_image_new_from_pixbuf(pb); - } else { - NW(label); - content = gtk_label_new(icons[n].icon); - } - gtk_container_add(GTK_CONTAINER(icons[n].button), content); - gtk_tooltips_set_tip(tips, icons[n].button, icons[n].tip, ""); + icons[n].button = iconbutton(icons[n].icon, icons[n].tip); g_signal_connect(G_OBJECT(icons[n].button), "clicked", G_CALLBACK(clicked_icon), &icons[n]); /* pop the icon in a vbox so it doesn't get vertically stretch if there are @@ -284,8 +268,8 @@ GtkWidget *control_widget(void) { v = gtk_hscale_new(volume_adj); NW(hscale); b = gtk_hscale_new(balance_adj); - set_slider_colors(v); - set_slider_colors(b); + gtk_widget_set_style(v, tool_style); + gtk_widget_set_style(b, tool_style); gtk_scale_set_digits(GTK_SCALE(v), 10); gtk_scale_set_digits(GTK_SCALE(b), 10); gtk_widget_set_size_request(v, 192, -1); diff --git a/disobedience/disobedience.c b/disobedience/disobedience.c index 2d7ab3e..eb8135f 100644 --- a/disobedience/disobedience.c +++ b/disobedience/disobedience.c @@ -138,10 +138,7 @@ static GtkWidget *notebook(void) { tabs = gtk_notebook_new(); /* The current tab is _NORMAL, the rest are _ACTIVE, which is bizarre but * produces not too dreadful appearance */ - gtk_widget_modify_bg(tabs, GTK_STATE_NORMAL, &tool_bg); - gtk_widget_modify_bg(tabs, GTK_STATE_ACTIVE, &tool_active); - gtk_widget_modify_fg(tabs, GTK_STATE_NORMAL, &tool_fg); - gtk_widget_modify_fg(tabs, GTK_STATE_ACTIVE, &tool_fg); + gtk_widget_set_style(tabs, tool_style); g_signal_connect(tabs, "switch-page", G_CALLBACK(tab_switched), 0); gtk_notebook_append_page(GTK_NOTEBOOK(tabs), queue_widget(), gtk_label_new("Queue")); @@ -186,7 +183,7 @@ static void make_toplevel_window(void) { FALSE, /* expand */ FALSE, /* fill */ 0); - gtk_widget_modify_bg(toplevel, GTK_STATE_NORMAL, &tool_bg); + gtk_widget_set_style(toplevel, tool_style); } #if MDEBUG @@ -453,6 +450,7 @@ int main(int argc, char **argv) { } signal(SIGPIPE, SIG_IGN); load_settings(); + init_styles(); /* create the event loop */ D(("create main loop")); mainloop = g_main_loop_new(0, 0); diff --git a/disobedience/disobedience.h b/disobedience/disobedience.h index edb973d..ea5d095 100644 --- a/disobedience/disobedience.h +++ b/disobedience/disobedience.h @@ -247,16 +247,21 @@ void stop_rtp(void); /* Settings */ -extern GdkColor tool_bg, tool_fg, layout_bg, even_bg, odd_bg; -extern GdkColor active_bg, selected_bg, selected_fg, search_bg; -extern GdkColor title_bg, title_fg, item_fg, drag_target, tool_active; +void init_styles(void); +extern GtkStyle *layout_style; +extern GtkStyle *title_style; +extern GtkStyle *even_style; +extern GtkStyle *odd_style; +extern GtkStyle *active_style; +extern GtkStyle *tool_style; +extern GtkStyle *search_style; +extern GtkStyle *drag_style; extern const char *browser; void save_settings(void); void load_settings(void); void set_tool_colors(GtkWidget *w); -void set_slider_colors(GtkWidget *w); /* Widget leakage debugging rubbish ---------------------------------------- */ diff --git a/disobedience/login.c b/disobedience/login.c index e53e947..3dff339 100644 --- a/disobedience/login.c +++ b/disobedience/login.c @@ -215,16 +215,16 @@ void login_box(void) { default_connect(); /* Create a new login window */ login_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_modify_bg(login_window, GTK_STATE_NORMAL, &tool_bg); + gtk_widget_set_style(login_window, tool_style); g_signal_connect(login_window, "destroy", G_CALLBACK(gtk_widget_destroyed), &login_window); gtk_window_set_title(GTK_WINDOW(login_window), "Login Details"); /* Construct the form */ table = gtk_table_new(NLWIS + 1/*rows*/, 2/*columns*/, FALSE/*homogenous*/); - gtk_widget_modify_bg(table, GTK_STATE_NORMAL, &tool_bg); + gtk_widget_set_style(table, tool_style); for(n = 0; n < NLWIS; ++n) { label = gtk_label_new(lwis[n].description); - gtk_widget_modify_fg(table, GTK_STATE_NORMAL, &tool_fg); + gtk_widget_set_style(label, tool_style); gtk_misc_set_alignment(GTK_MISC(label), 1/*right*/, 0/*bottom*/); gtk_table_attach(GTK_TABLE(table), label, 0, 1, /* left/right_attach */ @@ -232,6 +232,7 @@ void login_box(void) { GTK_FILL, 0, /* x/yoptions */ 1, 1); /* x/ypadding */ entry = gtk_entry_new(); + gtk_widget_set_style(entry, tool_style); gtk_entry_set_visibility(GTK_ENTRY(entry), lwis[n].flags & LWI_HIDDEN ? FALSE : TRUE); gtk_entry_set_text(GTK_ENTRY(entry), lwis[n].get()); diff --git a/disobedience/misc.c b/disobedience/misc.c index 2a80053..958e2b2 100644 --- a/disobedience/misc.c +++ b/disobedience/misc.c @@ -45,6 +45,7 @@ GtkWidget *scroll_widget(GtkWidget *child) { GtkWidget *scroller = gtk_scrolled_window_new(0, 0); GtkAdjustment *adj; + gtk_widget_set_style(scroller, tool_style); D(("scroll_widget")); /* Why isn't _AUTOMATIC the default? */ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller), @@ -64,11 +65,10 @@ 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); + gtk_widget_set_style(gtk_bin_get_child(GTK_BIN(scroller)), tool_style); } - set_slider_colors(GTK_SCROLLED_WINDOW(scroller)->hscrollbar); - set_slider_colors(GTK_SCROLLED_WINDOW(scroller)->vscrollbar); + gtk_widget_set_style(GTK_SCROLLED_WINDOW(scroller)->hscrollbar, tool_style); + gtk_widget_set_style(GTK_SCROLLED_WINDOW(scroller)->vscrollbar, tool_style); return scroller; } @@ -119,6 +119,7 @@ void popup_msg(GtkMessageType mt, const char *msg) { mt, GTK_BUTTONS_CLOSE, "%s", msg); + gtk_widget_set_style(w, tool_style); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); } @@ -140,7 +141,7 @@ void fpopup_msg(GtkMessageType mt, const char *fmt, ...) { * @return Button */ GtkWidget *iconbutton(const char *path, const char *tip) { - GtkWidget *button, *content;; + GtkWidget *button, *content; GdkPixbuf *pb; NW(button); @@ -152,6 +153,8 @@ GtkWidget *iconbutton(const char *path, const char *tip) { NW(label); content = gtk_label_new(path); } + gtk_widget_set_style(button, tool_style); + gtk_widget_set_style(content, tool_style); gtk_container_add(GTK_CONTAINER(button), content); if(tip) gtk_tooltips_set_tip(tips, button, tip, ""); @@ -166,16 +169,7 @@ 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); + gtk_widget_set_style(button, tool_style); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttons[n].clicked), 0); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 1); diff --git a/disobedience/properties.c b/disobedience/properties.c index 99bda20..7ec9042 100644 --- a/disobedience/properties.c +++ b/disobedience/properties.c @@ -170,8 +170,7 @@ static void propagate_clicked(GtkButton attribute((unused)) *button, void properties(int ntracks, const char **tracks) { int n, m; struct prefdata *f; - GtkWidget *buttonbox, *vbox, *label, *entry, *propagate, *content; - GdkPixbuf *pb; + GtkWidget *buttonbox, *vbox, *label, *entry, *propagate; /* If no tracks, do nothign */ if(!ntracks) @@ -190,13 +189,13 @@ void properties(int ntracks, const char **tracks) { } /* Create a new properties window */ properties_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_modify_bg(properties_window, GTK_STATE_NORMAL, &tool_bg); + gtk_widget_set_style(properties_window, tool_style); g_signal_connect(properties_window, "destroy", G_CALLBACK(gtk_widget_destroyed), &properties_window); /* Most of the action is the table of preferences */ properties_table = gtk_table_new((NPREFS + 1) * ntracks, 2 + ntracks > 1, FALSE); - gtk_widget_modify_bg(properties_table, GTK_STATE_NORMAL, &tool_bg); + gtk_widget_set_style(properties_table, tool_style); g_signal_connect(properties_table, "destroy", G_CALLBACK(gtk_widget_destroyed), &properties_table); gtk_window_set_title(GTK_WINDOW(properties_window), "Track Properties"); @@ -208,7 +207,7 @@ void properties(int ntracks, const char **tracks) { /* The track itself */ /* Caption */ label = gtk_label_new("Track"); - gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &tool_fg); + gtk_widget_set_style(label, tool_style); gtk_misc_set_alignment(GTK_MISC(label), 1, 0); gtk_table_attach(GTK_TABLE(properties_table), label, @@ -218,6 +217,7 @@ void properties(int ntracks, const char **tracks) { 1, 1); /* The track name */ entry = gtk_entry_new(); + gtk_widget_set_style(entry, tool_style); gtk_entry_set_text(GTK_ENTRY(entry), tracks[n]); gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE); gtk_table_attach(GTK_TABLE(properties_table), @@ -230,7 +230,7 @@ void properties(int ntracks, const char **tracks) { for(m = 0; m < NPREFS; ++m) { /* Caption */ label = gtk_label_new(prefs[m].label); - gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &tool_fg); + gtk_widget_set_style(label, tool_style); gtk_misc_set_alignment(GTK_MISC(label), 1, 0); gtk_table_attach(GTK_TABLE(properties_table), label, @@ -246,13 +246,7 @@ void properties(int ntracks, const char **tracks) { prefs[m].type->kickoff(f); if(ntracks > 1) { /* Propagation button */ - propagate = gtk_button_new(); - if((pb = find_image("propagate.png"))) - content = gtk_image_new_from_pixbuf(pb); - else - content = gtk_label_new("propagate.png"); - gtk_container_add(GTK_CONTAINER(propagate), content); - gtk_tooltips_set_tip(tips, propagate, "Copy to other tracks", ""); + propagate = iconbutton("propagate.png", "Copy to other tracks"); g_signal_connect(G_OBJECT(propagate), "clicked", G_CALLBACK(propagate_clicked), f); gtk_table_attach(GTK_TABLE(properties_table), @@ -388,8 +382,7 @@ static void kickoff_boolean(struct prefdata *f) { static void completed_boolean(struct prefdata *f) { f->widget = gtk_check_button_new(); - gtk_widget_modify_bg(f->widget, GTK_STATE_NORMAL, &tool_bg); - gtk_widget_modify_bg(f->widget, GTK_STATE_PRELIGHT, &tool_active); + gtk_widget_set_style(f->widget, tool_style); if(!f->value) /* Not set, use the default */ f->value = f->p->default_value; diff --git a/disobedience/queue.c b/disobedience/queue.c index b3661dc..2469f25 100644 --- a/disobedience/queue.c +++ b/disobedience/queue.c @@ -513,8 +513,7 @@ static void update_queue(struct queuelike *ql, struct queue_entry *newq) { * @return New widget */ static GtkWidget *wrap_queue_cell(GtkWidget *label, - const GdkColor *bgcolor, - const GdkColor *fgcolor, + GtkStyle *style, int *wp) { GtkRequisition req; GtkWidget *bg; @@ -533,12 +532,8 @@ static GtkWidget *wrap_queue_cell(GtkWidget *label, if(req.width > *wp) *wp = req.width; } /* Set colors */ - gtk_widget_modify_bg(bg, GTK_STATE_NORMAL, bgcolor); - gtk_widget_modify_bg(bg, GTK_STATE_SELECTED, &selected_bg); - gtk_widget_modify_bg(bg, GTK_STATE_PRELIGHT, &selected_bg); - gtk_widget_modify_fg(label, GTK_STATE_NORMAL, fgcolor); - gtk_widget_modify_fg(label, GTK_STATE_SELECTED, &selected_fg); - gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &selected_fg); + gtk_widget_set_style(bg, style); + gtk_widget_set_style(label, style); return bg; } @@ -547,22 +542,20 @@ static GtkWidget *get_queue_cell(struct queuelike *ql, const struct queue_entry *q, int row, int col, - const GdkColor *bgcolor, - const GdkColor *fgcolor, + GtkStyle *style, int *wp) { GtkWidget *label; D(("get_queue_cell %d %d", row, col)); label = ql->columns[col].widget(ql, q, ql->columns[col].data); gtk_misc_set_alignment(GTK_MISC(label), ql->columns[col].xalign, 0); - return wrap_queue_cell(label, bgcolor, fgcolor, wp); + return wrap_queue_cell(label, style, wp); } /** @brief Add a padding cell to the end of a row */ -static GtkWidget *get_padding_cell(const GdkColor *bgcolor, - const GdkColor *fgcolor) { +static GtkWidget *get_padding_cell(GtkStyle *style) { D(("get_padding_cell")); NW(label); - return wrap_queue_cell(gtk_label_new(""), bgcolor, fgcolor, 0); + return wrap_queue_cell(gtk_label_new(""), style, 0); } /* User button press and menu ---------------------------------------------- */ @@ -813,7 +806,7 @@ static gboolean queue_drag_motion(GtkWidget attribute((unused)) *widget, g_signal_connect(ql->dragmark, "destroy", G_CALLBACK(gtk_widget_destroyed), &ql->dragmark); gtk_widget_set_size_request(ql->dragmark, 10240, row ? 4 : 2); - gtk_widget_modify_bg(ql->dragmark, GTK_STATE_NORMAL, &drag_target); + gtk_widget_set_style(ql->dragmark, drag_style); gtk_layout_put(GTK_LAYOUT(ql->mainlayout), ql->dragmark, 0, (row + 1) * ql->mainrowheight - !!row); } else @@ -915,7 +908,7 @@ static void redisplay_queue(struct queuelike *ql) { struct queue_entry *q; int row, col; GList *c, *children; - const GdkColor *bgcolor; + GtkStyle *style; GtkRequisition req; GtkWidget *w; int maxwidths[MAXCOLUMNS], x, y, titlerowheight; @@ -955,16 +948,15 @@ static void redisplay_queue(struct queuelike *ql) { /* Construct the widgets */ for(q = ql->q, row = 0; q; q = q->next, ++row) { /* Figure out the widget name for this row */ - if(q == playing_track) bgcolor = &active_bg; - else bgcolor = row % 2 ? &even_bg : &odd_bg; + if(q == playing_track) style = active_style; + else style = row % 2 ? even_style : odd_style; /* Make the widget for each column */ for(col = 0; col <= ql->ncolumns; ++col) { /* Create and store the widget */ if(col < ql->ncolumns) - w = get_queue_cell(ql, q, row, col, bgcolor, &item_fg, - &maxwidths[col]); + w = get_queue_cell(ql, q, row, col, style, &maxwidths[col]); else - w = get_padding_cell(bgcolor, &item_fg); + w = get_padding_cell(style); ql->cells[row * (ql->ncolumns + 1) + col] = w; /* Maybe mark it draggable */ if(draggable_row(q)) { @@ -1086,9 +1078,10 @@ static GtkWidget *queuelike(struct queuelike *ql, /* Create the layouts */ NW(layout); ql->mainlayout = gtk_layout_new(0, 0); - gtk_widget_modify_bg(ql->mainlayout, GTK_STATE_NORMAL, &layout_bg); + gtk_widget_set_style(ql->mainlayout, layout_style); NW(layout); ql->titlelayout = gtk_layout_new(0, 0); + gtk_widget_set_style(ql->titlelayout, title_style); /* Scroll the layouts */ ql->mainscroll = mainscroll = scroll_widget(ql->mainlayout); titlescroll = scroll_widget(ql->titlelayout); @@ -1103,10 +1096,10 @@ static GtkWidget *queuelike(struct queuelike *ql, NW(label); label = gtk_label_new(ql->columns[col].name); gtk_misc_set_alignment(GTK_MISC(label), ql->columns[col].xalign, 0); - ql->titlecells[col] = wrap_queue_cell(label, &title_bg, &title_fg, 0); + ql->titlecells[col] = wrap_queue_cell(label, title_style, 0); gtk_layout_put(GTK_LAYOUT(ql->titlelayout), ql->titlecells[col], 0, 0); } - ql->titlecells[col] = get_padding_cell(&title_bg, &title_fg); + ql->titlecells[col] = get_padding_cell(title_style); gtk_layout_put(GTK_LAYOUT(ql->titlelayout), ql->titlecells[col], 0, 0); /* Pack the lot together in a vbox */ NW(vbox); diff --git a/disobedience/settings.c b/disobedience/settings.c index 75f7396..a5ea53f 100644 --- a/disobedience/settings.c +++ b/disobedience/settings.c @@ -34,88 +34,12 @@ #include "split.h" #include -/** @brief Background colors for tools - menus, icons, etc. */ -GdkColor tool_bg = { 0, 0xDC00, 0xDA00, 0xD500 }; - -/** @brief Background color for active tool */ -GdkColor tool_active; - -/** @brief Foreground colors for tools */ -GdkColor tool_fg = { 0, 0x0000, 0x0000, 0x0000 }; - -/** @brief Foreground colors for inactive tools */ -GdkColor inactive_tool_fg = { 0, 0x8000, 0x8000, 0x8000 }; - -/** @brief Background color for the various layouts */ -GdkColor layout_bg = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; - -/** @brief Title-row background color */ -GdkColor title_bg = { 0, 0x0000, 0x0000, 0x0000 }; - -/** @brief Title-row foreground color */ -GdkColor title_fg = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; - -/** @brief Even-row background color */ -GdkColor even_bg = { 0, 0xFFFF, 0xEC00, 0xEBFF }; - -/** @brief Odd-row background color */ -GdkColor odd_bg = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; - -/** @brief Active-row background color */ -GdkColor active_bg = { 0, 0xE000, 0xFFFF, 0xE000 }; - -/** @brief Item foreground color */ -GdkColor item_fg = { 0, 0x0000, 0x0000, 0x0000 }; - -/** @brief Selected background color */ -GdkColor selected_bg = { 0, 0x4B00, 0x6900, 0x8300 }; - -/** @brief Selected foreground color */ -GdkColor selected_fg = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; - -/** @brief Search results */ -GdkColor search_bg = { 0, 0xFFFF, 0xFFFF, 0x0000 }; - -/** @brief Drag target color */ -GdkColor drag_target = { 0, 0x6666, 0x6666, 0x6666 }; - /** @brief HTML displayer */ const char *browser = BROWSER; -struct colordesc { - GdkColor *color; - const char *name; - const char *description; -}; - -#define COLOR(name, description) { &name, #name, description } - -/** @brief Table of configurable colors - * - * Some of the descriptions could be improve! - */ -static const struct colordesc colors[] = { - COLOR(tool_bg, "Tool background color"), - COLOR(tool_fg, "Tool foreground color"), - COLOR(layout_bg, "Layout background color"), - COLOR(title_bg, "Title row background color"), - COLOR(title_fg, "Title row foreground color"), - COLOR(even_bg, "Even row background color"), - COLOR(odd_bg, "Odd row background color"), - COLOR(active_bg, "Playing row background color"), - COLOR(item_fg, "Track foreground color"), - COLOR(selected_bg, "Selected item background color"), - COLOR(selected_fg, "Selected item foreground color"), - COLOR(search_bg, "Search result background color"), - COLOR(drag_target, "Drag target color"), -}; - -#define NCOLORS (sizeof colors / sizeof *colors) - void save_settings(void) { char *dir, *path, *tmp; FILE *fp = 0; - size_t n; byte_xasprintf(&dir, "%s/.disorder", getenv("HOME")); byte_xasprintf(&path, "%s/disobedience", dir); @@ -126,15 +50,7 @@ void save_settings(void) { tmp, strerror(errno)); goto done; } - for(n = 0; n < NCOLORS; ++n) - if(fprintf(fp, "color %-20s 0x%04X 0x%04X 0x%04X\n", colors[n].name, - colors[n].color->red, - colors[n].color->green, - colors[n].color->blue) < 0) { - fpopup_msg(GTK_MESSAGE_ERROR, "error writing to %s: %s", - tmp, strerror(errno)); - goto done; - } + /* TODO */ if(fclose(fp) < 0) { fpopup_msg(GTK_MESSAGE_ERROR, "error writing to %s: %s", tmp, strerror(errno)); @@ -157,7 +73,6 @@ static inline unsigned clamp(unsigned n) { void load_settings(void) { char *path, *line; FILE *fp; - size_t n; char **vec; int nvec; @@ -176,15 +91,7 @@ void load_settings(void) { error(0, "%s: malformed '%s' command", path, vec[0]); continue; } - for(n = 0; n < NCOLORS && strcmp(colors[n].name, vec[1]); ++n) - ; - if(n >= NCOLORS) { - error(0, "%s: unknown color '%s'", path, vec[1]); - continue; - } - colors[n].color->red = strtoul(vec[2], 0, 0); - colors[n].color->green = strtoul(vec[3], 0, 0); - colors[n].color->blue = strtoul(vec[4], 0, 0); + /* TODO */ } else /* mention errors but otherwise ignore them */ error(0, "%s: unknown command '%s'", path, vec[0]); @@ -195,10 +102,6 @@ void load_settings(void) { fclose(fp); } } - tool_active = tool_bg; - tool_active.red = clamp(105 * tool_active.red / 100); - tool_active.green = clamp(105 * tool_active.green / 100); - tool_active.blue = clamp(105 * tool_active.blue / 100); } /** @brief Callback used by set_tool_colors() */ @@ -211,14 +114,7 @@ static void set_tool_colors_callback(GtkWidget *w, void set_tool_colors(GtkWidget *w) { GtkWidget *child; - gtk_widget_modify_bg(w, GTK_STATE_NORMAL, &tool_bg); - gtk_widget_modify_bg(w, GTK_STATE_SELECTED, &selected_bg); - gtk_widget_modify_bg(w, GTK_STATE_PRELIGHT, &selected_bg); - gtk_widget_modify_bg(w, GTK_STATE_INSENSITIVE, &tool_bg); - gtk_widget_modify_fg(w, GTK_STATE_NORMAL, &tool_fg); - gtk_widget_modify_fg(w, GTK_STATE_SELECTED, &selected_fg); - gtk_widget_modify_fg(w, GTK_STATE_PRELIGHT, &selected_fg); - gtk_widget_modify_fg(w, GTK_STATE_INSENSITIVE, &inactive_tool_fg); + gtk_widget_set_style(w, tool_style); if(GTK_IS_CONTAINER(w)) gtk_container_foreach(GTK_CONTAINER(w), set_tool_colors_callback, 0); if(GTK_IS_MENU_ITEM(w) @@ -226,18 +122,79 @@ void set_tool_colors(GtkWidget *w) { set_tool_colors(child); } -/** @brief Set the colors for a slider */ -void set_slider_colors(GtkWidget *w) { - if(!w) - return; - gtk_widget_modify_bg(w, GTK_STATE_NORMAL, &tool_bg); - gtk_widget_modify_bg(w, GTK_STATE_ACTIVE, &tool_bg); - gtk_widget_modify_bg(w, GTK_STATE_SELECTED, &tool_active); - gtk_widget_modify_bg(w, GTK_STATE_PRELIGHT, &tool_active); - gtk_widget_modify_fg(w, GTK_STATE_NORMAL, &tool_fg); - gtk_widget_modify_fg(w, GTK_STATE_ACTIVE, &tool_fg); - gtk_widget_modify_fg(w, GTK_STATE_SELECTED, &tool_fg); - gtk_widget_modify_fg(w, GTK_STATE_PRELIGHT, &tool_fg); +/** @brief Default style for layouts */ +GtkStyle *layout_style; + +/** @brief Title-row style for layouts */ +GtkStyle *title_style; + +/** @brief Even-row style for layouts */ +GtkStyle *even_style; + +/** @brief Odd-row style for layouts */ +GtkStyle *odd_style; + +/** @brief Active-row style for layouts */ +GtkStyle *active_style; + +/** @brief Style for tools */ +GtkStyle *tool_style; + +/** @brief Style for search results */ +GtkStyle *search_style; + +/** @brief Style for drag targets */ +GtkStyle *drag_style; + +/** @brief Initialize styles */ +void init_styles(void) { + layout_style = gtk_style_new(); + title_style = gtk_style_new(); + even_style = gtk_style_new(); + odd_style = gtk_style_new(); + active_style = gtk_style_new(); + search_style = gtk_style_new(); + tool_style = gtk_style_new(); + drag_style = gtk_style_new(); + + /* Style defaults */ + + /* Layouts are basically black on white */ + layout_style->bg[GTK_STATE_NORMAL] = layout_style->white; + layout_style->fg[GTK_STATE_NORMAL] = layout_style->black; + + /* Title row is inverted */ + title_style->bg[GTK_STATE_NORMAL] = layout_style->fg[GTK_STATE_NORMAL]; + title_style->fg[GTK_STATE_NORMAL] = layout_style->bg[GTK_STATE_NORMAL]; + + /* Active row is pastel green */ + active_style->bg[GTK_STATE_NORMAL].red = 0xE000; + active_style->bg[GTK_STATE_NORMAL].green = 0xFFFF; + active_style->bg[GTK_STATE_NORMAL].blue = 0xE000; + active_style->fg[GTK_STATE_NORMAL] = layout_style->fg[GTK_STATE_NORMAL]; + + /* Even rows are pastel red */ + even_style->bg[GTK_STATE_NORMAL].red = 0xFFFF; + even_style->bg[GTK_STATE_NORMAL].green = 0xEC00; + even_style->bg[GTK_STATE_NORMAL].blue = 0xEC00; + even_style->fg[GTK_STATE_NORMAL] = layout_style->fg[GTK_STATE_NORMAL]; + + /* Odd rows match the underlying layout */ + odd_style->bg[GTK_STATE_NORMAL] = layout_style->bg[GTK_STATE_NORMAL]; + odd_style->fg[GTK_STATE_NORMAL] = layout_style->fg[GTK_STATE_NORMAL]; + + /* Search results have a yellow background */ + search_style->fg[GTK_STATE_NORMAL] = layout_style->fg[GTK_STATE_NORMAL]; + search_style->bg[GTK_STATE_NORMAL].red = 0xFFFF; + search_style->bg[GTK_STATE_NORMAL].green = 0xFFFF; + search_style->bg[GTK_STATE_NORMAL].blue = 0x0000; + + /* Drag targets are grey */ + drag_style->bg[GTK_STATE_NORMAL].red = 0x6666; + drag_style->bg[GTK_STATE_NORMAL].green = 0x6666; + drag_style->bg[GTK_STATE_NORMAL].blue = 0x6666; + + /* Tools we leave at GTK+ defaults */ } /* -- [mdw]