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,13 +97,19 @@ static void reload_action(GtkAction *action, GtkWidget *widget) | ||
| 97 | static void copy_action(GtkAction *action, GtkWidget *widget) | 97 | static void copy_action(GtkAction *action, GtkWidget *widget) |
| 98 | { | 98 | { |
| 99 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | 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 | static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) | 109 | static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) |
| 104 | { | 110 | { |
| 105 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | 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 | static void paste_next_action(GtkAction *action, GtkWidget *widget) | 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,7 +151,6 @@ static void connect_standard_action(GtkAction *action, GtkWidget *widget, const | ||
| 145 | { "activate", activate_action }, | 151 | { "activate", activate_action }, |
| 146 | { "reload", reload_action }, | 152 | { "reload", reload_action }, |
| 147 | { "connect", connect_action }, | 153 | { "connect", connect_action }, |
| 148 | - { "copy", copy_action }, | ||
| 149 | { "disconnect", disconnect_action }, | 154 | { "disconnect", disconnect_action }, |
| 150 | { "hostname", hostname_action } | 155 | { "hostname", hostname_action } |
| 151 | }; | 156 | }; |
| @@ -409,6 +414,33 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | @@ -409,6 +414,33 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | ||
| 409 | nm = g_strconcat(name,attr, NULL); | 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 | else if(!g_strcasecmp(name,"save")) | 444 | else if(!g_strcasecmp(name,"save")) |
| 413 | { | 445 | { |
| 414 | static const GCallback cbk[] = { G_CALLBACK(save_all_action), | 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,26 +127,66 @@ const gchar * v3270_get_selected_text(GtkWidget *widget) | ||
| 127 | return terminal->clipboard; | 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 | const gchar * text = v3270_get_selected_text(widget); | 170 | const gchar * text = v3270_get_selected_text(widget); |
| 133 | GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD); | 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,7 +321,7 @@ static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget | ||
| 281 | v3270_paste_string(widget,text,"UTF-8"); | 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 | gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget); | 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,9 +203,11 @@ | ||
| 203 | // Clipboard | 203 | // Clipboard |
| 204 | const gchar * v3270_get_selected_text(GtkWidget *widget); | 204 | const gchar * v3270_get_selected_text(GtkWidget *widget); |
| 205 | gchar * v3270_get_text(GtkWidget *widget); | 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 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); | 210 | void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding); |
| 208 | - void v3270_paste_clipboard(GtkWidget *widget); | ||
| 209 | 211 | ||
| 210 | G_END_DECLS | 212 | G_END_DECLS |
| 211 | 213 |
ui/00default.xml
| @@ -49,10 +49,10 @@ | @@ -49,10 +49,10 @@ | ||
| 49 | </menu> | 49 | </menu> |
| 50 | 50 | ||
| 51 | <menu name='EditMenu' label='_Edit' > | 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 | <menuitem action='paste' src='clipboard' key='<ctrl>v' icon='paste' group='paste' label='Paste' /> | 56 | <menuitem action='paste' src='clipboard' key='<ctrl>v' icon='paste' group='paste' label='Paste' /> |
| 57 | <menuitem action='paste' src='next' key='<shift><ctrl>v' label='Paste next' /> | 57 | <menuitem action='paste' src='next' key='<shift><ctrl>v' label='Paste next' /> |
| 58 | <menuitem action='paste' src='file' group='online' label='Paste text file' /> | 58 | <menuitem action='paste' src='file' group='online' label='Paste text file' /> |
| @@ -135,7 +135,7 @@ | @@ -135,7 +135,7 @@ | ||
| 135 | 135 | ||
| 136 | <toolbar name='toolbar.default' label='Toolbar' key='<alt>t' > | 136 | <toolbar name='toolbar.default' label='Toolbar' key='<alt>t' > |
| 137 | <toolitem action='selectall' /> | 137 | <toolitem action='selectall' /> |
| 138 | - <toolitem action='Copy' /> | 138 | + <toolitem action='copy' mode='begin' /> |
| 139 | <toolitem action='paste' src='clipboard' /> | 139 | <toolitem action='paste' src='clipboard' /> |
| 140 | <toolitem action='EraseInput' /> | 140 | <toolitem action='EraseInput' /> |
| 141 | 141 |