Commit 537f5dd00a1d81da9e36458f9e42a0446b99c9ce
1 parent
04a2ace8
Exists in
master
and in
5 other branches
Implementando "append to copy"
Showing
4 changed files
with
98 additions
and
24 deletions
Show diff stats
src/gtk/actions.c
| ... | ... | @@ -97,13 +97,19 @@ static void reload_action(GtkAction *action, GtkWidget *widget) |
| 97 | 97 | static void copy_action(GtkAction *action, GtkWidget *widget) |
| 98 | 98 | { |
| 99 | 99 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); |
| 100 | - v3270_copy_clipboard(widget); | |
| 100 | + v3270_copy(widget); | |
| 101 | +} | |
| 102 | + | |
| 103 | +static void append_action(GtkAction *action, GtkWidget *widget) | |
| 104 | +{ | |
| 105 | + trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | |
| 106 | + v3270_copy_append(widget); | |
| 101 | 107 | } |
| 102 | 108 | |
| 103 | 109 | static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) |
| 104 | 110 | { |
| 105 | 111 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); |
| 106 | - v3270_paste_clipboard(widget); | |
| 112 | + v3270_paste(widget); | |
| 107 | 113 | } |
| 108 | 114 | |
| 109 | 115 | static void paste_next_action(GtkAction *action, GtkWidget *widget) |
| ... | ... | @@ -145,7 +151,6 @@ static void connect_standard_action(GtkAction *action, GtkWidget *widget, const |
| 145 | 151 | { "activate", activate_action }, |
| 146 | 152 | { "reload", reload_action }, |
| 147 | 153 | { "connect", connect_action }, |
| 148 | - { "copy", copy_action }, | |
| 149 | 154 | { "disconnect", disconnect_action }, |
| 150 | 155 | { "hostname", hostname_action } |
| 151 | 156 | }; |
| ... | ... | @@ -409,6 +414,33 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash |
| 409 | 414 | nm = g_strconcat(name,attr, NULL); |
| 410 | 415 | |
| 411 | 416 | } |
| 417 | + else if(!g_strcasecmp(name,"copy")) | |
| 418 | + { | |
| 419 | + static const gchar * src[] = { "begin", | |
| 420 | + "table", | |
| 421 | + "image", | |
| 422 | + "append", | |
| 423 | + NULL | |
| 424 | + }; | |
| 425 | + | |
| 426 | + static const GCallback cbk[] = { G_CALLBACK(copy_action), | |
| 427 | + G_CALLBACK(nop_action), | |
| 428 | + G_CALLBACK(nop_action), | |
| 429 | + G_CALLBACK(append_action) | |
| 430 | + }; | |
| 431 | + callback = cbk; | |
| 432 | + action_type = ACTION_TYPE_TABLE; | |
| 433 | + attr = ui_get_attribute("mode",names,values); | |
| 434 | + | |
| 435 | + id = id_from_array(attr,src,error); | |
| 436 | + if(id < 0) | |
| 437 | + { | |
| 438 | + *error = g_error_new(ERROR_DOMAIN,EINVAL,_("Unexpected or invalid mode attribute: \"%s\"" ), attr); | |
| 439 | + return NULL; | |
| 440 | + } | |
| 441 | + | |
| 442 | + nm = g_strconcat(name,attr,NULL); | |
| 443 | + } | |
| 412 | 444 | else if(!g_strcasecmp(name,"save")) |
| 413 | 445 | { |
| 414 | 446 | static const GCallback cbk[] = { G_CALLBACK(save_all_action), | ... | ... |
src/gtk/v3270/clipboard.c
| ... | ... | @@ -127,26 +127,66 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) |
| 127 | 127 | return terminal->clipboard; |
| 128 | 128 | } |
| 129 | 129 | |
| 130 | -void v3270_copy_clipboard(GtkWidget *widget) | |
| 130 | +const gchar * v3270_copy_append(GtkWidget *widget) | |
| 131 | +{ | |
| 132 | + v3270 * terminal; | |
| 133 | + char * str; | |
| 134 | + gchar * text; | |
| 135 | + gchar * clip; | |
| 136 | + | |
| 137 | + g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | |
| 138 | + | |
| 139 | + terminal = GTK_V3270(widget); | |
| 140 | + | |
| 141 | + if(!terminal->clipboard) | |
| 142 | + return v3270_get_selected_text(widget); | |
| 143 | + | |
| 144 | + str = lib3270_get_selected(terminal->host); | |
| 145 | + | |
| 146 | + if(!str) | |
| 147 | + return terminal->clipboard; | |
| 148 | + | |
| 149 | + text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL); | |
| 150 | + | |
| 151 | + free(str); | |
| 152 | + | |
| 153 | + clip = g_strconcat(terminal->clipboard,"\n",text,NULL); | |
| 154 | + | |
| 155 | + g_free(text); | |
| 156 | + g_free(terminal->clipboard); | |
| 157 | + | |
| 158 | + terminal->clipboard = clip; | |
| 159 | + | |
| 160 | + gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1); | |
| 161 | + | |
| 162 | + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | |
| 163 | + | |
| 164 | + | |
| 165 | + return terminal->clipboard; | |
| 166 | +} | |
| 167 | + | |
| 168 | +const gchar * v3270_copy(GtkWidget *widget) | |
| 131 | 169 | { |
| 132 | 170 | const gchar * text = v3270_get_selected_text(widget); |
| 133 | 171 | GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); |
| 134 | 172 | |
| 135 | - if(!text) | |
| 136 | - return; | |
| 137 | - | |
| 138 | - if(gtk_clipboard_set_with_owner( clipboard, | |
| 139 | - targets, | |
| 140 | - G_N_ELEMENTS(targets), | |
| 141 | - (GtkClipboardGetFunc) clipboard_get, | |
| 142 | - (GtkClipboardClearFunc) clipboard_clear, | |
| 143 | - G_OBJECT(widget) | |
| 144 | - )) | |
| 173 | + if(text) | |
| 145 | 174 | { |
| 146 | - gtk_clipboard_set_can_store(clipboard,targets,1); | |
| 175 | + if(gtk_clipboard_set_with_owner( clipboard, | |
| 176 | + targets, | |
| 177 | + G_N_ELEMENTS(targets), | |
| 178 | + (GtkClipboardGetFunc) clipboard_get, | |
| 179 | + (GtkClipboardClearFunc) clipboard_clear, | |
| 180 | + G_OBJECT(widget) | |
| 181 | + )) | |
| 182 | + { | |
| 183 | + gtk_clipboard_set_can_store(clipboard,targets,1); | |
| 184 | + } | |
| 185 | + | |
| 186 | + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | |
| 147 | 187 | } |
| 148 | 188 | |
| 149 | - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE); | |
| 189 | + return text; | |
| 150 | 190 | |
| 151 | 191 | } |
| 152 | 192 | |
| ... | ... | @@ -281,7 +321,7 @@ static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget |
| 281 | 321 | v3270_paste_string(widget,text,"UTF-8"); |
| 282 | 322 | } |
| 283 | 323 | |
| 284 | -void v3270_paste_clipboard(GtkWidget *widget) | |
| 324 | +void v3270_paste(GtkWidget *widget) | |
| 285 | 325 | { |
| 286 | 326 | gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); |
| 287 | 327 | } | ... | ... |
src/gtk/v3270/v3270.h
| ... | ... | @@ -203,9 +203,11 @@ |
| 203 | 203 | // Clipboard |
| 204 | 204 | const gchar * v3270_get_selected_text(GtkWidget *widget); |
| 205 | 205 | gchar * v3270_get_text(GtkWidget *widget); |
| 206 | - void v3270_copy_clipboard(GtkWidget *widget); | |
| 206 | + const gchar * v3270_copy(GtkWidget *widget); | |
| 207 | + const gchar * v3270_copy_append(GtkWidget *widget); | |
| 208 | + | |
| 209 | + void v3270_paste(GtkWidget *widget); | |
| 207 | 210 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); |
| 208 | - void v3270_paste_clipboard(GtkWidget *widget); | |
| 209 | 211 | |
| 210 | 212 | G_END_DECLS |
| 211 | 213 | ... | ... |
ui/00default.xml
| ... | ... | @@ -49,10 +49,10 @@ |
| 49 | 49 | </menu> |
| 50 | 50 | |
| 51 | 51 | <menu name='EditMenu' label='_Edit' > |
| 52 | - <menuitem action='Copy' key='<ctrl>c' icon='copy' group='selection' label='Copy' /> | |
| 53 | - <menuitem action='CopyAsTable' key='<ctrl><alt>c' group='selection' label='Copy as table' /> | |
| 54 | - <menuitem action='CopyAsImage' group='selection' label='Copy as image' /> | |
| 55 | - <menuitem action='Append' key='<shift><ctrl>c' group='selection' label='Add to copy' /> | |
| 52 | + <menuitem action='copy' mode='begin' key='<ctrl>c' icon='copy' group='selection' label='Copy' /> | |
| 53 | + <menuitem action='copy' mode='table' key='<ctrl><alt>c' group='selection' label='Copy as table' /> | |
| 54 | + <menuitem action='copy' mode='image' group='selection' label='Copy as image' /> | |
| 55 | + <menuitem action='copy' mode='append' key='<shift><ctrl>c' group='selection' label='Add to copy' /> | |
| 56 | 56 | <menuitem action='paste' src='clipboard' key='<ctrl>v' icon='paste' group='paste' label='Paste' /> |
| 57 | 57 | <menuitem action='paste' src='next' key='<shift><ctrl>v' label='Paste next' /> |
| 58 | 58 | <menuitem action='paste' src='file' group='online' label='Paste text file' /> |
| ... | ... | @@ -135,7 +135,7 @@ |
| 135 | 135 | |
| 136 | 136 | <toolbar name='toolbar.default' label='Toolbar' key='<alt>t' > |
| 137 | 137 | <toolitem action='selectall' /> |
| 138 | - <toolitem action='Copy' /> | |
| 138 | + <toolitem action='copy' mode='begin' /> | |
| 139 | 139 | <toolitem action='paste' src='clipboard' /> |
| 140 | 140 | <toolitem action='EraseInput' /> |
| 141 | 141 | ... | ... |