diff --git a/src/gtk/colors.c b/src/gtk/colors.c index 4bf96e5..87df174 100644 --- a/src/gtk/colors.c +++ b/src/gtk/colors.c @@ -137,14 +137,31 @@ g_free(filename); } - static void color_selected(GtkTreeSelection *selection, GtkWidget *widget) + static void color_changed(GtkColorSelection *colorselection, GtkWidget *widget) { + GdkColor clr; + int id = (int) g_object_get_data(G_OBJECT(colorselection),"colorid"); + + if(id < 0 || id >= V3270_COLOR_COUNT) + return; + + gtk_color_selection_get_current_color(colorselection,&clr); + v3270_set_color(widget,id,&clr); + v3270_reload(widget); + gtk_widget_queue_draw(widget); + } + + static void color_selected(GtkTreeSelection *selection, GtkWidget *color) + { + GtkWidget * widget = g_object_get_data(G_OBJECT(selection),"v3270"); + GdkColor * saved = g_object_get_data(G_OBJECT(selection),"lastcolors"); + GValue value = { 0, }; GtkTreeModel * model; GtkTreeIter iter; - GValue value = { 0, }; + GdkColor * clr; int id; - gtk_widget_set_sensitive(widget,FALSE); + gtk_widget_set_sensitive(color,FALSE); if(!gtk_tree_selection_get_selected(selection,&model,&iter)) return; @@ -156,8 +173,13 @@ if(id < 0 || id >= V3270_COLOR_COUNT) return; + g_object_set_data(G_OBJECT(color),"colorid",(gpointer) id); + clr = v3270_get_color(widget,id); + + gtk_color_selection_set_previous_color(GTK_COLOR_SELECTION(color),saved+id); + gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(color),clr); - gtk_widget_set_sensitive(widget,TRUE); + gtk_widget_set_sensitive(color,TRUE); } void editcolors_action(GtkAction *action, GtkWidget *widget) @@ -224,6 +246,7 @@ GtkWidget * panned = gtk_hbox_new(FALSE,2); GtkWidget * tree; GtkWidget * color; + GdkColor saved[V3270_COLOR_COUNT]; { // Color dialog setup @@ -232,6 +255,8 @@ gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(color),FALSE); gtk_color_selection_set_has_palette(GTK_COLOR_SELECTION(color),TRUE); gtk_box_pack_end(GTK_BOX(panned),color,TRUE,TRUE,0); + g_object_set_data(G_OBJECT(color),"colorid",(gpointer) -1); + g_signal_connect(G_OBJECT(color),"color-changed",G_CALLBACK(color_changed),widget); } // Tree view with all available colors @@ -255,13 +280,18 @@ gtk_tree_store_append((GtkTreeStore *) model,&parent,NULL); gtk_tree_store_set((GtkTreeStore *) model, &parent, 0, gettext(node[title++].text), 1, V3270_COLOR_COUNT, -1); - select = gtk_tree_view_get_selection(GTK_TREE_VIEW (tree)); + + g_object_set_data(G_OBJECT(select),"v3270",widget); + g_object_set_data(G_OBJECT(select),"lastcolors",saved); + gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); - g_signal_connect(G_OBJECT (select),"changed",G_CALLBACK(color_selected),color); + g_signal_connect(G_OBJECT(select),"changed",G_CALLBACK(color_selected),color); for(f=0;fcolor,colors); - g_signal_emit(widget,v3270_widget_signal[SIGNAL_UPDATE_CONFIG], 0, "colors", colors); v3270_reload(widget); } +void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color) +{ + g_return_if_fail(GTK_IS_V3270(widget)); + + GTK_V3270(widget)->color[id] = *color; + +#if !GTK_CHECK_VERSION(3,0,0) + gdk_colormap_alloc_color(gtk_widget_get_default_colormap(),color,TRUE,TRUE); +#endif // !GTK(3,0,0) + +} +GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id) +{ + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); + return GTK_V3270(widget)->color+id; +} + void v3270_set_color_table(GdkColor *table, const gchar *colors) { gchar **clr; @@ -864,7 +880,7 @@ void v3270_set_color_table(GdkColor *table, const gchar *colors) { case V3270_COLOR_COUNT: // Complete string for(f=0;f < V3270_COLOR_COUNT;f++) - v3270_set_color_entry(table,f,clr[f]); + gdk_color_parse(clr[f],table+f); break; default: @@ -872,12 +888,13 @@ void v3270_set_color_table(GdkColor *table, const gchar *colors) g_warning("Color table has %d elements; should be %d.",cnt,V3270_COLOR_COUNT); for(f=0;f < cnt;f++) - v3270_set_color_entry(table,f,clr[f]); + gdk_color_parse(clr[f],table+f); + for(f=cnt; f < V3270_COLOR_COUNT;f++) - v3270_set_color_entry(table,f,clr[cnt-1]); + gdk_color_parse(clr[cnt-1],table+f); - v3270_set_color_entry(table,V3270_COLOR_OIA_BACKGROUND,clr[0]); - v3270_set_color_entry(table,V3270_COLOR_SELECTED_BG,clr[0]); + clr[V3270_COLOR_OIA_BACKGROUND] = clr[0]; + clr[V3270_COLOR_SELECTED_BG] = clr[0]; } @@ -885,32 +902,6 @@ void v3270_set_color_table(GdkColor *table, const gchar *colors) } -int v3270_set_color_entry(GdkColor *clr, enum V3270_COLOR id, const gchar *name) -{ - if(id >= V3270_COLOR_COUNT) - return -1; - - gdk_color_parse(name,clr+id); - - return 0; -} - -void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, const gchar *name) -{ - v3270 * terminal = GTK_V3270(widget); - - if(v3270_set_color_entry(terminal->color,id,name)) - return; - -#if(GTK_CHECK_VERSION(3,0,0)) - -#else - gdk_colormap_alloc_color(gtk_widget_get_default_colormap(),terminal->color+id,TRUE,TRUE); -#endif - - -} - void v3270_set_font_family(GtkWidget *widget, const gchar *name) { v3270 * terminal; -- libgit2 0.21.2