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

时间:2011-04-28 16:10:05

标签: c++ cocoa gtk quartz-graphics

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

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

使用GetWindowPlacement和rcNormalPosition可以在Windows下轻松解决此问题。 但我需要一个适用于Mac OS X Cocoa的解决方案(至少)或纯GTK中的某种解决方案。

3 个答案:

答案 0 :(得分:0)

Cocoa *解决方案在Window Programming Guide的Saving Window Position中有描述。让你的申请代表做:

[window setFrameAutosaveName:@"MyWindowFrame"];

使窗口在帧更改时自动将其框架保存为用户默认值。然后在下次发布时,

[window setFrameUsingName:@"MyWindowFrame"];

窗口知道它是is "zoomed"(最大化):

[window isZoomed];

所以你可以随时随地获得这个标志:

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

根据文档,isZoomedzoom通过windowWillUseStandardFrame:defaultFrame:检查窗口的代理人。我不确定你想要去Cocoa有多深,但这看起来像是你在评论中提到的情况的一个选项。我认为窗口委托对象可以通过此方法为框架提供合理的默认值,如果窗口是使用缩放框架创建的。


*和Obj-C,因为我不懂C ++。

答案 1 :(得分:0)

为此,我做的是使用在调整大小时发出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>

祝你好运!

答案 2 :(得分:0)

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

您可以找到代码here

我已经将GNOME Builder的默认模板用于python GNOME应用程序,因此如果您使用它来设置项目,则复制起来应该非常容易。