aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/Dialog/Dialog_linux.cpp
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