Skip to content

Commit 806ad51

Browse files
authored
Merge pull request #1505 from CelDaemon/master
Ensure PropertiesChanged signal is sent when handling SIGUSR*
2 parents ee63a72 + 129b52d commit 806ad51

File tree

5 files changed

+123
-24
lines changed

5 files changed

+123
-24
lines changed

src/dbus.c

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,17 @@ static const char *introspection_xml =
113113
" <annotation name=\"org.freedesktop.DBus.Property.EmitsChangedSignal\" value=\"true\"/>"
114114
" </property>"
115115

116-
" <property name=\"displayedLength\" type=\"u\" access=\"read\" />"
117-
" <property name=\"historyLength\" type=\"u\" access=\"read\" />"
118-
" <property name=\"waitingLength\" type=\"u\" access=\"read\" />"
116+
" <property name=\"displayedLength\" type=\"u\" access=\"read\">"
117+
" <annotation name=\"org.freedesktop.DBus.Property.EmitsChangedSignal\" value=\"true\"/>"
118+
" </property>"
119+
" <property name=\"historyLength\" type=\"u\" access=\"read\">"
120+
" <annotation name=\"org.freedesktop.DBus.Property.EmitsChangedSignal\" value=\"true\"/>"
121+
" </property>"
122+
123+
" <property name=\"waitingLength\" type=\"u\" access=\"read\">"
124+
" <annotation name=\"org.freedesktop.DBus.Property.EmitsChangedSignal\" value=\"true\"/>"
125+
" </property>"
126+
119127

120128
" <signal name=\"NotificationHistoryRemoved\">"
121129
" <arg name=\"id\" type=\"u\"/>"
@@ -993,6 +1001,39 @@ void signal_length_propertieschanged(void)
9931001
g_clear_pointer(&invalidated_builder, g_variant_builder_unref);
9941002
}
9951003

1004+
void signal_paused_propertieschanged(void)
1005+
{
1006+
if(!dbus_conn)
1007+
return;
1008+
1009+
struct dunst_status status = dunst_status_get();
1010+
1011+
GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE_VARDICT);
1012+
GVariantBuilder *invalidated_builder = g_variant_builder_new(G_VARIANT_TYPE_STRING_ARRAY);
1013+
1014+
g_variant_builder_add(builder,
1015+
"{sv}",
1016+
"paused", g_variant_new_boolean(status.pause_level != 0));
1017+
g_variant_builder_add(builder,
1018+
"{sv}",
1019+
"pauseLevel", g_variant_new_uint32(status.pause_level));
1020+
1021+
g_dbus_connection_emit_signal(dbus_conn,
1022+
NULL,
1023+
FDN_PATH,
1024+
PROPERTIES_IFAC,
1025+
"PropertiesChanged",
1026+
g_variant_new("(sa{sv}as)",
1027+
DUNST_IFAC,
1028+
builder,
1029+
invalidated_builder),
1030+
NULL);
1031+
1032+
g_clear_pointer(&builder, g_variant_builder_unref);
1033+
g_clear_pointer(&invalidated_builder, g_variant_builder_unref);
1034+
1035+
}
1036+
9961037
static void dbus_cb_Notify(
9971038
GDBusConnection *connection,
9981039
const gchar *sender,
@@ -1199,27 +1240,8 @@ gboolean dbus_cb_dunst_Properties_Set(GDBusConnection *connection,
11991240
dunst_status_int(S_PAUSE_LEVEL, targetPauseLevel);
12001241
wake_up();
12011242

1202-
GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE_VARDICT);
1203-
GVariantBuilder *invalidated_builder = g_variant_builder_new(G_VARIANT_TYPE_STRING_ARRAY);
1204-
g_variant_builder_add(builder,
1205-
"{sv}",
1206-
"paused", g_variant_new_boolean(targetPauseLevel != 0));
1207-
g_variant_builder_add(builder,
1208-
"{sv}",
1209-
"pauseLevel", g_variant_new_uint32(targetPauseLevel));
1210-
g_dbus_connection_emit_signal(connection,
1211-
NULL,
1212-
object_path,
1213-
PROPERTIES_IFAC,
1214-
"PropertiesChanged",
1215-
g_variant_new("(sa{sv}as)",
1216-
interface_name,
1217-
builder,
1218-
invalidated_builder),
1219-
NULL);
1220-
1221-
g_clear_pointer(&builder, g_variant_builder_unref);
1222-
g_clear_pointer(&invalidated_builder, g_variant_builder_unref);
1243+
signal_paused_propertieschanged();
1244+
12231245
return true;
12241246
}
12251247

src/dbus.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ void dbus_teardown(int id);
2121
void signal_notification_closed(struct notification *n, enum reason reason);
2222
void signal_action_invoked(const struct notification *n, const char *identifier);
2323
void signal_length_propertieschanged(void);
24+
void signal_paused_propertieschanged(void);
2425
void signal_history_removed(guint id);
2526
void signal_history_cleared(guint n);
2627
void signal_config_reloaded(char **const configs);

src/dunst.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ gboolean pause_signal(gpointer data)
184184
dunst_status_int(S_PAUSE_LEVEL, MAX_PAUSE_LEVEL);
185185
wake_up();
186186

187+
signal_paused_propertieschanged();
188+
187189
return G_SOURCE_CONTINUE;
188190
}
189191

@@ -194,6 +196,8 @@ gboolean unpause_signal(gpointer data)
194196
dunst_status_int(S_PAUSE_LEVEL, 0);
195197
wake_up();
196198

199+
signal_paused_propertieschanged();
200+
197201
return G_SOURCE_CONTINUE;
198202
}
199203

src/dunst.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ int dunst_main(int argc, char *argv[]);
4747
void usage(int exit_status);
4848
void print_version(void);
4949

50+
gboolean pause_signal(gpointer data);
51+
gboolean unpause_signal(gpointer data);
5052
gboolean quit_signal(gpointer data);
5153

5254
#endif

test/dbus.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,74 @@ TEST test_signal_length_propertieschanged(void)
13821382
PASS();
13831383
}
13841384

1385+
TEST test_signal_paused_propertieschanged_pause(void)
1386+
{
1387+
struct signal_propertieschanged sig = {NULL, NULL, NULL, -1};
1388+
1389+
dbus_signal_subscribe_propertieschanged(&sig);
1390+
1391+
pause_signal(NULL);
1392+
1393+
uint waiting = 0;
1394+
1395+
while(!sig.interface && waiting < 2000) {
1396+
usleep(500);
1397+
waiting++;
1398+
}
1399+
1400+
ASSERT_STR_EQ(sig.interface, DUNST_IFAC);
1401+
1402+
gboolean paused;
1403+
g_variant_lookup(sig.array_dict_sv_data, "paused", "b", &paused);
1404+
1405+
ASSERT_EQ(paused, TRUE);
1406+
1407+
guint32 pause_level;
1408+
g_variant_lookup(sig.array_dict_sv_data, "pauseLevel", "u", &pause_level);
1409+
1410+
ASSERT_EQ(pause_level, 100);
1411+
1412+
g_free(sig.interface);
1413+
g_variant_unref(sig.array_dict_sv_data);
1414+
g_variant_unref(sig.array_s_data);
1415+
dbus_signal_unsubscribe_propertieschanged(&sig);
1416+
PASS();
1417+
}
1418+
1419+
TEST test_signal_paused_propertieschanged_unpause(void)
1420+
{
1421+
struct signal_propertieschanged sig = {NULL, NULL, NULL, -1};
1422+
1423+
dbus_signal_subscribe_propertieschanged(&sig);
1424+
1425+
unpause_signal(NULL);
1426+
1427+
uint waiting = 0;
1428+
1429+
while(!sig.interface && waiting < 2000) {
1430+
usleep(500);
1431+
waiting++;
1432+
}
1433+
1434+
ASSERT_STR_EQ(sig.interface, DUNST_IFAC);
1435+
1436+
gboolean paused;
1437+
g_variant_lookup(sig.array_dict_sv_data, "paused", "b", &paused);
1438+
1439+
ASSERT_EQ(paused, FALSE);
1440+
1441+
guint32 pause_level;
1442+
g_variant_lookup(sig.array_dict_sv_data, "pauseLevel", "u", &pause_level);
1443+
1444+
ASSERT_EQ(pause_level, 0);
1445+
1446+
g_free(sig.interface);
1447+
g_variant_unref(sig.array_dict_sv_data);
1448+
g_variant_unref(sig.array_s_data);
1449+
dbus_signal_unsubscribe_propertieschanged(&sig);
1450+
PASS();
1451+
}
1452+
13851453
TEST test_close_and_signal(void)
13861454
{
13871455
GVariant *data, *ret;
@@ -1660,6 +1728,8 @@ gpointer run_threaded_tests(gpointer data)
16601728
RUN_TEST(test_close_and_signal);
16611729
RUN_TEST(test_signal_actioninvoked);
16621730
RUN_TEST(test_signal_length_propertieschanged);
1731+
RUN_TEST(test_signal_paused_propertieschanged_pause);
1732+
RUN_TEST(test_signal_paused_propertieschanged_unpause);
16631733
RUN_TEST(test_timeout_overflow);
16641734
RUN_TEST(test_override_dbus_timeout);
16651735
RUN_TEST(test_match_dbus_timeout);

0 commit comments

Comments
 (0)