Commit da9a427b7c7950f66d8c10af2e14c4d6a4585512

Authored by Perry Werneck
1 parent ea07200f

Creating gsettings path for window state and saving size and state to

it.
Makefile.in
... ... @@ -44,6 +44,10 @@ SOURCES= \
44 44 $(wildcard src/main/@OSNAME@/*.c) \
45 45 $(wildcard src/main/@OSNAME@/*.rc)
46 46  
  47 +SCHEMAS= \
  48 + $(wildcard schemas/@OSNAME@/*.gschema.xml) \
  49 + $(wildcard schemas/common/*.gschema.xml)
  50 +
47 51 #---[ Tools ]----------------------------------------------------------------------------
48 52  
49 53 CC=@CC@
... ... @@ -75,6 +79,7 @@ sysconfdir=@sysconfdir@
75 79 BASEDIR=@BASEDIR@
76 80  
77 81 POTDIR=$(BASEDIR)/.pot
  82 +POTDIR=$(BASEDIR)/.schemas
78 83  
79 84 OBJDIR=$(BASEDIR)/.obj/$(PACKAGE_NAME)
80 85 OBJDBG=$(OBJDIR)/Debug
... ... @@ -134,11 +139,11 @@ $(OBJDBG)/%.o: \
134 139 @$(WINDRES) $< -O coff -o $@
135 140  
136 141 gschemas.compiled: \
137   - schemas/@OSNAME@/*.gschema.xml
  142 + $(foreach SCHEMA, $(notdir $(SCHEMAS)), $(OBJDIR)/schemas/$(SCHEMA))
138 143  
139 144 @glib-compile-schemas \
140 145 --targetdir=$(@D) \
141   - $(BASEDIR)/schemas/@OSNAME@
  146 + $(OBJDIR)/schemas
142 147  
143 148 #---[ Release Rules ]--------------------------------------------------------------------
144 149  
... ... @@ -184,6 +189,18 @@ $(POTDIR)/$(PACKAGE_NAME)/%.pot: \
184 189 @touch $@
185 190  
186 191  
  192 +$(OBJDIR)/schemas/%.xml:\
  193 + schemas/@OSNAME@/%.xml
  194 +
  195 + @$(MKDIR) $(@D)
  196 + @cp "$^" "$@"
  197 +
  198 +$(OBJDIR)/schemas/%.xml:\
  199 + schemas/common/%.xml
  200 +
  201 + @$(MKDIR) $(@D)
  202 + @cp "$^" "$@"
  203 +
187 204 install-%: \
188 205 %/Makefile
189 206  
... ... @@ -299,12 +316,14 @@ clean: \
299 316 cleanDebug:
300 317  
301 318 @rm -fr $(OBJDBG)
  319 + @rm -fr $(OBJDIR)/schemas
302 320 @rm -fr $(BINDBG)
303 321 @rm -f gschemas.compiled
304 322  
305 323 cleanRelease:
306 324  
307 325 @rm -fr $(OBJRLS)
  326 + @rm -fr $(OBJDIR)/schemas
308 327 @rm -fr $(BINRLS)
309 328 @rm -fr $(POTDIR)
310 329  
... ...
configure.ac
... ... @@ -97,6 +97,8 @@ dnl INSTALL_PACKAGES=&quot;linux-lib ${INSTALL_PACKAGES}&quot;
97 97  
98 98 esac
99 99  
  100 +AC_CONFIG_FILES(schemas/common/window.gschema.xml)
  101 +
100 102 AC_SUBST(OSNAME,$app_cv_osname)
101 103 AC_SUBST(LIBS)
102 104 AC_SUBST(LOGDIR)
... ...
schemas/Makefile.in
... ... @@ -55,6 +55,10 @@ install:
55 55 @$(MKDIR) $(DESTDIR)/$(schemadir)
56 56 @$(INSTALL_DATA) \
57 57 $(BASEDIR)/schemas/@OSNAME@/application.gschema.xml \
58   - $(DESTDIR)/$(schemadir)/$(PRODUCT_NAME).gschema.xml
  58 + $(DESTDIR)/$(schemadir)/$(PRODUCT_NAME)-application.gschema.xml
  59 +
  60 + @$(INSTALL_DATA) \
  61 + $(BASEDIR)/schemas/common/window.gschema.xml \
  62 + $(DESTDIR)/$(schemadir)/$(PRODUCT_NAME)-window.gschema.xml
59 63  
60 64  
... ...
schemas/common/window.gschema.xml.in 0 → 100644
... ... @@ -0,0 +1,103 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!--
  3 +
  4 + Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  5 + (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  6 + aplicativos mainframe. Registro no INPI sob o nome G3270.
  7 +
  8 + Copyright (C) <2008> <Banco do Brasil S.A.>
  9 +
  10 + Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  11 + os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  12 + Free Software Foundation.
  13 +
  14 + Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  15 + GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  16 + A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  17 + obter mais detalhes.
  18 +
  19 + Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  20 + programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  21 + St, Fifth Floor, Boston, MA 02110-1301 USA
  22 +
  23 +
  24 + Contatos:
  25 +
  26 + perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  27 + erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  28 +
  29 +-->
  30 +
  31 +<schemalist>
  32 +
  33 + <schema id="br.com.bb.@PACKAGE_NAME@.window">
  34 +
  35 + <key name="width" type="i">
  36 + <default>-1</default>
  37 + <summary>The window width.</summary>
  38 + <description></description>
  39 + </key>
  40 +
  41 + <key name="height" type="i">
  42 + <default>-1</default>
  43 + <summary>The window height.</summary>
  44 + <description></description>
  45 + </key>
  46 +
  47 + <key name="is-maximized" type="b">
  48 + <default>false</default>
  49 + <summary>Is the window maximized?</summary>
  50 + <description></description>
  51 + </key>
  52 +
  53 + <key name="is-fullscreen" type="b">
  54 + <default>false</default>
  55 + <summary>Is the window in full screen mode?</summary>
  56 + <description></description>
  57 + </key>
  58 +
  59 + <key name="has-subtitle" type="b">
  60 + <default>true</default>
  61 + <summary>Enable top window subtitle</summary>
  62 + <description>If TRUE, reserve space for a subtitle, even if none is currently set.</description>
  63 + </key>
  64 +
  65 + <key name="toolbar-visible" type="b">
  66 + <default>true</default>
  67 + <summary>The toolbar visible state</summary>
  68 + <description></description>
  69 + </key>
  70 +
  71 + <key name="menubar-visible" type="b">
  72 + <default>true</default>
  73 + <summary>The menubar visible state</summary>
  74 + <description></description>
  75 + </key>
  76 +
  77 + <key name="toolbar-style" type="i">
  78 + <default>-1</default>
  79 + <summary>How to draw the toolbar.</summary>
  80 + <description></description>
  81 + </key>
  82 +
  83 + <key name="toolbar-icon-size" type="i">
  84 + <default>0</default>
  85 + <summary>The size of the icons in a toolbar</summary>
  86 + <description></description>
  87 + </key>
  88 +
  89 + <key name="toolbar-action-names" type="s">
  90 + <default>'win.copy,win.paste,win.select-all,separator,win.connect,win.disconnect,separator,win.session.properties,win.file.transfer,win.print,win.close'</default>
  91 + <summary>The toolbar action list</summary>
  92 + <description></description>
  93 + </key>
  94 +
  95 + <key name="header-action-names" type="s">
  96 + <default>'win.disconnect,win.reconnect,win.file.transfer,win.print:menu.open-menu'</default>
  97 + <summary>The actions in the header bar</summary>
  98 + <description></description>
  99 + </key>
  100 +
  101 + </schema>
  102 +
  103 +</schemalist>
... ...
schemas/linux/application.gschema.xml.in
... ... @@ -38,48 +38,6 @@
38 38 <description>The ID of the current user interface style</description>
39 39 </key>
40 40  
41   - <key name="has-subtitle" type="b">
42   - <default>true</default>
43   - <summary>Enable top window subtitle</summary>
44   - <description>If TRUE, reserve space for a subtitle, even if none is currently set.</description>
45   - </key>
46   -
47   - <key name="toolbar-style" type="i">
48   - <default>-1</default>
49   - <summary>How to draw the toolbar.</summary>
50   - <description></description>
51   - </key>
52   -
53   - <key name="toolbar-icon-size" type="i">
54   - <default>0</default>
55   - <summary>The size of the icons in a toolbar</summary>
56   - <description></description>
57   - </key>
58   -
59   - <key name="toolbar-visible" type="b">
60   - <default>true</default>
61   - <summary>The toolbar visible state</summary>
62   - <description></description>
63   - </key>
64   -
65   - <key name="menubar-visible" type="b">
66   - <default>true</default>
67   - <summary>The menubar visible state</summary>
68   - <description></description>
69   - </key>
70   -
71   - <key name="toolbar-action-names" type="s">
72   - <default>'win.copy,win.paste,win.select-all,separator,win.connect,win.disconnect,separator,win.session.properties,win.file.transfer,win.print,app.quit'</default>
73   - <summary>The toolbar action list</summary>
74   - <description></description>
75   - </key>
76   -
77   - <key name="header-action-names" type="s">
78   - <default>'win.disconnect,win.reconnect,win.file.transfer,win.print:menu.open-menu'</default>
79   - <summary>The actions in the header bar</summary>
80   - <description></description>
81   - </key>
82   -
83 41 </schema>
84 42  
85 43 </schemalist>
... ...
src/objects/window/private.h
... ... @@ -65,6 +65,13 @@
65 65 GtkNotebook * notebook;
66 66 GtkToolbar * toolbar;
67 67  
  68 + struct {
  69 + int width; ///< @brief Window width.
  70 + int height; ///< @brief Window height.
  71 + int is_maximized : 1; ///< @brief Non zero if window is maximized.
  72 + int is_fullscreen : 1; ///< @brief Non zero if window is fullscreen.
  73 + } state;
  74 +
68 75 GtkWidget * popups[PW3270_APP_WINDOW_POPUP_COUNT];
69 76  
70 77 };
... ...
src/objects/window/window.c
... ... @@ -35,6 +35,7 @@
35 35  
36 36 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
37 37 static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
  38 + static GSettings *pw3270_application_window_settings_new(void);
38 39  
39 40 G_DEFINE_TYPE(pw3270ApplicationWindow, pw3270ApplicationWindow, GTK_TYPE_APPLICATION_WINDOW);
40 41  
... ... @@ -60,29 +61,105 @@
60 61 }
61 62 }
62 63  
  64 + {
  65 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  66 +
  67 + g_settings_set_int(settings, "width", window->state.width);
  68 + g_settings_set_int(settings, "height", window->state.height);
  69 + g_settings_set_boolean(settings, "is-maximized", window->state.is_maximized);
  70 + g_settings_set_boolean(settings, "is-fullscreen", window->state.is_fullscreen);
  71 + }
  72 +
63 73 GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->destroy(widget);
64 74  
65 75 }
66 76  
67   - static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) {
  77 + static void size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
  78 +
  79 + // https://developer.gnome.org/SaveWindowState/
  80 + GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->size_allocate(widget, allocation);
68 81  
69   - GTK_WIDGET_CLASS(klass)->destroy = destroy;
  82 + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget);
  83 +
  84 + if(!(window->state.is_maximized || window->state.is_fullscreen)) {
  85 + gtk_window_get_size(GTK_WINDOW (widget), &window->state.width, &window->state.height);
  86 + }
70 87  
71   - GObjectClass *object_class = G_OBJECT_CLASS(klass);
  88 + }
72 89  
73   - object_class->set_property = set_property;
74   - object_class->get_property = get_property;
  90 + static gboolean window_state_event(GtkWidget *widget, GdkEventWindowState *event) {
75 91  
76   - g_object_class_install_property(
77   - object_class,
78   - PROP_ACTION_NAMES,
79   - g_param_spec_string ("action-names",
80   - N_("Action Names"),
81   - N_("The name of the actions in the header bar"),
82   - NULL,
83   - G_PARAM_WRITABLE|G_PARAM_READABLE)
84   - );
  92 + // https://developer.gnome.org/SaveWindowState/
  93 + gboolean res = GDK_EVENT_PROPAGATE;
85 94  
  95 + if(GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->window_state_event != NULL) {
  96 + res = GTK_WIDGET_CLASS(pw3270ApplicationWindow_parent_class)->window_state_event(widget, event);
  97 + }
  98 +
  99 + {
  100 + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(widget);
  101 +
  102 + window->state.is_maximized = (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) == 0 ? 0 : 1;
  103 + window->state.is_fullscreen = (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) == 0 ? 0 : 1;
  104 + }
  105 +
  106 + return res;
  107 + }
  108 +
  109 + static void constructed(GObject *object) {
  110 +
  111 + // https://developer.gnome.org/SaveWindowState/
  112 +
  113 + pw3270ApplicationWindow * window = PW3270_APPLICATION_WINDOW(object);
  114 +
  115 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  116 + if(settings) {
  117 +
  118 + // https://developer.gnome.org/SaveWindowState/
  119 + window->state.width = g_settings_get_int (settings, "width");
  120 + window->state.height = g_settings_get_int (settings, "height");
  121 + window->state.is_maximized = g_settings_get_boolean (settings, "is-maximized") ? 1 : 0;
  122 + window->state.is_fullscreen = g_settings_get_boolean (settings, "is-fullscreen") ? 1 : 0;
  123 +
  124 + }
  125 +
  126 + gtk_window_set_default_size(GTK_WINDOW (object), window->state.width, window->state.height);
  127 +
  128 + if(window->state.is_maximized)
  129 + gtk_window_maximize(GTK_WINDOW(object));
  130 +
  131 + if(window->state.is_fullscreen)
  132 + gtk_window_fullscreen(GTK_WINDOW (object));
  133 +
  134 + G_OBJECT_CLASS (pw3270ApplicationWindow_parent_class)->constructed (object);
  135 + }
  136 +
  137 + static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) {
  138 +
  139 + {
  140 + GtkWidgetClass *widget = GTK_WIDGET_CLASS(klass);
  141 + widget->destroy = destroy;
  142 + widget->window_state_event = window_state_event;
  143 + widget->size_allocate = size_allocate;
  144 + }
  145 +
  146 + {
  147 + GObjectClass *object_class = G_OBJECT_CLASS(klass);
  148 +
  149 + object_class->set_property = set_property;
  150 + object_class->get_property = get_property;
  151 + object_class->constructed = constructed;
  152 +
  153 + g_object_class_install_property(
  154 + object_class,
  155 + PROP_ACTION_NAMES,
  156 + g_param_spec_string ("action-names",
  157 + N_("Action Names"),
  158 + N_("The name of the actions in the header bar"),
  159 + NULL,
  160 + G_PARAM_WRITABLE|G_PARAM_READABLE)
  161 + );
  162 + }
86 163  
87 164 }
88 165  
... ... @@ -104,6 +181,13 @@
104 181  
105 182 static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) {
106 183  
  184 + // Setup defaults
  185 + widget->state.width = 800;
  186 + widget->state.height = 500;
  187 + widget->state.is_maximized = 0;
  188 + widget->state.is_fullscreen = 0;
  189 +
  190 + // Create contents
107 191 GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0));
108 192  
109 193 widget->notebook = GTK_NOTEBOOK(gtk_notebook_new());
... ... @@ -224,8 +308,6 @@
224 308  
225 309 size_t ix;
226 310  
227   - g_autoptr(GSettings) settings = pw3270_application_get_settings(G_APPLICATION(application));
228   -
229 311 g_return_val_if_fail(GTK_IS_APPLICATION(application), NULL);
230 312 pw3270ApplicationWindow * window =
231 313 g_object_new(
... ... @@ -259,88 +341,88 @@
259 341  
260 342 }
261 343  
262   - if(pw3270_application_get_ui_style(G_APPLICATION(application)) == PW3270_UI_STYLE_GNOME) {
  344 + // Setup and show main window
  345 + {
  346 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  347 +
  348 + if(pw3270_application_get_ui_style(G_APPLICATION(application)) == PW3270_UI_STYLE_GNOME) {
  349 +
  350 + // Create header bar
  351 +
  352 + GtkHeaderBar * header = GTK_HEADER_BAR(gtk_header_bar_new());
  353 + gtk_window_set_titlebar(GTK_WINDOW(window), GTK_WIDGET(header));
  354 + gtk_header_bar_set_show_close_button(header,TRUE);
263 355  
264   - // Create header bar
  356 + gtk_header_bar_set_title(header,title);
  357 + g_settings_bind(
  358 + settings,
  359 + "has-subtitle",
  360 + header,
  361 + "has-subtitle",
  362 + G_SETTINGS_BIND_DEFAULT
  363 + );
265 364  
266   - GtkHeaderBar * header = GTK_HEADER_BAR(gtk_header_bar_new());
267   - gtk_window_set_titlebar(GTK_WINDOW(window), GTK_WIDGET(header));
268   - gtk_header_bar_set_show_close_button(header,TRUE);
  365 + // Show the new header
  366 + gtk_widget_show_all(GTK_WIDGET(header));
  367 +
  368 + g_settings_bind(
  369 + settings,
  370 + "header-action-names",
  371 + window,
  372 + "action-names",
  373 + G_SETTINGS_BIND_DEFAULT
  374 + );
  375 +
  376 + } else {
  377 +
  378 + gtk_window_set_title(GTK_WINDOW(window), title);
  379 +
  380 + }
269 381  
270   - gtk_header_bar_set_title(header,title);
271 382 g_settings_bind(
272 383 settings,
273   - "has-subtitle",
274   - header,
275   - "has-subtitle",
  384 + "menubar-visible",
  385 + window,
  386 + "show-menubar",
276 387 G_SETTINGS_BIND_DEFAULT
277 388 );
278 389  
279   - // Show the new header
280   - gtk_widget_show_all(GTK_WIDGET(header));
281   -
282   - // g_autofree gchar * header_actions = g_settings_get_string(settings, "header-action-names");
283   - // pw3270_window_set_header_action_names(GTK_WIDGET(window), header_actions);
  390 + g_settings_bind(
  391 + settings,
  392 + "toolbar-visible",
  393 + window->toolbar,
  394 + "visible",
  395 + G_SETTINGS_BIND_DEFAULT
  396 + );
284 397  
285 398 g_settings_bind(
286 399 settings,
287   - "header-action-names",
288   - window,
  400 + "toolbar-action-names",
  401 + window->toolbar,
289 402 "action-names",
290 403 G_SETTINGS_BIND_DEFAULT
291 404 );
292 405  
293   - } else {
  406 + g_settings_bind(
  407 + settings,
  408 + "toolbar-style",
  409 + window->toolbar,
  410 + "style",
  411 + G_SETTINGS_BIND_DEFAULT
  412 + );
294 413  
295   - gtk_window_set_title(GTK_WINDOW(window), title);
  414 + g_settings_bind(
  415 + settings,
  416 + "toolbar-icon-size",
  417 + window->toolbar,
  418 + "icon-size",
  419 + G_SETTINGS_BIND_DEFAULT
  420 + );
296 421  
297 422 }
298 423  
299   - // Setup and show main window
300   - g_settings_bind(
301   - settings,
302   - "menubar-visible",
303   - window,
304   - "show-menubar",
305   - G_SETTINGS_BIND_DEFAULT
306   - );
307   -
308   - g_settings_bind(
309   - settings,
310   - "toolbar-visible",
311   - window->toolbar,
312   - "visible",
313   - G_SETTINGS_BIND_DEFAULT
314   - );
315   -
316   - g_settings_bind(
317   - settings,
318   - "toolbar-action-names",
319   - window->toolbar,
320   - "action-names",
321   - G_SETTINGS_BIND_DEFAULT
322   - );
323   -
324   - g_settings_bind(
325   - settings,
326   - "toolbar-style",
327   - window->toolbar,
328   - "style",
329   - G_SETTINGS_BIND_DEFAULT
330   - );
331   -
332   - g_settings_bind(
333   - settings,
334   - "toolbar-icon-size",
335   - window->toolbar,
336   - "icon-size",
337   - G_SETTINGS_BIND_DEFAULT
338   - );
339   -
340   -
341 424 // Setup default position and size
342 425 gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
343   - gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
344 426  
345 427 // Create terminal widget
346 428 GtkWidget * terminal = pw3270_application_window_new_tab(GTK_WIDGET(window), session_file);
... ... @@ -456,3 +538,45 @@
456 538 g_strfreev(actions);
457 539  
458 540 }
  541 +
  542 + GSettings *pw3270_application_window_settings_new() {
  543 +
  544 + // Get settings
  545 + g_autofree gchar * path = g_strconcat("/apps/" PACKAGE_NAME "/", g_get_application_name(), "/window/",NULL);
  546 + debug("path=%s",path);
  547 +
  548 +#ifdef DEBUG
  549 +
  550 + GError * error = NULL;
  551 + GSettingsSchemaSource * source =
  552 + g_settings_schema_source_new_from_directory(
  553 + ".",
  554 + NULL,
  555 + TRUE,
  556 + &error
  557 + );
  558 +
  559 + g_assert_no_error(error);
  560 +
  561 + GSettingsSchema * schema =
  562 + g_settings_schema_source_lookup(
  563 + source,
  564 + "br.com.bb." PACKAGE_NAME ".window",
  565 + TRUE);
  566 +
  567 + debug("schema %s=%p path=%s","br.com.bb." PACKAGE_NAME ".window",schema,path);
  568 +
  569 + GSettings * settings = g_settings_new_full(schema, NULL, path);
  570 +
  571 + g_settings_schema_source_unref(source);
  572 +
  573 +#else
  574 +
  575 + GSettings * settings = g_settings_new_with_path("br.com.bb." PACKAGE_NAME, path);
  576 +
  577 +#endif // DEBUG
  578 +
  579 + return settings;
  580 +
  581 + }
  582 +
... ...