-
Notifications
You must be signed in to change notification settings - Fork 0
/
Window.vala
116 lines (95 loc) · 2.83 KB
/
Window.vala
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
namespace XRun
{
[GtkTemplate(ui="/io/github/ydalton/XRun/ui/window.ui")]
public class Window : Gtk.ApplicationWindow
{
[GtkChild]
private unowned Gtk.Entry search_bar;
private List<AppInfo> _desktop_file_list;
private List<AppInfo> desktop_file_list {
get {
if(_desktop_file_list == null)
_desktop_file_list = AppInfo.get_all();
return _desktop_file_list;
}
}
private Gtk.TreeModel build_completion()
{
Gtk.TreeIter iter;
var store = new Gtk.ListStore(2, Type.STRING, Type.STRING);
foreach(var desktop_file in desktop_file_list) {
var name = desktop_file.get_name();
store.append(out iter);
store.set(iter, 0, name, -1);
}
return store;
}
[GtkCallback]
public bool on_keypress_cb(Gtk.Widget widget, Gdk.EventKey event)
{
if(event.keyval == Gdk.Key.Escape) {
this.close();
return true;
}
return false;
}
[GtkCallback]
public bool close_cb()
{
this.close();
return true;
}
[GtkCallback]
public void on_enter_cb()
{
var text = search_bar.text;
// Try to launch an application and close the launcher if
// successful.
foreach(var desktop_file in desktop_file_list) {
if(should_match(desktop_file.get_name(), text)) {
var launch_ctx = Gdk.Display.get_default()
.get_app_launch_context();
try {
desktop_file.launch(null, launch_ctx);
} catch(Error e) {
warning("Failed to launch: %s", e.message);
return;
}
this.close();
return;
}
}
message("No results found.");
}
private bool should_match(string name, string key)
{
if(key.down() in name.down())
return true;
return false;
}
private bool match_func(Gtk.EntryCompletion completion,
string key,
Gtk.TreeIter iter)
{
Value text_value;
var model = completion.model;
model.get_value(iter, completion.text_column, out text_value);
var row = text_value.get_string();
return should_match(row, key);
}
construct {
var completion = new Gtk.EntryCompletion() {
model = build_completion(),
text_column = 0,
inline_completion = true,
popup_single_match = true,
};
completion.set_match_func(match_func);
this.search_bar.completion = completion;
}
public Window(Gtk.Application application)
{
Object(application: application);
}
}
} // namespace XRun