summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2025-08-20 21:54:22 -0400
committerLuke from DC <[email protected]>2025-08-25 21:50:51 +0000
commitf3d64128881cdeb483de44e01ca090a238d1aa34 (patch)
treed627e41a634c87427bd7e4093feb23dec7ebc4fc
parentd348da7ea809e1bcfb9e408455271395a64c877a (diff)
downloadmate-notification-daemon-f3d64128881cdeb483de44e01ca090a238d1aa34.tar.bz2
mate-notification-daemon-f3d64128881cdeb483de44e01ca090a238d1aa34.tar.xz
themes: Display countdown on non-persistent notification messages
Countdown was only visible for notifications that had action buttons. This change adds a 'show-countdown' gsetting to display it instead on all non-persisntent notifications.
-rw-r--r--data/org.mate.NotificationDaemon.gschema.xml.in5
-rw-r--r--src/themes/coco/coco-theme.c56
-rw-r--r--src/themes/nodoka/nodoka-theme.c57
-rw-r--r--src/themes/slider/theme.c58
-rw-r--r--src/themes/standard/theme.c58
5 files changed, 162 insertions, 72 deletions
diff --git a/data/org.mate.NotificationDaemon.gschema.xml.in b/data/org.mate.NotificationDaemon.gschema.xml.in
index 0cd797f..a0c6cf8 100644
--- a/data/org.mate.NotificationDaemon.gschema.xml.in
+++ b/data/org.mate.NotificationDaemon.gschema.xml.in
@@ -41,5 +41,10 @@
<summary>Enable persistence</summary>
<description>Allow notifications to be persistent when requested by applications.</description>
</key>
+ <key name="show-countdown" type="b">
+ <default>false</default>
+ <summary>Show countdown</summary>
+ <description>Show countdown timer for all non-persistent notifications. If false, only show it for those waiting for user actions.</description>
+ </key>
</schema>
</schemalist>
diff --git a/src/themes/coco/coco-theme.c b/src/themes/coco/coco-theme.c
index 5524974..ff76d52 100644
--- a/src/themes/coco/coco-theme.c
+++ b/src/themes/coco/coco-theme.c
@@ -88,6 +88,7 @@ void move_notification(GtkWidget *nw, int x, int y);
void set_notification_timeout(GtkWindow *nw, glong timeout);
void set_notification_hints(GtkWindow *nw, GVariant *hints);
void notification_tick(GtkWindow *nw, glong remaining);
+static void create_pie_countdown(WindowData* windata);
#define STRIPE_WIDTH 32
#define WIDTH 300
@@ -658,24 +659,7 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key,
if (gtk_widget_get_visible(windata->actions_box))
{
gtk_widget_show(windata->actions_box);
-
- /* Don't try to re-add a pie_countdown */
- if (!windata->pie_countdown) {
- windata->pie_countdown = gtk_drawing_area_new();
- gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
- gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
- gtk_widget_show(windata->pie_countdown);
-
- #if GTK_CHECK_VERSION (4,0,0)
- gtk_widget_add_css_class (windata->pie_countdown, "countdown");
- #else
- gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
- #endif
-
- gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
- gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
- g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK (countdown_expose_cb), windata);
- }
+ create_pie_countdown(windata);
}
if (windata->action_icons) {
@@ -760,6 +744,27 @@ move_notification(GtkWidget *nw, int x, int y)
/* Hide notification */
/* Set notification timeout */
+static void create_pie_countdown(WindowData* windata)
+{
+ if (windata->pie_countdown != NULL)
+ return; /* Already created */
+
+ windata->pie_countdown = gtk_drawing_area_new();
+ gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
+ gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
+ gtk_widget_show(windata->pie_countdown);
+
+ #if GTK_CHECK_VERSION (4,0,0)
+ gtk_widget_add_css_class (windata->pie_countdown, "countdown");
+ #else
+ gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
+ #endif
+
+ gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
+ gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
+ g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(countdown_expose_cb), windata);
+}
+
void
set_notification_timeout(GtkWindow *nw, glong timeout)
{
@@ -767,6 +772,21 @@ set_notification_timeout(GtkWindow *nw, glong timeout)
g_assert(windata != NULL);
windata->timeout = timeout;
+
+ /* Check if we should show countdown for all timed notifications */
+ if (timeout > 0)
+ {
+ GSettings *gsettings = g_settings_new ("org.mate.NotificationDaemon");
+ gboolean show_countdown = g_settings_get_boolean (gsettings, "show-countdown");
+ g_object_unref (gsettings);
+
+ if (show_countdown)
+ {
+ /* Ensure actions_box is visible for countdown */
+ gtk_widget_show(windata->actions_box);
+ create_pie_countdown(windata);
+ }
+ }
}
/* Set notification hints */
diff --git a/src/themes/nodoka/nodoka-theme.c b/src/themes/nodoka/nodoka-theme.c
index 10801f5..d478862 100644
--- a/src/themes/nodoka/nodoka-theme.c
+++ b/src/themes/nodoka/nodoka-theme.c
@@ -101,6 +101,7 @@ void move_notification(GtkWidget *nw, int x, int y);
void set_notification_timeout(GtkWindow *nw, glong timeout);
void set_notification_hints(GtkWindow *nw, GVariant *hints);
void notification_tick(GtkWindow *nw, glong remaining);
+static void create_pie_countdown(WindowData* windata);
#define STRIPE_WIDTH 32
#define WIDTH 400
@@ -1064,24 +1065,7 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key,
{
gtk_widget_show(windata->actions_box);
update_content_hbox_visibility(windata);
-
- /* Don't try to re-add a pie_countdown */
- if (!windata->pie_countdown) {
- windata->pie_countdown = gtk_drawing_area_new();
- gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
- gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
- gtk_widget_show(windata->pie_countdown);
-
- #if GTK_CHECK_VERSION (4,0,0)
- gtk_widget_add_css_class (windata->pie_countdown, "countdown");
- #else
- gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
- #endif
-
- gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
- gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
- g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(countdown_expose_cb), windata);
- }
+ create_pie_countdown(windata);
}
if (windata->action_icons) {
@@ -1173,6 +1157,27 @@ move_notification(GtkWidget *nw, int x, int y)
/* Hide notification */
/* Set notification timeout */
+static void create_pie_countdown(WindowData* windata)
+{
+ if (windata->pie_countdown != NULL)
+ return; /* Already created */
+
+ windata->pie_countdown = gtk_drawing_area_new();
+ gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
+ gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
+ gtk_widget_show(windata->pie_countdown);
+
+ #if GTK_CHECK_VERSION (4,0,0)
+ gtk_widget_add_css_class (windata->pie_countdown, "countdown");
+ #else
+ gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
+ #endif
+
+ gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
+ gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
+ g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(countdown_expose_cb), windata);
+}
+
void
set_notification_timeout(GtkWindow *nw, glong timeout)
{
@@ -1180,6 +1185,22 @@ set_notification_timeout(GtkWindow *nw, glong timeout)
g_assert(windata != NULL);
windata->timeout = timeout;
+
+ /* Check if we should show countdown for all timed notifications */
+ if (timeout > 0)
+ {
+ GSettings *gsettings = g_settings_new ("org.mate.NotificationDaemon");
+ gboolean show_countdown = g_settings_get_boolean (gsettings, "show-countdown");
+ g_object_unref (gsettings);
+
+ if (show_countdown)
+ {
+ /* Ensure actions_box is visible for countdown */
+ gtk_widget_show(windata->actions_box);
+ update_content_hbox_visibility(windata);
+ create_pie_countdown(windata);
+ }
+ }
}
/* Set notification hints */
diff --git a/src/themes/slider/theme.c b/src/themes/slider/theme.c
index 94a8f46..4552af0 100644
--- a/src/themes/slider/theme.c
+++ b/src/themes/slider/theme.c
@@ -83,6 +83,8 @@ void set_notification_timeout(GtkWindow *nw, glong timeout);
void set_notification_hints(GtkWindow *nw, GVariant *hints);
void notification_tick(GtkWindow *nw, glong remaining);
gboolean get_always_stack(GtkWidget* nw);
+static gboolean on_countdown_draw (GtkWidget *widget, cairo_t *cr, WindowData *windata);
+static void create_pie_countdown(WindowData* windata);
#define WIDTH 400
#define DEFAULT_X0 0
@@ -490,6 +492,22 @@ void set_notification_timeout(GtkWindow *nw, glong timeout)
g_assert(windata != NULL);
windata->timeout = timeout;
+
+ /* Check if we should show countdown for all timed notifications */
+ if (timeout > 0)
+ {
+ GSettings *gsettings = g_settings_new ("org.mate.NotificationDaemon");
+ gboolean show_countdown = g_settings_get_boolean (gsettings, "show-countdown");
+ g_object_unref (gsettings);
+
+ if (show_countdown)
+ {
+ /* Ensure actions_box is visible for countdown */
+ gtk_widget_show(windata->actions_box);
+ update_content_hbox_visibility(windata);
+ create_pie_countdown(windata);
+ }
+ }
}
void notification_tick(GtkWindow* nw, glong remaining)
@@ -731,6 +749,27 @@ on_countdown_draw (GtkWidget *widget, cairo_t *cr, WindowData *windata)
return FALSE;
}
+static void create_pie_countdown(WindowData* windata)
+{
+ if (windata->pie_countdown != NULL)
+ return; /* Already created */
+
+ windata->pie_countdown = gtk_drawing_area_new();
+ gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
+ gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
+ gtk_widget_show(windata->pie_countdown);
+
+ #if GTK_CHECK_VERSION (4,0,0)
+ gtk_widget_add_css_class (windata->pie_countdown, "countdown");
+ #else
+ gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
+ #endif
+
+ gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
+ gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
+ g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(on_countdown_draw), windata);
+}
+
static void on_action_clicked(GtkWidget* w, GdkEventButton *event, ActionInvokedCb action_cb)
{
GtkWindow* nw = g_object_get_data(G_OBJECT(w), "_nw");
@@ -756,24 +795,7 @@ void add_notification_action(GtkWindow* nw, const char* text, const char* key, A
{
gtk_widget_show(windata->actions_box);
update_content_hbox_visibility(windata);
-
- /* Don't try to re-add a pie_countdown */
- if (!windata->pie_countdown) {
- windata->pie_countdown = gtk_drawing_area_new();
- gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
- gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
- gtk_widget_show(windata->pie_countdown);
-
- #if GTK_CHECK_VERSION (4,0,0)
- gtk_widget_add_css_class (windata->pie_countdown, "countdown");
- #else
- gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
- #endif
-
- gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
- gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
- g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(on_countdown_draw), windata);
- }
+ create_pie_countdown(windata);
}
if (windata->action_icons) {
diff --git a/src/themes/standard/theme.c b/src/themes/standard/theme.c
index 82c6b51..90171c6 100644
--- a/src/themes/standard/theme.c
+++ b/src/themes/standard/theme.c
@@ -100,6 +100,8 @@ void move_notification(GtkWidget *nw, int x, int y);
void set_notification_timeout(GtkWindow *nw, glong timeout);
void set_notification_hints(GtkWindow *nw, GVariant *hints);
void notification_tick(GtkWindow *nw, glong remaining);
+static void create_pie_countdown(WindowData* windata);
+static gboolean on_countdown_draw (GtkWidget *widget, cairo_t *cr, WindowData *windata);
//#define ENABLE_GRADIENT_LOOK
@@ -835,6 +837,27 @@ void set_notification_hints(GtkWindow *nw, GVariant *hints)
}
}
+static void create_pie_countdown(WindowData* windata)
+{
+ if (windata->pie_countdown != NULL)
+ return; /* Already created */
+
+ windata->pie_countdown = gtk_drawing_area_new();
+ gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
+ gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
+ gtk_widget_show(windata->pie_countdown);
+
+ #if GTK_CHECK_VERSION (4,0,0)
+ gtk_widget_add_css_class (windata->pie_countdown, "countdown");
+ #else
+ gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
+ #endif
+
+ gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
+ gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
+ g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(on_countdown_draw), windata);
+}
+
void set_notification_timeout(GtkWindow* nw, glong timeout)
{
WindowData* windata = g_object_get_data(G_OBJECT(nw), "windata");
@@ -842,6 +865,22 @@ void set_notification_timeout(GtkWindow* nw, glong timeout)
g_assert(windata != NULL);
windata->timeout = timeout;
+
+ /* Check if we should show countdown for all timed notifications */
+ if (timeout > 0)
+ {
+ GSettings *gsettings = g_settings_new ("org.mate.NotificationDaemon");
+ gboolean show_countdown = g_settings_get_boolean (gsettings, "show-countdown");
+ g_object_unref (gsettings);
+
+ if (show_countdown)
+ {
+ /* Ensure actions_box is visible for countdown */
+ gtk_widget_show(windata->actions_box);
+ update_content_hbox_visibility(windata);
+ create_pie_countdown(windata);
+ }
+ }
}
void notification_tick(GtkWindow* nw, glong remaining)
@@ -1066,24 +1105,7 @@ void add_notification_action(GtkWindow* nw, const char* text, const char* key, A
{
gtk_widget_show(windata->actions_box);
update_content_hbox_visibility(windata);
-
- /* Don't try to re-add a pie_countdown */
- if (!windata->pie_countdown) {
- windata->pie_countdown = gtk_drawing_area_new();
- gtk_widget_set_halign (windata->pie_countdown, GTK_ALIGN_END);
- gtk_widget_set_valign (windata->pie_countdown, GTK_ALIGN_CENTER);
- gtk_widget_show(windata->pie_countdown);
-
- #if GTK_CHECK_VERSION (4,0,0)
- gtk_widget_add_css_class (windata->pie_countdown, "countdown");
- #else
- gtk_style_context_add_class (gtk_widget_get_style_context (windata->pie_countdown), "countdown");
- #endif
-
- gtk_box_pack_end (GTK_BOX (windata->actions_box), windata->pie_countdown, FALSE, TRUE, 0);
- gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT);
- g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(on_countdown_draw), windata);
- }
+ create_pie_countdown(windata);
}
if (windata->action_icons) {