Merge pull request #732 from matclab/731-ignore-dbus-close-setting
Add ignore_dbusclose settings
This commit is contained in:
		
						commit
						eb253a4547
					
				
							
								
								
									
										1
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								config.h
									
									
									
									
									
								
							| @ -38,6 +38,7 @@ struct settings defaults = { | ||||
| .history_length = 20,        /* max amount of notifications kept in history */ | ||||
| .show_indicators = true, | ||||
| .word_wrap = false, | ||||
| .ignore_dbusclose = false, | ||||
| .ellipsize = ELLIPSE_MIDDLE, | ||||
| .ignore_newline = false, | ||||
| .line_height = 0,            /* if line height < font height, it will be raised to font height */ | ||||
|  | ||||
| @ -515,6 +515,13 @@ Close all notifications. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| 
 | ||||
| =item B<ignore_dbusclose> (default: false) | ||||
| 
 | ||||
| Ignore the dbus closeNotification message. This is useful to enforce the timeout | ||||
| set by dunst configuration. Without this parameter, an application may close | ||||
| the notification sent before the user defined timeout. | ||||
| 
 | ||||
| =back | ||||
| 
 | ||||
| =head2 Shortcut section B<DEPRECATED SEE DUNSTCTL> | ||||
|  | ||||
							
								
								
									
										6
									
								
								dunstrc
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								dunstrc
									
									
									
									
									
								
							| @ -224,6 +224,12 @@ | ||||
|     # notification height to avoid clipping text and/or icons. | ||||
|     corner_radius = 0 | ||||
| 
 | ||||
|     # Ignore the dbus closeNotification message. | ||||
|     # Useful to enforce the timeout set by dunst configuration. Without this | ||||
|     # parameter, an application may close the notification sent before the  | ||||
|     # user defined timeout. | ||||
|     ignore_dbusclose = false | ||||
| 
 | ||||
|     ### Legacy | ||||
| 
 | ||||
|     # Use the Xinerama extension instead of RandR for multi-monitor support. | ||||
|  | ||||
							
								
								
									
										14
									
								
								src/dbus.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/dbus.c
									
									
									
									
									
								
							| @ -494,7 +494,17 @@ static void dbus_cb_CloseNotification( | ||||
| { | ||||
|         guint32 id; | ||||
|         g_variant_get(parameters, "(u)", &id); | ||||
|         queues_notification_close_id(id, REASON_SIG); | ||||
|         if (settings.ignore_dbusclose) { | ||||
|                 LOG_D("Ignoring CloseNotification message"); | ||||
|                 // Stay commpliant by lying to the sender,  telling him we closed the notification 
 | ||||
|                 if (id > 0) { | ||||
|                         struct notification *n = queues_get_by_id(id); | ||||
|                         if (n)  | ||||
|                                 signal_notification_closed(n, REASON_SIG); | ||||
|                 } | ||||
|         } else { | ||||
|                 queues_notification_close_id(id, REASON_SIG); | ||||
|         } | ||||
|         wake_up(); | ||||
|         g_dbus_method_invocation_return_value(invocation, NULL); | ||||
|         g_dbus_connection_flush(connection, NULL, NULL, NULL); | ||||
| @ -515,8 +525,6 @@ static void dbus_cb_GetServerInformation( | ||||
| void signal_notification_closed(struct notification *n, enum reason reason) | ||||
| { | ||||
|         if (!n->dbus_valid) { | ||||
|                 LOG_W("Closing notification '%s' not supported. " | ||||
|                       "Notification already closed.", n->summary); | ||||
|                 return; | ||||
|         } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										23
									
								
								src/queues.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								src/queues.c
									
									
									
									
									
								
							| @ -506,6 +506,27 @@ gint64 queues_get_next_datachange(gint64 time) | ||||
|         return sleep != G_MAXINT64 ? sleep : -1; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* see queues.h */ | ||||
| struct notification* queues_get_by_id(int id) | ||||
| { | ||||
|         assert(id > 0); | ||||
| 
 | ||||
|         GQueue *recqueues[] = { displayed, waiting, history }; | ||||
|         for (int i = 0; i < sizeof(recqueues)/sizeof(GQueue*); i++) { | ||||
|                 for (GList *iter = g_queue_peek_head_link(recqueues[i]); iter; | ||||
|                      iter = iter->next) { | ||||
|                         struct notification *cur = iter->data; | ||||
|                         if (cur->id == id) | ||||
|                                 return cur; | ||||
|                 } | ||||
|         } | ||||
| 
 | ||||
|         return NULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Helper function for queues_teardown() to free a single notification | ||||
|  * | ||||
| @ -527,4 +548,6 @@ void queues_teardown(void) | ||||
|         g_queue_free_full(waiting, teardown_notification); | ||||
|         waiting = NULL; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ | ||||
|  | ||||
							
								
								
									
										11
									
								
								src/queues.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/queues.h
									
									
									
									
									
								
							| @ -145,6 +145,17 @@ void queues_update(struct dunst_status status); | ||||
|  */ | ||||
| gint64 queues_get_next_datachange(gint64 time); | ||||
| 
 | ||||
| /**
 | ||||
|  * Get the notification which has the given id in the displayed and waiting queue or | ||||
|  * NULL if not found | ||||
|  * | ||||
|  * @param the id searched for. | ||||
|  * | ||||
|  * @return the `id` notification  or NULL | ||||
|  */ | ||||
| struct notification* queues_get_by_id(int id); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Remove all notifications from all list and free the notifications | ||||
|  * | ||||
|  | ||||
| @ -176,6 +176,11 @@ void load_settings(char *cmdline_config_path) | ||||
|                 "word_wrap", "-word_wrap", defaults.word_wrap, | ||||
|                 "Truncating long lines or do word wrap" | ||||
|         ); | ||||
|         settings.ignore_dbusclose = option_get_bool( | ||||
|                 "global", | ||||
|                 "ignore_dbusclose", "-ignore_dbusclose", defaults.ignore_dbusclose, | ||||
|                 "Ignore dbus CloseNotification events" | ||||
|         ); | ||||
| 
 | ||||
|         { | ||||
|                 char *c = option_get_string( | ||||
|  | ||||
| @ -59,6 +59,7 @@ struct settings { | ||||
|         int history_length; | ||||
|         int show_indicators; | ||||
|         int word_wrap; | ||||
|         int ignore_dbusclose; | ||||
|         enum ellipsize ellipsize; | ||||
|         int ignore_newline; | ||||
|         int line_height; | ||||
|  | ||||
| @ -740,6 +740,29 @@ TEST test_queues_timeout_before_paused(void) | ||||
|         PASS(); | ||||
| } | ||||
| 
 | ||||
| TEST test_queue_find_by_id(void) | ||||
| { | ||||
|         struct notification *n; | ||||
|         int id; | ||||
|         queues_init(); | ||||
| 
 | ||||
|         n = test_notification("n", 0); | ||||
|         queues_notification_insert(n); | ||||
|         n = test_notification("n1", 0); | ||||
|         queues_notification_insert(n); | ||||
|         id = n->id; | ||||
|         n = test_notification("n2", 0); | ||||
|         queues_notification_insert(n); | ||||
| 
 | ||||
|         n = queues_get_by_id(id); | ||||
| 
 | ||||
|         ASSERT(n->id == id); | ||||
|         ASSERT(!strncmp(n->summary, "n1", 2)); | ||||
| 
 | ||||
|         queues_teardown(); | ||||
|         PASS(); | ||||
| } | ||||
| 
 | ||||
| SUITE(suite_queues) | ||||
| { | ||||
|         settings.icon_path = ""; | ||||
| @ -770,6 +793,7 @@ SUITE(suite_queues) | ||||
|         RUN_TEST(test_queues_update_seeping); | ||||
|         RUN_TEST(test_queues_update_xmore); | ||||
|         RUN_TEST(test_queues_timeout_before_paused); | ||||
|         RUN_TEST(test_queue_find_by_id); | ||||
| 
 | ||||
|         settings.icon_path = NULL; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Nikos Tsipinakis
						Nikos Tsipinakis