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,13 +154,18 @@ int main(int argc, char *argv[])
154 { 154 {
155 configuration_init(); 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 configuration_deinit(); 170 configuration_deinit();
166 } 171 }
src/gtk/v3270/v3270.h
@@ -178,6 +178,7 @@ @@ -178,6 +178,7 @@
178 GtkIMContext * v3270_get_im_context(GtkWidget *widget); 178 GtkIMContext * v3270_get_im_context(GtkWidget *widget);
179 gboolean v3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix); 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 G_END_DECLS 184 G_END_DECLS
src/gtk/v3270/widget.c
@@ -1203,13 +1203,19 @@ GtkIMContext * v3270_get_im_context(GtkWidget *widget) @@ -1203,13 +1203,19 @@ GtkIMContext * v3270_get_im_context(GtkWidget *widget)
1203 return GTK_V3270(widget)->input_method; 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 g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); 1208 g_return_val_if_fail(GTK_IS_V3270(widget),FALSE);
1209 1209
1210 if(ix < LIB3270_TOGGLE_COUNT) 1210 if(ix < LIB3270_TOGGLE_COUNT)
1211 return lib3270_get_toggle(GTK_V3270(widget)->host,ix) ? TRUE : FALSE; 1211 return lib3270_get_toggle(GTK_V3270(widget)->host,ix) ? TRUE : FALSE;
1212 1212
1213 return FALSE; 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,9 +32,23 @@
32 #include "globals.h" 32 #include "globals.h"
33 #include "uiparser/parser.h" 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 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 53 /*--[ Globals ]--------------------------------------------------------------------------------------*/
40 54
@@ -80,30 +94,25 @@ @@ -80,30 +94,25 @@
80 94
81 /*--[ Implement ]------------------------------------------------------------------------------------*/ 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 // Update fullscreen toggles 117 // Update fullscreen toggles
109 if(action[ACTION_FULLSCREEN]) 118 if(action[ACTION_FULLSCREEN])
@@ -117,85 +126,55 @@ @@ -117,85 +126,55 @@
117 return 0; 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 else 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 static void setup_input_method(GtkWidget *widget, GtkWidget *obj) 180 static void setup_input_method(GtkWidget *widget, GtkWidget *obj)
@@ -251,24 +230,102 @@ @@ -251,24 +230,102 @@
251 gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget),menu); 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 static const UI_WIDGET_SETUP widget_setup[] = 330 static const UI_WIDGET_SETUP widget_setup[] =
274 { 331 {
@@ -288,41 +345,22 @@ @@ -288,41 +345,22 @@
288 { "font-family", v3270_set_font_family } 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 for(f=0;f<G_N_ELEMENTS(widget_config);f++) 356 for(f=0;f<G_N_ELEMENTS(widget_config);f++)
319 { 357 {
320 gchar *str = get_string_from_config("terminal",widget_config[f].key,NULL); 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 if(str) 360 if(str)
323 g_free(str); 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 for(f=0;f<LIB3270_TOGGLE_COUNT;f++) 365 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
328 { 366 {
@@ -331,78 +369,79 @@ @@ -331,78 +369,79 @@
331 g_free(nm); 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 // Setup actions 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 #ifdef DEBUG 439 #ifdef DEBUG
394 lib3270_testpattern(host); 440 lib3270_testpattern(host);
395 #endif 441 #endif
396 442
397 trace("%s ends",__FUNCTION__); 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,6 +40,7 @@
40 #endif 40 #endif
41 41
42 #include <gtk/gtk.h> 42 #include <gtk/gtk.h>
  43 + #include <lib3270.h>
43 44
44 // Trace 45 // Trace
45 #include <stdio.h> 46 #include <stdio.h>
@@ -82,8 +83,24 @@ @@ -82,8 +83,24 @@
82 83
83 #endif 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 #endif // PW3270_H_INCLUDED 106 #endif // PW3270_H_INCLUDED