Commit 00e3b6b50747e8d5efc8823502ac5ff7cfbd5278

Authored by perry.werneck@gmail.com
1 parent ae94dea8

Convertendo janela principal em um widget independente

src/gtk/main.c
... ... @@ -154,13 +154,18 @@ int main(int argc, char *argv[])
154 154 {
155 155 configuration_init();
156 156  
157   - toplevel = create_main_window(host);
  157 + toplevel = pw3270_new(host);
158 158  
159   - if(toplevel)
160   - {
161   - gtk_window_present(GTK_WINDOW(toplevel));
162   - gtk_main();
163   - }
  159 + gtk_window_set_type_hint(GTK_WINDOW(toplevel),GDK_WINDOW_TYPE_HINT_NORMAL);
  160 + gtk_window_set_position(GTK_WINDOW(toplevel),GTK_WIN_POS_CENTER);
  161 + gtk_window_set_role(GTK_WINDOW(toplevel),"toplevel");
  162 +
  163 + gtk_window_present(GTK_WINDOW(toplevel));
  164 +
  165 + if(pw3270_get_toggle(toplevel,LIB3270_TOGGLE_FULL_SCREEN))
  166 + gtk_window_fullscreen(GTK_WINDOW(toplevel));
  167 +
  168 + gtk_main();
164 169  
165 170 configuration_deinit();
166 171 }
... ...
src/gtk/v3270/v3270.h
... ... @@ -178,6 +178,7 @@
178 178 GtkIMContext * v3270_get_im_context(GtkWidget *widget);
179 179 gboolean v3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix);
180 180  
  181 + void v3270_set_host(GtkWidget *widget, const gchar *uri);
181 182  
182 183  
183 184 G_END_DECLS
... ...
src/gtk/v3270/widget.c
... ... @@ -1203,13 +1203,19 @@ GtkIMContext * v3270_get_im_context(GtkWidget *widget)
1203 1203 return GTK_V3270(widget)->input_method;
1204 1204 }
1205 1205  
1206   - gboolean v3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix)
1207   - {
  1206 +gboolean v3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix)
  1207 +{
1208 1208 g_return_val_if_fail(GTK_IS_V3270(widget),FALSE);
1209 1209  
1210 1210 if(ix < LIB3270_TOGGLE_COUNT)
1211 1211 return lib3270_get_toggle(GTK_V3270(widget)->host,ix) ? TRUE : FALSE;
1212 1212  
1213 1213 return FALSE;
1214   - }
  1214 +}
1215 1215  
  1216 +void v3270_set_host(GtkWidget *widget, const gchar *uri)
  1217 +{
  1218 + g_return_if_fail(GTK_IS_V3270(widget));
  1219 + g_return_if_fail(uri != NULL);
  1220 + lib3270_set_host(GTK_V3270(widget)->host,uri);
  1221 +}
... ...
src/gtk/window.c
... ... @@ -32,9 +32,23 @@
32 32 #include "globals.h"
33 33 #include "uiparser/parser.h"
34 34  
35   -#ifdef DEBUG
36   - #include <lib3270/actions.h>
37   -#endif
  35 +
  36 +/*--[ Widget definition ]----------------------------------------------------------------------------*/
  37 +
  38 + struct _pw3270
  39 + {
  40 + GtkWindow parent;
  41 + GtkWidget * terminal;
  42 + };
  43 +
  44 + struct _pw3270Class
  45 + {
  46 + GtkWindowClass parent_class;
  47 +
  48 + int dummy;
  49 + };
  50 +
  51 + G_DEFINE_TYPE(pw3270, pw3270, GTK_TYPE_WINDOW);
38 52  
39 53 /*--[ Globals ]--------------------------------------------------------------------------------------*/
40 54  
... ... @@ -80,30 +94,25 @@
80 94  
81 95 /*--[ Implement ]------------------------------------------------------------------------------------*/
82 96  
83   - static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel)
  97 +#if GTK_CHECK_VERSION(3,0,0)
  98 + static void pw3270_destroy(GtkWidget *widget)
  99 +#else
  100 + static void pw3270_destroy(GtkObject *widget)
  101 +#endif
84 102 {
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);
  103 + pw3270 * window = GTK_PW3270(widget);
89 104  
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   - }
  105 + trace("%s %p",__FUNCTION__,widget);
97 106  
98   - if(list[id])
99   - gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(list[id]),toggled);
  107 + if(window->terminal)
  108 + v3270_disconnect(window->terminal);
100 109  
101 110 }
102 111  
103   - static gboolean window_state_event(GtkWidget *window, GdkEventWindowState *event, GtkWidget *widget)
  112 + static gboolean window_state_event(GtkWidget *window, GdkEventWindowState *event, GtkWidget *widget)
104 113 {
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");
  114 + gboolean fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN ? TRUE : FALSE;
  115 + GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions");
107 116  
108 117 // Update fullscreen toggles
109 118 if(action[ACTION_FULLSCREEN])
... ... @@ -117,85 +126,55 @@
117 126 return 0;
118 127 }
119 128  
120   - static gboolean window_destroy(GtkWidget *window, GtkWidget *widget)
  129 + static void pw3270_class_init(pw3270Class *klass)
121 130 {
122   - if(widget)
123   - v3270_disconnect(widget);
124   - }
  131 + GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
  132 + GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass);
  133 +// GtkWindowClass * window_class = GTK_WINDOW_CLASS(klass);
125 134  
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   - }
  135 +#if GTK_CHECK_VERSION(3,0,0)
  136 + widget_class->destroy = pw3270_destroy;
  137 +#else
  138 + {
  139 + GtkObjectClass *object_class = (GtkObjectClass*) klass;
  140 + object_class->destroy = pw3270_destroy;
  141 + }
  142 +#endif // GTK3
147 143  
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 144 }
153 145  
154   - static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup)
  146 + GtkWidget * pw3270_new(const gchar *host)
155 147 {
156   - GtkWidget *menu = NULL;
  148 + GtkWidget *widget = g_object_new(GTK_TYPE_PW3270, NULL);
157 149  
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];
  150 + if(host)
  151 + {
  152 + pw3270_set_host(widget,host);
  153 + }
164 154 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);
  155 + {
  156 + gchar *ptr = get_string_from_config("host","uri","");
  157 + if(*ptr)
  158 + pw3270_set_host(widget,ptr);
  159 + g_free(ptr);
  160 + }
185 161  
186   - if(action[ACTION_RESELECT])
187   - gtk_action_set_sensitive(action[ACTION_RESELECT],!on);
  162 + if(pw3270_get_toggle(widget,LIB3270_TOGGLE_CONNECT_ON_STARTUP))
  163 + v3270_connect(GTK_PW3270(widget)->terminal,NULL);
188 164  
  165 + return widget;
189 166 }
190 167  
191   - static void has_text(GtkWidget *widget, gboolean on, GtkActionGroup **group)
  168 + void pw3270_set_host(GtkWidget *widget, const gchar *uri)
192 169 {
193   - gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],on);
  170 + g_return_if_fail(GTK_IS_PW3270(widget));
  171 + v3270_set_host(GTK_PW3270(widget)->terminal,uri);
194 172 }
195 173  
196   - static void pastenext(GtkWidget *widget, gboolean on, GtkAction **action)
  174 + gboolean pw3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix)
197 175 {
198   - gtk_action_set_sensitive(action[ACTION_PASTENEXT],on);
  176 + g_return_if_fail(GTK_IS_PW3270(widget));
  177 + return v3270_get_toggle(GTK_PW3270(widget)->terminal,ix);
199 178 }
200 179  
201 180 static void setup_input_method(GtkWidget *widget, GtkWidget *obj)
... ... @@ -251,24 +230,102 @@
251 230 gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu);
252 231 }
253 232  
254   - static void set_icon_list(GtkWindow *window)
  233 + static void pastenext(GtkWidget *widget, gboolean on, GtkAction **action)
255 234 {
256   - gchar * name = g_strdup_printf("%s.png",g_get_application_name());
257   - gchar * filename = build_data_filename(name,NULL);
258   - GError * error = NULL;
  235 + gtk_action_set_sensitive(action[ACTION_PASTENEXT],on);
  236 + }
259 237  
260   - if(!gtk_window_set_icon_from_file(window,filename,&error))
  238 + static void disconnected(GtkWidget *widget, GtkActionGroup **group)
  239 + {
  240 + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);
  241 + gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],FALSE);
  242 + gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],TRUE);
  243 + gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),g_get_application_name());
  244 + }
  245 +
  246 + static void connected(GtkWidget *widget, const gchar *host, GtkActionGroup **group)
  247 + {
  248 + set_string_to_config("host","uri","%s",host);
  249 + gtk_window_set_title(GTK_WINDOW(gtk_widget_get_toplevel(widget)),host);
  250 + gtk_action_group_set_sensitive(group[ACTION_GROUP_ONLINE],TRUE);
  251 + gtk_action_group_set_sensitive(group[ACTION_GROUP_OFFLINE],FALSE);
  252 + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],TRUE);
  253 + }
  254 +
  255 + static void update_config(GtkWidget *widget, const gchar *name, const gchar *value)
  256 + {
  257 + set_string_to_config("terminal",name,"%s",value);
  258 + }
  259 +
  260 + static void update_model(GtkWidget *widget, guint id, const gchar *name)
  261 + {
  262 + trace("Widget %p changed to %s (id=%d)",widget,name,id);
  263 + set_integer_to_config("terminal","model",id);
  264 + }
  265 +
  266 + static void selecting(GtkWidget *widget, gboolean on, GtkActionGroup **group)
  267 + {
  268 + GtkAction **action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"named_actions");
  269 + gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],on);
  270 +
  271 + if(action[ACTION_RESELECT])
  272 + gtk_action_set_sensitive(action[ACTION_RESELECT],!on);
  273 +
  274 + }
  275 +
  276 + static gboolean popup_menu(GtkWidget *widget, gboolean selected, gboolean online, GdkEventButton *event, GtkWidget **popup)
  277 + {
  278 + GtkWidget *menu = NULL;
  279 +
  280 + if(!online)
  281 + menu = popup[POPUP_OFFLINE];
  282 + else if(selected && popup[POPUP_SELECTION])
  283 + menu = popup[POPUP_SELECTION];
  284 + else if(popup[POPUP_ONLINE])
  285 + menu = popup[POPUP_ONLINE];
  286 + else
  287 + menu = popup[POPUP_DEFAULT];
  288 +
  289 + trace("Popup %p on widget %p online=%s selected=%s",menu,widget,online ? "Yes" : "No", selected ? "Yes" : "No");
  290 +
  291 + if(!menu)
  292 + return FALSE;
  293 +
  294 + trace("Showing popup \"%s\"",gtk_widget_get_name(menu));
  295 +
  296 + gtk_widget_show_all(menu);
  297 + gtk_menu_set_screen(GTK_MENU(menu), gtk_widget_get_screen(widget));
  298 + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,event->time);
  299 +
  300 + return TRUE;
  301 + }
  302 +
  303 + static void has_text(GtkWidget *widget, gboolean on, GtkActionGroup **group)
  304 + {
  305 + gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],on);
  306 + }
  307 +
  308 + static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE id, gboolean toggled, const gchar *name, GtkWindow *toplevel)
  309 + {
  310 + GtkAction **list = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions");
  311 + gchar *nm = g_ascii_strdown(name,-1);
  312 + set_boolean_to_config("toggle",nm,toggled);
  313 + g_free(nm);
  314 +
  315 + if(id == LIB3270_TOGGLE_FULL_SCREEN)
261 316 {
262   - g_warning("Error %s loading icon from %s",error->message,filename);
263   - g_error_free(error);
  317 + if(toggled)
  318 + gtk_window_fullscreen(GTK_WINDOW(toplevel));
  319 + else
  320 + gtk_window_unfullscreen(GTK_WINDOW(toplevel));
264 321 }
265 322  
266   - g_free(filename);
267   - g_free(name);
  323 + if(list[id])
  324 + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(list[id]),toggled);
268 325  
269 326 }
270 327  
271   - GtkWidget * create_main_window(const gchar *uri)
  328 + static void pw3270_init(pw3270 *widget)
272 329 {
273 330 static const UI_WIDGET_SETUP widget_setup[] =
274 331 {
... ... @@ -288,41 +345,22 @@
288 345 { "font-family", v3270_set_font_family }
289 346 };
290 347  
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   - }
  348 + int f;
  349 + GtkAction **action = g_new0(GtkAction *,ACTION_COUNT);
  350 + H3270 * host;
313 351  
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);
  352 + // Initialize terminal widget
  353 + widget->terminal = v3270_new();
  354 + host = v3270_get_session(widget->terminal);
316 355  
317   - // Initialize terminal config
318 356 for(f=0;f<G_N_ELEMENTS(widget_config);f++)
319 357 {
320 358 gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL);
321   - widget_config[f].set(terminal,str);
  359 + widget_config[f].set(widget->terminal,str);
322 360 if(str)
323 361 g_free(str);
324 362 }
325   - lib3270_set_model(host,get_integer_from_config("terminal","model",2));
  363 + lib3270_set_model(v3270_get_session(widget->terminal),get_integer_from_config("terminal","model",2));
326 364  
327 365 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
328 366 {
... ... @@ -331,78 +369,79 @@
331 369 g_free(nm);
332 370 }
333 371  
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");
  372 + g_object_set_data_full(G_OBJECT(widget->terminal),"toggle_actions",g_new0(GtkAction *,LIB3270_TOGGLE_COUNT),g_free);
  373 + g_object_set_data_full(G_OBJECT(widget->terminal),"named_actions",(gpointer) action, (GDestroyNotify) g_free);
338 374  
339   - if(ui_parse_xml_folder(GTK_WINDOW(window),path,groupname,popupname,terminal,widget_setup))
  375 + // Load UI
340 376 {
341   - g_object_unref(terminal);
342   - g_object_unref(window);
343   - return NULL;
  377 + gchar *path = build_data_filename("ui",NULL);
  378 +
  379 + if(ui_parse_xml_folder(GTK_WINDOW(widget),path,groupname,popupname,widget->terminal,widget_setup))
  380 + {
  381 + g_free(path);
  382 + gtk_widget_set_sensitive(widget->terminal,FALSE);
  383 + return;
  384 + }
  385 +
  386 + g_free(path);
344 387 }
345   - group = g_object_get_data(G_OBJECT(window),"action_groups");
346   - popup = g_object_get_data(G_OBJECT(window),"popup_menus");
347 388  
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 389  
355 390 // Setup actions
356   - if(action[ACTION_FULLSCREEN])
357   - gtk_action_set_visible(action[ACTION_FULLSCREEN],!lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
  391 + {
  392 + GtkWidget **popup = g_object_get_data(G_OBJECT(widget),"popup_menus");
  393 + GtkActionGroup **group = g_object_get_data(G_OBJECT(widget),"action_groups");
358 394  
359   - if(action[ACTION_UNFULLSCREEN])
360   - gtk_action_set_visible(action[ACTION_UNFULLSCREEN],lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
  395 + // Setup action groups
  396 + gtk_action_group_set_sensitive(group[ACTION_GROUP_SELECTION],FALSE);
  397 + gtk_action_group_set_sensitive(group[ACTION_GROUP_CLIPBOARD],FALSE);
  398 + gtk_action_group_set_sensitive(group[ACTION_GROUP_FILETRANSFER],FALSE);
  399 + gtk_action_group_set_sensitive(group[ACTION_GROUP_PASTE],FALSE);
361 400  
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   - }
  401 + disconnected(widget->terminal, (gpointer) group);
367 402  
368   - if(action[ACTION_RESELECT])
369   - gtk_action_set_sensitive(action[ACTION_RESELECT],FALSE);
  403 + // Setup actions
  404 + if(action[ACTION_FULLSCREEN])
  405 + gtk_action_set_visible(action[ACTION_FULLSCREEN],!lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
370 406  
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);
  407 + if(action[ACTION_UNFULLSCREEN])
  408 + gtk_action_set_visible(action[ACTION_UNFULLSCREEN],lib3270_get_toggle(host,LIB3270_TOGGLE_FULL_SCREEN));
374 409  
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);
  410 + if(action[ACTION_PASTENEXT])
  411 + {
  412 + gtk_action_set_sensitive(action[ACTION_PASTENEXT],FALSE);
  413 + g_signal_connect(widget->terminal,"pastenext",G_CALLBACK(pastenext),action);
  414 + }
384 415  
385   - g_free(path);
  416 + if(action[ACTION_RESELECT])
  417 + gtk_action_set_sensitive(action[ACTION_RESELECT],FALSE);
386 418  
387 419  
  420 + // Connect action signals
  421 + g_signal_connect(widget->terminal,"disconnected",G_CALLBACK(disconnected),group);
  422 + g_signal_connect(widget->terminal,"connected",G_CALLBACK(connected),group);
  423 + g_signal_connect(widget->terminal,"update_config",G_CALLBACK(update_config),0);
  424 + g_signal_connect(widget->terminal,"model_changed",G_CALLBACK(update_model),0);
  425 + g_signal_connect(widget->terminal,"selecting",G_CALLBACK(selecting),group);
  426 + g_signal_connect(widget->terminal,"popup",G_CALLBACK(popup_menu),popup);
  427 + g_signal_connect(widget->terminal,"has_text",G_CALLBACK(has_text),group);
388 428  
389   - // Initialize terminal
390   - if(v3270_get_toggle(terminal,LIB3270_TOGGLE_FULL_SCREEN))
391   - gtk_window_fullscreen(GTK_WINDOW(window));
  429 + }
392 430  
  431 + // Connect widget signals
  432 + g_signal_connect(widget->terminal,"toggle_changed",G_CALLBACK(toggle_changed),widget);
  433 +
  434 + // Connect window signals
  435 + g_signal_connect(widget,"window_state_event",G_CALLBACK(window_state_event),widget->terminal);
  436 +
  437 +
  438 + // Finish setup
393 439 #ifdef DEBUG
394 440 lib3270_testpattern(host);
395 441 #endif
396 442  
397 443 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);
  444 + gtk_window_set_focus(GTK_WINDOW(widget),widget->terminal);
402 445  
403   - return window;
404 446 }
405 447  
406   -
407   -
408   -
... ...
src/include/pw3270.h
... ... @@ -40,6 +40,7 @@
40 40 #endif
41 41  
42 42 #include <gtk/gtk.h>
  43 + #include <lib3270.h>
43 44  
44 45 // Trace
45 46 #include <stdio.h>
... ... @@ -82,8 +83,24 @@
82 83  
83 84 #endif
84 85  
  86 + // pw3270 window
  87 + G_BEGIN_DECLS
85 88  
  89 + #define GTK_TYPE_PW3270 (pw3270_get_type ())
  90 + #define GTK_PW3270(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PW3270, pw3270))
  91 + #define GTK_PW3270_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PW3270, pw3270Class))
  92 + #define GTK_IS_PW3270(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PW3270))
  93 + #define GTK_IS_PW3270_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PW3270))
  94 + #define GTK_PW3270_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PW3270, pw3270Class))
86 95  
  96 + typedef struct _pw3270 pw3270;
  97 + typedef struct _pw3270Class pw3270Class;
87 98  
88 99  
  100 + GtkWidget * pw3270_new(const gchar *host);
  101 + void pw3270_set_host(GtkWidget *widget, const gchar *uri);
  102 + gboolean pw3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix);
  103 +
  104 + G_END_DECLS
  105 +
89 106 #endif // PW3270_H_INCLUDED
... ...