Commit 72bdaf3378d0d3a708634b05fd0c7947e8e407ac
1 parent
0326d968
Exists in
master
and in
5 other branches
Iniciando reconstrução das barras lateral e de funções posto que, aparentemente,…
… o widget usado nelas não funciona depois da última atualização do gtk.
Showing
4 changed files
with
57 additions
and
168 deletions
Show diff stats
src/pw3270/uiparser/button.c
... | ... | @@ -77,6 +77,7 @@ |
77 | 77 | |
78 | 78 | void keypad_button_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad) |
79 | 79 | { |
80 | + /* | |
80 | 81 | const gchar * label = ui_get_attribute("label", names, values); |
81 | 82 | const gchar * icon = ui_get_attribute("icon", names, values); |
82 | 83 | const gchar * name = ui_get_attribute("action", names, values); |
... | ... | @@ -132,5 +133,6 @@ |
132 | 133 | gtk_widget_set_sensitive(widget,FALSE); |
133 | 134 | g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_script),info->center_widget); |
134 | 135 | } |
136 | + */ | |
135 | 137 | } |
136 | 138 | ... | ... |
src/pw3270/uiparser/keypad.c
... | ... | @@ -31,46 +31,14 @@ |
31 | 31 | |
32 | 32 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
33 | 33 | |
34 | - void keypad_row_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad) | |
35 | - { | |
36 | - keypad->row = g_malloc0(sizeof(struct row)); | |
37 | - | |
38 | - keypad->row->pos = ++keypad->num_rows; | |
39 | - keypad->col = 0; | |
40 | - | |
41 | - keypad->rows = g_list_append(keypad->rows,keypad->row); | |
42 | - } | |
43 | - | |
44 | 34 | static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct keypad *keypad, GError **error) |
45 | 35 | { |
46 | - static const struct _cmd | |
47 | - { | |
48 | - const gchar *element_name; | |
49 | - void (*start)(GMarkupParseContext *, const gchar **,const gchar **, GError **, struct keypad *); | |
50 | - } cmd[] = | |
51 | - { | |
52 | - { "row", keypad_row_start }, | |
53 | - { "button", keypad_button_start }, | |
54 | - }; | |
55 | - | |
56 | - int f; | |
57 | - | |
58 | - for(f = 0; f < G_N_ELEMENTS(cmd); f++) | |
59 | - { | |
60 | - if(!g_ascii_strcasecmp(cmd[f].element_name,element_name)) | |
61 | - { | |
62 | - cmd[f].start(context,names,values,error,keypad); | |
63 | - return; | |
64 | - } | |
65 | - } | |
66 | - | |
67 | - *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "Unexpected element <%s>"), element_name); | |
36 | + trace("%s(%s)",__FUNCTION__,element_name); | |
68 | 37 | } |
69 | 38 | |
70 | 39 | static void element_end(GMarkupParseContext *context, const gchar *element_name, struct keypad *keypad, GError **error) |
71 | 40 | { |
72 | - keypad->widget = NULL; | |
73 | -// trace("%s: %s",__FUNCTION__,element_name); | |
41 | + trace("%s(%s)",__FUNCTION__,element_name); | |
74 | 42 | } |
75 | 43 | |
76 | 44 | static void toggled(GtkToggleAction *action, GtkWidget *widget) |
... | ... | @@ -88,44 +56,37 @@ |
88 | 56 | |
89 | 57 | } |
90 | 58 | |
91 | - UI_ATTR_DIRECTION ui_get_position_attribute(const gchar **names, const gchar **values) | |
59 | + GtkPositionType ui_get_position_attribute(const gchar **names, const gchar **values) | |
92 | 60 | { |
93 | - static const gchar * posname[] = { "top", "bottom", "left", "right" }; | |
94 | - const gchar * dir = ui_get_attribute("position",names,values); | |
95 | - int f; | |
61 | + static const struct _pos { | |
62 | + GtkPositionType type; | |
63 | + const gchar * name; | |
64 | + } pos [] = { | |
65 | + | |
66 | + { GTK_POS_LEFT, "left" }, | |
67 | + { GTK_POS_RIGHT, "right" }, | |
68 | + { GTK_POS_TOP, "top" }, | |
69 | + { GTK_POS_BOTTOM, "bottom" }, | |
70 | + | |
71 | + }; | |
72 | + | |
73 | + const gchar * dir = ui_get_attribute("position",names,values); | |
74 | + int f; | |
96 | 75 | |
97 | 76 | if(dir) |
98 | 77 | { |
99 | - for(f=0;f<G_N_ELEMENTS(posname);f++) | |
78 | + for(f=0;f<G_N_ELEMENTS(pos);f++) | |
100 | 79 | { |
101 | - if(!g_ascii_strcasecmp(dir,posname[f])) | |
102 | - return f; | |
80 | + if(!g_ascii_strcasecmp(dir,pos[f].name)) | |
81 | + return pos[f].type; | |
103 | 82 | } |
104 | 83 | } |
105 | 84 | |
106 | - return UI_ATTR_DIRECTION_NONE; | |
85 | + return GTK_POS_TOP; | |
107 | 86 | } |
108 | 87 | |
109 | 88 | static void element_text(GMarkupParseContext *context, const gchar *text, gsize sz, struct keypad *keypad, GError **error) |
110 | 89 | { |
111 | - if(keypad->widget) | |
112 | - { | |
113 | - gchar *base = g_strstrip(g_strdup(text)); | |
114 | - gchar *text = g_strdup(base); | |
115 | - g_free(base); | |
116 | - | |
117 | - if(*text) | |
118 | - { | |
119 | - gtk_widget_set_sensitive(keypad->widget,TRUE); | |
120 | - g_object_set_data_full(G_OBJECT(keypad->widget),"script_text",text,g_free); | |
121 | - } | |
122 | - else | |
123 | - { | |
124 | - g_free(text); | |
125 | - } | |
126 | - | |
127 | - } | |
128 | - | |
129 | 90 | } |
130 | 91 | |
131 | 92 | GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error) |
... | ... | @@ -162,100 +123,33 @@ |
162 | 123 | info->block_data = keypad = g_malloc0(sizeof(struct keypad)); |
163 | 124 | |
164 | 125 | keypad->parser = info; |
165 | - keypad->handle = gtk_handle_box_new(); | |
166 | 126 | keypad->pos = ui_get_position_attribute(names,values); |
167 | 127 | keypad->relief = ui_get_relief(names, values, GTK_RELIEF_NORMAL); |
128 | + keypad->grid = GTK_GRID(gtk_grid_new()); | |
168 | 129 | |
169 | - switch(keypad->pos) | |
170 | - { | |
171 | - case UI_ATTR_UP: | |
172 | -#if GTK_CHECK_VERSION(3,0,0) | |
173 | - keypad->box = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | |
174 | -#else | |
175 | - keypad->box = gtk_vbox_new(FALSE,0); | |
176 | -#endif // GTK(3,0,0) | |
177 | - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_BOTTOM); | |
178 | - break; | |
179 | - | |
180 | - case UI_ATTR_DOWN: | |
181 | -#if GTK_CHECK_VERSION(3,0,0) | |
182 | - keypad->box = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | |
183 | -#else | |
184 | - keypad->box = gtk_vbox_new(FALSE,0); | |
185 | -#endif // GTK(3,0,0) | |
186 | - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_TOP); | |
187 | - break; | |
188 | - | |
189 | - case UI_ATTR_LEFT: | |
190 | -#if GTK_CHECK_VERSION(3,0,0) | |
191 | - keypad->box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); | |
192 | -#else | |
193 | - keypad->box = gtk_hbox_new(FALSE,0); | |
194 | -#endif // GTK(3,0,0) | |
195 | - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_RIGHT); | |
196 | - break; | |
197 | - | |
198 | - default: | |
199 | -#if GTK_CHECK_VERSION(3,0,0) | |
200 | - keypad->box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); | |
201 | -#else | |
202 | - keypad->box = gtk_hbox_new(FALSE,0); | |
203 | -#endif // GTK(3,0,0) | |
204 | - keypad->pos = UI_ATTR_RIGHT; | |
205 | - gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_LEFT); | |
206 | - | |
207 | - } | |
130 | + g_object_set_data(G_OBJECT(keypad->grid),"position",(gpointer) keypad->pos); | |
208 | 131 | |
209 | 132 | label = ui_get_attribute("label",names,values); |
210 | 133 | if(label) |
211 | 134 | { |
212 | 135 | // Keypad has label, create and setup an action |
213 | 136 | const gchar *name = ui_get_attribute("name",names,values); |
137 | + | |
138 | + trace("%s name=%s",__FUNCTION__,name); | |
139 | + | |
214 | 140 | if(name) |
215 | 141 | { |
216 | 142 | GtkToggleAction *action = gtk_toggle_action_new(name,gettext(label),NULL,NULL); |
217 | 143 | ui_action_set_options(GTK_ACTION(action),info,names,values,error); |
218 | - g_object_set_data_full(G_OBJECT(keypad->handle),"view_action",action,g_object_unref); | |
219 | - g_signal_connect(action,"toggled",G_CALLBACK(toggled),keypad->handle); | |
144 | + g_object_set_data_full(G_OBJECT(keypad->grid),"view_action",action,g_object_unref); | |
145 | + g_signal_connect(action,"toggled",G_CALLBACK(toggled),keypad->grid); | |
146 | + gtk_widget_set_name(GTK_WIDGET(keypad->grid),name); | |
220 | 147 | } |
221 | 148 | } |
222 | 149 | |
223 | - gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(keypad->handle),GTK_SHADOW_ETCHED_IN); | |
224 | - gtk_container_add(GTK_CONTAINER(keypad->handle),keypad->box); | |
225 | - | |
226 | 150 | g_markup_parse_context_push(context,(GMarkupParser *) &parser,keypad); |
227 | 151 | |
228 | - return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_KEYPAD, names, values, G_OBJECT(keypad->handle), error)); | |
229 | - } | |
230 | - | |
231 | - static void create_col(GtkWidget *widget, struct keypad *keypad) | |
232 | - { | |
233 | - if(widget) | |
234 | - { | |
235 | - gtk_table_attach( GTK_TABLE(keypad->table), | |
236 | - widget, | |
237 | - keypad->col,keypad->col+keypad->button_width, | |
238 | - keypad->num_rows,keypad->num_rows+1, | |
239 | - GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,0,0 ); | |
240 | - | |
241 | - } | |
242 | - keypad->col += keypad->button_width; | |
243 | - | |
244 | - } | |
245 | - | |
246 | - static void create_row(struct row *info, struct keypad *keypad) | |
247 | - { | |
248 | - if(info->cols) | |
249 | - { | |
250 | - keypad->col = 0; | |
251 | - keypad->button_width = keypad->num_cols / info->num_cols; | |
252 | - | |
253 | -// trace("Max cols=%d row cols=%d width=%d",keypad->num_cols,info->num_cols,keypad->button_width); | |
254 | - | |
255 | - g_list_foreach(info->cols,(GFunc) create_col,keypad); | |
256 | - g_list_free(info->cols); | |
257 | - } | |
258 | - keypad->num_rows++; | |
152 | + return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_KEYPAD, names, values, G_OBJECT(keypad->grid), error)); | |
259 | 153 | } |
260 | 154 | |
261 | 155 | void ui_end_keypad(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error) |
... | ... | @@ -263,33 +157,7 @@ |
263 | 157 | struct keypad *keypad = (struct keypad *) info->block_data; |
264 | 158 | info->block_data = NULL; |
265 | 159 | |
266 | - keypad->num_cols *= 2; | |
267 | - | |
268 | - if(keypad->rows) | |
269 | - { | |
270 | - // Create Widgets & Release memory | |
271 | - keypad->table = gtk_table_new(keypad->num_rows,keypad->num_cols,FALSE); | |
272 | - | |
273 | -#if GTK_CHECK_VERSION(2,18,0) | |
274 | - gtk_widget_set_can_focus(keypad->table,FALSE); | |
275 | - gtk_widget_set_can_default(keypad->table,FALSE); | |
276 | -#else | |
277 | - GTK_WIDGET_UNSET_FLAGS(keypad->table,GTK_CAN_FOCUS); | |
278 | - GTK_WIDGET_UNSET_FLAGS(keypad->table,GTK_CAN_DEFAULT); | |
279 | -#endif // GTK(2,18) | |
280 | - | |
281 | - keypad->num_rows = 0; | |
282 | - g_list_foreach(keypad->rows,(GFunc) create_row,keypad); | |
283 | -#if GTK_CHECK_VERSION(2,28,0) | |
284 | - g_list_free_full(keypad->rows,g_free); | |
285 | -#else | |
286 | - g_list_foreach(keypad->rows,(GFunc) g_free,NULL); | |
287 | - g_list_free(keypad->rows); | |
288 | -#endif // GTK(2,28) | |
289 | - gtk_box_pack_start(GTK_BOX(keypad->box),keypad->table,FALSE,FALSE,0); | |
290 | - | |
291 | - gtk_widget_show_all(keypad->box); | |
292 | - } | |
160 | + gtk_widget_show_all(GTK_WIDGET(keypad->grid)); | |
293 | 161 | |
294 | 162 | g_free(keypad); |
295 | 163 | g_markup_parse_context_pop(context); | ... | ... |
src/pw3270/uiparser/keypad.h
... | ... | @@ -33,6 +33,16 @@ |
33 | 33 | |
34 | 34 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
35 | 35 | |
36 | + struct keypad { | |
37 | + struct parser * parser; | |
38 | + unsigned short row; | |
39 | + unsigned short col; | |
40 | + GtkGrid * grid; | |
41 | + GtkReliefStyle relief; | |
42 | + UI_ATTR_DIRECTION pos; | |
43 | + }; | |
44 | + | |
45 | +/* | |
36 | 46 | struct row |
37 | 47 | { |
38 | 48 | unsigned short pos; |
... | ... | @@ -58,5 +68,6 @@ |
58 | 68 | GtkWidget * widget; |
59 | 69 | |
60 | 70 | }; |
71 | +*/ | |
61 | 72 | |
62 | 73 | G_GNUC_INTERNAL void keypad_button_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad); | ... | ... |
src/pw3270/uiparser/parser.c
... | ... | @@ -73,6 +73,7 @@ static void pack_start(gpointer key, GtkWidget *widget, struct parser *p) |
73 | 73 | gtk_box_pack_start(GTK_BOX(p->element),widget,FALSE,FALSE,0); |
74 | 74 | } |
75 | 75 | |
76 | + | |
76 | 77 | struct keypad |
77 | 78 | { |
78 | 79 | GtkWidget * box; |
... | ... | @@ -82,10 +83,13 @@ struct keypad |
82 | 83 | |
83 | 84 | static void pack_keypad(gpointer key, GtkWidget *widget, struct keypad *k) |
84 | 85 | { |
85 | - if(gtk_handle_box_get_handle_position(GTK_HANDLE_BOX(widget)) != k->filter) | |
86 | + if((GtkPositionType) g_object_get_data(G_OBJECT(widget),"position") != k->filter) { | |
86 | 87 | return; |
88 | + } | |
87 | 89 | |
90 | + trace("%s %s",__FUNCTION__,gtk_widget_get_name(widget)); | |
88 | 91 | k->pack(GTK_BOX(k->box),widget,FALSE,FALSE,0); |
92 | + | |
89 | 93 | } |
90 | 94 | |
91 | 95 | static void pack_view(gpointer key, GtkWidget *widget, GtkWidget *parent) |
... | ... | @@ -231,15 +235,17 @@ void parser_build(struct parser *p, GtkWidget *widget) |
231 | 235 | ui_setup_keypads(p->element_list[UI_ELEMENT_KEYPAD], p->toplevel, p->center_widget); |
232 | 236 | |
233 | 237 | // Pack top keypads |
238 | + trace("Packing %s keypads","top"); | |
234 | 239 | memset(&keypad,0,sizeof(keypad)); |
235 | 240 | keypad.box = vbox; |
236 | - keypad.filter = GTK_POS_BOTTOM; | |
241 | + keypad.filter = GTK_POS_TOP; | |
237 | 242 | keypad.pack = gtk_box_pack_start; |
238 | 243 | g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); |
239 | 244 | |
240 | 245 | // Pack left keypads |
246 | + trace("Packing %s keypads","left"); | |
241 | 247 | keypad.box = hbox; |
242 | - keypad.filter = GTK_POS_RIGHT; | |
248 | + keypad.filter = GTK_POS_LEFT; | |
243 | 249 | g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); |
244 | 250 | |
245 | 251 | // Pack & configure center widget |
... | ... | @@ -252,13 +258,15 @@ void parser_build(struct parser *p, GtkWidget *widget) |
252 | 258 | gtk_box_pack_start(GTK_BOX(hbox),vbox,TRUE,TRUE,0); |
253 | 259 | |
254 | 260 | // Pack right keypads |
255 | - keypad.filter = GTK_POS_LEFT; | |
261 | + trace("Packing %s keypads","right"); | |
262 | + keypad.filter = GTK_POS_RIGHT; | |
256 | 263 | keypad.pack = gtk_box_pack_end; |
257 | 264 | g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); |
258 | 265 | |
259 | 266 | // Pack bottom keypads |
267 | + trace("Packing %s keypads","bottom"); | |
260 | 268 | keypad.box = vbox; |
261 | - keypad.filter = GTK_POS_TOP; | |
269 | + keypad.filter = GTK_POS_BOTTOM; | |
262 | 270 | g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); |
263 | 271 | |
264 | 272 | // Finish building | ... | ... |