multi click not fucked
This commit is contained in:
@@ -2,8 +2,9 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <sys/types.h>
|
||||
#include <vector>
|
||||
#include "gdkmm/pixbuf.h"
|
||||
@@ -39,6 +40,8 @@ struct NotifyMessage {
|
||||
int32_t expire_timeout;
|
||||
// Callback to invoke when an action is triggered
|
||||
std::function<void(const std::string& action_id)> on_action;
|
||||
// Guard to prevent multiple action invocations across mirrors
|
||||
std::shared_ptr<bool> actionInvoked;
|
||||
// image data (if any) from dbus
|
||||
std::optional<Glib::RefPtr<Gdk::Pixbuf>> imageData;
|
||||
};
|
||||
@@ -9,7 +9,7 @@
|
||||
#include "gdkmm/monitor.h"
|
||||
#include "gtkmm/window.h"
|
||||
|
||||
#define DEFAULT_NOTIFICATION_TIMEOUT 7000
|
||||
#define DEFAULT_NOTIFICATION_TIMEOUT 5000
|
||||
|
||||
|
||||
class BaseNotification : public Gtk::Window {
|
||||
@@ -35,7 +35,6 @@ class BaseNotification : public Gtk::Window {
|
||||
void pause_auto_close();
|
||||
void resume_auto_close();
|
||||
|
||||
// onClose signal can be added here if needed
|
||||
protected:
|
||||
uint64_t notificationId;
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@ void NotificationService::handle_notify(const Glib::VariantContainerBase ¶me
|
||||
notify.app_icon = app_icon;
|
||||
notify.summary = static_cast<std::string>(summary);
|
||||
notify.body = static_cast<std::string>(body);
|
||||
notify.actionInvoked = std::make_shared<bool>(false);
|
||||
|
||||
std::vector<std::string> actions_converted;
|
||||
actions_converted.reserve(actions.size());
|
||||
|
||||
@@ -93,7 +93,7 @@ void NotificationController::showSpotifyNotification(MprisPlayer2Message mpris)
|
||||
});
|
||||
|
||||
|
||||
notification->startAutoClose(10000);
|
||||
notification->startAutoClose(DEFAULT_NOTIFICATION_TIMEOUT);
|
||||
}
|
||||
|
||||
this->activeNotifications[id] = notifications;
|
||||
|
||||
@@ -88,8 +88,9 @@ NotificationWindow::NotificationWindow(uint64_t notificationId, std::shared_ptr<
|
||||
break;
|
||||
}
|
||||
|
||||
btn->signal_clicked().connect([this, action_id, cb = notify.on_action]() {
|
||||
if (cb) {
|
||||
btn->signal_clicked().connect([this, action_id, cb = notify.on_action, guard = notify.actionInvoked]() {
|
||||
if (cb && guard && !*guard) {
|
||||
*guard = true;
|
||||
cb(action_id);
|
||||
this->signal_close.emit(this->notificationId);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user