Commit 0054c1c31cca45424ce6f3afec83a961c3b58014

Authored by Perry Werneck
1 parent f1894934
Exists in master and in 1 other branch develop

Rewriting color scheme selection widget

Makefile.in
... ... @@ -313,6 +313,13 @@ install-shared: \
313 313 $(DESTDIR)$(libdir)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@
314 314  
315 315  
  316 + # Install default configs
  317 + @mkdir -p $(datarootdir)/pw3270
  318 +
  319 + @$(INSTALL_DATA) \
  320 + colors.conf \
  321 + $(datarootdir)/pw3270
  322 +
316 323 install-static: \
317 324 $(BINRLS)/static/$(LIBNAME).a
318 325  
... ...
colors.conf 0 → 100644
... ... @@ -0,0 +1,103 @@
  1 +#
  2 +# Software pw3270; desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 +# (Paul Mattes Paul.Mattes@usa.net); de emulação de terminal 3270 para acesso a
  4 +# aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 +#
  6 +# Copyright (C) <2008> <Banco do Brasil S.A.>
  7 +#
  8 +# Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 +# os termos da GPL v.2 - Licença Pública Geral GNU; conforme publicado pela
  10 +# Free Software Foundation.
  11 +#
  12 +# Este programa é distribuído na expectativa de ser útil; mas SEM QUALQUER
  13 +# GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 +# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 +# obter mais detalhes.
  16 +#
  17 +# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 +# programa; se não; escreva para a Free Software Foundation; Inc.; 51 Franklin
  19 +# St; Fifth Floor; Boston; MA 02110-1301 USA
  20 +#
  21 +#
  22 +# Contatos:
  23 +#
  24 +# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  25 +# erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  26 +#
  27 +
  28 +[default]
  29 +label=PW3270 default
  30 +
  31 +base=#000000;#7890F0;#FF0000;#FF00FF;#00FF00;#00FFFF;#FFFF00;#FFFFFF;#000000;#000080;#FFA200;#800080;#008000;#008080;#A0A000;#C0C0C0
  32 +field=#00FF00;#FF0000;#00FFFF;#FFFFFF
  33 +selection=#404040;#ffffff
  34 +OIA=#000000;#00FF00;#7890F0;#FFFFFF;#FF0000
  35 +
  36 +cross-hair=#00FF00
  37 +
  38 +[X3270]
  39 +label=X3270
  40 +
  41 +base=black;deepSkyBlue;red;pink;green;turquoise;yellow;white;black;blue3;orange;purple;paleGreen;paleTurquoise2;grey;white
  42 +field=green;red;deepSkyBlue;white
  43 +selection=dimGrey;black
  44 +OIA=black;turquoise;turquoise;white;red
  45 +
  46 +cross-hair=white
  47 +
  48 +[Reverse]
  49 +label=Reverse
  50 +label[pt_BR]=Invertido
  51 +
  52 +base=white;blue;firebrick;pink;green4;cadetBlue;goldenrod;black;white;blue3;orange;purple;paleGreen;darkTurquoise;grey;black
  53 +selection=dimGrey;black
  54 +OIA=white;blue;blue;black;black
  55 +
  56 +cross-hair=black
  57 +
  58 +[Bright]
  59 +label=Bright
  60 +label[pt_BR]=Cores fortes
  61 +
  62 +base=black;blue;red;magenta;green;turquoise;yellow;white;black;blue3;orange;purple;paleGreen;cyan;grey;white
  63 +selection=dimGrey;black
  64 +OIA=black;blue;blue;white;red
  65 +
  66 +cross-hair=white
  67 +
  68 +[CPE]
  69 +label=CPE
  70 +base=black;LightBlue1;PaleVioletRed1;pink;green;turquoise;yellow;white;black;LightBlue3;orange;MediumPurple1;paleGreen;paleTurquoise2;grey80;white
  71 +selection=dimGrey;black
  72 +OIA=black;turquoise;turquoise;white;red
  73 +
  74 +cross-hair=white
  75 +
  76 +[Green]
  77 +label=Green
  78 +label[pt_BR]=Verde
  79 +
  80 +base=black;green
  81 +
  82 +[WB]
  83 +label=White on Black
  84 +label[pt_BR]=Branco com fundo preto
  85 +
  86 +base=black;white
  87 +
  88 +[BW]
  89 +label=Black on White
  90 +label[pt_BR]=Preto com fundo branco
  91 +base=white;black
  92 +
  93 +[selenized]
  94 +
  95 +# https://github.com/jan-warchol/selenized
  96 +label=Selenized color palette by Jan Warchoł
  97 +
  98 +base=rgb(24,24,24);rgb(79,156,254);rgb(237,74,70);rgb(235,110,183);rgb(131,199,70);rgb(86,216,201);rgb(239,197,65);rgb(222,222,222);rgb(59,59,59);rgb(54,142,171);rgb(250,145,83);rgb(165,128,226);rgb(112,180,51);rgb(65,199,185);rgb(219,179,45);rgb(119,119,119)
  99 +field=rgb(131,199,70);rgb(237,74,70);rgb(65,199,185);rgb(250,145,83)
  100 +selection=rgb(37,37,37);rgb(222,222,222)
  101 +OIA=rgb(24,24,24);rgb(222,222,222);rgb(79,156,254);rgb(131,199,70);rgb(239,197,65)
  102 +cross-hair=rgb(222,222,222)
  103 +
... ...
src/dialogs/colorscheme.c
... ... @@ -38,7 +38,9 @@
38 38 #include <glib/gi18n.h>
39 39  
40 40 #include <v3270.h>
  41 + #include <lib3270/log.h>
41 42 #include <v3270/colorscheme.h>
  43 + #include "../v3270/marshal.h"
42 44  
43 45 #define V3270_COLOR_BASE V3270_COLOR_GRAY+1
44 46  
... ... @@ -48,33 +50,260 @@
48 50 {
49 51 GtkComboBoxClass parent_class;
50 52  
51   -
52 53 };
53 54  
54 55 struct _V3270ColorScheme
55 56 {
56   - GtkComboBox parent;
  57 + GtkComboBox parent;
  58 + GdkRGBA * schemes;
  59 +
  60 +
  61 + };
57 62  
  63 + enum
  64 + {
  65 + CHANGED,
  66 + LAST_SIGNAL
58 67 };
59 68  
  69 + static guint color_signal[LAST_SIGNAL] = { 0 };
  70 +
60 71 G_DEFINE_TYPE(V3270ColorScheme, V3270ColorScheme, GTK_TYPE_COMBO_BOX);
61 72  
62 73 /*--[ Implement ]------------------------------------------------------------------------------------*/
63 74  
  75 + static void changed(GtkComboBox *widget)
  76 + {
  77 + GdkRGBA * clr = NULL;
  78 + GValue value = { 0, };
  79 + GtkTreeIter iter;
  80 +
  81 + if(!gtk_combo_box_get_active_iter(widget,&iter))
  82 + return;
  83 +
  84 + gtk_tree_model_get_value(gtk_combo_box_get_model(widget),&iter,1,&value);
  85 + clr = g_value_get_pointer(&value);
  86 +
  87 + debug("%s=%p",__FUNCTION__,clr);
  88 + g_signal_emit(widget, color_signal[CHANGED], 0, clr);
  89 +
  90 + }
  91 +
64 92 static void V3270ColorScheme_class_init(G_GNUC_UNUSED V3270ColorSchemeClass *klass)
65 93 {
  94 + GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
  95 +
  96 + klass->parent_class.changed = changed;
  97 +
  98 + color_signal[CHANGED] =
  99 + g_signal_new(
  100 + "update-colors",
  101 + G_OBJECT_CLASS_TYPE (gobject_class),
  102 + G_SIGNAL_RUN_FIRST,
  103 + 0,
  104 + NULL, NULL,
  105 + v3270_VOID__VOID_POINTER,
  106 + G_TYPE_NONE, 1, G_TYPE_POINTER, 0
  107 + );
  108 +
  109 + debug("changed_signal=%d",(int) color_signal[CHANGED]);
66 110  
67 111 }
68 112  
69 113 static void V3270ColorScheme_init(V3270ColorScheme *widget)
70 114 {
71 115  
  116 + GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_POINTER);
  117 + GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
  118 +
  119 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE);
  120 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget), renderer, "text", 0, NULL);
  121 +
  122 + gtk_combo_box_set_model(GTK_COMBO_BOX(widget), model);
  123 +
72 124 }
73 125  
74   - LIB3270_EXPORT GtkWidget * v3270_color_scheme_new(GdkRGBA *colors)
  126 + static void load_color_scheme(GKeyFile *conf, const gchar *group, GdkRGBA *clr)
75 127 {
76   - GtkWidget *widget = GTK_WIDGET(g_object_new(GTK_TYPE_V3270_COLOR_SCHEME, NULL));
  128 + const gchar * val;
  129 + size_t f;
  130 +
  131 + // Load base colors
  132 + val = g_key_file_get_string(conf,group,"base",NULL);
  133 + if(val)
  134 + {
  135 + // Process base colors
  136 + gchar **str = g_strsplit(val,";",V3270_COLOR_BASE);
  137 +
  138 + switch(g_strv_length(str))
  139 + {
  140 + case 2: // Only 2 colors, create monocromatic table
  141 + v3270_set_mono_color_table(clr,str[1],str[0]);
  142 + break;
  143 +
  144 + case V3270_COLOR_BASE: // All colors, update it
  145 + for(f=0;f<V3270_COLOR_BASE;f++)
  146 + gdk_rgba_parse(clr+f,str[f]);
  147 + break;
  148 +
  149 + default:
  150 +
  151 + // Unexpected size, load new colors over the defaults
  152 + g_warning("base color list in %s has %d elements, should have %d",group,g_strv_length(str),V3270_COLOR_GRAY);
  153 +
  154 + gdk_rgba_parse(clr,str[0]);
  155 + gdk_rgba_parse(clr+1,str[1]);
  156 +
  157 + for(f=2;f<V3270_COLOR_BASE;f++)
  158 + clr[f] = clr[1];
  159 +
  160 + clr[V3270_COLOR_BLACK] = *clr;
  161 +
  162 + for(f=2;f<MIN(g_strv_length(str),V3270_COLOR_BASE-1);f++)
  163 + gdk_rgba_parse(clr+f,str[f]);
  164 +
  165 + }
  166 + g_strfreev(str);
  167 +
  168 + }
  169 + else
  170 + {
  171 + g_warning("Color scheme [%s] has no \"base\" entry, using green on black",group);
  172 +
  173 + gdk_rgba_parse(clr,"black");
  174 + gdk_rgba_parse(clr+1,"green");
  175 +
  176 + for(f=2;f<V3270_COLOR_BASE;f++)
  177 + clr[f] = clr[1];
  178 + clr[V3270_COLOR_BLACK] = *clr;
  179 + }
  180 +
  181 + // Load field colors
  182 + clr[V3270_COLOR_FIELD] = clr[V3270_COLOR_GREEN];
  183 + clr[V3270_COLOR_FIELD_INTENSIFIED] = clr[V3270_COLOR_RED];
  184 + clr[V3270_COLOR_FIELD_PROTECTED] = clr[V3270_COLOR_BLUE];
  185 + clr[V3270_COLOR_FIELD_PROTECTED_INTENSIFIED] = clr[V3270_COLOR_WHITE];
  186 +
  187 + val = g_key_file_get_string(conf,group,"field",NULL);
  188 + if(val)
  189 + {
  190 + gchar **str = g_strsplit(val,";",5);
  191 +
  192 + for(f=0;f< MIN(g_strv_length(str),4); f++)
  193 + gdk_rgba_parse(clr+V3270_COLOR_FIELD+f,str[f]);
  194 +
  195 + g_strfreev(str);
  196 + }
  197 +
  198 + // Load selection colors
  199 + clr[V3270_COLOR_SELECTED_BG] = clr[V3270_COLOR_WHITE];
  200 + clr[V3270_COLOR_SELECTED_FG] = clr[V3270_COLOR_BLACK];
  201 + val = g_key_file_get_string(conf,group,"selection",NULL);
  202 + if(val)
  203 + {
  204 + gchar **str = g_strsplit(val,";",3);
  205 +
  206 + for(f=0;f< MIN(g_strv_length(str),2); f++)
  207 + gdk_rgba_parse(clr+V3270_COLOR_SELECTED_BG+f,str[f]);
  208 +
  209 + g_strfreev(str);
  210 + }
  211 +
  212 + // Load OIA colors
  213 + clr[V3270_COLOR_OIA_BACKGROUND] = clr[V3270_COLOR_BACKGROUND];
  214 + clr[V3270_COLOR_OIA_FOREGROUND] = clr[V3270_COLOR_GREEN];
  215 + clr[V3270_COLOR_OIA_SEPARATOR] = clr[V3270_COLOR_GREEN];
  216 + clr[V3270_COLOR_OIA_STATUS_OK] = clr[V3270_COLOR_GREEN];
  217 + clr[V3270_COLOR_OIA_STATUS_INVALID] = clr[V3270_COLOR_RED];
  218 + clr[V3270_COLOR_OIA_STATUS_WARNING] = clr[V3270_COLOR_YELLOW];
  219 +
  220 + val = g_key_file_get_string(conf,group,"OIA",NULL);
  221 + if(val)
  222 + {
  223 + gchar **str = g_strsplit(val,";",6);
  224 +
  225 + // 0 = V3270_COLOR_OIA_BACKGROUND,
  226 + // 1 = V3270_COLOR_OIA_FOREGROUND,
  227 + // 2 = V3270_COLOR_OIA_SEPARATOR,
  228 + // 3 = V3270_COLOR_OIA_STATUS_OK,
  229 + // 4 = V3270_COLOR_OIA_STATUS_WARNING,
  230 + // 5 = V3270_COLOR_OIA_STATUS_INVALID,
  231 +
  232 + if(g_strv_length(str) == 5)
  233 + {
  234 + for(f=0;f < 5; f++)
  235 + gdk_rgba_parse(clr+V3270_COLOR_OIA_BACKGROUND+f,str[f]);
  236 + clr[V3270_COLOR_OIA_STATUS_INVALID] = clr[V3270_COLOR_OIA_STATUS_WARNING];
  237 + }
  238 + else
  239 + {
  240 + for(f=0;f< MIN(g_strv_length(str),6); f++)
  241 + gdk_rgba_parse(clr+V3270_COLOR_OIA_BACKGROUND+f,str[f]);
  242 + }
  243 +
  244 + g_strfreev(str);
  245 + }
  246 +
  247 + // Setup extended elements
  248 + clr[V3270_COLOR_CROSS_HAIR] = clr[V3270_COLOR_GREEN];
  249 +
  250 + val = g_key_file_get_string(conf,group,"cross-hair",NULL);
  251 + if(val)
  252 + gdk_rgba_parse(clr+V3270_COLOR_CROSS_HAIR,val);
  253 +
  254 + }
  255 +
  256 + LIB3270_EXPORT GtkWidget * v3270_color_scheme_new()
  257 + {
  258 + GtkWidget * widget = GTK_WIDGET(g_object_new(GTK_TYPE_V3270_COLOR_SCHEME, NULL));
  259 + GtkTreeModel * model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
  260 +
  261 +#ifdef DEBUG
  262 + lib3270_autoptr(char) filename = lib3270_strdup_printf("%s/%s",".","colors.conf");
  263 +#else
  264 + lib3270_autoptr(char) filename = lib3270_build_data_filename("colors.conf");
  265 +#endif // DEBUG
  266 +
  267 + if(!g_file_test(filename,G_FILE_TEST_IS_REGULAR))
  268 + {
  269 + g_warning("Unable to load color schemes in \"%s\"",filename);
  270 + gtk_widget_set_sensitive(widget,FALSE);
  271 + return widget;
  272 + }
  273 +
  274 + // Load color schemes.
  275 + g_autoptr(GKeyFile) conf = g_key_file_new();
  276 + g_autoptr(GError) err = NULL;
  277 + int index = 0;
  278 + gsize len;
  279 + gsize g;
  280 +
  281 + g_key_file_load_from_file(conf,filename,G_KEY_FILE_NONE,&err);
  282 +
  283 + gchar **group = g_key_file_get_groups(conf,&len);
  284 + GTK_V3270_COLOR_SCHEME(widget)->schemes = g_new0(GdkRGBA,(len*V3270_COLOR_COUNT));
  285 +
  286 + for(g=0;g<len;g++)
  287 + {
  288 + // Setup colors for current entry
  289 + GtkTreeIter iter;
  290 + GdkRGBA * clr = GTK_V3270_COLOR_SCHEME(widget)->schemes+index;
  291 + const gchar * label = g_key_file_get_locale_string(conf,group[g],"label",NULL,NULL);
  292 +
  293 + load_color_scheme(conf,group[g],clr);
  294 +
  295 + // Set it in the combobox
  296 + gtk_list_store_append((GtkListStore *) model,&iter);
  297 + gtk_list_store_set((GtkListStore *) model, &iter,
  298 + 0, label ? label : group[g],
  299 + 1, clr,
  300 + -1);
  301 +
  302 + // move to next color list
  303 + index += V3270_COLOR_COUNT;
  304 + }
77 305  
  306 + g_strfreev(group);
78 307  
79 308 return widget;
80 309 }
... ...
src/include/v3270.h
... ... @@ -215,7 +215,7 @@
215 215 LIB3270_EXPORT const GdkRGBA * v3270_get_color_table(GtkWidget *widget);
216 216 LIB3270_EXPORT void v3270_set_mono_color_table(GdkRGBA *table, const gchar *fg, const gchar *bg);
217 217 LIB3270_EXPORT void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, v3270FontInfo *font, GdkRectangle *rect, GdkRGBA *color);
218   - LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkRGBA *color);
  218 + LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, const GdkRGBA *color);
219 219 LIB3270_EXPORT GdkRGBA * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id);
220 220  
221 221 // Misc
... ...
src/include/v3270/colorscheme.h
... ... @@ -47,7 +47,7 @@
47 47  
48 48 /*--[ Prototipes ]-----------------------------------------------------------------------------------*/
49 49  
50   - LIB3270_EXPORT GtkWidget * v3270_color_scheme_new(GdkRGBA *colors);
  50 + LIB3270_EXPORT GtkWidget * v3270_color_scheme_new();
51 51  
52 52 G_END_DECLS
53 53  
... ...
src/testprogram/testprogram.c
... ... @@ -36,6 +36,8 @@
36 36 #include <v3270.h>
37 37 #include <v3270/filetransfer.h>
38 38 #include <v3270/ftprogress.h>
  39 + #include <v3270/colorscheme.h>
  40 + #include <lib3270/log.h>
39 41 #include <stdlib.h>
40 42  
41 43 /*---[ Implement ]----------------------------------------------------------------------------------*/
... ... @@ -88,6 +90,19 @@ static void trace_window_destroy(G_GNUC_UNUSED GtkWidget *widget, H3270 *hSessio
88 90 lib3270_set_toggle(hSession,LIB3270_TOGGLE_NETWORK_TRACE,0);
89 91 }
90 92  
  93 +static void color_scheme_changed(GtkWidget *widget, const GdkRGBA *colors, GtkWidget *terminal) {
  94 +
  95 + debug("%s=%p",__FUNCTION__,colors);
  96 +
  97 + int f;
  98 + for(f=0;f<V3270_COLOR_COUNT;f++)
  99 + v3270_set_color(terminal,f,colors+f);
  100 +
  101 + v3270_reload(terminal);
  102 + gtk_widget_queue_draw(terminal);
  103 +
  104 +}
  105 +
91 106 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
92 107  
93 108 /*
... ... @@ -153,17 +168,29 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
153 168  
154 169 g_signal_connect(terminal,"popup",G_CALLBACK(popup_menu),NULL);
155 170  
  171 + // Create box
  172 + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL,2);
  173 + GtkWidget *grid = gtk_grid_new();
  174 + GtkWidget *color = v3270_color_scheme_new();
  175 +
  176 + g_signal_connect(G_OBJECT(color),"update-colors",G_CALLBACK(color_scheme_changed),terminal);
  177 +
  178 + gtk_grid_attach(GTK_GRID(grid),color,0,0,1,1);
  179 +
  180 + gtk_box_pack_start(GTK_BOX(box),grid,FALSE,TRUE,0);
  181 + gtk_box_pack_start(GTK_BOX(box),terminal,TRUE,TRUE,0);
  182 +
156 183 // Setup and show window
157 184 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
158 185 gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
159   - gtk_container_add(GTK_CONTAINER(window),terminal);
  186 + gtk_container_add(GTK_CONTAINER(window),box);
160 187 gtk_widget_show_all (window);
161 188  
162   - v3270_set_toggle(terminal,LIB3270_TOGGLE_RECONNECT,1);
  189 + // v3270_set_toggle(terminal,LIB3270_TOGGLE_RECONNECT,1);
163 190  
164 191 // v3270_set_script(terminal,'R');
165 192  
166   - v3270_print_all(terminal);
  193 + // v3270_print_all(terminal);
167 194  
168 195  
169 196 }
... ...
src/v3270/colors.c
... ... @@ -90,7 +90,7 @@ LIB3270_EXPORT void v3270_set_colors(GtkWidget *widget, const gchar *colors)
90 90  
91 91 }
92 92  
93   -LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkRGBA *color)
  93 +LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, const GdkRGBA *color)
94 94 {
95 95 g_return_if_fail(GTK_IS_V3270(widget));
96 96  
... ...
src/v3270/print.c
... ... @@ -210,7 +210,6 @@
210 210 debug("%s(%p)",__FUNCTION__,info->widget);
211 211 g_signal_emit(info->widget, v3270_widget_signal[SIGNAL_PRINT_DONE], 0, prt, (guint) result);
212 212  
213   -
214 213 debug("%s",__FUNCTION__);
215 214 if(info->font.scaled)
216 215 cairo_scaled_font_destroy(info->font.scaled);
... ...