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