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 | ... | ... |