diff options
author | Victor Kareh <[email protected]> | 2025-08-20 21:54:22 -0400 |
---|---|---|
committer | Luke from DC <[email protected]> | 2025-08-25 21:50:51 +0000 |
commit | f3d64128881cdeb483de44e01ca090a238d1aa34 (patch) | |
tree | d627e41a634c87427bd7e4093feb23dec7ebc4fc | |
parent | d348da7ea809e1bcfb9e408455271395a64c877a (diff) | |
download | mate-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.in | 5 | ||||
-rw-r--r-- | src/themes/coco/coco-theme.c | 56 | ||||
-rw-r--r-- | src/themes/nodoka/nodoka-theme.c | 57 | ||||
-rw-r--r-- | src/themes/slider/theme.c | 58 | ||||
-rw-r--r-- | src/themes/standard/theme.c | 58 |
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) { |