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 50  
51 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 54 $(foreach SRC, $(V3270_SRC), v3270/$(SRC)) \
55 55 $(foreach SRC, $(COMMON_SRC), common/$(SRC)) \
56 56 $(foreach SRC, $(UI_PARSER_SRC), uiparser/$(SRC))
... ...
src/gtk/dialog.c
... ... @@ -537,10 +537,11 @@
537 537 "USA" );
538 538  
539 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 546 GError * error = NULL;
546 547 GdkPixbuf * pix = gdk_pixbuf_new_from_file(filename,&error);
... ... @@ -558,10 +559,13 @@
558 559 }
559 560 }
560 561  
561   - g_free(logo);
562 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 569 gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." );
566 570 gtk_about_dialog_set_comments(dialog, _( "3270 terminal emulator for GTK+" ) );
567 571  
... ...
src/gtk/mainwindow.c
... ... @@ -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   -/*
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 177 {
178 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 183 id = V3270_CURSOR_MOVE_SELECTION;
184 184 break;
185 185  
186   - case 0x12:
  186 + case 0x82:
187 187 id = V3270_CURSOR_SELECTION_TOP;
188 188 break;
189 189  
190   - case 0x16:
  190 + case 0x86:
191 191 id = V3270_CURSOR_SELECTION_TOP_RIGHT;
192 192 break;
193 193  
194   - case 0x14:
  194 + case 0x84:
195 195 id = V3270_CURSOR_SELECTION_RIGHT;
196 196 break;
197 197  
198   - case 0x11:
  198 + case 0x81:
199 199 id = V3270_CURSOR_SELECTION_LEFT;
200 200 break;
201 201  
202   - case 0x19:
  202 + case 0x89:
203 203 id = V3270_CURSOR_SELECTION_BOTTOM_LEFT;
204 204 break;
205 205  
206   - case 0x18:
  206 + case 0x88:
207 207 id = V3270_CURSOR_SELECTION_BOTTOM;
208 208 break;
209 209  
210   - case 0x1c:
  210 + case 0x8c:
211 211 id = V3270_CURSOR_SELECTION_BOTTOM_RIGHT;
212 212 break;
213 213  
214   - case 0x13:
  214 + case 0x83:
215 215 id = V3270_CURSOR_SELECTION_TOP_LEFT;
216 216 break;
217 217  
... ...
src/gtk/v3270/selection.c 0 → 100644
... ... @@ -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 @@
  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 28 */
29 29  
30 30 #include "globals.h"
31   -// #include "ctlr.h"
32 31 #include "appres.h"
33 32 #include <lib3270.h>
34 33 #include <lib3270/session.h>
... ...