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 |