Commit cb274a9a9f7780ce296f3ad9ac63f8ac7b15fc33
1 parent
430ad616
Exists in
master
and in
5 other branches
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.
Showing
5 changed files
with
99 additions
and
1 deletions
Show diff stats
src/include/pw3270.h
| @@ -56,7 +56,10 @@ | @@ -56,7 +56,10 @@ | ||
| 56 | LIB3270_EXPORT gboolean pw3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix); | 56 | LIB3270_EXPORT gboolean pw3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix); |
| 57 | LIB3270_EXPORT H3270 * pw3270_get_session(GtkWidget *widget); | 57 | LIB3270_EXPORT H3270 * pw3270_get_session(GtkWidget *widget); |
| 58 | LIB3270_EXPORT GtkWidget * pw3270_get_terminal_widget(GtkWidget *widget); | 58 | LIB3270_EXPORT GtkWidget * pw3270_get_terminal_widget(GtkWidget *widget); |
| 59 | + | ||
| 59 | LIB3270_EXPORT gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ...); | 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 | G_END_DECLS | 64 | G_END_DECLS |
| 62 | 65 |
src/pw3270/common/common.h.in
| @@ -62,6 +62,7 @@ | @@ -62,6 +62,7 @@ | ||
| 62 | 62 | ||
| 63 | #include <libintl.h> | 63 | #include <libintl.h> |
| 64 | #include <glib/gi18n.h> | 64 | #include <glib/gi18n.h> |
| 65 | + #include <gtk/gtk.h> | ||
| 65 | 66 | ||
| 66 | #if defined( DEBUG ) | 67 | #if defined( DEBUG ) |
| 67 | #define trace(x, ...) fprintf(stderr,"%s(%d):\t" x "\n",__FILE__,__LINE__, __VA_ARGS__); fflush(stderr); | 68 | #define trace(x, ...) fprintf(stderr,"%s(%d):\t" x "\n",__FILE__,__LINE__, __VA_ARGS__); fflush(stderr); |
| @@ -84,6 +85,9 @@ | @@ -84,6 +85,9 @@ | ||
| 84 | gchar * build_data_filename(const gchar *first_element, ...); | 85 | gchar * build_data_filename(const gchar *first_element, ...); |
| 85 | gchar * filename_from_va(const gchar *first_element, va_list args); | 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 | #ifdef WIN_REGISTRY_ENABLED | 91 | #ifdef WIN_REGISTRY_ENABLED |
| 88 | gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired); | 92 | gboolean get_registry_handle(const gchar *group, HKEY *hKey, REGSAM samDesired); |
| 89 | void registry_foreach(HKEY parent, const gchar *name,void (*cbk)(const gchar *key, const gchar *val, gpointer *user_data), gpointer *user_data); | 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,3 +667,80 @@ GKeyFile * get_application_keyfile(void) | ||
| 667 | return program_config; | 667 | return program_config; |
| 668 | } | 668 | } |
| 669 | #endif // WIN_REGISTRY_ENABLED | 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,6 +250,8 @@ int main(int argc, char *argv[]) | ||
| 250 | 250 | ||
| 251 | if(pw3270_get_toggle(toplevel,LIB3270_TOGGLE_FULL_SCREEN)) | 251 | if(pw3270_get_toggle(toplevel,LIB3270_TOGGLE_FULL_SCREEN)) |
| 252 | gtk_window_fullscreen(GTK_WINDOW(toplevel)); | 252 | gtk_window_fullscreen(GTK_WINDOW(toplevel)); |
| 253 | + else | ||
| 254 | + pw3270_restore_window_state(toplevel,"toplevel"); | ||
| 253 | 255 | ||
| 254 | gtk_window_present(GTK_WINDOW(toplevel)); | 256 | gtk_window_present(GTK_WINDOW(toplevel)); |
| 255 | 257 | ||
| @@ -260,6 +262,8 @@ int main(int argc, char *argv[]) | @@ -260,6 +262,8 @@ int main(int argc, char *argv[]) | ||
| 260 | 262 | ||
| 261 | gtk_main(); | 263 | gtk_main(); |
| 262 | 264 | ||
| 265 | + pw3270_save_window_state(toplevel,"toplevel"); | ||
| 266 | + | ||
| 263 | } | 267 | } |
| 264 | 268 | ||
| 265 | return rc; | 269 | return rc; |
src/pw3270/tools.c
| @@ -78,7 +78,7 @@ int libpw3270_unloaded(void) | @@ -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 | va_list args; | 83 | va_list args; |
| 84 | gchar *path; | 84 | gchar *path; |
| @@ -88,3 +88,13 @@ gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ... | @@ -88,3 +88,13 @@ gchar * pw3270_build_filename(GtkWidget *widget, const gchar *first_element, ... | ||
| 88 | va_end(args); | 88 | va_end(args); |
| 89 | return path; | 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 | +} |