rustydialogs 0.4.2

Provides a simple and cross-platform way to display native dialog boxes.
Documentation
use super::*;

pub fn show(p: &MessageBox<'_>) -> Option<MessageResult> {
	ensure_gtk_initialized();

	let msg_type = match p.icon {
		MessageIcon::Info => gtk_sys::GTK_MESSAGE_INFO,
		MessageIcon::Warning => gtk_sys::GTK_MESSAGE_WARNING,
		MessageIcon::Error => gtk_sys::GTK_MESSAGE_ERROR,
		MessageIcon::Question => gtk_sys::GTK_MESSAGE_QUESTION,
	};

	let title = cstring(p.title);
	let message = cstring(p.message);

	let dialog = unsafe {
		gtk_sys::gtk_message_dialog_new(
			ptr::null_mut(),
			gtk_sys::GTK_DIALOG_MODAL,
			msg_type,
			gtk_sys::GTK_BUTTONS_NONE,
			c"\n%s".as_ptr(),
			message.as_ptr(),
		)
	};
	unsafe {
		gtk_sys::gtk_window_set_title(dialog as *mut gtk_sys::GtkWindow, title.as_ptr());
	}

	let ok_label = c"OK";
	let cancel_label = c"Cancel";
	let yes_label = c"Yes";
	let no_label = c"No";

	unsafe {
		match p.buttons {
			MessageButtons::Ok => {
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, ok_label.as_ptr(), gtk_sys::GTK_RESPONSE_OK);
				gtk_sys::gtk_dialog_set_default_response(dialog as *mut gtk_sys::GtkDialog, gtk_sys::GTK_RESPONSE_OK);
			}
			MessageButtons::OkCancel => {
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, cancel_label.as_ptr(), gtk_sys::GTK_RESPONSE_CANCEL);
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, ok_label.as_ptr(), gtk_sys::GTK_RESPONSE_OK);
				gtk_sys::gtk_dialog_set_default_response(dialog as *mut gtk_sys::GtkDialog, gtk_sys::GTK_RESPONSE_OK);
			}
			MessageButtons::YesNo => {
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, no_label.as_ptr(), gtk_sys::GTK_RESPONSE_NO);
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, yes_label.as_ptr(), gtk_sys::GTK_RESPONSE_YES);
				gtk_sys::gtk_dialog_set_default_response(dialog as *mut gtk_sys::GtkDialog, gtk_sys::GTK_RESPONSE_YES);
			}
			MessageButtons::YesNoCancel => {
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, cancel_label.as_ptr(), gtk_sys::GTK_RESPONSE_CANCEL);
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, no_label.as_ptr(), gtk_sys::GTK_RESPONSE_NO);
				gtk_sys::gtk_dialog_add_button(dialog as *mut gtk_sys::GtkDialog, yes_label.as_ptr(), gtk_sys::GTK_RESPONSE_YES);
				gtk_sys::gtk_dialog_set_default_response(dialog as *mut gtk_sys::GtkDialog, gtk_sys::GTK_RESPONSE_YES);
			}
		}
	}

	let response = run_dialog(dialog);

	match response {
		gtk_sys::GTK_RESPONSE_OK => Some(MessageResult::Ok),
		gtk_sys::GTK_RESPONSE_CANCEL => Some(MessageResult::Cancel),
		gtk_sys::GTK_RESPONSE_YES => Some(MessageResult::Yes),
		gtk_sys::GTK_RESPONSE_NO => Some(MessageResult::No),
		_ => None,
	}
}