Gtk.Application in Genie

时间:2017-01-31 21:36:45

标签: gtk gtk3 genie

我找不到关于" Gtk.Application"的信息或示例。在Genie。

在Genie中使用Gtk.Application类的正确方法是什么?

美好的一天,谢谢你

编辑:我不知道这是否是最佳方式,但我的代码是:

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk

class MyApplication : Gtk.Application   
    def override activate ()        
        var window = new Gtk.ApplicationWindow (this)
        window.title = "Welcome to GNOME"
        window.set_default_size (400, 400)
        window.show ()

init
    new MyApplication ().run (args)

2 个答案:

答案 0 :(得分:6)

你的例子看起来对我来说是个不错的开始,但我认为你应该添加一个应用程序ID和一些应用程序标记。

三个好的资源是GTK+3 Reference Manual's documentation for GtkApplication,GNOME Wiki“HowDoI”部分的页面名为"Using GtkApplication"GIO Reference Manual's documentation for GApplication。 Vala绑定中的GApplication或GLib.Application是GtkApplication的父类。

“HowDoI”页面建议:

  

GtkApplication没有为您实现main()。你必须自己这样做。你的main()函数应该尽可能小,除了创建你的GtkApplication并运行它之外什么都不做。应该始终响应GtkApplication发出的信号完成“实际工作”。

您在Genie中的main()功能是:

init
    new MyApplication().run( args )

这就像你能得到的一样简单。

“HowDoI”页面也建议:

  

当您的应用程序启动时,将触发启动信号。这使您有机会执行与显示新窗口无直接关系的初始化任务。在此之后,根据应用程序的启动方式,将激活或打开下一个。

你没有用你的例子做任何启动任务,这很好。因此,无需使用startup信号,但您通过使用activate覆盖虚函数来使用def override activate ()信号。当Gtk.Application运行时,activate实际上是默认信号,但是在设置了适当的ApplicatonFlags时可以发出替代信号。例如,如果设置了HANDLES_OPEN标志,那么如果存在未解析的命令行参数,则将发送open信号。未解析的参数被视为文件名或URI。默认标志为FLAGS_NONE,稍后将在示例代码中明确显示。

GTK + 3参考手册关于GtkApplication的部分说明:

  

目前,GtkApplication处理GTK +初始化,应用程序唯一性,会话管理,通过导出操作和菜单提供一些基本的脚本化和桌面shell集成,并管理一个顶级窗口列表,其生命周期自动与您的生命周期相关联application ...如果没有给出应用程序ID,那么将禁用某些功能(最明显的是应用程序唯一性)。只有GTK + 3.6或更高版本才允许使用null应用程序ID。

应用程序ID应至少由两个以点分隔的名称组成。如果应用程序第二次运行,则第二个实例的窗口将成为第一个应用程序的一部分,但第二个应用程序实例将关闭。这是应用程序唯一性功能,可以使用ApplicationFlags.NON_UNIQUE禁用。应用程序使用应用程序ID在会话总线上注册。如果您使用的是Linux,则可以使用D-Feet之类的工具查看应用程序是否出现在会话总线上,以及再次运行应用程序时会发生什么情况(需要刷新视图)。

某些代码的时间:

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
[indent=4]
uses Gtk

init
    new MyApplication( "org.genie.Example.SimpleGtkApplication",
                     ApplicationFlags.FLAGS_NONE
                     ).run( args )

class MyApplication:Gtk.Application
    construct( application_id:string, flags:ApplicationFlags )
        if !id_is_valid( application_id )
            error( "application id %s is not valid", application_id )
        this.application_id = application_id
        this.flags = flags

    def override activate ()
        var window = new Gtk.ApplicationWindow( this )
        window.title = "Welcome to GNOME"
        window.set_default_size( 400, 400 )
        window.show_all()

这会添加一个应用程序ID并使ApplicationFlags显式。

答案 1 :(得分:4)

好吧,我还在取得进展。

我用Gtk.Application编写了这段代码,运行了一个简单的截图:

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk

init
    new MyApplication( "captura.escritorio",
        ApplicationFlags.FLAGS_NONE
        ).run( args )

class MyApplication:Gtk.Application

    construct( application_id:string, flags:ApplicationFlags )
        if !id_is_valid( application_id )
            error( "application id %s is not valid", application_id )
        this.application_id = application_id
        this.flags = flags

    def override activate ()
        var window = new Gtk.ApplicationWindow( this )
        window.title = "Escritorio"             
        window.border_width = 10        
        window.window_position = WindowPosition.CENTER      

        var grid = new Gtk.Grid()
        window.add (grid)

        var boton = new Button.with_label ("Capturar")      
        boton.clicked.connect(btn)
        boton.border_width = 10 
        grid.attach(boton, 0, 0, 2, 1)

        var boton_salir = new Button.with_label ("Salir")
        boton_salir.clicked.connect(btn_salir)
        boton_salir.border_width = 10   
        grid.attach(boton_salir, 2, 0, 2, 1)

        window.show_all()       

    def btn(btn:Button)
        escritorio: Gdk.Window = Gdk.get_default_root_window()
        ancho: int = escritorio.get_width()
        alto: int = escritorio.get_height() 
        screenshot: Gdk.Pixbuf = Gdk.pixbuf_get_from_window(escritorio, 0, 0, ancho, alto)
        try
            screenshot.save("screenshot.png","png")
        except e: GLib.Error
            stderr.printf ("Error: %s\n", e.message)

    def btn_salir(btn:Button)       
        this.quit()

我想把它放在这里,因为很少有Gtk.Application与Genie的例子。

谢谢