Сохранить / восстановить положение окна в GTK - PullRequest
1 голос
/ 28 апреля 2011

Я хотел бы сохранить / восстановить положение окна между запусками программы. Окно может быть развернуто. Это также должно быть сохранено. Проблема заключается в том, чтобы сохранить положение окна, когда оно развернуто (увеличено).

Итак, подробности (меня не волнует сохранение, это довольно простая задача). Мне нужен способ получить x, y, ширину, высоту нормального состояния окна и указать, развернуто ли окно. К сожалению, gdk_window_get_size / gdk_window_get_position возвращает фактическое размещение окна.

Эта проблема может быть легко решена под Windows, используя GetWindowPlacement и rcNormalPosition. Но мне нужно решение для Mac OS X Cocoa (по крайней мере) или что-то в чистом GTK.

Ответы [ 2 ]

0 голосов
/ 30 января 2015

для этого я использую сигнал, который излучает Gtk.Window, когда вы изменяете его размер, через gsettings я сохраняю значения и восстанавливаю его, чтобы запустить приложение таким же образом. Вот пример в vala + GTK +:

using Gtk;
using GLib;

public class Prueba : Window {

    public void on_resize (Window win)
    {
        int width;
        int height;

        win.get_size (out width, out height);

        /* GSETTINGS CONFIG */
        string settings_dir = Path.get_dirname (".");

        SettingsSchemaSource sss = new SettingsSchemaSource.from_directory (settings_dir, null, false);
        SettingsSchema schema = sss.lookup ("apps.test-gs", false);     

        if (sss.lookup == null)
        {
            stdout.printf ("GLIB.GIO.SCHEMA: ID not found.");
        }

        GLib.Settings config = new GLib.Settings.full (schema, null, null);
        /* GSETTINGS FIN */

        stdout.printf ("RESOLUTION: %dx%d\n", width, height);

        config.set_int ("width", width);
        config.set_int ("height", height);
    }

    public void on_destroy (Window ventana)
    {

        stderr.printf ("APPLICATION EXIT!\n");
        Gtk.main_quit ();
    }

    public Prueba ()
    {
        this.title = "Prueba GTK+";

        string settings_dir = Path.get_dirname (".");
        SettingsSchemaSource sss = new SettingsSchemaSource.from_directory (settings_dir, null, false);
        SettingsSchema schema = sss.lookup ("apps.test-gs", false);

        if (sss.lookup == null)
        {
            stdout.printf ("GLIB.GIO.SCHEMA: ID not found.");
        }

        GLib.Settings settings = new GLib.Settings.full (schema, null, null);

        this.set_default_size (settings.get_int("width"), settings.get_int("height"));
        this.border_width = 10;
        this.window_position = WindowPosition.CENTER;

        Button b = new Button.with_label ("SALIR");

        b.clicked.connect (()=>{
                this.on_destroy (this);
            });

        this.add (b);
        this.show_all ();
    }

    public static int main (string[] args)
    {
        Gtk.init (ref args);

        Prueba app = new Prueba ();

        app.destroy.connect (()=> {

            app.on_destroy (app);

        });

        app.size_allocate.connect (()=>{
                app.on_resize (app);
        });

        Gtk.main ();
        return 0;
    }

}

И схема для этого:

<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
    <schema id="apps.test-gs" path="/apps/test-gs/">
        <key type="b" name="check-test">
            <default>false</default>
            <summary>Check de mi app TEST</summary>
            <description>Es un ejemplo de BOOLEANO de mi APP TEST</description>
        </key>
        <key type="i" name="width">
            <default>300</default>
            <summary>Pixels del Ancho</summary>
            <description>Valor del Ancho del Programa TEST</description>
        </key>
        <key type="i" name="height">
            <default>100</default>
            <summary>Pixels del Alto</summary>
            <description>Valor del Alto del Programa TEST</description>
        </key>
    </schema>
</schemalist>

Удачи!

0 голосов
/ 28 апреля 2011

Решение Какао * описано в Сохранение позиции окна в Руководстве по программированию окна. Попросите делегата вашего приложения:

[window setFrameAutosaveName:@"MyWindowFrame"];

, чтобы окно автоматически сохраняло свой кадр в пользовательских настройках по умолчанию при каждом изменении кадра. Затем при следующем запуске

[window setFrameUsingName:@"MyWindowFrame"];

Окно знает, увеличено ли оно (развернуто):

[window isZoomed];

чтобы вы могли получить этот флаг в любое время вместе с рамкой:

// Gives you an NSRect in screen coordinates
[window frame];

Согласно документам, isZoomed и zoom уточняйте у представителя окна через windowWillUseStandardFrame:defaultFrame:. Я не уверен, как глубоко в Какао вы хотите пойти сюда, но это похоже на вариант для ситуации, которую вы упоминаете в своем комментарии. Я думаю, что объект делегата окна может обеспечить разумное значение по умолчанию для фрейма с помощью этого метода, если окно было создано с увеличенным фреймом.


* и Obj-C, потому что я не знаю C ++.

...