Commit d7cf40b5d61f623a21e90939344e731b7e9a7c42

Authored by perry.werneck@gmail.com
1 parent 0846c5da

Incluindo icone padrao

src/gtk/Makefile.in
@@ -50,7 +50,7 @@ include uiparser/sources.mak @@ -50,7 +50,7 @@ include uiparser/sources.mak
50 50
51 #---[ Targets ]---------------------------------------------------------------- 51 #---[ Targets ]----------------------------------------------------------------
52 52
53 -SOURCES=main.c mainwindow.c actions.c fonts.c dialog.c print.c colors.c \ 53 +SOURCES=main.c window.c actions.c fonts.c dialog.c print.c colors.c \
54 $(foreach SRC, $(V3270_SRC), v3270/$(SRC)) \ 54 $(foreach SRC, $(V3270_SRC), v3270/$(SRC)) \
55 $(foreach SRC, $(COMMON_SRC), common/$(SRC)) \ 55 $(foreach SRC, $(COMMON_SRC), common/$(SRC)) \
56 $(foreach SRC, $(UI_PARSER_SRC), uiparser/$(SRC)) 56 $(foreach SRC, $(UI_PARSER_SRC), uiparser/$(SRC))
src/gtk/dialog.c
@@ -537,10 +537,11 @@ @@ -537,10 +537,11 @@
537 "USA" ); 537 "USA" );
538 538
539 GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); 539 GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
540 - gchar * filename = g_strdup_printf("%s-logo.png",g_get_application_name());  
541 - gchar * logo = build_data_filename(filename,NULL); 540 + gchar * text = g_strdup_printf("%s-logo.png",g_get_application_name());
  541 + gchar * filename = build_data_filename(text,NULL);
542 542
543 - if(logo && g_file_test(filename,G_FILE_TEST_EXISTS)) 543 + trace("[%s]",filename);
  544 + if(g_file_test(filename,G_FILE_TEST_EXISTS))
544 { 545 {
545 GError * error = NULL; 546 GError * error = NULL;
546 GdkPixbuf * pix = gdk_pixbuf_new_from_file(filename,&error); 547 GdkPixbuf * pix = gdk_pixbuf_new_from_file(filename,&error);
@@ -558,10 +559,13 @@ @@ -558,10 +559,13 @@
558 } 559 }
559 } 560 }
560 561
561 - g_free(logo);  
562 g_free(filename); 562 g_free(filename);
  563 + g_free(text);
  564 +
  565 + text = g_strdup_printf(_("Version %s - Revision %s"),PACKAGE_VERSION,PACKAGE_REVISION);
  566 + gtk_about_dialog_set_version(dialog,text);
  567 + g_free(text);
563 568
564 - gtk_about_dialog_set_version(dialog, PACKAGE_VERSION );  
565 gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); 569 gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." );
566 gtk_about_dialog_set_comments(dialog, _( "3270 terminal emulator for GTK+" ) ); 570 gtk_about_dialog_set_comments(dialog, _( "3270 terminal emulator for GTK+" ) );
567 571
src/gtk/mainwindow.c
@@ -1,389 +0,0 @@ @@ -1,389 +0,0 @@
1 -/*  
2 - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270  
3 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a  
4 - * aplicativos mainframe. Registro no INPI sob o nome G3270.  
5 - *  
6 - * Copyright (C) <2008> <Banco do Brasil S.A.>  
7 - *  
8 - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob  
9 - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela  
10 - * Free Software Foundation.  
11 - *  
12 - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER  
13 - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO  
14 - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para  
15 - * obter mais detalhes.  
16 - *  
17 - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este  
18 - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple  
19 - * Place, Suite 330, Boston, MA, 02111-1307, USA  
20 - *  
21 - * Este programa está nomeado como mainwindow.c e possui - linhas de código.  
22 - *  
23 - * Contatos:  
24 - *  
25 - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)  
26 - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)  
27 - * licinio@bb.com.br (Licínio Luis Branco)  
28 - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)  
29 - *  
30 - */  
31 -  
32 -#include "globals.h"  
33 -#include "uiparser/parser.h"  
34 -  
35 -#ifdef DEBUG  
36 - #include <lib3270/actions.h>  
37 -#endif  
38 -  
39 -/*--[ Globals ]--------------------------------------------------------------------------------------*/  
40 -  
41 - enum action_group  
42 - {  
43 - ACTION_GROUP_DEFAULT,  
44 - ACTION_GROUP_ONLINE,  
45 - ACTION_GROUP_OFFLINE,  
46 - ACTION_GROUP_SELECTION,  
47 - ACTION_GROUP_CLIPBOARD,  
48 - ACTION_GROUP_FILETRANSFER,  
49 - ACTION_GROUP_PASTE,  
50 -  
51 - ACTION_GROUP_MAX  
52 - };  
53 -  
54 - enum popup_group  
55 - {  
56 - POPUP_DEFAULT,  
57 - POPUP_ONLINE,  
58 - POPUP_OFFLINE,  
59 - POPUP_SELECTION,  
60 -  
61 - POPUP_MAX  
62 - };  
63 -  
64 - static const gchar *groupname[ACTION_GROUP_MAX+1] = { "default",  
65 - "online",  
66 - "offline",  
67 - "selection",  
68 - "clipboard",  
69 - "filetransfer",  
70 - "paste",  
71 - NULL  
72 - };  
73 -  
74 - static const gchar *popupname[POPUP_MAX+1] = { "default",  
75 - "online",  
76 - "offline",  
77 - "selection",  
78 - NULL  
79 - };  
80 -  
81 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
82 -  
83 - static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel)  
84 - {  
85 - GtkAction **list = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions");  
86 - gchar *nm = g_ascii_strdown(name,-1);  
87 - set_boolean_to_config("toggle",nm,toggled);  
88 - g_free(nm);  
89 -  
90 - if(id == LIB3270_TOGGLE_FULL_SCREEN)  
91 - {  
92 - if(toggled)  
93 - gtk_window_fullscreen(GTK_WINDOW(toplevel));  
94 - else  
95 - gtk_window_unfullscreen(GTK_WINDOW(toplevel));  
96 - }  
97 -  
98 - if(list[id])  
99 - gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(list[id]),toggled);  
100 -  
101 - }  
102 -  
103 - static gboolean window_state_event(GtkWidget *window, GdkEventWindowState *event, GtkWidget *widget)  
104 - {  
105 - gboolean fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ? TRUE : FALSE;  
106 - GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions");  
107 -  
108 - // Update fullscreen toggles  
109 - if(action[ACTION_FULLSCREEN])  
110 - gtk_action_set_visible(action[ACTION_FULLSCREEN],!fullscreen);  
111 -  
112 - if(action[ACTION_UNFULLSCREEN])  
113 - gtk_action_set_visible(action[ACTION_UNFULLSCREEN],fullscreen);  
114 -  
115 - lib3270_set_toggle(v3270_get_session(widget),LIB3270_TOGGLE_FULL_SCREEN,fullscreen);  
116 -  
117 - return 0;  
118 - }  
119 -  
120 - static gboolean window_destroy(GtkWidget *window, GtkWidget *widget)  
121 - {  
122 - if(widget)  
123 - v3270_disconnect(widget);  
124 - }  
125 -  
126 - static void disconnected(GtkWidget *widget, GtkActionGroup **group)  
127 - {  
128 - gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);  
129 - gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],FALSE);  
130 - gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],TRUE);  
131 - gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),g_get_application_name());  
132 - }  
133 -  
134 - static void connected(GtkWidget *widget, const gchar *host, GtkActionGroup **group)  
135 - {  
136 - set_string_to_config("host","uri","%s",host);  
137 - gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),host);  
138 - gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],TRUE);  
139 - gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],FALSE);  
140 - gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],TRUE);  
141 - }  
142 -  
143 - static void update_config(GtkWidget *widget, const gchar *name, const gchar *value)  
144 - {  
145 - set_string_to_config("terminal",name,"%s",value);  
146 - }  
147 -  
148 - static void update_model(GtkWidget *widget, guint id, const gchar *name)  
149 - {  
150 - trace("Widget %p changed to %s (id=%d)",widget,name,id);  
151 - set_integer_to_config("terminal","model",id);  
152 - }  
153 -  
154 - static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup)  
155 - {  
156 - GtkWidget *menu = NULL;  
157 -  
158 - if(!online)  
159 - menu = popup[POPUP_OFFLINE];  
160 - else if(selected && popup[POPUP_SELECTION])  
161 - menu = popup[POPUP_SELECTION];  
162 - else if(popup[POPUP_ONLINE])  
163 - menu = popup[POPUP_ONLINE];  
164 - else  
165 - menu = popup[POPUP_DEFAULT];  
166 -  
167 - trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No");  
168 -  
169 - if(!menu)  
170 - return FALSE;  
171 -  
172 - trace("Showing popup \"%s\"",gtk_widget_get_name(menu));  
173 -  
174 - gtk_widget_show_all(menu);  
175 - gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget));  
176 - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time);  
177 -  
178 - return TRUE;  
179 - }  
180 -  
181 - static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group)  
182 - {  
183 - GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions");  
184 - gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],on);  
185 -  
186 - if(action[ACTION_RESELECT])  
187 - gtk_action_set_sensitive(action[ACTION_RESELECT],!on);  
188 -  
189 - }  
190 -  
191 - static void has_text(GtkWidget *widget, gboolean on, GtkActionGroup **group)  
192 - {  
193 - gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],on);  
194 - }  
195 -  
196 - static void pastenext(GtkWidget *widget, gboolean on, GtkAction **action)  
197 - {  
198 - gtk_action_set_sensitive(action[ACTION_PASTENEXT],on);  
199 - }  
200 -  
201 - static void setup_input_method(GtkWidget *widget, GtkWidget *obj)  
202 - {  
203 - GtkWidget *menu = gtk_menu_new();  
204 - gtk_im_multicontext_append_menuitems((GtkIMMulticontext *) v3270_get_im_context(obj) ,GTK_MENU_SHELL(menu));  
205 - gtk_widget_show_all(menu);  
206 - gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu);  
207 - }  
208 -  
209 - static void set_screen_size(GtkCheckMenuItem *item, GtkWidget *widget)  
210 - {  
211 - if(gtk_check_menu_item_get_active(item))  
212 - {  
213 - trace("screen model on widget %p changes to %d",widget,(int) g_object_get_data(G_OBJECT(item),"mode_3270"));  
214 - lib3270_set_model(v3270_get_session(widget),(int) g_object_get_data(G_OBJECT(item),"mode_3270"));  
215 - }  
216 - }  
217 -  
218 - static void setup_screen_sizes(GtkWidget *widget, GtkWidget *obj)  
219 - {  
220 - static const gchar * text[] = { "80x24", "80x32", "80x43", "132x27" };  
221 - GtkWidget * menu = gtk_menu_new();  
222 - int model = lib3270_get_model(v3270_get_session(obj))-2;  
223 - GSList * group = NULL;  
224 - GtkWidget * item;  
225 - int f;  
226 -  
227 - gtk_widget_set_sensitive(widget,TRUE);  
228 -  
229 - for(f=0;f<G_N_ELEMENTS(text);f++)  
230 - {  
231 - gchar * name = g_strdup_printf( _( "Model %d (%s)"),f+2,text[f]);  
232 -  
233 - item = gtk_radio_menu_item_new_with_label(group,name);  
234 - g_free(name);  
235 -  
236 - g_object_set_data(G_OBJECT(item),"mode_3270",(gpointer) (f+2));  
237 -  
238 - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));  
239 -  
240 - gtk_widget_show(item);  
241 - gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);  
242 -  
243 - if(f == model)  
244 - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),TRUE);  
245 -  
246 - g_signal_connect(G_OBJECT(item),"toggled",G_CALLBACK(set_screen_size),(gpointer) obj);  
247 -  
248 - }  
249 -  
250 - gtk_widget_show_all(menu);  
251 - gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu);  
252 - }  
253 -  
254 -  
255 - GtkWidget * create_main_window(const gchar *uri)  
256 - {  
257 - static const UI_WIDGET_SETUP widget_setup[] =  
258 - {  
259 - { "inputmethod", setup_input_method },  
260 - { "screensizes", setup_screen_sizes },  
261 - { "fontselect", setup_font_list },  
262 - { NULL, NULL }  
263 - };  
264 -  
265 - static const struct _widget_config  
266 - {  
267 - const gchar *key;  
268 - void (*set)(GtkWidget *widget, const gchar *str);  
269 - } widget_config[] =  
270 - {  
271 - { "colors", v3270_set_colors },  
272 - { "font-family", v3270_set_font_family }  
273 - };  
274 -  
275 - GtkWidget * window;  
276 - GtkWidget * terminal = v3270_new();  
277 - H3270 * host = v3270_get_session(terminal);  
278 - gchar * path = build_data_filename("ui",NULL);  
279 - GtkActionGroup **group;  
280 - GtkAction **action = g_new0(GtkAction *,ACTION_COUNT);  
281 - GtkWidget **popup;  
282 - int f;  
283 -  
284 - gtk_widget_set_tooltip_text(terminal,_( "3270 screen"));  
285 -  
286 - if(uri)  
287 - {  
288 - lib3270_set_host(host,uri);  
289 - }  
290 - else  
291 - {  
292 - gchar *ptr = get_string_from_config("host","uri","");  
293 - if(*ptr)  
294 - lib3270_set_host(host,ptr);  
295 - g_free(ptr);  
296 - }  
297 -  
298 - g_object_set_data_full(G_OBJECT(terminal),"toggle_actions",g_new0(GtkAction *,LIB3270_TOGGLE_COUNT),g_free);  
299 - g_object_set_data_full(G_OBJECT(terminal),"named_actions",(gpointer) action, (GDestroyNotify) g_free);  
300 -  
301 - // Initialize terminal config  
302 - for(f=0;f<G_N_ELEMENTS(widget_config);f++)  
303 - {  
304 - gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL);  
305 - widget_config[f].set(terminal,str);  
306 - if(str)  
307 - g_free(str);  
308 - }  
309 - lib3270_set_model(host,get_integer_from_config("terminal","model",2));  
310 -  
311 - for(f=0;f<LIB3270_TOGGLE_COUNT;f++)  
312 - {  
313 - gchar *nm = g_ascii_strdown(lib3270_get_toggle_name(f),-1);  
314 - lib3270_set_toggle(host,f,get_boolean_from_config("toggle",nm,lib3270_get_toggle(host,f)));  
315 - g_free(nm);  
316 - }  
317 -  
318 - // Create window  
319 - window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
320 - gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
321 - gtk_window_set_role(GTK_WINDOW(window),"toplevel");  
322 -  
323 - if(ui_parse_xml_folder(GTK_WINDOW(window),path,groupname,popupname,terminal,widget_setup))  
324 - {  
325 - g_object_unref(terminal);  
326 - g_object_unref(window);  
327 - return NULL;  
328 - }  
329 - group = g_object_get_data(G_OBJECT(window),"action_groups");  
330 - popup = g_object_get_data(G_OBJECT(window),"popup_menus");  
331 -  
332 - // Setup action groups  
333 - gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE);  
334 - gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],FALSE);  
335 - gtk_action_group_set_sensitive(group[ACTION_GROUP_FILETRANSFER],FALSE);  
336 - gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);  
337 - disconnected(terminal, (gpointer) group);  
338 -  
339 - // Setup actions  
340 - if(action[ACTION_FULLSCREEN])  
341 - gtk_action_set_visible(action[ACTION_FULLSCREEN],!lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));  
342 -  
343 - if(action[ACTION_UNFULLSCREEN])  
344 - gtk_action_set_visible(action[ACTION_UNFULLSCREEN],lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));  
345 -  
346 - if(action[ACTION_PASTENEXT])  
347 - {  
348 - gtk_action_set_sensitive(action[ACTION_PASTENEXT],FALSE);  
349 - g_signal_connect(terminal,"pastenext",G_CALLBACK(pastenext),action);  
350 - }  
351 -  
352 - if(action[ACTION_RESELECT])  
353 - gtk_action_set_sensitive(action[ACTION_RESELECT],FALSE);  
354 -  
355 - // Connect window signals  
356 - g_signal_connect(window,"window_state_event",G_CALLBACK(window_state_event),terminal);  
357 - g_signal_connect(window,"destroy",G_CALLBACK(window_destroy),terminal);  
358 -  
359 - // Connect widget signals  
360 - g_signal_connect(terminal,"toggle_changed",G_CALLBACK(toggle_changed),window);  
361 - g_signal_connect(terminal,"disconnected",G_CALLBACK(disconnected),group);  
362 - g_signal_connect(terminal,"connected",G_CALLBACK(connected),group);  
363 - g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0);  
364 - g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0);  
365 - g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group);  
366 - g_signal_connect(terminal,"popup",G_CALLBACK(popup_menu),popup);  
367 - g_signal_connect(terminal,"has_text",G_CALLBACK(has_text),group);  
368 -  
369 - g_free(path);  
370 -  
371 - if(v3270_get_toggle(terminal,LIB3270_TOGGLE_FULL_SCREEN))  
372 - gtk_window_fullscreen(GTK_WINDOW(window));  
373 -  
374 -#ifdef DEBUG  
375 - lib3270_testpattern(host);  
376 -#endif  
377 -  
378 - trace("%s ends",__FUNCTION__);  
379 - gtk_window_set_focus(GTK_WINDOW(window),terminal);  
380 -  
381 - if(v3270_get_toggle(terminal,LIB3270_TOGGLE_CONNECT_ON_STARTUP))  
382 - lib3270_connect(host,NULL,0);  
383 -  
384 - return window;  
385 - }  
386 -  
387 -  
388 -  
389 -  
src/gtk/v3270/clipboard.c
@@ -1,476 +0,0 @@ @@ -1,476 +0,0 @@
1 -/*  
2 - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270  
3 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a  
4 - * aplicativos mainframe. Registro no INPI sob o nome G3270.  
5 - *  
6 - * Copyright (C) <2008> <Banco do Brasil S.A.>  
7 - *  
8 - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob  
9 - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela  
10 - * Free Software Foundation.  
11 - *  
12 - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER  
13 - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO  
14 - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para  
15 - * obter mais detalhes.  
16 - *  
17 - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este  
18 - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple  
19 - * Place, Suite 330, Boston, MA, 02111-1307, USA  
20 - *  
21 - * Este programa está nomeado como clipboard.c e possui - linhas de código.  
22 - *  
23 - * Contatos:  
24 - *  
25 - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)  
26 - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)  
27 - *  
28 - */  
29 -  
30 - #include <gtk/gtk.h>  
31 - #include <pw3270.h>  
32 - #include <malloc.h>  
33 - #include "v3270.h"  
34 - #include "private.h"  
35 - #include <lib3270/selection.h>  
36 -  
37 -/*--[ Globals ]--------------------------------------------------------------------------------------*/  
38 -  
39 - enum  
40 - {  
41 - CLIPBOARD_TYPE_TEXT,  
42 - };  
43 -  
44 - static const GtkTargetEntry targets[] =  
45 - {  
46 - { "COMPOUND_TEXT", 0, CLIPBOARD_TYPE_TEXT },  
47 - { "UTF8_STRING", 0, CLIPBOARD_TYPE_TEXT },  
48 - };  
49 -  
50 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
51 -  
52 -static void clipboard_clear(GtkClipboard *clipboard, GObject *obj)  
53 -{  
54 - trace("%s widget=%p",__FUNCTION__,obj);  
55 -  
56 -}  
57 -  
58 -static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj)  
59 -{  
60 - v3270 * widget = GTK_V3270(obj);  
61 -  
62 - trace("%s: widget=%p target=\"%s\"",__FUNCTION__,obj,targets[target].target);  
63 -  
64 - switch(target)  
65 - {  
66 - case CLIPBOARD_TYPE_TEXT:  
67 - if(!widget->clipboard)  
68 - lib3270_ring_bell(widget->host);  
69 - else  
70 - gtk_selection_data_set_text(selection,widget->clipboard,-1);  
71 - break;  
72 -  
73 - default:  
74 - g_warning("Unexpected clipboard type %d\n",target);  
75 - }  
76 -}  
77 -  
78 -gchar * v3270_get_text(GtkWidget *widget, int offset, int len)  
79 -{  
80 - v3270 * terminal;  
81 - gchar * text;  
82 - char * str;  
83 -  
84 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
85 -  
86 - terminal = GTK_V3270(widget);  
87 -  
88 - str = lib3270_get_text(terminal->host, offset, len);  
89 -  
90 - if(!str)  
91 - return NULL;  
92 -  
93 - text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL);  
94 -  
95 - free(str);  
96 - return text;  
97 -}  
98 -  
99 -/**  
100 - * Get lib3270 selection as a g_malloc buffer.  
101 - *  
102 - * @param widget Widget containing the desired section.  
103 - *  
104 - * @return NULL if error, otherwise the selected buffer contents (release with g_free).  
105 - *  
106 - */  
107 -static gchar * v3270_get_selected(v3270 *widget)  
108 -{  
109 - gchar *text = lib3270_get_selected(widget->host);  
110 - if(text)  
111 - {  
112 - gchar *str = g_strdup(text);  
113 - free(text);  
114 - return str;  
115 - }  
116 - return NULL;  
117 -}  
118 -  
119 -const gchar * v3270_get_selected_text(GtkWidget *widget)  
120 -{  
121 - v3270 *terminal;  
122 - gchar *text;  
123 -  
124 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
125 -  
126 - terminal = GTK_V3270(widget);  
127 -  
128 - if(terminal->clipboard)  
129 - {  
130 - g_free(terminal->clipboard);  
131 - terminal->clipboard = NULL;  
132 - }  
133 -  
134 - text = v3270_get_selected(terminal);  
135 -  
136 - if(!text)  
137 - {  
138 - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE);  
139 - lib3270_ring_bell(terminal->host);  
140 - return NULL;  
141 - }  
142 -  
143 - if(terminal->table)  
144 - {  
145 - // Convert text to table  
146 - gchar **ln = g_strsplit(text,"\n",-1);  
147 - int width = lib3270_get_width(terminal->host);  
148 - gboolean cols[width];  
149 - int l;  
150 - GString * buffer;  
151 -  
152 - memset(cols,0,sizeof(gboolean)*width);  
153 -  
154 - // Find column delimiters  
155 - for(l=0;ln[l];l++)  
156 - {  
157 - int c;  
158 - gchar * ptr = ln[l];  
159 - GString * buffer;  
160 -  
161 - for(c=0;c<width && *ptr;c++)  
162 - {  
163 - if(!g_ascii_isspace(*ptr))  
164 - cols[c] = TRUE;  
165 -  
166 - ptr++;  
167 - }  
168 -  
169 - }  
170 -  
171 - // Read screen contents  
172 - buffer = g_string_sized_new(strlen(text));  
173 - for(l=0;ln[l];l++)  
174 - {  
175 - int col = 0;  
176 - gchar * src = ln[l];  
177 -  
178 - while(col < width && *src)  
179 - {  
180 - if(col)  
181 - g_string_append_c(buffer,'\t');  
182 -  
183 - // Find column start  
184 - while(!cols[col] && col < width && *src)  
185 - {  
186 - col++;  
187 - src++;  
188 - }  
189 -  
190 - if(col < width && *src)  
191 - {  
192 - gchar tmp[width+1];  
193 - gchar * dst = tmp;  
194 -  
195 - // Copy column content  
196 - while(cols[col] && col < width && *src)  
197 - {  
198 - *dst = *src;  
199 - col++;  
200 - dst++;  
201 - src++;  
202 - }  
203 - *dst = 0;  
204 - g_string_append(buffer,g_strstrip(tmp));  
205 - }  
206 -  
207 - }  
208 - g_string_append_c(buffer,'\n');  
209 -  
210 - }  
211 -  
212 - g_strfreev(ln);  
213 - g_free(text);  
214 -  
215 - text = g_string_free(buffer,FALSE);  
216 - }  
217 -  
218 - terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL);  
219 -  
220 - g_free(text);  
221 -  
222 -  
223 - return terminal->clipboard;  
224 -}  
225 -  
226 -const gchar * v3270_get_copy(GtkWidget *widget)  
227 -{  
228 - v3270 *terminal;  
229 -  
230 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
231 -  
232 - terminal = GTK_V3270(widget);  
233 -  
234 - return terminal->clipboard;  
235 -}  
236 -  
237 -const gchar * v3270_copy_append(GtkWidget *widget)  
238 -{  
239 - v3270 * terminal;  
240 - char * str;  
241 - gchar * text;  
242 - gchar * clip;  
243 -  
244 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
245 -  
246 - terminal = GTK_V3270(widget);  
247 -  
248 - if(!terminal->clipboard)  
249 - return v3270_get_selected_text(widget);  
250 -  
251 - str = lib3270_get_selected(terminal->host);  
252 -  
253 - if(!str)  
254 - return terminal->clipboard;  
255 -  
256 - text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL);  
257 -  
258 - free(str);  
259 -  
260 - clip = g_strconcat(terminal->clipboard,"\n",text,NULL);  
261 -  
262 - g_free(text);  
263 - g_free(terminal->clipboard);  
264 -  
265 - terminal->clipboard = clip;  
266 -  
267 - gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1);  
268 -  
269 - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE);  
270 -  
271 - return terminal->clipboard;  
272 -}  
273 -  
274 -const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode)  
275 -{  
276 - const gchar * text;  
277 - GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD);  
278 -  
279 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
280 -  
281 - GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0);  
282 -  
283 - text = v3270_get_selected_text(widget);  
284 -  
285 - if(text)  
286 - {  
287 - if(gtk_clipboard_set_with_owner( clipboard,  
288 - targets,  
289 - G_N_ELEMENTS(targets),  
290 - (GtkClipboardGetFunc) clipboard_get,  
291 - (GtkClipboardClearFunc) clipboard_clear,  
292 - G_OBJECT(widget)  
293 - ))  
294 - {  
295 - gtk_clipboard_set_can_store(clipboard,targets,1);  
296 - }  
297 -  
298 - g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE);  
299 - }  
300 -  
301 - return text;  
302 -  
303 -}  
304 -  
305 -void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding)  
306 -{  
307 - gchar * buffer = NULL;  
308 - H3270 * session = v3270_get_session(widget);  
309 - const gchar * charset = lib3270_get_charset(session);  
310 - gboolean next;  
311 -  
312 - if(!text)  
313 - return;  
314 - else if(g_strcasecmp(encoding,charset))  
315 - buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL);  
316 - else  
317 - buffer = g_strdup(text);  
318 -  
319 - if(!buffer)  
320 - {  
321 - /* Conversion failed, update special chars and try again */  
322 - int f;  
323 -  
324 - static const struct _xlat  
325 - {  
326 - const gchar *from;  
327 - const gchar *to;  
328 - } xlat[] =  
329 - {  
330 - { "–", "-" },  
331 - { "→", "->" },  
332 - { "←", "<-" },  
333 - { "©", "(c)" },  
334 - { "↔", "<->" },  
335 - { "™", "(TM)" },  
336 - { "®", "(R)" },  
337 - { "“", "\"" },  
338 - { "”", "\"" },  
339 - { "…", "..." },  
340 - { "•", "*" },  
341 - { "․", "." },  
342 - { "·", "*" },  
343 -  
344 - };  
345 -  
346 - gchar *string = g_strdup(text);  
347 -  
348 - // FIXME (perry#1#): Is there any better way for a "sed" here?  
349 - for(f=0;f<G_N_ELEMENTS(xlat);f++)  
350 - {  
351 - gchar *ptr = g_strstr_len(string,-1,xlat[f].from);  
352 -  
353 - if(ptr)  
354 - {  
355 - gchar *old = string;  
356 - gchar **tmp = g_strsplit(old,xlat[f].from,-1);  
357 - string = g_strjoinv(xlat[f].to,tmp);  
358 - g_strfreev(tmp);  
359 - g_free(old);  
360 - }  
361 - }  
362 -  
363 - buffer = g_convert(string, -1, charset, encoding, NULL, NULL, NULL);  
364 -  
365 - if(!buffer)  
366 - {  
367 - // Still failing, convert line by line  
368 - gchar **ln = g_strsplit(string,"\n",-1);  
369 -  
370 - for(f=0;ln[f];f++)  
371 - {  
372 - GError *error = NULL;  
373 - gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, &error);  
374 -  
375 - if(!str)  
376 - {  
377 - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)),  
378 - GTK_DIALOG_DESTROY_WITH_PARENT,  
379 - GTK_MESSAGE_ERROR,  
380 - GTK_BUTTONS_OK,  
381 - _( "Can't convert line %d from %s to %s" ),f+1, encoding, charset);  
382 -  
383 - gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) );  
384 - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]);  
385 -  
386 - gtk_dialog_run(GTK_DIALOG (dialog));  
387 - gtk_widget_destroy(dialog);  
388 -  
389 - break;  
390 - }  
391 - else  
392 - {  
393 - g_free(str);  
394 - }  
395 -  
396 - }  
397 - g_strfreev(ln);  
398 -  
399 - }  
400 -  
401 - g_free(string);  
402 - }  
403 -  
404 - if(buffer)  
405 - {  
406 - /* Remove TABS */  
407 - gchar *ptr;  
408 -  
409 - for(ptr = buffer;*ptr;ptr++)  
410 - {  
411 - if(*ptr == '\t')  
412 - *ptr = ' ';  
413 - }  
414 - }  
415 - else  
416 - {  
417 - g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, FALSE);  
418 - return;  
419 - }  
420 -  
421 - next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE;  
422 -  
423 - trace("Pastenext is %s",next ? "On" : "Off");  
424 -  
425 - g_free(buffer);  
426 -  
427 - g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, next);  
428 -  
429 -}  
430 -  
431 -static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget)  
432 -{  
433 - v3270_paste_string(widget,text,"UTF-8");  
434 -}  
435 -  
436 -void v3270_paste(GtkWidget *widget)  
437 -{  
438 - gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget);  
439 -}  
440 -  
441 -void v3270_unselect(GtkWidget *widget)  
442 -{  
443 - lib3270_unselect(v3270_get_session(widget));  
444 -}  
445 -  
446 -gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end)  
447 -{  
448 - g_return_val_if_fail(GTK_IS_V3270(widget),FALSE);  
449 - return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE;  
450 -}  
451 -  
452 -gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all)  
453 -{  
454 - char * str;  
455 - gchar * utftext;  
456 -  
457 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
458 -  
459 - str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all);  
460 - if(!str)  
461 - return NULL;  
462 -  
463 - utftext = g_convert(str, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);  
464 -  
465 - free(str);  
466 -  
467 - return utftext;  
468 -}  
469 -  
470 - void v3270_select_region(GtkWidget *widget, gint start, gint end)  
471 - {  
472 - g_return_if_fail(GTK_IS_V3270(widget));  
473 - lib3270_select_region(GTK_V3270(widget)->host,start,end);  
474 - }  
475 -  
476 -  
src/gtk/v3270/mouse.c
@@ -177,41 +177,41 @@ static void update_mouse_pointer(GtkWidget *widget, int baddr) @@ -177,41 +177,41 @@ static void update_mouse_pointer(GtkWidget *widget, int baddr)
177 { 177 {
178 int id = terminal->pointer; 178 int id = terminal->pointer;
179 179
180 - switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x1f) 180 + switch(lib3270_get_selection_flags(terminal->host,baddr) & 0x8f)
181 { 181 {
182 - case 0x10: 182 + case 0x80:
183 id = V3270_CURSOR_MOVE_SELECTION; 183 id = V3270_CURSOR_MOVE_SELECTION;
184 break; 184 break;
185 185
186 - case 0x12: 186 + case 0x82:
187 id = V3270_CURSOR_SELECTION_TOP; 187 id = V3270_CURSOR_SELECTION_TOP;
188 break; 188 break;
189 189
190 - case 0x16: 190 + case 0x86:
191 id = V3270_CURSOR_SELECTION_TOP_RIGHT; 191 id = V3270_CURSOR_SELECTION_TOP_RIGHT;
192 break; 192 break;
193 193
194 - case 0x14: 194 + case 0x84:
195 id = V3270_CURSOR_SELECTION_RIGHT; 195 id = V3270_CURSOR_SELECTION_RIGHT;
196 break; 196 break;
197 197
198 - case 0x11: 198 + case 0x81:
199 id = V3270_CURSOR_SELECTION_LEFT; 199 id = V3270_CURSOR_SELECTION_LEFT;
200 break; 200 break;
201 201
202 - case 0x19: 202 + case 0x89:
203 id = V3270_CURSOR_SELECTION_BOTTOM_LEFT; 203 id = V3270_CURSOR_SELECTION_BOTTOM_LEFT;
204 break; 204 break;
205 205
206 - case 0x18: 206 + case 0x88:
207 id = V3270_CURSOR_SELECTION_BOTTOM; 207 id = V3270_CURSOR_SELECTION_BOTTOM;
208 break; 208 break;
209 209
210 - case 0x1c: 210 + case 0x8c:
211 id = V3270_CURSOR_SELECTION_BOTTOM_RIGHT; 211 id = V3270_CURSOR_SELECTION_BOTTOM_RIGHT;
212 break; 212 break;
213 213
214 - case 0x13: 214 + case 0x83:
215 id = V3270_CURSOR_SELECTION_TOP_LEFT; 215 id = V3270_CURSOR_SELECTION_TOP_LEFT;
216 break; 216 break;
217 217
src/gtk/v3270/selection.c 0 → 100644
@@ -0,0 +1,476 @@ @@ -0,0 +1,476 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como clipboard.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <gtk/gtk.h>
  31 + #include <pw3270.h>
  32 + #include <malloc.h>
  33 + #include "v3270.h"
  34 + #include "private.h"
  35 + #include <lib3270/selection.h>
  36 +
  37 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  38 +
  39 + enum
  40 + {
  41 + CLIPBOARD_TYPE_TEXT,
  42 + };
  43 +
  44 + static const GtkTargetEntry targets[] =
  45 + {
  46 + { "COMPOUND_TEXT", 0, CLIPBOARD_TYPE_TEXT },
  47 + { "UTF8_STRING", 0, CLIPBOARD_TYPE_TEXT },
  48 + };
  49 +
  50 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  51 +
  52 +static void clipboard_clear(GtkClipboard *clipboard, GObject *obj)
  53 +{
  54 + trace("%s widget=%p",__FUNCTION__,obj);
  55 +
  56 +}
  57 +
  58 +static void clipboard_get(GtkClipboard *clipboard, GtkSelectionData *selection, guint target, GObject *obj)
  59 +{
  60 + v3270 * widget = GTK_V3270(obj);
  61 +
  62 + trace("%s: widget=%p target=\"%s\"",__FUNCTION__,obj,targets[target].target);
  63 +
  64 + switch(target)
  65 + {
  66 + case CLIPBOARD_TYPE_TEXT:
  67 + if(!widget->clipboard)
  68 + lib3270_ring_bell(widget->host);
  69 + else
  70 + gtk_selection_data_set_text(selection,widget->clipboard,-1);
  71 + break;
  72 +
  73 + default:
  74 + g_warning("Unexpected clipboard type %d\n",target);
  75 + }
  76 +}
  77 +
  78 +gchar * v3270_get_text(GtkWidget *widget, int offset, int len)
  79 +{
  80 + v3270 * terminal;
  81 + gchar * text;
  82 + char * str;
  83 +
  84 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  85 +
  86 + terminal = GTK_V3270(widget);
  87 +
  88 + str = lib3270_get_text(terminal->host, offset, len);
  89 +
  90 + if(!str)
  91 + return NULL;
  92 +
  93 + text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL);
  94 +
  95 + free(str);
  96 + return text;
  97 +}
  98 +
  99 +/**
  100 + * Get lib3270 selection as a g_malloc buffer.
  101 + *
  102 + * @param widget Widget containing the desired section.
  103 + *
  104 + * @return NULL if error, otherwise the selected buffer contents (release with g_free).
  105 + *
  106 + */
  107 +static gchar * v3270_get_selected(v3270 *widget)
  108 +{
  109 + gchar *text = lib3270_get_selected(widget->host);
  110 + if(text)
  111 + {
  112 + gchar *str = g_strdup(text);
  113 + free(text);
  114 + return str;
  115 + }
  116 + return NULL;
  117 +}
  118 +
  119 +const gchar * v3270_get_selected_text(GtkWidget *widget)
  120 +{
  121 + v3270 *terminal;
  122 + gchar *text;
  123 +
  124 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  125 +
  126 + terminal = GTK_V3270(widget);
  127 +
  128 + if(terminal->clipboard)
  129 + {
  130 + g_free(terminal->clipboard);
  131 + terminal->clipboard = NULL;
  132 + }
  133 +
  134 + text = v3270_get_selected(terminal);
  135 +
  136 + if(!text)
  137 + {
  138 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, FALSE);
  139 + lib3270_ring_bell(terminal->host);
  140 + return NULL;
  141 + }
  142 +
  143 + if(terminal->table)
  144 + {
  145 + // Convert text to table
  146 + gchar **ln = g_strsplit(text,"\n",-1);
  147 + int width = lib3270_get_width(terminal->host);
  148 + gboolean cols[width];
  149 + int l;
  150 + GString * buffer;
  151 +
  152 + memset(cols,0,sizeof(gboolean)*width);
  153 +
  154 + // Find column delimiters
  155 + for(l=0;ln[l];l++)
  156 + {
  157 + int c;
  158 + gchar * ptr = ln[l];
  159 + GString * buffer;
  160 +
  161 + for(c=0;c<width && *ptr;c++)
  162 + {
  163 + if(!g_ascii_isspace(*ptr))
  164 + cols[c] = TRUE;
  165 +
  166 + ptr++;
  167 + }
  168 +
  169 + }
  170 +
  171 + // Read screen contents
  172 + buffer = g_string_sized_new(strlen(text));
  173 + for(l=0;ln[l];l++)
  174 + {
  175 + int col = 0;
  176 + gchar * src = ln[l];
  177 +
  178 + while(col < width && *src)
  179 + {
  180 + if(col)
  181 + g_string_append_c(buffer,'\t');
  182 +
  183 + // Find column start
  184 + while(!cols[col] && col < width && *src)
  185 + {
  186 + col++;
  187 + src++;
  188 + }
  189 +
  190 + if(col < width && *src)
  191 + {
  192 + gchar tmp[width+1];
  193 + gchar * dst = tmp;
  194 +
  195 + // Copy column content
  196 + while(cols[col] && col < width && *src)
  197 + {
  198 + *dst = *src;
  199 + col++;
  200 + dst++;
  201 + src++;
  202 + }
  203 + *dst = 0;
  204 + g_string_append(buffer,g_strstrip(tmp));
  205 + }
  206 +
  207 + }
  208 + g_string_append_c(buffer,'\n');
  209 +
  210 + }
  211 +
  212 + g_strfreev(ln);
  213 + g_free(text);
  214 +
  215 + text = g_string_free(buffer,FALSE);
  216 + }
  217 +
  218 + terminal->clipboard = g_convert(text, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL);
  219 +
  220 + g_free(text);
  221 +
  222 +
  223 + return terminal->clipboard;
  224 +}
  225 +
  226 +const gchar * v3270_get_copy(GtkWidget *widget)
  227 +{
  228 + v3270 *terminal;
  229 +
  230 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  231 +
  232 + terminal = GTK_V3270(widget);
  233 +
  234 + return terminal->clipboard;
  235 +}
  236 +
  237 +const gchar * v3270_copy_append(GtkWidget *widget)
  238 +{
  239 + v3270 * terminal;
  240 + char * str;
  241 + gchar * text;
  242 + gchar * clip;
  243 +
  244 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  245 +
  246 + terminal = GTK_V3270(widget);
  247 +
  248 + if(!terminal->clipboard)
  249 + return v3270_get_selected_text(widget);
  250 +
  251 + str = lib3270_get_selected(terminal->host);
  252 +
  253 + if(!str)
  254 + return terminal->clipboard;
  255 +
  256 + text = g_convert(str, -1, "UTF-8", lib3270_get_charset(terminal->host), NULL, NULL, NULL);
  257 +
  258 + free(str);
  259 +
  260 + clip = g_strconcat(terminal->clipboard,"\n",text,NULL);
  261 +
  262 + g_free(text);
  263 + g_free(terminal->clipboard);
  264 +
  265 + terminal->clipboard = clip;
  266 +
  267 + gtk_clipboard_set_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),terminal->clipboard,-1);
  268 +
  269 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE);
  270 +
  271 + return terminal->clipboard;
  272 +}
  273 +
  274 +const gchar * v3270_copy(GtkWidget *widget, V3270_SELECT_FORMAT mode)
  275 +{
  276 + const gchar * text;
  277 + GtkClipboard * clipboard = gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD);
  278 +
  279 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  280 +
  281 + GTK_V3270(widget)->table = (mode == V3270_SELECT_TABLE ? 1 : 0);
  282 +
  283 + text = v3270_get_selected_text(widget);
  284 +
  285 + if(text)
  286 + {
  287 + if(gtk_clipboard_set_with_owner( clipboard,
  288 + targets,
  289 + G_N_ELEMENTS(targets),
  290 + (GtkClipboardGetFunc) clipboard_get,
  291 + (GtkClipboardClearFunc) clipboard_clear,
  292 + G_OBJECT(widget)
  293 + ))
  294 + {
  295 + gtk_clipboard_set_can_store(clipboard,targets,1);
  296 + }
  297 +
  298 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_CLIPBOARD], 0, TRUE);
  299 + }
  300 +
  301 + return text;
  302 +
  303 +}
  304 +
  305 +void v3270_paste_string(GtkWidget *widget, const gchar *text, const gchar *encoding)
  306 +{
  307 + gchar * buffer = NULL;
  308 + H3270 * session = v3270_get_session(widget);
  309 + const gchar * charset = lib3270_get_charset(session);
  310 + gboolean next;
  311 +
  312 + if(!text)
  313 + return;
  314 + else if(g_strcasecmp(encoding,charset))
  315 + buffer = g_convert(text, -1, charset, encoding, NULL, NULL, NULL);
  316 + else
  317 + buffer = g_strdup(text);
  318 +
  319 + if(!buffer)
  320 + {
  321 + /* Conversion failed, update special chars and try again */
  322 + int f;
  323 +
  324 + static const struct _xlat
  325 + {
  326 + const gchar *from;
  327 + const gchar *to;
  328 + } xlat[] =
  329 + {
  330 + { "–", "-" },
  331 + { "→", "->" },
  332 + { "←", "<-" },
  333 + { "©", "(c)" },
  334 + { "↔", "<->" },
  335 + { "™", "(TM)" },
  336 + { "®", "(R)" },
  337 + { "“", "\"" },
  338 + { "”", "\"" },
  339 + { "…", "..." },
  340 + { "•", "*" },
  341 + { "․", "." },
  342 + { "·", "*" },
  343 +
  344 + };
  345 +
  346 + gchar *string = g_strdup(text);
  347 +
  348 + // FIXME (perry#1#): Is there any better way for a "sed" here?
  349 + for(f=0;f<G_N_ELEMENTS(xlat);f++)
  350 + {
  351 + gchar *ptr = g_strstr_len(string,-1,xlat[f].from);
  352 +
  353 + if(ptr)
  354 + {
  355 + gchar *old = string;
  356 + gchar **tmp = g_strsplit(old,xlat[f].from,-1);
  357 + string = g_strjoinv(xlat[f].to,tmp);
  358 + g_strfreev(tmp);
  359 + g_free(old);
  360 + }
  361 + }
  362 +
  363 + buffer = g_convert(string, -1, charset, encoding, NULL, NULL, NULL);
  364 +
  365 + if(!buffer)
  366 + {
  367 + // Still failing, convert line by line
  368 + gchar **ln = g_strsplit(string,"\n",-1);
  369 +
  370 + for(f=0;ln[f];f++)
  371 + {
  372 + GError *error = NULL;
  373 + gchar *str = g_convert(ln[f], -1, charset, encoding, NULL, NULL, &error);
  374 +
  375 + if(!str)
  376 + {
  377 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel(widget)),
  378 + GTK_DIALOG_DESTROY_WITH_PARENT,
  379 + GTK_MESSAGE_ERROR,
  380 + GTK_BUTTONS_OK,
  381 + _( "Can't convert line %d from %s to %s" ),f+1, encoding, charset);
  382 +
  383 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Charset error" ) );
  384 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s\n%s",error->message, ln[f]);
  385 +
  386 + gtk_dialog_run(GTK_DIALOG (dialog));
  387 + gtk_widget_destroy(dialog);
  388 +
  389 + break;
  390 + }
  391 + else
  392 + {
  393 + g_free(str);
  394 + }
  395 +
  396 + }
  397 + g_strfreev(ln);
  398 +
  399 + }
  400 +
  401 + g_free(string);
  402 + }
  403 +
  404 + if(buffer)
  405 + {
  406 + /* Remove TABS */
  407 + gchar *ptr;
  408 +
  409 + for(ptr = buffer;*ptr;ptr++)
  410 + {
  411 + if(*ptr == '\t')
  412 + *ptr = ' ';
  413 + }
  414 + }
  415 + else
  416 + {
  417 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, FALSE);
  418 + return;
  419 + }
  420 +
  421 + next = lib3270_paste(session,(unsigned char *) buffer) ? TRUE : FALSE;
  422 +
  423 + trace("Pastenext is %s",next ? "On" : "Off");
  424 +
  425 + g_free(buffer);
  426 +
  427 + g_signal_emit(widget,v3270_widget_signal[SIGNAL_PASTENEXT], 0, next);
  428 +
  429 +}
  430 +
  431 +static void text_received(GtkClipboard *clipboard, const gchar *text, GtkWidget *widget)
  432 +{
  433 + v3270_paste_string(widget,text,"UTF-8");
  434 +}
  435 +
  436 +void v3270_paste(GtkWidget *widget)
  437 +{
  438 + gtk_clipboard_request_text(gtk_widget_get_clipboard(widget,GDK_SELECTION_CLIPBOARD),(GtkClipboardTextReceivedFunc) text_received,(gpointer) widget);
  439 +}
  440 +
  441 +void v3270_unselect(GtkWidget *widget)
  442 +{
  443 + lib3270_unselect(v3270_get_session(widget));
  444 +}
  445 +
  446 +gboolean v3270_get_selection_bounds(GtkWidget *widget, gint *start, gint *end)
  447 +{
  448 + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE);
  449 + return lib3270_get_selection_bounds(GTK_V3270(widget)->host,start,end) == 0 ? FALSE : TRUE;
  450 +}
  451 +
  452 +gchar * v3270_get_region(GtkWidget *widget, gint start_pos, gint end_pos, gboolean all)
  453 +{
  454 + char * str;
  455 + gchar * utftext;
  456 +
  457 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  458 +
  459 + str = lib3270_get_region(GTK_V3270(widget)->host,start_pos,end_pos,all);
  460 + if(!str)
  461 + return NULL;
  462 +
  463 + utftext = g_convert(str, -1, "UTF-8", lib3270_get_charset(GTK_V3270(widget)->host), NULL, NULL, NULL);
  464 +
  465 + free(str);
  466 +
  467 + return utftext;
  468 +}
  469 +
  470 + void v3270_select_region(GtkWidget *widget, gint start, gint end)
  471 + {
  472 + g_return_if_fail(GTK_IS_V3270(widget));
  473 + lib3270_select_region(GTK_V3270(widget)->host,start,end);
  474 + }
  475 +
  476 +
src/gtk/v3270/sources.mak
1 -V3270_SRC=marshal.c widget.c oia.c iocallback.c keyboard.c draw.c mouse.c clipboard.c accessible.c 1 +V3270_SRC=marshal.c widget.c oia.c iocallback.c keyboard.c draw.c mouse.c selection.c accessible.c
2 2
src/gtk/window.c 0 → 100644
@@ -0,0 +1,408 @@ @@ -0,0 +1,408 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como mainwindow.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + * licinio@bb.com.br (Licínio Luis Branco)
  28 + * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
  29 + *
  30 + */
  31 +
  32 +#include "globals.h"
  33 +#include "uiparser/parser.h"
  34 +
  35 +#ifdef DEBUG
  36 + #include <lib3270/actions.h>
  37 +#endif
  38 +
  39 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  40 +
  41 + enum action_group
  42 + {
  43 + ACTION_GROUP_DEFAULT,
  44 + ACTION_GROUP_ONLINE,
  45 + ACTION_GROUP_OFFLINE,
  46 + ACTION_GROUP_SELECTION,
  47 + ACTION_GROUP_CLIPBOARD,
  48 + ACTION_GROUP_FILETRANSFER,
  49 + ACTION_GROUP_PASTE,
  50 +
  51 + ACTION_GROUP_MAX
  52 + };
  53 +
  54 + enum popup_group
  55 + {
  56 + POPUP_DEFAULT,
  57 + POPUP_ONLINE,
  58 + POPUP_OFFLINE,
  59 + POPUP_SELECTION,
  60 +
  61 + POPUP_MAX
  62 + };
  63 +
  64 + static const gchar *groupname[ACTION_GROUP_MAX+1] = { "default",
  65 + "online",
  66 + "offline",
  67 + "selection",
  68 + "clipboard",
  69 + "filetransfer",
  70 + "paste",
  71 + NULL
  72 + };
  73 +
  74 + static const gchar *popupname[POPUP_MAX+1] = { "default",
  75 + "online",
  76 + "offline",
  77 + "selection",
  78 + NULL
  79 + };
  80 +
  81 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  82 +
  83 + static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel)
  84 + {
  85 + GtkAction **list = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions");
  86 + gchar *nm = g_ascii_strdown(name,-1);
  87 + set_boolean_to_config("toggle",nm,toggled);
  88 + g_free(nm);
  89 +
  90 + if(id == LIB3270_TOGGLE_FULL_SCREEN)
  91 + {
  92 + if(toggled)
  93 + gtk_window_fullscreen(GTK_WINDOW(toplevel));
  94 + else
  95 + gtk_window_unfullscreen(GTK_WINDOW(toplevel));
  96 + }
  97 +
  98 + if(list[id])
  99 + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(list[id]),toggled);
  100 +
  101 + }
  102 +
  103 + static gboolean window_state_event(GtkWidget *window, GdkEventWindowState *event, GtkWidget *widget)
  104 + {
  105 + gboolean fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ? TRUE : FALSE;
  106 + GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions");
  107 +
  108 + // Update fullscreen toggles
  109 + if(action[ACTION_FULLSCREEN])
  110 + gtk_action_set_visible(action[ACTION_FULLSCREEN],!fullscreen);
  111 +
  112 + if(action[ACTION_UNFULLSCREEN])
  113 + gtk_action_set_visible(action[ACTION_UNFULLSCREEN],fullscreen);
  114 +
  115 + lib3270_set_toggle(v3270_get_session(widget),LIB3270_TOGGLE_FULL_SCREEN,fullscreen);
  116 +
  117 + return 0;
  118 + }
  119 +
  120 + static gboolean window_destroy(GtkWidget *window, GtkWidget *widget)
  121 + {
  122 + if(widget)
  123 + v3270_disconnect(widget);
  124 + }
  125 +
  126 + static void disconnected(GtkWidget *widget, GtkActionGroup **group)
  127 + {
  128 + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);
  129 + gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],FALSE);
  130 + gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],TRUE);
  131 + gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),g_get_application_name());
  132 + }
  133 +
  134 + static void connected(GtkWidget *widget, const gchar *host, GtkActionGroup **group)
  135 + {
  136 + set_string_to_config("host","uri","%s",host);
  137 + gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),host);
  138 + gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],TRUE);
  139 + gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],FALSE);
  140 + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],TRUE);
  141 + }
  142 +
  143 + static void update_config(GtkWidget *widget, const gchar *name, const gchar *value)
  144 + {
  145 + set_string_to_config("terminal",name,"%s",value);
  146 + }
  147 +
  148 + static void update_model(GtkWidget *widget, guint id, const gchar *name)
  149 + {
  150 + trace("Widget %p changed to %s (id=%d)",widget,name,id);
  151 + set_integer_to_config("terminal","model",id);
  152 + }
  153 +
  154 + static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup)
  155 + {
  156 + GtkWidget *menu = NULL;
  157 +
  158 + if(!online)
  159 + menu = popup[POPUP_OFFLINE];
  160 + else if(selected && popup[POPUP_SELECTION])
  161 + menu = popup[POPUP_SELECTION];
  162 + else if(popup[POPUP_ONLINE])
  163 + menu = popup[POPUP_ONLINE];
  164 + else
  165 + menu = popup[POPUP_DEFAULT];
  166 +
  167 + trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No");
  168 +
  169 + if(!menu)
  170 + return FALSE;
  171 +
  172 + trace("Showing popup \"%s\"",gtk_widget_get_name(menu));
  173 +
  174 + gtk_widget_show_all(menu);
  175 + gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget));
  176 + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time);
  177 +
  178 + return TRUE;
  179 + }
  180 +
  181 + static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group)
  182 + {
  183 + GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions");
  184 + gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],on);
  185 +
  186 + if(action[ACTION_RESELECT])
  187 + gtk_action_set_sensitive(action[ACTION_RESELECT],!on);
  188 +
  189 + }
  190 +
  191 + static void has_text(GtkWidget *widget, gboolean on, GtkActionGroup **group)
  192 + {
  193 + gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],on);
  194 + }
  195 +
  196 + static void pastenext(GtkWidget *widget, gboolean on, GtkAction **action)
  197 + {
  198 + gtk_action_set_sensitive(action[ACTION_PASTENEXT],on);
  199 + }
  200 +
  201 + static void setup_input_method(GtkWidget *widget, GtkWidget *obj)
  202 + {
  203 + GtkWidget *menu = gtk_menu_new();
  204 + gtk_im_multicontext_append_menuitems((GtkIMMulticontext *) v3270_get_im_context(obj) ,GTK_MENU_SHELL(menu));
  205 + gtk_widget_show_all(menu);
  206 + gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu);
  207 + }
  208 +
  209 + static void set_screen_size(GtkCheckMenuItem *item, GtkWidget *widget)
  210 + {
  211 + if(gtk_check_menu_item_get_active(item))
  212 + {
  213 + trace("screen model on widget %p changes to %d",widget,(int) g_object_get_data(G_OBJECT(item),"mode_3270"));
  214 + lib3270_set_model(v3270_get_session(widget),(int) g_object_get_data(G_OBJECT(item),"mode_3270"));
  215 + }
  216 + }
  217 +
  218 + static void setup_screen_sizes(GtkWidget *widget, GtkWidget *obj)
  219 + {
  220 + static const gchar * text[] = { "80x24", "80x32", "80x43", "132x27" };
  221 + GtkWidget * menu = gtk_menu_new();
  222 + int model = lib3270_get_model(v3270_get_session(obj))-2;
  223 + GSList * group = NULL;
  224 + GtkWidget * item;
  225 + int f;
  226 +
  227 + gtk_widget_set_sensitive(widget,TRUE);
  228 +
  229 + for(f=0;f<G_N_ELEMENTS(text);f++)
  230 + {
  231 + gchar * name = g_strdup_printf( _( "Model %d (%s)"),f+2,text[f]);
  232 +
  233 + item = gtk_radio_menu_item_new_with_label(group,name);
  234 + g_free(name);
  235 +
  236 + g_object_set_data(G_OBJECT(item),"mode_3270",(gpointer) (f+2));
  237 +
  238 + group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
  239 +
  240 + gtk_widget_show(item);
  241 + gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
  242 +
  243 + if(f == model)
  244 + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),TRUE);
  245 +
  246 + g_signal_connect(G_OBJECT(item),"toggled",G_CALLBACK(set_screen_size),(gpointer) obj);
  247 +
  248 + }
  249 +
  250 + gtk_widget_show_all(menu);
  251 + gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu);
  252 + }
  253 +
  254 + static void set_icon_list(GtkWindow *window)
  255 + {
  256 + gchar * name = g_strdup_printf("%s.png",g_get_application_name());
  257 + gchar * filename = build_data_filename(name,NULL);
  258 + GError * error = NULL;
  259 +
  260 + if(!gtk_window_set_icon_from_file(window,filename,&error))
  261 + {
  262 + g_warning("Error %s loading icon from %s",error->message,filename);
  263 + g_error_free(error);
  264 + }
  265 +
  266 + g_free(filename);
  267 + g_free(name);
  268 +
  269 + }
  270 +
  271 + GtkWidget * create_main_window(const gchar *uri)
  272 + {
  273 + static const UI_WIDGET_SETUP widget_setup[] =
  274 + {
  275 + { "inputmethod", setup_input_method },
  276 + { "screensizes", setup_screen_sizes },
  277 + { "fontselect", setup_font_list },
  278 + { NULL, NULL }
  279 + };
  280 +
  281 + static const struct _widget_config
  282 + {
  283 + const gchar *key;
  284 + void (*set)(GtkWidget *widget, const gchar *str);
  285 + } widget_config[] =
  286 + {
  287 + { "colors", v3270_set_colors },
  288 + { "font-family", v3270_set_font_family }
  289 + };
  290 +
  291 + GtkWidget * window;
  292 + GtkWidget * terminal = v3270_new();
  293 + H3270 * host = v3270_get_session(terminal);
  294 + gchar * path = build_data_filename("ui",NULL);
  295 + GtkActionGroup **group;
  296 + GtkAction **action = g_new0(GtkAction *,ACTION_COUNT);
  297 + GtkWidget **popup;
  298 + int f;
  299 +
  300 + gtk_widget_set_tooltip_text(terminal,_( "3270 screen"));
  301 +
  302 + if(uri)
  303 + {
  304 + lib3270_set_host(host,uri);
  305 + }
  306 + else
  307 + {
  308 + gchar *ptr = get_string_from_config("host","uri","");
  309 + if(*ptr)
  310 + lib3270_set_host(host,ptr);
  311 + g_free(ptr);
  312 + }
  313 +
  314 + g_object_set_data_full(G_OBJECT(terminal),"toggle_actions",g_new0(GtkAction *,LIB3270_TOGGLE_COUNT),g_free);
  315 + g_object_set_data_full(G_OBJECT(terminal),"named_actions",(gpointer) action, (GDestroyNotify) g_free);
  316 +
  317 + // Initialize terminal config
  318 + for(f=0;f<G_N_ELEMENTS(widget_config);f++)
  319 + {
  320 + gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL);
  321 + widget_config[f].set(terminal,str);
  322 + if(str)
  323 + g_free(str);
  324 + }
  325 + lib3270_set_model(host,get_integer_from_config("terminal","model",2));
  326 +
  327 + for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
  328 + {
  329 + gchar *nm = g_ascii_strdown(lib3270_get_toggle_name(f),-1);
  330 + lib3270_set_toggle(host,f,get_boolean_from_config("toggle",nm,lib3270_get_toggle(host,f)));
  331 + g_free(nm);
  332 + }
  333 +
  334 + // Create window
  335 + window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  336 + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  337 + gtk_window_set_role(GTK_WINDOW(window),"toplevel");
  338 +
  339 + if(ui_parse_xml_folder(GTK_WINDOW(window),path,groupname,popupname,terminal,widget_setup))
  340 + {
  341 + g_object_unref(terminal);
  342 + g_object_unref(window);
  343 + return NULL;
  344 + }
  345 + group = g_object_get_data(G_OBJECT(window),"action_groups");
  346 + popup = g_object_get_data(G_OBJECT(window),"popup_menus");
  347 +
  348 + // Setup action groups
  349 + gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE);
  350 + gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],FALSE);
  351 + gtk_action_group_set_sensitive(group[ACTION_GROUP_FILETRANSFER],FALSE);
  352 + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);
  353 + disconnected(terminal, (gpointer) group);
  354 +
  355 + // Setup actions
  356 + if(action[ACTION_FULLSCREEN])
  357 + gtk_action_set_visible(action[ACTION_FULLSCREEN],!lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
  358 +
  359 + if(action[ACTION_UNFULLSCREEN])
  360 + gtk_action_set_visible(action[ACTION_UNFULLSCREEN],lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
  361 +
  362 + if(action[ACTION_PASTENEXT])
  363 + {
  364 + gtk_action_set_sensitive(action[ACTION_PASTENEXT],FALSE);
  365 + g_signal_connect(terminal,"pastenext",G_CALLBACK(pastenext),action);
  366 + }
  367 +
  368 + if(action[ACTION_RESELECT])
  369 + gtk_action_set_sensitive(action[ACTION_RESELECT],FALSE);
  370 +
  371 + // Connect window signals
  372 + g_signal_connect(window,"window_state_event",G_CALLBACK(window_state_event),terminal);
  373 + g_signal_connect(window,"destroy",G_CALLBACK(window_destroy),terminal);
  374 +
  375 + // Connect widget signals
  376 + g_signal_connect(terminal,"toggle_changed",G_CALLBACK(toggle_changed),window);
  377 + g_signal_connect(terminal,"disconnected",G_CALLBACK(disconnected),group);
  378 + g_signal_connect(terminal,"connected",G_CALLBACK(connected),group);
  379 + g_signal_connect(terminal,"update_config",G_CALLBACK(update_config),0);
  380 + g_signal_connect(terminal,"model_changed",G_CALLBACK(update_model),0);
  381 + g_signal_connect(terminal,"selecting",G_CALLBACK(selecting),group);
  382 + g_signal_connect(terminal,"popup",G_CALLBACK(popup_menu),popup);
  383 + g_signal_connect(terminal,"has_text",G_CALLBACK(has_text),group);
  384 +
  385 + g_free(path);
  386 +
  387 +
  388 +
  389 + // Initialize terminal
  390 + if(v3270_get_toggle(terminal,LIB3270_TOGGLE_FULL_SCREEN))
  391 + gtk_window_fullscreen(GTK_WINDOW(window));
  392 +
  393 +#ifdef DEBUG
  394 + lib3270_testpattern(host);
  395 +#endif
  396 +
  397 + trace("%s ends",__FUNCTION__);
  398 + gtk_window_set_focus(GTK_WINDOW(window),terminal);
  399 +
  400 + if(v3270_get_toggle(terminal,LIB3270_TOGGLE_CONNECT_ON_STARTUP))
  401 + lib3270_connect(host,NULL,0);
  402 +
  403 + return window;
  404 + }
  405 +
  406 +
  407 +
  408 +
src/lib3270/selection.c
@@ -28,7 +28,6 @@ @@ -28,7 +28,6 @@
28 */ 28 */
29 29
30 #include "globals.h" 30 #include "globals.h"
31 -// #include "ctlr.h"  
32 #include "appres.h" 31 #include "appres.h"
33 #include <lib3270.h> 32 #include <lib3270.h>
34 #include <lib3270/session.h> 33 #include <lib3270/session.h>