在GTK中保存/恢复窗口位置

Save/restore window position in GTK

本文关键字:恢复 窗口 位置 保存 GTK      更新时间:2023-10-16

我想在程序启动之间保存/恢复窗口位置。窗口可以最大化。这个也应该保存。问题是当它被最大化(缩放)时保存窗口位置。

所以细节(我不关心保存,这是相当简单的任务)。我需要获得窗口正常状态的x,y,宽度,高度和标志窗口是否最大化的方法。不幸的是,gdk_window_get_size/gdk_window_get_position返回的是实际的窗口位置。

这个问题可以很容易地解决在Windows下使用GetWindowPlacement和rcNormalPosition。但我需要一个Mac OS X Cocoa(至少)或纯GTK的解决方案。

对此,我所做的是使用发出Gtk的信号。窗口,当你调整它的大小,通过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%dn", 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;
    }
}

和schema:

<?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>

祝你好运!

Cocoa*解决方案在窗口编程指南中的保存窗口位置中进行了描述。让你的应用程序委托做:

[window setFrameAutosaveName:@"MyWindowFrame"];

使窗口在框架发生变化时自动将其框架保存为User Defaults。然后在下次启动时,

[window setFrameUsingName:@"MyWindowFrame"];

窗口知道它是否被"缩放"(最大化):

[window isZoomed];

所以你可以随时获得这个标志,以及框架:

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

根据文档,isZoomedzoom通过windowWillUseStandardFrame:defaultFrame:与窗口的委托进行检查。我不确定您想在这里深入到什么程度,但对于您在评论中提到的情况,这似乎是一种选择。我认为窗口委托对象可以通过这个方法为框架提供一个合理的默认值,如果窗口是用缩放的框架创建的。


<子> * Obj-C,因为我不知道c++。

我刚刚使用pygobject实现了这样的事情;它不是c++,但它仍然是有用的。

你可以在这里找到代码。

我使用GNOME Builder的默认模板来创建一个python GNOME应用程序,所以如果你用它来设置你的项目,它应该非常容易复制。