blob: 11c3ceefe283da05ac4f8e2ea93f2f6c4a51ee31 (
plain)
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
|
// Adapted from https://github.com/aaronmjacobs/Boxer/blob/master/src/boxer_linux.cpp
#include "Dialog.hpp"
#include <gtk/gtk.h>
namespace Dialog {
namespace {
GtkMessageType GetMessageType(Style style) {
switch (style) {
case Style::Info:
return GTK_MESSAGE_INFO;
case Style::Warning:
return GTK_MESSAGE_WARNING;
case Style::Error:
return GTK_MESSAGE_ERROR;
case Style::Question:
return GTK_MESSAGE_QUESTION;
default:
return GTK_MESSAGE_INFO;
}
}
GtkButtonsType GetButtonsType(Buttons buttons) {
switch (buttons) {
case Buttons::OK:
return GTK_BUTTONS_OK;
case Buttons::OKCancel:
return GTK_BUTTONS_OK_CANCEL;
case Buttons::YesNo:
return GTK_BUTTONS_YES_NO;
case Buttons::Quit:
return GTK_BUTTONS_CLOSE;
default:
return GTK_BUTTONS_OK;
}
}
Selection getSelection(gint response) {
switch (response) {
case GTK_RESPONSE_OK:
return Selection::OK;
case GTK_RESPONSE_CANCEL:
return Selection::Cancel;
case GTK_RESPONSE_YES:
return Selection::Yes;
case GTK_RESPONSE_NO:
return Selection::No;
case GTK_RESPONSE_CLOSE:
return Selection::Quit;
default:
return Selection::None;
}
}
} // namespace
Selection Show(const char* message, const char* title, Style style, Buttons buttons) {
if (!gtk_init_check(0, nullptr)) {
return Selection::Error;
}
// Create a parent window to stop gtk_dialog_run from complaining
GtkWidget* parent = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget* dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
GTK_DIALOG_MODAL,
GetMessageType(style),
GetButtonsType(buttons),
"%s",
message);
gtk_window_set_title(GTK_WINDOW(dialog), title);
Selection selection = getSelection(gtk_dialog_run(GTK_DIALOG(dialog)));
gtk_widget_destroy(GTK_WIDGET(dialog));
gtk_widget_destroy(GTK_WIDGET(parent));
while (g_main_context_iteration(nullptr, false)) {
// Do nothing
}
return selection;
}
} // namespace Dialog
|