diff options
Diffstat (limited to 'tests/common/test_desktop.c')
| -rw-r--r-- | tests/common/test_desktop.c | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/tests/common/test_desktop.c b/tests/common/test_desktop.c index f65a9cd..89760fe 100644 --- a/tests/common/test_desktop.c +++ b/tests/common/test_desktop.c @@ -1,5 +1,6 @@ #define _GNU_SOURCE #include "common/backend.h" +#include "platform/freedesktop/dbus.h" #include "yasl/desktop.h" #include <assert.h> @@ -142,6 +143,8 @@ static void test_open_uri(const char *dir) static void test_appearance_fallback(void) { + assert(yasl_display_double_click_ms(NULL) == YASL_DOUBLE_CLICK_MS_DEFAULT); + assert(portal_double_click_ms() == 0); struct yasl_display display = {0}; assert(yasl_display_appearance(NULL) == 0); unsetenv("GTK_THEME"); @@ -160,6 +163,8 @@ static void test_appearance_fallback(void) } #if YASL_HAS_DBUS +static dbus_int32_t fake_slot = -1; + /* A fake notification server and Settings portal on a private bus. */ struct fake_bus { DBusConnection *conn; @@ -167,6 +172,7 @@ struct fake_bus { char app[64], title[64], body[64], entry[64]; int notifications; bool read_one; + bool kde; _Atomic bool stop; }; @@ -175,14 +181,28 @@ static void reply_setting(DBusConnection *c, DBusMessage *msg, bool nested) const char *ns = NULL, *key = NULL; dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &ns, DBUS_TYPE_STRING, &key, DBUS_TYPE_INVALID); - dbus_uint32_t value; - if (ns && key && strcmp(ns, "org.freedesktop.appearance") == 0 && - strcmp(key, "color-scheme") == 0) { - value = 1; - } else if (ns && key && strcmp(ns, "org.freedesktop.appearance") == 0 && - strcmp(key, "contrast") == 0) { - value = 1; + struct fake_bus *fb = dbus_connection_get_data(c, fake_slot); + dbus_uint32_t value = 1; + dbus_int32_t gnome_ms = 333; + const char *kde_ms = "250"; + int type = DBUS_TYPE_UINT32; + const void *data = &value; + if (!ns || !key) { + type = DBUS_TYPE_INVALID; + } else if (strcmp(ns, "org.freedesktop.appearance") == 0 && + (strcmp(key, "color-scheme") == 0 || strcmp(key, "contrast") == 0)) { + } else if (strcmp(ns, "org.gnome.desktop.peripherals.mouse") == 0 && + strcmp(key, "double-click") == 0) { + type = DBUS_TYPE_INT32; + data = &gnome_ms; + } else if (fb->kde && strcmp(ns, "org.kde.kdeglobals.KDE") == 0 && + strcmp(key, "DoubleClickInterval") == 0) { + type = DBUS_TYPE_STRING; + data = &kde_ms; } else { + type = DBUS_TYPE_INVALID; + } + if (type == DBUS_TYPE_INVALID) { DBusMessage *err = dbus_message_new_error(msg, "org.freedesktop.portal.Error.NotFound", "Requested setting not found"); dbus_connection_send(c, err, NULL); @@ -191,16 +211,17 @@ static void reply_setting(DBusConnection *c, DBusMessage *msg, bool nested) } DBusMessage *reply = dbus_message_new_method_return(msg); DBusMessageIter it, outer, inner; + const char signature[2] = {(char)type, '\0'}; dbus_message_iter_init_append(reply, &it); if (nested) { dbus_message_iter_open_container(&it, DBUS_TYPE_VARIANT, "v", &outer); - dbus_message_iter_open_container(&outer, DBUS_TYPE_VARIANT, "u", &inner); - dbus_message_iter_append_basic(&inner, DBUS_TYPE_UINT32, &value); + dbus_message_iter_open_container(&outer, DBUS_TYPE_VARIANT, signature, &inner); + dbus_message_iter_append_basic(&inner, type, data); dbus_message_iter_close_container(&outer, &inner); dbus_message_iter_close_container(&it, &outer); } else { - dbus_message_iter_open_container(&it, DBUS_TYPE_VARIANT, "u", &outer); - dbus_message_iter_append_basic(&outer, DBUS_TYPE_UINT32, &value); + dbus_message_iter_open_container(&it, DBUS_TYPE_VARIANT, signature, &outer); + dbus_message_iter_append_basic(&outer, type, data); dbus_message_iter_close_container(&it, &outer); } dbus_connection_send(c, reply, NULL); @@ -280,6 +301,8 @@ static void test_bus(const char *address) pthread_mutex_init(&fb.lock, NULL); fb.conn = dbus_connection_open_private(address, &err); assert(fb.conn && dbus_bus_register(fb.conn, &err)); + assert(dbus_connection_allocate_data_slot(&fake_slot)); + assert(dbus_connection_set_data(fb.conn, fake_slot, &fb, NULL)); assert(dbus_bus_request_name(fb.conn, "org.freedesktop.Notifications", 0, &err) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER); assert(dbus_bus_request_name(fb.conn, "org.freedesktop.portal.Desktop", 0, &err) == @@ -311,10 +334,18 @@ static void test_bus(const char *address) assert(yasl_display_appearance(&display) == want); unsetenv("GTK_THEME"); + /* A KDE value, sent as a string, wins over the GNOME key. */ + assert(portal_double_click_ms() == 333); + fb.kde = true; + assert(portal_double_click_ms() == 250); + fb.read_one = true; + assert(portal_double_click_ms() == 250); + fb.stop = true; pthread_join(thread, NULL); dbus_connection_close(fb.conn); dbus_connection_unref(fb.conn); + dbus_connection_free_data_slot(&fake_slot); pthread_mutex_destroy(&fb.lock); } #endif |
