gtk4 4.1.2 → 4.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/sample/examples/application1/exampleapp.rb +2 -2
- data/sample/examples/application2/README.md +10 -0
- data/sample/examples/application2/exampleapp.rb +80 -0
- data/sample/examples/application3/README.md +1 -0
- data/sample/examples/application3/exampleapp.rb +108 -0
- data/sample/examples/application4/README.md +13 -0
- data/sample/examples/application4/exampleapp.rb +158 -0
- data/sample/examples/application5/README.md +30 -0
- data/sample/examples/application5/Rakefile +27 -0
- data/sample/examples/application5/exampleapp.rb +171 -0
- data/sample/examples/application5/org.gtk.exampleapp.gschema.xml +20 -0
- data/sample/examples/application6/README.md +15 -0
- data/sample/examples/application6/Rakefile +27 -0
- data/sample/examples/application6/exampleapp.rb +265 -0
- data/sample/examples/application6/org.gtk.exampleapp.gschema.xml +20 -0
- data/sample/examples/application7/README.md +15 -0
- data/sample/examples/application7/Rakefile +27 -0
- data/sample/examples/application7/exampleapp.rb +307 -0
- data/sample/examples/application7/org.gtk.exampleapp.gschema.xml +20 -0
- data/sample/examples/application8/README.md +15 -0
- data/sample/examples/application8/Rakefile +27 -0
- data/sample/examples/application8/exampleapp.rb +357 -0
- data/sample/examples/application8/org.gtk.exampleapp.gschema.xml +25 -0
- data/sample/examples/application9/README.md +15 -0
- data/sample/examples/application9/Rakefile +27 -0
- data/sample/examples/application9/exampleapp.rb +387 -0
- data/sample/examples/application9/org.gtk.exampleapp.gschema.xml +25 -0
- metadata +32 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90c3fcabed9c80a529fe0f2007ae9eaa93ee5d75182823a532b27425122e5b53
|
4
|
+
data.tar.gz: 84dc0413afa122d96df224c91645a954d6d367182bdb4ec833187007e1e6abb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e074e481366cbaa3e6930b71cb5c6c1471460bb2b7d006bef92b6ba4c62af0898094c816b3e4d80363222136bf2d31cf8629a898e25582a791657d4c14d0fa7
|
7
|
+
data.tar.gz: ae553d93201f83bdc7727a6b78c17259b2954eb29b6e95309120a86a82fe2e7478e276201f589a8078c316f954ad0c39fde1dc92114600b9a767f173d15f25e9
|
@@ -18,7 +18,7 @@
|
|
18
18
|
#
|
19
19
|
# Example from:
|
20
20
|
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application1/exampleapp.c
|
21
|
-
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application1/exampleappwin.c
|
21
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application1/exampleappwin.c
|
22
22
|
# License: LGPL2.1-or-later
|
23
23
|
|
24
24
|
require "gtk4"
|
@@ -36,7 +36,7 @@ class ExampleApp < Gtk::Application
|
|
36
36
|
window = ExampleAppWindow.new(application)
|
37
37
|
window.present
|
38
38
|
end
|
39
|
-
signal_connect "open" do |application, files,
|
39
|
+
signal_connect "open" do |application, files, hint|
|
40
40
|
window = application.windows[0] || ExampleAppWindow.new(application)
|
41
41
|
files.each do |file|
|
42
42
|
window.open(file)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# Step 2: Populating the window
|
2
|
+
|
3
|
+
The original files are located in the following directory.
|
4
|
+
|
5
|
+
- https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application2
|
6
|
+
|
7
|
+
They are written in C language and use GResource because it is the best way in C language.
|
8
|
+
But when it comes to Ruby language, GResource is not the best way especially when the resource only includes ui files.
|
9
|
+
So, the program here uses a string instead of a resource.
|
10
|
+
If you want to know how to program with GResource in Ruby language, see gtk3/sample/tutorial/exampleapp2 directory.
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2023 Ruby-GNOME Project Team
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
#
|
19
|
+
# Example from:
|
20
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application2/exampleapp.c
|
21
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application2/exampleappwin.c
|
22
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application2/window.ui
|
23
|
+
# License: LGPL2.1-or-later
|
24
|
+
|
25
|
+
require "gtk4"
|
26
|
+
|
27
|
+
class ExampleAppWindow < Gtk::ApplicationWindow
|
28
|
+
type_register
|
29
|
+
class << self
|
30
|
+
def init
|
31
|
+
template = <<~TEMPLATE
|
32
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
33
|
+
<interface>
|
34
|
+
<template class="ExampleAppWindow" parent="GtkApplicationWindow">
|
35
|
+
<property name="title" translatable="yes">Example Application</property>
|
36
|
+
<property name="default-width">600</property>
|
37
|
+
<property name="default-height">400</property>
|
38
|
+
<child>
|
39
|
+
<object class="GtkBox" id="content_box">
|
40
|
+
<property name="orientation">vertical</property>
|
41
|
+
<child>
|
42
|
+
<object class="GtkStack" id="stack"/>
|
43
|
+
</child>
|
44
|
+
</object>
|
45
|
+
</child>
|
46
|
+
</template>
|
47
|
+
</interface>
|
48
|
+
TEMPLATE
|
49
|
+
set_template(data: template)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(application)
|
54
|
+
super(application: application)
|
55
|
+
end
|
56
|
+
|
57
|
+
def open(file)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class ExampleApp < Gtk::Application
|
62
|
+
def initialize
|
63
|
+
super("org.gtk.exampleapp", :handles_open)
|
64
|
+
|
65
|
+
signal_connect "activate" do |application|
|
66
|
+
window = ExampleAppWindow.new(application)
|
67
|
+
window.present
|
68
|
+
end
|
69
|
+
signal_connect "open" do |application, files, hint|
|
70
|
+
window = application.windows[0] || ExampleAppWindow.new(application)
|
71
|
+
files.each do |file|
|
72
|
+
window.open(file)
|
73
|
+
end
|
74
|
+
window.present
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
app = ExampleApp.new
|
80
|
+
app.run
|
@@ -0,0 +1 @@
|
|
1
|
+
# Step 3: Opening files, add a stack switcher
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2023 Ruby-GNOME Project Team
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
#
|
19
|
+
# Example from:
|
20
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application3/exampleapp.c
|
21
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application3/exampleappwin.c
|
22
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application3/window.ui
|
23
|
+
# License: LGPL2.1-or-later
|
24
|
+
|
25
|
+
require "gtk4"
|
26
|
+
|
27
|
+
class ExampleAppWindow < Gtk::ApplicationWindow
|
28
|
+
type_register
|
29
|
+
class << self
|
30
|
+
def init
|
31
|
+
template = <<~TEMPLATE
|
32
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
33
|
+
<interface>
|
34
|
+
<template class="ExampleAppWindow" parent="GtkApplicationWindow">
|
35
|
+
<property name="title" translatable="yes">Example Application</property>
|
36
|
+
<property name="default-width">600</property>
|
37
|
+
<property name="default-height">400</property>
|
38
|
+
<child type="titlebar">
|
39
|
+
<object class="GtkHeaderBar" id="header">
|
40
|
+
<child type="title">
|
41
|
+
<object class="GtkStackSwitcher" id="tabs">
|
42
|
+
<property name="stack">stack</property>
|
43
|
+
</object>
|
44
|
+
</child>
|
45
|
+
</object>
|
46
|
+
</child>
|
47
|
+
<child>
|
48
|
+
<object class="GtkBox" id="content_box">
|
49
|
+
<property name="orientation">vertical</property>
|
50
|
+
<child>
|
51
|
+
<object class="GtkStack" id="stack"/>
|
52
|
+
</child>
|
53
|
+
</object>
|
54
|
+
</child>
|
55
|
+
</template>
|
56
|
+
</interface>
|
57
|
+
TEMPLATE
|
58
|
+
set_template(data: template)
|
59
|
+
bind_template_child("stack")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def initialize(application)
|
64
|
+
super(application: application)
|
65
|
+
end
|
66
|
+
|
67
|
+
def open(file)
|
68
|
+
basename = file.basename
|
69
|
+
scrolled = Gtk::ScrolledWindow.new
|
70
|
+
scrolled.hexpand = true
|
71
|
+
scrolled.vexpand = true
|
72
|
+
view = Gtk::TextView.new
|
73
|
+
view.editable = false
|
74
|
+
view.cursor_visible = false
|
75
|
+
scrolled.child = view
|
76
|
+
stack.add_titled(scrolled, basename, basename)
|
77
|
+
buffer = view.buffer
|
78
|
+
file.read do |stream|
|
79
|
+
buffer.text = stream.read.force_encoding(Encoding::UTF_8)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class ExampleApp < Gtk::Application
|
85
|
+
def initialize
|
86
|
+
super("org.gtk.exampleapp", :handles_open)
|
87
|
+
|
88
|
+
signal_connect "activate" do |application|
|
89
|
+
window = ExampleAppWindow.new(application)
|
90
|
+
window.present
|
91
|
+
end
|
92
|
+
signal_connect "open" do |application, files, hint|
|
93
|
+
window = application.windows[0] || ExampleAppWindow.new(application)
|
94
|
+
files.each do |file|
|
95
|
+
window.open(file)
|
96
|
+
end
|
97
|
+
window.present
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
app = ExampleApp.new
|
103
|
+
|
104
|
+
# Gtk::Application#run needs C style argv ([prog, arg1, arg2, ...,argn]).
|
105
|
+
# The ARGV ruby variable only contains the arguments ([arg1, arg2, ...,argb])
|
106
|
+
# and not the program name. We have to add it explicitly.
|
107
|
+
|
108
|
+
app.run([$PROGRAM_NAME] + ARGV)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Step 4: Add a menu
|
2
|
+
|
3
|
+
The original files are located in the following directory.
|
4
|
+
|
5
|
+
- https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4
|
6
|
+
|
7
|
+
They are written in the C language and use `g_action_map_add_action entries`.
|
8
|
+
It is a convenience function for creating multiple GSimpleAction instances and adding them to a GActionMap.
|
9
|
+
If you write a program in C, it is the best way.
|
10
|
+
|
11
|
+
However, the program in this directory doesn't use `add_action_entries` method.
|
12
|
+
Instead, it uses `each` method of an array of action names.
|
13
|
+
The way above is flexible and simple.
|
@@ -0,0 +1,158 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2023 Ruby-GNOME Project Team
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
#
|
19
|
+
# Example from:
|
20
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/exampleapp.c
|
21
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/exampleappwin.c
|
22
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/window.ui
|
23
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application4/gears-menu.ui
|
24
|
+
# License: LGPL2.1-or-later
|
25
|
+
|
26
|
+
require "gtk4"
|
27
|
+
|
28
|
+
class ExampleAppWindow < Gtk::ApplicationWindow
|
29
|
+
type_register
|
30
|
+
class << self
|
31
|
+
def init
|
32
|
+
template = <<~TEMPLATE
|
33
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
34
|
+
<interface>
|
35
|
+
<template class="ExampleAppWindow" parent="GtkApplicationWindow">
|
36
|
+
<property name="title" translatable="yes">Example Application</property>
|
37
|
+
<property name="default-width">600</property>
|
38
|
+
<property name="default-height">400</property>
|
39
|
+
<child type="titlebar">
|
40
|
+
<object class="GtkHeaderBar" id="header">
|
41
|
+
<child type="title">
|
42
|
+
<object class="GtkStackSwitcher" id="tabs">
|
43
|
+
<property name="stack">stack</property>
|
44
|
+
</object>
|
45
|
+
</child>
|
46
|
+
<child type="end">
|
47
|
+
<object class="GtkMenuButton" id="gears">
|
48
|
+
<property name="direction">none</property>
|
49
|
+
</object>
|
50
|
+
</child>
|
51
|
+
</object>
|
52
|
+
</child>
|
53
|
+
<child>
|
54
|
+
<object class="GtkBox" id="content_box">
|
55
|
+
<property name="orientation">vertical</property>
|
56
|
+
<child>
|
57
|
+
<object class="GtkStack" id="stack"/>
|
58
|
+
</child>
|
59
|
+
</object>
|
60
|
+
</child>
|
61
|
+
</template>
|
62
|
+
</interface>
|
63
|
+
TEMPLATE
|
64
|
+
set_template(data: template)
|
65
|
+
bind_template_child("stack")
|
66
|
+
bind_template_child("gears")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def initialize(application)
|
71
|
+
menu_ui = <<~MENU
|
72
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
73
|
+
<interface>
|
74
|
+
<menu id="menu">
|
75
|
+
<section>
|
76
|
+
<item>
|
77
|
+
<attribute name="label" translatable="yes">_Preferences</attribute>
|
78
|
+
<attribute name="action">app.preferences</attribute>
|
79
|
+
</item>
|
80
|
+
</section>
|
81
|
+
<section>
|
82
|
+
<item>
|
83
|
+
<attribute name="label" translatable="yes">_Quit</attribute>
|
84
|
+
<attribute name="action">app.quit</attribute>
|
85
|
+
</item>
|
86
|
+
</section>
|
87
|
+
</menu>
|
88
|
+
</interface>
|
89
|
+
MENU
|
90
|
+
super(application: application)
|
91
|
+
builder = Gtk::Builder.new(string: menu_ui)
|
92
|
+
gears.menu_model = builder["menu"]
|
93
|
+
end
|
94
|
+
|
95
|
+
def open(file)
|
96
|
+
basename = file.basename
|
97
|
+
scrolled = Gtk::ScrolledWindow.new
|
98
|
+
scrolled.hexpand = true
|
99
|
+
scrolled.vexpand = true
|
100
|
+
view = Gtk::TextView.new
|
101
|
+
view.editable = false
|
102
|
+
view.cursor_visible = false
|
103
|
+
scrolled.child = view
|
104
|
+
stack.add_titled(scrolled, basename, basename)
|
105
|
+
buffer = view.buffer
|
106
|
+
file.read do |stream|
|
107
|
+
buffer.text = stream.read.force_encoding(Encoding::UTF_8)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class ExampleApp < Gtk::Application
|
113
|
+
def initialize
|
114
|
+
super("org.gtk.exampleapp", :handles_open)
|
115
|
+
|
116
|
+
signal_connect "startup" do |application|
|
117
|
+
[
|
118
|
+
"preferences",
|
119
|
+
"quit"
|
120
|
+
].each do |action_name|
|
121
|
+
action = Gio::SimpleAction.new(action_name)
|
122
|
+
action.signal_connect("activate") do |_action, _parameter|
|
123
|
+
__send__("#{action_name}_activated")
|
124
|
+
end
|
125
|
+
application.add_action(action)
|
126
|
+
end
|
127
|
+
application.set_accels_for_action("app.quit", ["<Control>Q"])
|
128
|
+
end
|
129
|
+
signal_connect "activate" do |application|
|
130
|
+
window = ExampleAppWindow.new(application)
|
131
|
+
window.present
|
132
|
+
end
|
133
|
+
signal_connect "open" do |application, files, hint|
|
134
|
+
window = application.windows[0] || ExampleAppWindow.new(application)
|
135
|
+
files.each do |file|
|
136
|
+
window.open(file)
|
137
|
+
end
|
138
|
+
window.present
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
def preferences_activated
|
145
|
+
end
|
146
|
+
|
147
|
+
def quit_activated
|
148
|
+
quit
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
app = ExampleApp.new
|
153
|
+
|
154
|
+
# Gtk::Application#run needs C style argv ([prog, arg1, arg2, ...,argn]).
|
155
|
+
# The ARGV ruby variable only contains the arguments ([arg1, arg2, ...,argb])
|
156
|
+
# and not the program name. We have to add it explicitly.
|
157
|
+
|
158
|
+
app.run([$PROGRAM_NAME] + ARGV)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Step 5: Add a GSettings object
|
2
|
+
|
3
|
+
The original files are located in the following directory.
|
4
|
+
|
5
|
+
- https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application5
|
6
|
+
|
7
|
+
The original schema file is [here](https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application5/org.gtk.exampleapp.gschema.xml) and the license is LGPL 2.1 or later.
|
8
|
+
|
9
|
+
This program uses GSettings object of the GIO library.
|
10
|
+
You need to compile the schema file (`org.gtk.exampleapp.gschema.xml`) in advance.
|
11
|
+
The instruction is written in the `Rakefile`, so you just run `rake` to compile it.
|
12
|
+
|
13
|
+
```console
|
14
|
+
$ cd gtk4/sample/examples/application5
|
15
|
+
$ rake
|
16
|
+
```
|
17
|
+
|
18
|
+
The Ruby script `exampleapp.rb` works with `gschemas.compiled`.
|
19
|
+
|
20
|
+
```console
|
21
|
+
$ ruby exampleapp.rb README.md Rakefile
|
22
|
+
```
|
23
|
+
|
24
|
+
You will see the contents of the two files `README.md` and `Rakefile` in the window.
|
25
|
+
|
26
|
+
If you want to remove `gschemas.compiled`, do like this:
|
27
|
+
|
28
|
+
```console
|
29
|
+
$ rake clean
|
30
|
+
```
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copyright (C) 2023 Ruby-GNOME Project Team
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "rake/clean"
|
18
|
+
|
19
|
+
task :default => "gschemas.compiled"
|
20
|
+
|
21
|
+
file "gschemas.compiled" => "org.gtk.exampleapp.gschema.xml" do
|
22
|
+
sh("glib-compile-schemas", ".")
|
23
|
+
end
|
24
|
+
|
25
|
+
CLEAN << "gschemas.compiled"
|
26
|
+
|
27
|
+
task :clean
|
@@ -0,0 +1,171 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (C) 2023 Ruby-GNOME Project Team
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
#
|
19
|
+
# Example from:
|
20
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application5/exampleapp.c
|
21
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application5/exampleappwin.c
|
22
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application5/window.ui
|
23
|
+
# * https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application5/gears-menu.ui
|
24
|
+
# License: LGPL2.1-or-later
|
25
|
+
|
26
|
+
# GSETTINGS_SCHEMA_DIR must be set before requiring "gtk4" gem because it is used in the GIO initialization.
|
27
|
+
|
28
|
+
if File.exist?(File.join(__dir__, "gschemas.compiled"))
|
29
|
+
ENV["GSETTINGS_SCHEMA_DIR"] = __dir__
|
30
|
+
else
|
31
|
+
raise %{gschemas.compiled doesn't exist. Run "rake" to generate it.}
|
32
|
+
end
|
33
|
+
|
34
|
+
require "gtk4"
|
35
|
+
|
36
|
+
class ExampleAppWindow < Gtk::ApplicationWindow
|
37
|
+
type_register
|
38
|
+
class << self
|
39
|
+
def init
|
40
|
+
template = <<~TEMPLATE
|
41
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
42
|
+
<interface>
|
43
|
+
<template class="ExampleAppWindow" parent="GtkApplicationWindow">
|
44
|
+
<property name="title" translatable="yes">Example Application</property>
|
45
|
+
<property name="default-width">600</property>
|
46
|
+
<property name="default-height">400</property>
|
47
|
+
<child type="titlebar">
|
48
|
+
<object class="GtkHeaderBar" id="header">
|
49
|
+
<child type="title">
|
50
|
+
<object class="GtkStackSwitcher" id="tabs">
|
51
|
+
<property name="stack">stack</property>
|
52
|
+
</object>
|
53
|
+
</child>
|
54
|
+
<child type="end">
|
55
|
+
<object class="GtkMenuButton" id="gears">
|
56
|
+
<property name="direction">none</property>
|
57
|
+
</object>
|
58
|
+
</child>
|
59
|
+
</object>
|
60
|
+
</child>
|
61
|
+
<child>
|
62
|
+
<object class="GtkBox" id="content_box">
|
63
|
+
<property name="orientation">vertical</property>
|
64
|
+
<child>
|
65
|
+
<object class="GtkStack" id="stack"/>
|
66
|
+
</child>
|
67
|
+
</object>
|
68
|
+
</child>
|
69
|
+
</template>
|
70
|
+
</interface>
|
71
|
+
TEMPLATE
|
72
|
+
set_template(data: template)
|
73
|
+
bind_template_child("stack")
|
74
|
+
bind_template_child("gears")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def initialize(application)
|
79
|
+
menu_ui = <<~MENU
|
80
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
81
|
+
<interface>
|
82
|
+
<menu id="menu">
|
83
|
+
<section>
|
84
|
+
<item>
|
85
|
+
<attribute name="label" translatable="yes">_Preferences</attribute>
|
86
|
+
<attribute name="action">app.preferences</attribute>
|
87
|
+
</item>
|
88
|
+
</section>
|
89
|
+
<section>
|
90
|
+
<item>
|
91
|
+
<attribute name="label" translatable="yes">_Quit</attribute>
|
92
|
+
<attribute name="action">app.quit</attribute>
|
93
|
+
</item>
|
94
|
+
</section>
|
95
|
+
</menu>
|
96
|
+
</interface>
|
97
|
+
MENU
|
98
|
+
super(application: application)
|
99
|
+
builder = Gtk::Builder.new(string: menu_ui)
|
100
|
+
gears.menu_model = builder["menu"]
|
101
|
+
@settings = Gio::Settings.new("org.gtk.exampleapp")
|
102
|
+
@settings.bind("transition", stack, "transition-type", :default)
|
103
|
+
end
|
104
|
+
|
105
|
+
def open(file)
|
106
|
+
basename = file.basename
|
107
|
+
scrolled = Gtk::ScrolledWindow.new
|
108
|
+
scrolled.hexpand = true
|
109
|
+
scrolled.vexpand = true
|
110
|
+
view = Gtk::TextView.new
|
111
|
+
view.editable = false
|
112
|
+
view.cursor_visible = false
|
113
|
+
scrolled.child = view
|
114
|
+
stack.add_titled(scrolled, basename, basename)
|
115
|
+
buffer = view.buffer
|
116
|
+
file.read do |stream|
|
117
|
+
buffer.text = stream.read.force_encoding(Encoding::UTF_8)
|
118
|
+
end
|
119
|
+
tag = buffer.create_tag
|
120
|
+
@settings.bind("font", tag, "font", :default)
|
121
|
+
buffer.apply_tag(tag, buffer.start_iter, buffer.end_iter)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class ExampleApp < Gtk::Application
|
126
|
+
def initialize
|
127
|
+
super("org.gtk.exampleapp", :handles_open)
|
128
|
+
|
129
|
+
signal_connect "startup" do |application|
|
130
|
+
[
|
131
|
+
"preferences",
|
132
|
+
"quit"
|
133
|
+
].each do |action_name|
|
134
|
+
action = Gio::SimpleAction.new(action_name)
|
135
|
+
action.signal_connect("activate") do |_action, _parameter|
|
136
|
+
__send__("#{action_name}_activated")
|
137
|
+
end
|
138
|
+
application.add_action(action)
|
139
|
+
end
|
140
|
+
application.set_accels_for_action("app.quit", ["<Control>Q"])
|
141
|
+
end
|
142
|
+
signal_connect "activate" do |application|
|
143
|
+
window = ExampleAppWindow.new(application)
|
144
|
+
window.present
|
145
|
+
end
|
146
|
+
signal_connect "open" do |application, files, hint|
|
147
|
+
window = application.windows[0] || ExampleAppWindow.new(application)
|
148
|
+
files.each do |file|
|
149
|
+
window.open(file)
|
150
|
+
end
|
151
|
+
window.present
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
|
157
|
+
def preferences_activated
|
158
|
+
end
|
159
|
+
|
160
|
+
def quit_activated
|
161
|
+
quit
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
app = ExampleApp.new
|
166
|
+
|
167
|
+
# Gtk::Application#run needs C style argv ([prog, arg1, arg2, ...,argn]).
|
168
|
+
# The ARGV ruby variable only contains the arguments ([arg1, arg2, ...,argb])
|
169
|
+
# and not the program name. We have to add it explicitly.
|
170
|
+
|
171
|
+
app.run([$PROGRAM_NAME] + ARGV)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<schemalist>
|
3
|
+
<schema path="/org/gtk/exampleapp/" id="org.gtk.exampleapp">
|
4
|
+
<key name="font" type="s">
|
5
|
+
<default>'Monospace 12'</default>
|
6
|
+
<summary>Font</summary>
|
7
|
+
<description>The font to be used for content.</description>
|
8
|
+
</key>
|
9
|
+
<key name="transition" type="s">
|
10
|
+
<choices>
|
11
|
+
<choice value='none'/>
|
12
|
+
<choice value='crossfade'/>
|
13
|
+
<choice value='slide-left-right'/>
|
14
|
+
</choices>
|
15
|
+
<default>'none'</default>
|
16
|
+
<summary>Transition</summary>
|
17
|
+
<description>The transition to use when switching tabs.</description>
|
18
|
+
</key>
|
19
|
+
</schema>
|
20
|
+
</schemalist>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Step 6: Add a preference dialog
|
2
|
+
|
3
|
+
The original files are located in the following directory.
|
4
|
+
|
5
|
+
- https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application6
|
6
|
+
|
7
|
+
The original schema file is [here](https://gitlab.gnome.org/GNOME/gtk/-/blob/main/examples/application6/org.gtk.exampleapp.gschema.xml) and the license is LGPL 2.1 or later.
|
8
|
+
|
9
|
+
Run `rake` before trying `exampleapp.rb`.
|
10
|
+
|
11
|
+
```console
|
12
|
+
$ cd gtk4/sample/examples/application6
|
13
|
+
$ rake
|
14
|
+
$ ruby exampleapp.rb README.md Rakefile
|
15
|
+
```
|