Skip to content

Commit

Permalink
apply reviews.
Browse files Browse the repository at this point in the history
  • Loading branch information
na2axl committed Dec 15, 2024
1 parent 37d78e3 commit 530efd7
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 113 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ jobs:
with: { java-version: '11' }

- name: Install Linux dependencies
run: sudo apt-get update && sudo apt-get install pkg-config libglew-dev zlib1g-dev libssl-dev libcrypt-dev libcurl4-openssl-dev libgtk-3-dev libfontconfig-dev ninja-build libpulse-dev libnotify-dev
run: sudo apt-get update && sudo apt-get install pkg-config libglew-dev zlib1g-dev libssl-dev libcrypt-dev libcurl4-openssl-dev libgtk-3-dev libfontconfig-dev ninja-build libpulse-dev


- name: Configure CMake
Expand Down Expand Up @@ -158,7 +158,7 @@ jobs:

- name: Install Linux dependencies
if: matrix.os == 'ubuntu-latest'
run: sudo apt-get update && sudo apt-get install pkg-config libglew-dev zlib1g-dev libssl-dev libcrypt-dev libcurl4-openssl-dev libgtk-3-dev libfontconfig-dev ninja-build libpulse-dev libnotify-dev
run: sudo apt-get update && sudo apt-get install pkg-config libglew-dev zlib1g-dev libssl-dev libcrypt-dev libcurl4-openssl-dev libgtk-3-dev libfontconfig-dev ninja-build libpulse-dev

- name: Install macos dependencies
if: matrix.os == 'macos-latest'
Expand Down Expand Up @@ -315,7 +315,7 @@ jobs:

- name: Install Linux dependencies
if: matrix.os == 'ubuntu-latest'
run: sudo apt-get update && sudo apt-get install pkg-config libglew-dev zlib1g-dev libssl-dev libcrypt-dev libcurl4-openssl-dev libgtk-3-dev libfontconfig-dev ninja-build libpulse-dev libnotify-dev
run: sudo apt-get update && sudo apt-get install pkg-config libglew-dev zlib1g-dev libssl-dev libcrypt-dev libcurl4-openssl-dev libgtk-3-dev libfontconfig-dev ninja-build libpulse-dev

- name: Install macos dependencies
if: matrix.os == 'macos-latest'
Expand Down
8 changes: 4 additions & 4 deletions aui.views/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ if (OPENGL_FOUND OR ANDROID OR IOS)
include_directories(${DBUS_INCLUDE_DIRS})
link_directories(${DBUS_LIBRARY_DIRS})

pkg_check_modules(LIBNOTIFY REQUIRED libnotify)
include_directories(${LIBNOTIFY_INCLUDE_DIRS})
link_directories(${LIBNOTIFY_LIBRARY_DIRS})
pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_INCLUDE_DIRS})

aui_link(aui.views PRIVATE X11::X11 X11::Xrandr X11::Xcursor X11::Xi ${DBUS_LIBRARIES} ${LIBNOTIFY_LIBRARIES} Fontconfig::Fontconfig)
aui_link(aui.views PRIVATE X11::X11 X11::Xrandr X11::Xcursor X11::Xi ${DBUS_LIBRARIES} ${GTK3_LIBRARIES} Fontconfig::Fontconfig)
endif ()

if (NOT AUI_PLATFORM_WINDOWS)
Expand Down
50 changes: 6 additions & 44 deletions aui.views/src/AUI/Platform/linux/ADBus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,50 +136,12 @@ void ADBus::processMessages() {
}

void aui::dbus::converter<aui::dbus::Variant>::iter_append(DBusMessageIter* iter, const Variant& t) {
DBusMessageIter sub;

if (std::holds_alternative<std::uint8_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::uint8_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::uint8_t>(&sub, std::get<std::uint8_t>(t));
} else if (std::holds_alternative<bool>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<bool>::signature.c_str(), &sub);
aui::dbus::iter_append<bool>(&sub, std::get<bool>(t));
} else if (std::holds_alternative<std::int16_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::int16_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::int16_t>(&sub, std::get<std::int16_t>(t));
} else if (std::holds_alternative<std::uint16_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::uint16_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::uint16_t>(&sub, std::get<std::uint16_t>(t));
} else if (std::holds_alternative<std::int32_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::int32_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::int32_t>(&sub, std::get<std::int32_t>(t));
} else if (std::holds_alternative<std::uint32_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::uint32_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::uint32_t>(&sub, std::get<std::uint32_t>(t));
} else if (std::holds_alternative<std::int64_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::int64_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::int64_t>(&sub, std::get<std::int64_t>(t));
} else if (std::holds_alternative<std::uint64_t>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::uint64_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::uint64_t>(&sub, std::get<std::uint64_t>(t));
} else if (std::holds_alternative<double>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<double>::signature.c_str(), &sub);
aui::dbus::iter_append<double>(&sub, std::get<double>(t));
} else if (std::holds_alternative<std::string>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::string>::signature.c_str(), &sub);
aui::dbus::iter_append<std::string>(&sub, std::get<std::string>(t));
} else if (std::holds_alternative<ObjectPath>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<ObjectPath>::signature.c_str(), &sub);
aui::dbus::iter_append<ObjectPath>(&sub, std::get<ObjectPath>(t));
} else if (std::holds_alternative<AVector<std::uint8_t>>(t)) {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<AVector<std::uint8_t>>::signature.c_str(), &sub);
aui::dbus::iter_append<AVector<std::uint8_t>>(&sub, std::get<AVector<std::uint8_t>>(t));
} else {
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<std::nullopt_t>::signature.c_str(), &sub);
aui::dbus::iter_append<std::nullopt_t>(&sub, std::nullopt);
}

dbus_message_iter_close_container(iter, &sub);
std::visit([&]<typename T>(const T& containedValue) {
DBusMessageIter sub;
dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, converter<T>::signature.c_str(), &sub);
AUI_DEFER { dbus_message_iter_close_container(iter, &sub); };
aui::dbus::iter_append<T>(&sub, containedValue);
}, t);
}

aui::dbus::Variant aui::dbus::converter<aui::dbus::Variant>::iter_get(DBusMessageIter* iter) {
Expand Down
117 changes: 55 additions & 62 deletions aui.views/src/AUI/Platform/linux/AMessageBoxImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#include <libnotify/notify.h>
#include <gtk/gtk.h>

#include "AUI/Common/AException.h"
#include "AUI/Platform/AMessageBox.h"
Expand All @@ -25,88 +25,81 @@ struct AMessageBoxContext {
GMainLoop *loop;
};

static void on_notification_closed(NotifyNotification *notification, gpointer user_data) {
const auto *data = static_cast<AMessageBoxContext *>(user_data);
g_main_loop_quit(data->loop);
}

static void on_action(NotifyNotification *notification, char *action, gpointer user_data) {
auto *data = static_cast<AMessageBoxContext *>(user_data);

if (strcmp(action, "yes") == 0) {
data->result = AMessageBox::ResultButton::YES;
} else if (strcmp(action, "no") == 0) {
data->result = AMessageBox::ResultButton::NO;
} else if (strcmp(action, "ok") == 0) {
data->result = AMessageBox::ResultButton::OK;
} else if (strcmp(action, "cancel") == 0) {
data->result = AMessageBox::ResultButton::CANCEL;
} else {
data->result = AMessageBox::ResultButton::INVALID;
static void on_response(GtkDialog *dialog, gint resp, gpointer user_data) {
auto *ctx = static_cast<AMessageBoxContext *>(user_data);

switch (resp) {
case GTK_RESPONSE_OK:
ctx->result = AMessageBox::ResultButton::OK;
break;
case GTK_RESPONSE_CANCEL:
ctx->result = AMessageBox::ResultButton::CANCEL;
break;
case GTK_RESPONSE_YES:
ctx->result = AMessageBox::ResultButton::YES;
break;
case GTK_RESPONSE_NO:
ctx->result = AMessageBox::ResultButton::NO;
break;
default:
ctx->result = AMessageBox::ResultButton::INVALID;
break;
}

g_main_loop_quit(data->loop);
g_main_loop_quit(ctx->loop);
}

AMessageBox::ResultButton AMessageBox::show(
AWindow *parent, const AString &title, const AString &message, AMessageBox::Icon icon, AMessageBox::Button b) {
if (!notify_init("AUI_App")) {
ALogger::err("AUI") << "Unable to initialize libnotify";
return AMessageBox::ResultButton::INVALID;
}

NotifyNotification *notification =
notify_notification_new(title.toStdString().c_str(), message.toStdString().c_str(), [icon] {
AMessageBox::ResultButton
AMessageBox::show(AWindow *parent, const AString &title, const AString &message, Icon icon, Button b) {
constexpr auto flags = static_cast<GtkDialogFlags>(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL);
GtkWidget *dialog = gtk_message_dialog_new(
nullptr, flags,
[icon] {
switch (icon) {
case Icon::INFO:
return "dialog-information";
return GTK_MESSAGE_INFO;
case Icon::WARNING:
return "dialog-warning";
return GTK_MESSAGE_WARNING;
case Icon::CRITICAL:
return "dialog-error";
return GTK_MESSAGE_ERROR;
default:
return "dialog-question";
case Icon::NONE:
return GTK_MESSAGE_OTHER;
}
}());

AMessageBoxContext c {};
c.result = ResultButton::INVALID;
c.loop = g_main_loop_new(nullptr, FALSE);

notify_notification_set_urgency(notification, NOTIFY_URGENCY_CRITICAL);
}(),
GTK_BUTTONS_NONE, "%s", message.toUtf8().data());

if (b == Button::YES_NO_CANCEL || b == Button::YES_NO) {
notify_notification_add_action(notification, "yes", "Yes"_i18n.toStdString().c_str(), on_action, &c, nullptr);

notify_notification_add_action(notification, "no", "No"_i18n.toStdString().c_str(), on_action, &c, nullptr);
gtk_dialog_add_button(GTK_DIALOG(dialog), "Yes"_i18n.toStdString().c_str(), GTK_RESPONSE_YES);
gtk_dialog_add_button(GTK_DIALOG(dialog), "No"_i18n.toStdString().c_str(), GTK_RESPONSE_NO);
}

if (b == Button::YES_NO_CANCEL) {
notify_notification_add_action(
notification, "cancel", "Cancel"_i18n.toStdString().c_str(), on_action, &c, nullptr);
}
} else if (b == Button::OK_CANCEL || b == Button::OK) {
notify_notification_add_action(notification, "ok", "OK"_i18n.toStdString().c_str(), on_action, &c, nullptr);
if (b == Button::OK || b == Button::OK_CANCEL) {
gtk_dialog_add_button(GTK_DIALOG(dialog), "OK"_i18n.toStdString().c_str(), GTK_RESPONSE_OK);
}

if (b == Button::OK_CANCEL) {
notify_notification_add_action(
notification, "cancel", "Cancel"_i18n.toStdString().c_str(), on_action, &c, nullptr);
}
if (b == Button::YES_NO_CANCEL || b == Button::OK_CANCEL) {
gtk_dialog_add_button(GTK_DIALOG(dialog), "Cancel"_i18n.toStdString().c_str(), GTK_RESPONSE_CANCEL);
}

g_signal_connect(notification, "closed", G_CALLBACK(on_notification_closed), &c);
gtk_window_set_title(GTK_WINDOW(dialog), title.toStdString().c_str());

if (!notify_notification_show(notification, nullptr)) {
std::cerr << "Failed to show notification" << std::endl;
g_object_unref(notification);
notify_uninit();
return ResultButton::INVALID;
}
AMessageBoxContext c {};
c.result = ResultButton::INVALID;
c.loop = g_main_loop_new(nullptr, FALSE);

// Connect the response signal
g_signal_connect(dialog, "response", G_CALLBACK(on_response), &c);

// Show the dialog
gtk_widget_show(dialog);

// Run the custom main loop
g_main_loop_run(c.loop);

g_object_unref(notification);
// Clean up
g_main_loop_unref(c.loop);
notify_uninit();
gtk_widget_destroy(dialog);

return c.result;
}

0 comments on commit 530efd7

Please sign in to comment.