Commit 34e5473bc58351951c10c4e4a0705796c5b0565a
1 parent
0098cc85
Exists in
master
and in
5 other branches
Incluindo opcao "copy as table"
Showing
7 changed files
with
165 additions
and
27 deletions
Show diff stats
src/gtk/actions.c
| @@ -97,8 +97,35 @@ static void reload_action(GtkAction *action, GtkWidget *widget) | @@ -97,8 +97,35 @@ static void reload_action(GtkAction *action, GtkWidget *widget) | ||
| 97 | 97 | ||
| 98 | static void copy_action(GtkAction *action, GtkWidget *widget) | 98 | static void copy_action(GtkAction *action, GtkWidget *widget) |
| 99 | { | 99 | { |
| 100 | - trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | ||
| 101 | - v3270_copy(widget); | 100 | + V3270_SELECT_FORMAT mode = V3270_SELECT_TEXT; |
| 101 | + const gchar * str = (const gchar *) g_object_get_data(G_OBJECT(action),"format"); | ||
| 102 | + | ||
| 103 | + if(str) | ||
| 104 | + { | ||
| 105 | + static const struct _format | ||
| 106 | + { | ||
| 107 | + V3270_SELECT_FORMAT mode; | ||
| 108 | + const gchar * name; | ||
| 109 | + } format[] = | ||
| 110 | + { | ||
| 111 | + { V3270_SELECT_TEXT, "text" }, | ||
| 112 | + { V3270_SELECT_TABLE, "table" }, | ||
| 113 | + }; | ||
| 114 | + | ||
| 115 | + int f; | ||
| 116 | + | ||
| 117 | + for(f=0;f<G_N_ELEMENTS(format);f++) | ||
| 118 | + { | ||
| 119 | + if(!g_strcasecmp(format[f].name,str)) | ||
| 120 | + { | ||
| 121 | + mode = format[f].mode; | ||
| 122 | + break; | ||
| 123 | + } | ||
| 124 | + } | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + trace("Action %s activated on widget %p mode=%d",gtk_action_get_name(action),widget,(int) mode); | ||
| 128 | + v3270_copy(widget,mode); | ||
| 102 | } | 129 | } |
| 103 | 130 | ||
| 104 | static void append_action(GtkAction *action, GtkWidget *widget) | 131 | static void append_action(GtkAction *action, GtkWidget *widget) |
| @@ -455,23 +482,13 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | @@ -455,23 +482,13 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | ||
| 455 | } | 482 | } |
| 456 | else if(!g_strcasecmp(name,"copy")) | 483 | else if(!g_strcasecmp(name,"copy")) |
| 457 | { | 484 | { |
| 458 | - static const gchar * src[] = { "begin", | ||
| 459 | - "table", | ||
| 460 | - "image", | ||
| 461 | - "append", | ||
| 462 | - NULL | ||
| 463 | - }; | ||
| 464 | - | ||
| 465 | static const GCallback cbk[] = { G_CALLBACK(copy_action), | 485 | static const GCallback cbk[] = { G_CALLBACK(copy_action), |
| 466 | - G_CALLBACK(nop_action), | ||
| 467 | - G_CALLBACK(nop_action), | ||
| 468 | G_CALLBACK(append_action) | 486 | G_CALLBACK(append_action) |
| 469 | }; | 487 | }; |
| 470 | callback = cbk; | 488 | callback = cbk; |
| 471 | action_type = ACTION_TYPE_TABLE; | 489 | action_type = ACTION_TYPE_TABLE; |
| 472 | - id = get_attribute_id(name,"mode",&nm,src,names,values,error); | ||
| 473 | - if(id < 0) | ||
| 474 | - return NULL; | 490 | + id = ui_get_bool_attribute("append",names,values,FALSE) ? 1 : 0; |
| 491 | + nm = g_strconcat(id == 0 ? "copy" : "append",ui_get_attribute("format",names,values),NULL); | ||
| 475 | } | 492 | } |
| 476 | else if(!g_strcasecmp(name,"select")) | 493 | else if(!g_strcasecmp(name,"select")) |
| 477 | { | 494 | { |
src/gtk/v3270/clipboard.c
| @@ -96,6 +96,18 @@ gchar * v3270_get_text(GtkWidget *widget, int offset, int len) | @@ -96,6 +96,18 @@ gchar * v3270_get_text(GtkWidget *widget, int offset, int len) | ||
| 96 | return text; | 96 | return text; |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | +static gchar * v3270_get_selected(v3270 *widget) | ||
| 100 | +{ | ||
| 101 | + gchar *text = lib3270_get_selected(widget->host); | ||
| 102 | + if(text) | ||
| 103 | + { | ||
| 104 | + gchar *str = g_strdup(text); | ||
| 105 | + free(text); | ||
| 106 | + return str; | ||
| 107 | + } | ||
| 108 | + return NULL; | ||
| 109 | +} | ||
| 110 | + | ||
| 99 | const gchar * v3270_get_selected_text(GtkWidget *widget) | 111 | const gchar * v3270_get_selected_text(GtkWidget *widget) |
| 100 | { | 112 | { |
| 101 | v3270 *terminal; | 113 | v3270 *terminal; |
| @@ -111,7 +123,7 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) | @@ -111,7 +123,7 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) | ||
| 111 | terminal->clipboard = NULL; | 123 | terminal->clipboard = NULL; |
| 112 | } | 124 | } |
| 113 | 125 | ||
| 114 | - text = lib3270_get_selected(terminal->host); | 126 | + text = v3270_get_selected(terminal); |
| 115 | 127 | ||
| 116 | if(!text) | 128 | if(!text) |
| 117 | { | 129 | { |
| @@ -120,9 +132,85 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) | @@ -120,9 +132,85 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) | ||
| 120 | return NULL; | 132 | return NULL; |
| 121 | } | 133 | } |
| 122 | 134 | ||
| 135 | + if(terminal->table) | ||
| 136 | + { | ||
| 137 | + // Convert text to table | ||
| 138 | + gchar **ln = g_strsplit(text,"\n",-1); | ||
| 139 | + int width = lib3270_get_width(terminal->host); | ||
| 140 | + gboolean cols[width]; | ||
| 141 | + int l; | ||
| 142 | + GString * buffer; | ||
| 143 | + | ||
| 144 | + memset(cols,0,sizeof(gboolean)*width); | ||
| 145 | + | ||
| 146 | + // Find column delimiters | ||
| 147 | + for(l=0;ln[l];l++) | ||
| 148 | + { | ||
| 149 | + int c; | ||
| 150 | + gchar * ptr = ln[l]; | ||
| 151 | + GString * buffer; | ||
| 152 | + | ||
| 153 | + for(c=0;c<width && *ptr;c++) | ||
| 154 | + { | ||
| 155 | + if(!g_ascii_isspace(*ptr)) | ||
| 156 | + cols[c] = TRUE; | ||
| 157 | + | ||
| 158 | + ptr++; | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + // Read screen contents | ||
| 164 | + buffer = g_string_sized_new(strlen(text)); | ||
| 165 | + for(l=0;ln[l];l++) | ||
| 166 | + { | ||
| 167 | + int col = 0; | ||
| 168 | + gchar * src = ln[l]; | ||
| 169 | + | ||
| 170 | + while(col < width && *src) | ||
| 171 | + { | ||
| 172 | + if(col) | ||
| 173 | + g_string_append_c(buffer,'\t'); | ||
| 174 | + | ||
| 175 | + // Find column start | ||
| 176 | + while(!cols[col] && col < width && *src) | ||
| 177 | + { | ||
| 178 | + col++; | ||
| 179 | + src++; | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + if(col < width && *src) | ||
| 183 | + { | ||
| 184 | + gchar tmp[width+1]; | ||
| 185 | + gchar * dst = tmp; | ||
| 186 | + | ||
| 187 | + // Copy column content | ||
| 188 | + while(cols[col] && col < width && *src) | ||
| 189 | + { | ||
| 190 | + *dst = *src; | ||
| 191 | + col++; | ||
| 192 | + dst++; | ||
| 193 | + src++; | ||
| 194 | + } | ||
| 195 | + *dst = 0; | ||
| 196 | + g_string_append(buffer,g_strstrip(tmp)); | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + } | ||
| 200 | + g_string_append_c(buffer,'\n'); | ||
| 201 | + | ||
| 202 | + } | ||
| 203 | + | ||
| 204 | + g_strfreev(ln); | ||
| 205 | + g_free(text); | ||
| 206 | + | ||
| 207 | + text = g_string_free(buffer,FALSE); | ||
| 208 | + } | ||
| 209 | + | ||
| 123 | terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); | 210 | terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); |
| 124 | 211 | ||
| 125 | - free(text); | 212 | + g_free(text); |
| 213 | + | ||
| 126 | 214 | ||
| 127 | return terminal->clipboard; | 215 | return terminal->clipboard; |
| 128 | } | 216 | } |
| @@ -175,11 +263,17 @@ const gchar * v3270_copy_append(GtkWidget *widget) | @@ -175,11 +263,17 @@ const gchar * v3270_copy_append(GtkWidget *widget) | ||
| 175 | return terminal->clipboard; | 263 | return terminal->clipboard; |
| 176 | } | 264 | } |
| 177 | 265 | ||
| 178 | -const gchar * v3270_copy(GtkWidget *widget) | 266 | +const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode) |
| 179 | { | 267 | { |
| 180 | - const gchar * text = v3270_get_selected_text(widget); | 268 | + const gchar * text; |
| 181 | GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); | 269 | GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); |
| 182 | 270 | ||
| 271 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | ||
| 272 | + | ||
| 273 | + GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0); | ||
| 274 | + | ||
| 275 | + text = v3270_get_selected_text(widget); | ||
| 276 | + | ||
| 183 | if(text) | 277 | if(text) |
| 184 | { | 278 | { |
| 185 | if(gtk_clipboard_set_with_owner( clipboard, | 279 | if(gtk_clipboard_set_with_owner( clipboard, |
src/gtk/v3270/private.h
| @@ -121,10 +121,11 @@ G_BEGIN_DECLS | @@ -121,10 +121,11 @@ G_BEGIN_DECLS | ||
| 121 | { | 121 | { |
| 122 | GtkWidget parent; | 122 | GtkWidget parent; |
| 123 | 123 | ||
| 124 | - // private | 124 | + // flags |
| 125 | int selecting : 1; /**< Selecting region */ | 125 | int selecting : 1; /**< Selecting region */ |
| 126 | int moving : 1; /**< Moving selected region */ | 126 | int moving : 1; /**< Moving selected region */ |
| 127 | int resizing : 1; /**< Resizing selected region */ | 127 | int resizing : 1; /**< Resizing selected region */ |
| 128 | + int table : 1; /**< Copy mode is table */ | ||
| 128 | 129 | ||
| 129 | #if GTK_CHECK_VERSION(3,0,0) | 130 | #if GTK_CHECK_VERSION(3,0,0) |
| 130 | 131 |
src/gtk/v3270/v3270.h
| @@ -142,11 +142,20 @@ | @@ -142,11 +142,20 @@ | ||
| 142 | void v3270_disconnect(GtkWidget *widget); | 142 | void v3270_disconnect(GtkWidget *widget); |
| 143 | 143 | ||
| 144 | // Clipboard | 144 | // Clipboard |
| 145 | + typedef enum _v3270_select_format | ||
| 146 | + { | ||
| 147 | + V3270_SELECT_TEXT, | ||
| 148 | + V3270_SELECT_TABLE, | ||
| 149 | + | ||
| 150 | + V3270_SELECT_MAX | ||
| 151 | + } V3270_SELECT_FORMAT; | ||
| 152 | + | ||
| 153 | + const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode); | ||
| 154 | + const gchar * v3270_copy_append(GtkWidget *widget); | ||
| 155 | + | ||
| 145 | const gchar * v3270_get_selected_text(GtkWidget *widget); | 156 | const gchar * v3270_get_selected_text(GtkWidget *widget); |
| 146 | const gchar * v3270_get_copy(GtkWidget *widget); | 157 | const gchar * v3270_get_copy(GtkWidget *widget); |
| 147 | gchar * v3270_get_text(GtkWidget *widget,int offset, int len); | 158 | gchar * v3270_get_text(GtkWidget *widget,int offset, int len); |
| 148 | - const gchar * v3270_copy(GtkWidget *widget); | ||
| 149 | - const gchar * v3270_copy_append(GtkWidget *widget); | ||
| 150 | 159 | ||
| 151 | void v3270_paste(GtkWidget *widget); | 160 | void v3270_paste(GtkWidget *widget); |
| 152 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); | 161 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); |
src/include/lib3270.h
| @@ -267,6 +267,17 @@ | @@ -267,6 +267,17 @@ | ||
| 267 | */ | 267 | */ |
| 268 | LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c); | 268 | LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c); |
| 269 | 269 | ||
| 270 | + | ||
| 271 | + /** | ||
| 272 | + * Get current screen width in columns. | ||
| 273 | + * | ||
| 274 | + * @param h Handle of the desired session. | ||
| 275 | + * | ||
| 276 | + * @return screen width. | ||
| 277 | + * | ||
| 278 | + */ | ||
| 279 | + LIB3270_EXPORT int lib3270_get_width(H3270 *h); | ||
| 280 | + | ||
| 270 | LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h); | 281 | LIB3270_EXPORT unsigned int lib3270_get_length(H3270 *h); |
| 271 | 282 | ||
| 272 | /** | 283 | /** |
src/lib3270/screen.c
| @@ -244,6 +244,12 @@ LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c) | @@ -244,6 +244,12 @@ LIB3270_EXPORT void lib3270_get_screen_size(H3270 *h, int *r, int *c) | ||
| 244 | *c = h->cols; | 244 | *c = h->cols; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | +LIB3270_EXPORT int lib3270_get_width(H3270 *h) | ||
| 248 | +{ | ||
| 249 | + CHECK_SESSION_HANDLE(h); | ||
| 250 | + return h->cols; | ||
| 251 | +} | ||
| 252 | + | ||
| 247 | void update_model_info(H3270 *session, int model, int cols, int rows) | 253 | void update_model_info(H3270 *session, int model, int cols, int rows) |
| 248 | { | 254 | { |
| 249 | if(model == session->model_num && session->maxROWS == rows && session->maxCOLS == cols) | 255 | if(model == session->model_num && session->maxROWS == rows && session->maxCOLS == cols) |
ui/00default.xml
| @@ -57,10 +57,10 @@ | @@ -57,10 +57,10 @@ | ||
| 57 | </menu> | 57 | </menu> |
| 58 | 58 | ||
| 59 | <menu name='EditMenu' label='_Edit' > | 59 | <menu name='EditMenu' label='_Edit' > |
| 60 | - <menuitem action='copy' mode='begin' key='<ctrl>c' icon='copy' group='selection' label='Copy' /> | ||
| 61 | - <!-- menuitem action='copy' mode='table' key='<ctrl><alt>c' group='selection' label='Copy as table' /--> | 60 | + <menuitem action='copy' append='no' format='text' key='<ctrl>c' icon='copy' group='selection' label='Copy' /> |
| 61 | + <menuitem action='copy' append='no' format='table' key='<ctrl><alt>c' group='selection' label='Copy as table' /> | ||
| 62 | <!-- menuitem action='copy' mode='image' group='selection' label='Copy as image' /--> | 62 | <!-- menuitem action='copy' mode='image' group='selection' label='Copy as image' /--> |
| 63 | - <menuitem action='copy' mode='append' key='<shift><ctrl>c' group='selection' label='Add to copy' /> | 63 | + <menuitem action='copy' append='yes' key='<shift><ctrl>c' group='selection' label='Add to copy' /> |
| 64 | <menuitem action='paste' src='clipboard' key='<ctrl>v' icon='paste' group='paste' label='Paste' /> | 64 | <menuitem action='paste' src='clipboard' key='<ctrl>v' icon='paste' group='paste' label='Paste' /> |
| 65 | <menuitem action='paste' src='next' key='<shift><ctrl>v' label='Paste next' /> | 65 | <menuitem action='paste' src='next' key='<shift><ctrl>v' label='Paste next' /> |
| 66 | 66 | ||
| @@ -144,7 +144,7 @@ | @@ -144,7 +144,7 @@ | ||
| 144 | 144 | ||
| 145 | <toolbar name='toolbar.default' label='Toolbar' key='<alt>t' > | 145 | <toolbar name='toolbar.default' label='Toolbar' key='<alt>t' > |
| 146 | <toolitem action='selectall' /> | 146 | <toolitem action='selectall' /> |
| 147 | - <toolitem action='copy' mode='begin' /> | 147 | + <toolitem action='copy' append='no' format='text' /> |
| 148 | <toolitem action='paste' src='clipboard' /> | 148 | <toolitem action='paste' src='clipboard' /> |
| 149 | <toolitem action='EraseInput' /> | 149 | <toolitem action='EraseInput' /> |
| 150 | 150 | ||
| @@ -161,8 +161,8 @@ | @@ -161,8 +161,8 @@ | ||
| 161 | </toolbar> | 161 | </toolbar> |
| 162 | 162 | ||
| 163 | <popup name='selectionpopup' type='selection'> | 163 | <popup name='selectionpopup' type='selection'> |
| 164 | - <menuitem action='copy' mode='begin' /> | ||
| 165 | - <menuitem action='copy' mode='append' /> | 164 | + <menuitem action='copy' append='no' format='text' /> |
| 165 | + <menuitem action='copy' append='yes' /> | ||
| 166 | <menuitem action='select' target='none'/> | 166 | <menuitem action='select' target='none'/> |
| 167 | <menuitem action='select' target='all'/> | 167 | <menuitem action='select' target='all'/> |
| 168 | 168 |