Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions src/SDL_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,36 @@ bool SDL_ListAdd(SDL_ListNode **head, void *ent)
return true;
}

// Append
bool SDL_ListAppend(SDL_ListNode **head, void *ent)
{
SDL_ListNode *cursor;
SDL_ListNode *node;

if (!head) {
return false;
}

node = (SDL_ListNode *)SDL_malloc(sizeof(*node));
if (!node) {
return false;
}
node->entry = ent;
node->next = NULL;

if (*head) {
cursor = *head;
while (cursor->next) {
cursor = cursor->next;
}
cursor->next = node;
} else {
*head = node;
}

return true;
}

// Pop from end as a FIFO (if add with SDL_ListAdd)
void SDL_ListPop(SDL_ListNode **head, void **ent)
{
Expand Down Expand Up @@ -84,3 +114,17 @@ void SDL_ListClear(SDL_ListNode **head)
SDL_free(tmp);
}
}

int SDL_ListCountEntries(SDL_ListNode **head) {
SDL_ListNode *l;
int i;

i = 0;
l = *head;
while (l) {
i++;
l = l->next;
}

return i;
}
2 changes: 2 additions & 0 deletions src/SDL_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@ typedef struct SDL_ListNode
} SDL_ListNode;

bool SDL_ListAdd(SDL_ListNode **head, void *ent);
bool SDL_ListAppend(SDL_ListNode **head, void *ent);
void SDL_ListPop(SDL_ListNode **head, void **ent);
void SDL_ListRemove(SDL_ListNode **head, void *ent);
void SDL_ListClear(SDL_ListNode **head);
int SDL_ListCountEntries(SDL_ListNode **head);

#endif // SDL_list_h_
840 changes: 797 additions & 43 deletions src/core/linux/SDL_dbus.c

Large diffs are not rendered by default.

52 changes: 50 additions & 2 deletions src/core/linux/SDL_dbus.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,20 @@

#ifdef HAVE_DBUS_DBUS_H
#define SDL_USE_LIBDBUS 1
#include "../../SDL_list.h"
#include <dbus/dbus.h>

#ifndef DBUS_TIMEOUT_USE_DEFAULT
#define DBUS_TIMEOUT_USE_DEFAULT -1
#endif
#ifndef DBUS_TIMEOUT_INFINITE
#define DBUS_TIMEOUT_INFINITE ((int) 0x7fffffff)
#define DBUS_TIMEOUT_INFINITE ((int)0x7fffffff)
#endif
#ifndef DBUS_TYPE_UNIX_FD
#define DBUS_TYPE_UNIX_FD ((int) 'h')
#define DBUS_TYPE_UNIX_FD ((int)'h')
#endif
#ifndef DBUS_ERROR_UNKNOWN_PROPERTY
#define DBUS_ERROR_UNKNOWN_PROPERTY "org.freedesktop.DBus.Error.UnknownProperty"
#endif

typedef struct SDL_DBusContext
Expand All @@ -47,6 +51,7 @@ typedef struct SDL_DBusContext
dbus_bool_t (*bus_register)(DBusConnection *, DBusError *);
void (*bus_add_match)(DBusConnection *, const char *, DBusError *);
void (*bus_remove_match)(DBusConnection *, const char *, DBusError *);
int (*bus_request_name)(DBusConnection *, const char *, unsigned int, DBusError *);
const char *(*bus_get_unique_name)(DBusConnection *);
DBusConnection *(*connection_open_private)(const char *, DBusError *);
void (*connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t);
Expand All @@ -65,17 +70,22 @@ typedef struct SDL_DBusContext
dbus_bool_t (*connection_read_write_dispatch)(DBusConnection *, int);
DBusDispatchStatus (*connection_dispatch)(DBusConnection *);
dbus_bool_t (*message_is_signal)(DBusMessage *, const char *, const char *);
dbus_bool_t (*message_is_method_call)(DBusMessage *, const char *, const char *);
dbus_bool_t (*message_has_path)(DBusMessage *, const char *);
DBusMessage *(*message_new_error)(DBusMessage *, const char *, const char *);
DBusMessage *(*message_new_method_call)(const char *, const char *, const char *, const char *);
DBusMessage *(*message_new_method_return)(DBusMessage *);
DBusMessage *(*message_new_signal)(const char *, const char *, const char *);
dbus_bool_t (*message_append_args)(DBusMessage *, int, ...);
dbus_bool_t (*message_append_args_valist)(DBusMessage *, int, va_list);
void (*message_iter_init_append)(DBusMessage *, DBusMessageIter *);
dbus_bool_t (*message_iter_open_container)(DBusMessageIter *, int, const char *, DBusMessageIter *);
dbus_bool_t (*message_iter_append_basic)(DBusMessageIter *, int, const void *);
dbus_bool_t (*message_iter_append_fixed_array)(DBusMessageIter *, int, const void *, int);
dbus_bool_t (*message_iter_close_container)(DBusMessageIter *, DBusMessageIter *);
dbus_bool_t (*message_get_args)(DBusMessage *, DBusError *, int, ...);
dbus_bool_t (*message_get_args_valist)(DBusMessage *, DBusError *, int, va_list);
void (*message_iter_get_fixed_array)(DBusMessageIter *, void *, int *);
dbus_bool_t (*message_iter_init)(DBusMessage *, DBusMessageIter *);
dbus_bool_t (*message_iter_next)(DBusMessageIter *);
void (*message_iter_get_basic)(DBusMessageIter *, void *);
Expand All @@ -95,6 +105,39 @@ typedef struct SDL_DBusContext

} SDL_DBusContext;

typedef enum SDL_DBusMenuItemType
{
SDL_DBUS_MENU_ITEM_TYPE_NORMAL,
SDL_DBUS_MENU_ITEM_TYPE_SEPERATOR,
SDL_DBUS_MENU_ITEM_TYPE_CHECKBOX
} SDL_DBusMenuItemType;

typedef enum SDL_DBusMenuItemFlags
{
SDL_DBUS_MENU_ITEM_FLAGS_NONE = 0,
SDL_DBUS_MENU_ITEM_FLAGS_DISABLED = 1 << 0,
SDL_DBUS_MENU_ITEM_FLAGS_CHECKED = 1 << 1,
SDL_DBUS_MENU_ITEM_FLAGS_BAR_ITEM = 1 << 2
} SDL_DBusMenuItemFlags;

/* This struct is meant to be in an SDL_ListNode just like sub_menu */
typedef struct SDL_DBusMenuItem
{
const char *utf8 /* Text */;
SDL_DBusMenuItemType type;
SDL_DBusMenuItemFlags flags;
void *cb_data;
void (*cb)(struct SDL_DBusMenuItem *, void *);
SDL_ListNode *sub_menu; /* NULL if no submenu */
void *udata;
void *udata2;

/* Internal use */
SDL_DBusContext *dbus;
long id;
unsigned long revision;
} SDL_DBusMenuItem;

extern void SDL_DBus_Init(void);
extern void SDL_DBus_Quit(void);
extern SDL_DBusContext *SDL_DBus_GetContext(void);
Expand All @@ -119,6 +162,11 @@ extern char **SDL_DBus_DocumentsPortalRetrieveFiles(const char *key, int *files_

extern int SDL_DBus_CameraPortalRequestAccess(void);

/* Menu functions */
extern void SDL_DBus_InitMenuItemInternals(SDL_DBusMenuItem *item);
extern const char *SDL_DBus_ExportMenu(SDL_DBusContext *ctx, DBusConnection *conn, SDL_ListNode *menu);
extern void SDL_DBus_UpdateMenu(SDL_DBusContext *ctx, DBusConnection *conn, SDL_ListNode *menu);

#endif // HAVE_DBUS_DBUS_H

#endif // SDL_dbus_h_
2 changes: 1 addition & 1 deletion src/events/SDL_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -1486,7 +1486,7 @@ void SDL_PumpEventMaintenance(void)
SDL_UpdateCursorAnimation();

SDL_UpdateTrays();

SDL_SendPendingSignalEvents(); // in case we had a signal handler fire, etc.
}

Expand Down
6 changes: 5 additions & 1 deletion src/tray/SDL_tray_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void SDL_RegisterTray(SDL_Tray *tray)
void SDL_UnregisterTray(SDL_Tray *tray)
{
SDL_assert(SDL_ObjectValid(tray, SDL_OBJECT_TYPE_TRAY));

SDL_SetObjectValid(tray, SDL_OBJECT_TYPE_TRAY, false);

--active_trays;
Expand Down Expand Up @@ -91,3 +91,7 @@ bool SDL_HasActiveTrays(void)
{
return (active_trays > 0);
}

int SDL_GetActiveTrayCount(void) {
return active_trays;
}
1 change: 1 addition & 0 deletions src/tray/SDL_tray_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ extern void SDL_RegisterTray(SDL_Tray *tray);
extern void SDL_UnregisterTray(SDL_Tray *tray);
extern void SDL_CleanupTrays(void);
extern bool SDL_HasActiveTrays(void);
extern int SDL_GetActiveTrayCount(void);
Loading
Loading