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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/sample/examples/application1/exampleapp.rb +2 -2
  3. data/sample/examples/application2/README.md +10 -0
  4. data/sample/examples/application2/exampleapp.rb +80 -0
  5. data/sample/examples/application3/README.md +1 -0
  6. data/sample/examples/application3/exampleapp.rb +108 -0
  7. data/sample/examples/application4/README.md +13 -0
  8. data/sample/examples/application4/exampleapp.rb +158 -0
  9. data/sample/examples/application5/README.md +30 -0
  10. data/sample/examples/application5/Rakefile +27 -0
  11. data/sample/examples/application5/exampleapp.rb +171 -0
  12. data/sample/examples/application5/org.gtk.exampleapp.gschema.xml +20 -0
  13. data/sample/examples/application6/README.md +15 -0
  14. data/sample/examples/application6/Rakefile +27 -0
  15. data/sample/examples/application6/exampleapp.rb +265 -0
  16. data/sample/examples/application6/org.gtk.exampleapp.gschema.xml +20 -0
  17. data/sample/examples/application7/README.md +15 -0
  18. data/sample/examples/application7/Rakefile +27 -0
  19. data/sample/examples/application7/exampleapp.rb +307 -0
  20. data/sample/examples/application7/org.gtk.exampleapp.gschema.xml +20 -0
  21. data/sample/examples/application8/README.md +15 -0
  22. data/sample/examples/application8/Rakefile +27 -0
  23. data/sample/examples/application8/exampleapp.rb +357 -0
  24. data/sample/examples/application8/org.gtk.exampleapp.gschema.xml +25 -0
  25. data/sample/examples/application9/README.md +15 -0
  26. data/sample/examples/application9/Rakefile +27 -0
  27. data/sample/examples/application9/exampleapp.rb +387 -0
  28. data/sample/examples/application9/org.gtk.exampleapp.gschema.xml +25 -0
  29. metadata +32 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 031bdff3af35f8c9ca1993b8857fe51b9c6e658d327a3fb263d8df8e0fd476ee
4
- data.tar.gz: ac2485eb8b4f99c3c714fcaa4ab18eccffd347980705a32e028c4503fa136585
3
+ metadata.gz: 90c3fcabed9c80a529fe0f2007ae9eaa93ee5d75182823a532b27425122e5b53
4
+ data.tar.gz: 84dc0413afa122d96df224c91645a954d6d367182bdb4ec833187007e1e6abb9
5
5
  SHA512:
6
- metadata.gz: 687e5abb4016942dbfb0228d6371ddb0a64263b90192575c21cb14470fb8066402d5323b1086ca74dbdec18e4df92d3206689020b6864f53d571b46b4b40d302
7
- data.tar.gz: f7b56275f7613f8f9a979d7b96ddfe16ef1c75b562c37516fd1da6da3840e236059d06426d0ee8008e3f8ba7b8a92d9c8f66890e00687d51e2ecbe0a47ea6938
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, hin|
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
+ ```