1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// See the note about Application.run() at the bottom of the script
const System = imports.system;
// Include this in case both GTK3 and GTK4 installed, otherwise an exception
// will be thrown
imports.gi.versions.Gtk = '3.0';
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk;
// An example GtkApplication with a few bells and whistles, see also:
// https://wiki.gnome.org/HowDoI/GtkApplication
var ExampleApplication = GObject.registerClass({
Properties: {
'exampleprop': GObject.ParamSpec.string(
'exampleprop', // property name
'ExampleProperty', // nickname
'An example read write property', // description
GObject.ParamFlags.READWRITE, // read/write/construct...
'' // implement defaults manually
),
},
Signals: {'examplesig': {param_types: [GObject.TYPE_INT]}},
}, class ExampleApplication extends Gtk.Application {
_init() {
super._init({
application_id: 'org.gnome.gjs.ExampleApplication',
flags: Gio.ApplicationFlags.FLAGS_NONE,
});
}
// Example property getter/setter
get exampleprop() {
if (typeof this._exampleprop === 'undefined')
return 'a default value';
return this._exampleprop;
}
set exampleprop(value) {
this._exampleprop = value;
// notify() has to be called, if you want it
this.notify('exampleprop');
}
// Example signal emission
emitExamplesig(number) {
this.emit('examplesig', number);
}
vfunc_startup() {
super.vfunc_startup();
// An example GAction, see: https://wiki.gnome.org/HowDoI/GAction
let exampleAction = new Gio.SimpleAction({
name: 'exampleAction',
parameter_type: new GLib.VariantType('s'),
});
exampleAction.connect('activate', (action, param) => {
param = param.deepUnpack().toString();
if (param === 'exampleParameter')
log('Yes!');
});
this.add_action(exampleAction);
}
vfunc_activate() {
super.vfunc_activate();
this.hold();
// Example ApplicationWindow
let window = new Gtk.ApplicationWindow({
application: this,
title: 'Example Application Window',
default_width: 300,
default_height: 200,
});
let label = new Gtk.Label({label: this.exampleprop});
window.add(label);
window.connect('delete-event', () => {
this.quit();
});
window.show_all();
// Example GNotification, see: https://developer.gnome.org/GNotification/
let notif = new Gio.Notification();
notif.set_title('Example Notification');
notif.set_body('Example Body');
notif.set_icon(
new Gio.ThemedIcon({name: 'dialog-information-symbolic'})
);
// A default action for when the body of the notification is clicked
notif.set_default_action("app.exampleAction('exampleParameter')");
// A button for the notification
notif.add_button(
'Button Text',
"app.exampleAction('exampleParameter')"
);
// This won't actually be shown, since an application needs a .desktop
// file with a base name matching the application id
this.send_notification('example-notification', notif);
// Withdraw
this.withdraw_notification('example-notification');
}
});
// The proper way to run a Gtk.Application or Gio.Application is take ARGV and
// prepend the program name to it, and pass that to run()
let app = new ExampleApplication();
app.run([System.programInvocationName].concat(ARGV));
// Or a one-liner...
// (new ExampleApplication()).run([System.programInvocationName].concat(ARGV));
|