Commit cb274a9a9f7780ce296f3ad9ac63f8ac7b15fc33

Authored by perry.werneck@gmail.com
1 parent 430ad616

Rômulo Silva Neiva

22 de agosto de 2012 08:56

 * ao abrir a aplicação, esta não 'guarda' o status/tamanho da janela quando foi fechada e inicia sempre com o tamanho mínimo.
src/include/pw3270.h
... ... @@ -56,7 +56,10 @@
56 56 LIB3270_EXPORT gboolean pw3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix);
57 57 LIB3270_EXPORT H3270 * pw3270_get_session(GtkWidget *widget);
58 58 LIB3270_EXPORT GtkWidget * pw3270_get_terminal_widget(GtkWidget *widget);
  59 +
59 60 LIB3270_EXPORT gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ...);
  61 + LIB3270_EXPORT void pw3270_save_window_state(GtkWidget *widget, const gchar *name);
  62 + LIB3270_EXPORT void pw3270_restore_window_state(GtkWidget *widget, const gchar *name);
60 63  
61 64 G_END_DECLS
62 65  
... ...
src/pw3270/common/common.h.in
... ... @@ -62,6 +62,7 @@
62 62  
63 63 #include <libintl.h>
64 64 #include <glib/gi18n.h>
  65 + #include <gtk/gtk.h>
65 66  
66 67 #if defined( DEBUG )
67 68 #define trace(x, ...) fprintf(stderr,"%s(%d):\t" x "\n",__FILE__,__LINE__, __VA_ARGS__); fflush(stderr);
... ... @@ -84,6 +85,9 @@
84 85 gchar * build_data_filename(const gchar *first_element, ...);
85 86 gchar * filename_from_va(const gchar *first_element, va_list args);
86 87  
  88 + void save_window_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd);
  89 + void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd);
  90 +
87 91 #ifdef WIN_REGISTRY_ENABLED
88 92 gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired);
89 93 void registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data);
... ...
src/pw3270/common/config.c
... ... @@ -667,3 +667,80 @@ GKeyFile * get_application_keyfile(void)
667 667 return program_config;
668 668 }
669 669 #endif // WIN_REGISTRY_ENABLED
  670 +
  671 + static const struct _WindowState
  672 + {
  673 + const char *name;
  674 + GdkWindowState flag;
  675 + void (*activate)(GtkWindow *);
  676 + } WindowState[] =
  677 + {
  678 + { "Maximized", GDK_WINDOW_STATE_MAXIMIZED, gtk_window_maximize },
  679 + { "Iconified", GDK_WINDOW_STATE_ICONIFIED, gtk_window_iconify },
  680 + { "Sticky", GDK_WINDOW_STATE_STICKY, gtk_window_stick }
  681 + };
  682 +
  683 +void save_window_to_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
  684 +{
  685 + GdkWindowState CurrentState = gdk_window_get_state(gtk_widget_get_window(hwnd));
  686 +
  687 + if( !(CurrentState & (GDK_WINDOW_STATE_FULLSCREEN|GDK_WINDOW_STATE_MAXIMIZED|GDK_WINDOW_STATE_ICONIFIED)) )
  688 + {
  689 +#if defined( WIN_REGISTRY_ENABLED )
  690 +
  691 + #warning save window state to registry
  692 +
  693 +#else
  694 + int f;
  695 + int pos[2];
  696 + GKeyFile * conf = get_application_keyfile();
  697 + gchar * id = g_strconcat(group,".",key,NULL);
  698 +
  699 + for(f=0;f<G_N_ELEMENTS(WindowState);f++)
  700 + g_key_file_set_boolean(conf,id,WindowState[f].name,CurrentState & WindowState[f].flag);
  701 +
  702 + gtk_window_get_size(GTK_WINDOW(hwnd),&pos[0],&pos[1]);
  703 + g_key_file_set_integer_list(conf,id,"size",pos,2);
  704 +
  705 + g_free(id);
  706 +
  707 +#endif // WIN_REGISTRY_ENABLED
  708 + }
  709 +}
  710 +
  711 +void restore_window_from_config(const gchar *group, const gchar *key, GtkWidget *hwnd)
  712 +{
  713 +#if defined( WIN_REGISTRY_ENABLED )
  714 +
  715 + #warning Implement window state saving on window
  716 +
  717 +#else
  718 + gchar * id = g_strconcat(group,".",key,NULL);
  719 + GKeyFile * conf = get_application_keyfile();
  720 +
  721 + if(g_key_file_has_key(conf,id,"size",NULL))
  722 + {
  723 + gsize sz = 2;
  724 + gint * vlr = g_key_file_get_integer_list(conf,id,"size",&sz,NULL);
  725 + int f;
  726 +
  727 + if(vlr)
  728 + {
  729 + gtk_window_resize(GTK_WINDOW(hwnd),vlr[0],vlr[1]);
  730 + g_free(vlr);
  731 + }
  732 +
  733 + for(f=0;f<G_N_ELEMENTS(WindowState);f++)
  734 + {
  735 + if(g_key_file_get_boolean(conf,id,WindowState[f].name,NULL))
  736 + WindowState[f].activate(GTK_WINDOW(hwnd));
  737 + }
  738 +
  739 + }
  740 +
  741 + g_free(id);
  742 +
  743 +#endif // WIN_REGISTRY_ENABLED
  744 +
  745 +}
  746 +
... ...
src/pw3270/main.c
... ... @@ -250,6 +250,8 @@ int main(int argc, char *argv[])
250 250  
251 251 if(pw3270_get_toggle(toplevel,LIB3270_TOGGLE_FULL_SCREEN))
252 252 gtk_window_fullscreen(GTK_WINDOW(toplevel));
  253 + else
  254 + pw3270_restore_window_state(toplevel,"toplevel");
253 255  
254 256 gtk_window_present(GTK_WINDOW(toplevel));
255 257  
... ... @@ -260,6 +262,8 @@ int main(int argc, char *argv[])
260 262  
261 263 gtk_main();
262 264  
  265 + pw3270_save_window_state(toplevel,"toplevel");
  266 +
263 267 }
264 268  
265 269 return rc;
... ...
src/pw3270/tools.c
... ... @@ -78,7 +78,7 @@ int libpw3270_unloaded(void)
78 78 }
79 79  
80 80  
81   -gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ...)
  81 +LIB3270_EXPORT gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ...)
82 82 {
83 83 va_list args;
84 84 gchar *path;
... ... @@ -88,3 +88,13 @@ gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ...
88 88 va_end(args);
89 89 return path;
90 90 }
  91 +
  92 +LIB3270_EXPORT void pw3270_save_window_state(GtkWidget *widget, const gchar *name)
  93 +{
  94 + save_window_to_config("window", name, widget);
  95 +}
  96 +
  97 +LIB3270_EXPORT void pw3270_restore_window_state(GtkWidget *widget, const gchar *name)
  98 +{
  99 + restore_window_from_config("window", name, widget);
  100 +}
... ...