summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/SDL2/src/core/linux
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/SDL2/src/core/linux')
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_dbus.c239
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_dbus.h82
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_evdev.c873
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_evdev.h39
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_fcitx.c553
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_fcitx.h40
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_ibus.c682
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_ibus.h58
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_ime.c138
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_ime.h38
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_udev.c539
-rw-r--r--3rdparty/SDL2/src/core/linux/SDL_udev.h119
12 files changed, 0 insertions, 3400 deletions
diff --git a/3rdparty/SDL2/src/core/linux/SDL_dbus.c b/3rdparty/SDL2/src/core/linux/SDL_dbus.c
deleted file mode 100644
index ab73ca17c93..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_dbus.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-#include "../../SDL_internal.h"
-#include "SDL_dbus.h"
-
-#if SDL_USE_LIBDBUS
-/* we never link directly to libdbus. */
-#include "SDL_loadso.h"
-static const char *dbus_library = "libdbus-1.so.3";
-static void *dbus_handle = NULL;
-static unsigned int screensaver_cookie = 0;
-static SDL_DBusContext dbus;
-
-static int
-LoadDBUSSyms(void)
-{
- #define SDL_DBUS_SYM2(x, y) \
- if (!(dbus.x = SDL_LoadFunction(dbus_handle, #y))) return -1
-
- #define SDL_DBUS_SYM(x) \
- SDL_DBUS_SYM2(x, dbus_##x)
-
- SDL_DBUS_SYM(bus_get_private);
- SDL_DBUS_SYM(bus_register);
- SDL_DBUS_SYM(bus_add_match);
- SDL_DBUS_SYM(connection_open_private);
- SDL_DBUS_SYM(connection_set_exit_on_disconnect);
- SDL_DBUS_SYM(connection_get_is_connected);
- SDL_DBUS_SYM(connection_add_filter);
- SDL_DBUS_SYM(connection_try_register_object_path);
- SDL_DBUS_SYM(connection_send);
- SDL_DBUS_SYM(connection_send_with_reply_and_block);
- SDL_DBUS_SYM(connection_close);
- SDL_DBUS_SYM(connection_unref);
- SDL_DBUS_SYM(connection_flush);
- SDL_DBUS_SYM(connection_read_write);
- SDL_DBUS_SYM(connection_dispatch);
- SDL_DBUS_SYM(message_is_signal);
- SDL_DBUS_SYM(message_new_method_call);
- SDL_DBUS_SYM(message_append_args);
- SDL_DBUS_SYM(message_get_args);
- SDL_DBUS_SYM(message_iter_init);
- SDL_DBUS_SYM(message_iter_next);
- SDL_DBUS_SYM(message_iter_get_basic);
- SDL_DBUS_SYM(message_iter_get_arg_type);
- SDL_DBUS_SYM(message_iter_recurse);
- SDL_DBUS_SYM(message_unref);
- SDL_DBUS_SYM(error_init);
- SDL_DBUS_SYM(error_is_set);
- SDL_DBUS_SYM(error_free);
- SDL_DBUS_SYM(get_local_machine_id);
- SDL_DBUS_SYM(free);
- SDL_DBUS_SYM(shutdown);
-
- #undef SDL_DBUS_SYM
- #undef SDL_DBUS_SYM2
-
- return 0;
-}
-
-static void
-UnloadDBUSLibrary(void)
-{
- if (dbus_handle != NULL) {
- SDL_UnloadObject(dbus_handle);
- dbus_handle = NULL;
- }
-}
-
-static int
-LoadDBUSLibrary(void)
-{
- int retval = 0;
- if (dbus_handle == NULL) {
- dbus_handle = SDL_LoadObject(dbus_library);
- if (dbus_handle == NULL) {
- retval = -1;
- /* Don't call SDL_SetError(): SDL_LoadObject already did. */
- } else {
- retval = LoadDBUSSyms();
- if (retval < 0) {
- UnloadDBUSLibrary();
- }
- }
- }
-
- return retval;
-}
-
-void
-SDL_DBus_Init(void)
-{
- if (!dbus.session_conn && LoadDBUSLibrary() != -1) {
- DBusError err;
- dbus.error_init(&err);
- dbus.session_conn = dbus.bus_get_private(DBUS_BUS_SESSION, &err);
- if (dbus.error_is_set(&err)) {
- dbus.error_free(&err);
- if (dbus.session_conn) {
- dbus.connection_unref(dbus.session_conn);
- dbus.session_conn = NULL;
- }
- return; /* oh well */
- }
- dbus.connection_set_exit_on_disconnect(dbus.session_conn, 0);
- }
-}
-
-void
-SDL_DBus_Quit(void)
-{
- if (dbus.session_conn) {
- dbus.connection_close(dbus.session_conn);
- dbus.connection_unref(dbus.session_conn);
- dbus.shutdown();
- SDL_memset(&dbus, 0, sizeof(dbus));
- }
- UnloadDBUSLibrary();
-}
-
-SDL_DBusContext *
-SDL_DBus_GetContext(void)
-{
- if(!dbus_handle || !dbus.session_conn){
- SDL_DBus_Init();
- }
-
- if(dbus_handle && dbus.session_conn){
- return &dbus;
- } else {
- return NULL;
- }
-}
-
-void
-SDL_DBus_ScreensaverTickle(void)
-{
- DBusConnection *conn = dbus.session_conn;
- if (conn != NULL) {
- DBusMessage *msg = dbus.message_new_method_call("org.gnome.ScreenSaver",
- "/org/gnome/ScreenSaver",
- "org.gnome.ScreenSaver",
- "SimulateUserActivity");
- if (msg != NULL) {
- if (dbus.connection_send(conn, msg, NULL)) {
- dbus.connection_flush(conn);
- }
- dbus.message_unref(msg);
- }
- }
-}
-
-SDL_bool
-SDL_DBus_ScreensaverInhibit(SDL_bool inhibit)
-{
- DBusConnection *conn = dbus.session_conn;
-
- if (conn == NULL)
- return SDL_FALSE;
-
- if (inhibit &&
- screensaver_cookie != 0)
- return SDL_TRUE;
- if (!inhibit &&
- screensaver_cookie == 0)
- return SDL_TRUE;
-
- if (inhibit) {
- const char *app = "My SDL application";
- const char *reason = "Playing a game";
-
- DBusMessage *msg = dbus.message_new_method_call("org.freedesktop.ScreenSaver",
- "/org/freedesktop/ScreenSaver",
- "org.freedesktop.ScreenSaver",
- "Inhibit");
- if (msg != NULL) {
- dbus.message_append_args (msg,
- DBUS_TYPE_STRING, &app,
- DBUS_TYPE_STRING, &reason,
- DBUS_TYPE_INVALID);
- }
-
- if (msg != NULL) {
- DBusMessage *reply;
-
- reply = dbus.connection_send_with_reply_and_block(conn, msg, 300, NULL);
- if (reply) {
- if (!dbus.message_get_args(reply, NULL,
- DBUS_TYPE_UINT32, &screensaver_cookie,
- DBUS_TYPE_INVALID))
- screensaver_cookie = 0;
- dbus.message_unref(reply);
- }
-
- dbus.message_unref(msg);
- }
-
- if (screensaver_cookie == 0) {
- return SDL_FALSE;
- }
- return SDL_TRUE;
- } else {
- DBusMessage *msg = dbus.message_new_method_call("org.freedesktop.ScreenSaver",
- "/org/freedesktop/ScreenSaver",
- "org.freedesktop.ScreenSaver",
- "UnInhibit");
- dbus.message_append_args (msg,
- DBUS_TYPE_UINT32, &screensaver_cookie,
- DBUS_TYPE_INVALID);
- if (msg != NULL) {
- if (dbus.connection_send(conn, msg, NULL)) {
- dbus.connection_flush(conn);
- }
- dbus.message_unref(msg);
- }
-
- screensaver_cookie = 0;
- return SDL_TRUE;
- }
-}
-#endif
diff --git a/3rdparty/SDL2/src/core/linux/SDL_dbus.h b/3rdparty/SDL2/src/core/linux/SDL_dbus.h
deleted file mode 100644
index c064381a0c0..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_dbus.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#include "../../SDL_internal.h"
-
-#ifndef _SDL_dbus_h
-#define _SDL_dbus_h
-
-#ifdef HAVE_DBUS_DBUS_H
-#define SDL_USE_LIBDBUS 1
-#include "SDL_stdinc.h"
-#include <dbus/dbus.h>
-
-
-typedef struct SDL_DBusContext {
- DBusConnection *session_conn;
-
- DBusConnection *(*bus_get_private)(DBusBusType, DBusError *);
- dbus_bool_t (*bus_register)(DBusConnection *, DBusError *);
- void (*bus_add_match)(DBusConnection *, const char *, DBusError *);
- DBusConnection * (*connection_open_private)(const char *, DBusError *);
- void (*connection_set_exit_on_disconnect)(DBusConnection *, dbus_bool_t);
- dbus_bool_t (*connection_get_is_connected)(DBusConnection *);
- dbus_bool_t (*connection_add_filter)(DBusConnection *, DBusHandleMessageFunction,
- void *, DBusFreeFunction);
- dbus_bool_t (*connection_try_register_object_path)(DBusConnection *, const char *,
- const DBusObjectPathVTable *, void *, DBusError *);
- dbus_bool_t (*connection_send)(DBusConnection *, DBusMessage *, dbus_uint32_t *);
- DBusMessage *(*connection_send_with_reply_and_block)(DBusConnection *, DBusMessage *, int, DBusError *);
- void (*connection_close)(DBusConnection *);
- void (*connection_unref)(DBusConnection *);
- void (*connection_flush)(DBusConnection *);
- dbus_bool_t (*connection_read_write)(DBusConnection *, int);
- DBusDispatchStatus (*connection_dispatch)(DBusConnection *);
- dbus_bool_t (*message_is_signal)(DBusMessage *, const char *, const char *);
- DBusMessage *(*message_new_method_call)(const char *, const char *, const char *, const char *);
- dbus_bool_t (*message_append_args)(DBusMessage *, int, ...);
- dbus_bool_t (*message_get_args)(DBusMessage *, DBusError *, int, ...);
- dbus_bool_t (*message_iter_init)(DBusMessage *, DBusMessageIter *);
- dbus_bool_t (*message_iter_next)(DBusMessageIter *);
- void (*message_iter_get_basic)(DBusMessageIter *, void *);
- int (*message_iter_get_arg_type)(DBusMessageIter *);
- void (*message_iter_recurse)(DBusMessageIter *, DBusMessageIter *);
- void (*message_unref)(DBusMessage *);
- void (*error_init)(DBusError *);
- dbus_bool_t (*error_is_set)(const DBusError *);
- void (*error_free)(DBusError *);
- char *(*get_local_machine_id)(void);
- void (*free)(void *);
- void (*shutdown)(void);
-
-} SDL_DBusContext;
-
-extern void SDL_DBus_Init(void);
-extern void SDL_DBus_Quit(void);
-extern SDL_DBusContext * SDL_DBus_GetContext(void);
-extern void SDL_DBus_ScreensaverTickle(void);
-extern SDL_bool SDL_DBus_ScreensaverInhibit(SDL_bool inhibit);
-
-#endif /* HAVE_DBUS_DBUS_H */
-
-#endif /* _SDL_dbus_h */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_evdev.c b/3rdparty/SDL2/src/core/linux/SDL_evdev.c
deleted file mode 100644
index 4761f3e464c..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_evdev.c
+++ /dev/null
@@ -1,873 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-#include "../../SDL_internal.h"
-
-#ifdef SDL_INPUT_LINUXEV
-
-/* This is based on the linux joystick driver */
-/* References: https://www.kernel.org/doc/Documentation/input/input.txt
- * https://www.kernel.org/doc/Documentation/input/event-codes.txt
- * /usr/include/linux/input.h
- * The evtest application is also useful to debug the protocol
- */
-
-#include "SDL_evdev.h"
-
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <limits.h> /* For the definition of PATH_MAX */
-#include <linux/input.h>
-#ifdef SDL_INPUT_LINUXKD
-#include <linux/kd.h>
-#include <linux/keyboard.h>
-#include <linux/vt.h>
-#include <linux/tiocl.h> /* for TIOCL_GETSHIFTSTATE */
-#endif
-
-#include "SDL.h"
-#include "SDL_assert.h"
-#include "SDL_endian.h"
-#include "../../core/linux/SDL_udev.h"
-#include "SDL_scancode.h"
-#include "../../events/SDL_events_c.h"
-#include "../../events/scancodes_linux.h" /* adds linux_scancode_table */
-
-/* This isn't defined in older Linux kernel headers */
-#ifndef SYN_DROPPED
-#define SYN_DROPPED 3
-#endif
-
-typedef struct SDL_evdevlist_item
-{
- char *path;
- int fd;
-
- /* TODO: use this for every device, not just touchscreen */
- int out_of_sync;
-
- /* TODO: expand on this to have data for every possible class (mouse,
- keyboard, touchpad, etc.). Also there's probably some things in here we
- can pull out to the SDL_evdevlist_item i.e. name */
- int is_touchscreen;
- struct {
- char* name;
-
- int min_x, max_x, range_x;
- int min_y, max_y, range_y;
-
- int max_slots;
- int current_slot;
- struct {
- enum {
- EVDEV_TOUCH_SLOTDELTA_NONE = 0,
- EVDEV_TOUCH_SLOTDELTA_DOWN,
- EVDEV_TOUCH_SLOTDELTA_UP,
- EVDEV_TOUCH_SLOTDELTA_MOVE
- } delta;
- int tracking_id;
- int x, y;
- } * slots;
- } * touchscreen_data;
-
- struct SDL_evdevlist_item *next;
-} SDL_evdevlist_item;
-
-typedef struct SDL_EVDEV_PrivateData
-{
- SDL_evdevlist_item *first;
- SDL_evdevlist_item *last;
- int num_devices;
- int ref_count;
- int console_fd;
- int kb_mode;
-} SDL_EVDEV_PrivateData;
-
-#define _THIS SDL_EVDEV_PrivateData *_this
-static _THIS = NULL;
-
-static SDL_Scancode SDL_EVDEV_translate_keycode(int keycode);
-static void SDL_EVDEV_sync_device(SDL_evdevlist_item *item);
-static int SDL_EVDEV_device_removed(const char *dev_path);
-
-#if SDL_USE_LIBUDEV
-static int SDL_EVDEV_device_added(const char *dev_path, int udev_class);
-void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_type, int udev_class,
- const char *dev_path);
-#endif /* SDL_USE_LIBUDEV */
-
-static Uint8 EVDEV_MouseButtons[] = {
- SDL_BUTTON_LEFT, /* BTN_LEFT 0x110 */
- SDL_BUTTON_RIGHT, /* BTN_RIGHT 0x111 */
- SDL_BUTTON_MIDDLE, /* BTN_MIDDLE 0x112 */
- SDL_BUTTON_X1, /* BTN_SIDE 0x113 */
- SDL_BUTTON_X2, /* BTN_EXTRA 0x114 */
- SDL_BUTTON_X2 + 1, /* BTN_FORWARD 0x115 */
- SDL_BUTTON_X2 + 2, /* BTN_BACK 0x116 */
- SDL_BUTTON_X2 + 3 /* BTN_TASK 0x117 */
-};
-
-static const char* EVDEV_consoles[] = {
- /* "/proc/self/fd/0",
- "/dev/tty",
- "/dev/tty0", */ /* the tty ioctl's prohibit these */
- "/dev/tty1",
- "/dev/tty2",
- "/dev/tty3",
- "/dev/tty4",
- "/dev/tty5",
- "/dev/tty6",
- "/dev/tty7", /* usually X is spawned in tty7 */
- "/dev/vc/0",
- "/dev/console"
-};
-
-static int SDL_EVDEV_is_console(int fd) {
- int type;
-
- return isatty(fd) && ioctl(fd, KDGKBTYPE, &type) == 0 &&
- (type == KB_101 || type == KB_84);
-}
-
-/* Prevent keystrokes from reaching the tty */
-static int SDL_EVDEV_mute_keyboard(int tty_fd, int* old_kb_mode)
-{
- if (!SDL_EVDEV_is_console(tty_fd)) {
- return SDL_SetError("Tried to mute an invalid tty");
- }
-
- if (ioctl(tty_fd, KDGKBMODE, old_kb_mode) < 0) {
- return SDL_SetError("Failed to get keyboard mode during muting");
- }
-
- /* FIXME: atm this absolutely ruins the vt, and KDSKBMUTE isn't implemented
- in the kernel */
- /*
- if (ioctl(tty_fd, KDSKBMODE, K_OFF) < 0) {
- return SDL_SetError("Failed to set keyboard mode during muting");
- }
- */
-
- return 0;
-}
-
-/* Restore the keyboard mode for given tty */
-static void SDL_EVDEV_unmute_keyboard(int tty_fd, int kb_mode)
-{
- /* read above */
- /*
- if (ioctl(tty_fd, KDSKBMODE, kb_mode) < 0) {
- SDL_Log("Failed to unmute keyboard");
- }
- */
-}
-
-static int SDL_EVDEV_get_active_tty()
-{
- int i, fd, ret, tty = 0;
- char tiocl;
- struct vt_stat vt_state;
- char path[PATH_MAX + 1];
-
- for(i = 0; i < SDL_arraysize(EVDEV_consoles); i++) {
- fd = open(EVDEV_consoles[i], O_RDONLY);
-
- if (fd < 0 && !SDL_EVDEV_is_console(fd))
- break;
-
- tiocl = TIOCL_GETFGCONSOLE;
- if ((ret = ioctl(fd, TIOCLINUX, &tiocl)) >= 0)
- tty = ret + 1;
- else if (ioctl(fd, VT_GETSTATE, &vt_state) == 0)
- tty = vt_state.v_active;
-
- close(fd);
-
- if (tty) {
- sprintf(path, "/dev/tty%u", tty);
- fd = open(path, O_RDONLY);
- if (fd >= 0 && SDL_EVDEV_is_console(fd))
- return fd;
- }
- }
-
- return SDL_SetError("Failed to determine active tty");
-}
-
-int
-SDL_EVDEV_Init(void)
-{
- if (_this == NULL) {
- _this = (SDL_EVDEV_PrivateData*)SDL_calloc(1, sizeof(*_this));
- if (_this == NULL) {
- return SDL_OutOfMemory();
- }
-
-#if SDL_USE_LIBUDEV
- if (SDL_UDEV_Init() < 0) {
- SDL_free(_this);
- _this = NULL;
- return -1;
- }
-
- /* Set up the udev callback */
- if (SDL_UDEV_AddCallback(SDL_EVDEV_udev_callback) < 0) {
- SDL_UDEV_Quit();
- SDL_free(_this);
- _this = NULL;
- return -1;
- }
-
- /* Force a scan to build the initial device list */
- SDL_UDEV_Scan();
-#else
- /* TODO: Scan the devices manually, like a caveman */
-#endif /* SDL_USE_LIBUDEV */
-
- /* We need a physical terminal (not PTS) to be able to translate key
- code to symbols via the kernel tables */
- _this->console_fd = SDL_EVDEV_get_active_tty();
-
- /* Mute the keyboard so keystrokes only generate evdev events and do not
- leak through to the console */
- SDL_EVDEV_mute_keyboard(_this->console_fd, &_this->kb_mode);
- }
-
- _this->ref_count += 1;
-
- return 0;
-}
-
-void
-SDL_EVDEV_Quit(void)
-{
- if (_this == NULL) {
- return;
- }
-
- _this->ref_count -= 1;
-
- if (_this->ref_count < 1) {
-#if SDL_USE_LIBUDEV
- SDL_UDEV_DelCallback(SDL_EVDEV_udev_callback);
- SDL_UDEV_Quit();
-#endif /* SDL_USE_LIBUDEV */
-
- if (_this->console_fd >= 0) {
- SDL_EVDEV_unmute_keyboard(_this->console_fd, _this->kb_mode);
- close(_this->console_fd);
- }
-
- /* Remove existing devices */
- while(_this->first != NULL) {
- SDL_EVDEV_device_removed(_this->first->path);
- }
-
- SDL_assert(_this->first == NULL);
- SDL_assert(_this->last == NULL);
- SDL_assert(_this->num_devices == 0);
-
- SDL_free(_this);
- _this = NULL;
- }
-}
-
-#if SDL_USE_LIBUDEV
-void SDL_EVDEV_udev_callback(SDL_UDEV_deviceevent udev_event, int udev_class,
- const char* dev_path)
-{
- if (dev_path == NULL) {
- return;
- }
-
- switch(udev_event) {
- case SDL_UDEV_DEVICEADDED:
- if (!(udev_class & (SDL_UDEV_DEVICE_MOUSE | SDL_UDEV_DEVICE_KEYBOARD |
- SDL_UDEV_DEVICE_TOUCHSCREEN)))
- return;
-
- SDL_EVDEV_device_added(dev_path, udev_class);
- break;
- case SDL_UDEV_DEVICEREMOVED:
- SDL_EVDEV_device_removed(dev_path);
- break;
- default:
- break;
- }
-}
-#endif /* SDL_USE_LIBUDEV */
-
-#ifdef SDL_INPUT_LINUXKD
-/* this logic is pulled from kbd_keycode() in drivers/tty/vt/keyboard.c in the
- Linux kernel source */
-static void SDL_EVDEV_do_text_input(unsigned short keycode) {
- char shift_state;
- int locks_state;
- struct kbentry kbe;
- unsigned char type;
- char text[2] = { 0 };
-
- if (_this->console_fd < 0)
- return;
-
- shift_state = TIOCL_GETSHIFTSTATE;
- if (ioctl(_this->console_fd, TIOCLINUX, &shift_state) < 0) {
- /* TODO: error */
- return;
- }
-
- kbe.kb_table = shift_state;
- kbe.kb_index = keycode;
-
- if (ioctl(_this->console_fd, KDGKBENT, &kbe) < 0) {
- /* TODO: error */
- return;
- }
-
- type = KTYP(kbe.kb_value);
-
- if (type < 0xf0) {
- /*
- * FIXME: keysyms with a type below 0xf0 represent a unicode character
- * which requires special handling due to dead characters, diacritics,
- * etc. For perfect input a proper way to deal with such characters
- * should be implemented.
- *
- * For reference, the only place I was able to find out about this
- * special 0xf0 value was in an unused? couple of patches listed below.
- *
- * http://ftp.tc.edu.tw/pub/docs/Unicode/utf8/linux-2.3.12-keyboard.diff
- * http://ftp.tc.edu.tw/pub/docs/Unicode/utf8/linux-2.3.12-console.diff
- */
-
- return;
- }
-
- type -= 0xf0;
-
- /* if type is KT_LETTER then it can be affected by Caps Lock */
- if (type == KT_LETTER) {
- type = KT_LATIN;
-
- if (ioctl(_this->console_fd, KDGKBLED, &locks_state) < 0) {
- /* TODO: error */
- return;
- }
-
- if (locks_state & K_CAPSLOCK) {
- kbe.kb_table = shift_state ^ (1 << KG_SHIFT);
-
- if (ioctl(_this->console_fd, KDGKBENT, &kbe) < 0) {
- /* TODO: error */
- return;
- }
- }
- }
-
- /* TODO: convert values >= 0x80 from ISO-8859-1? to UTF-8 */
- if (type != KT_LATIN || KVAL(kbe.kb_value) >= 0x80)
- return;
-
- *text = KVAL(kbe.kb_value);
- SDL_SendKeyboardText(text);
-}
-#endif /* SDL_INPUT_LINUXKD */
-
-void
-SDL_EVDEV_Poll(void)
-{
- struct input_event events[32];
- int i, j, len;
- SDL_evdevlist_item *item;
- SDL_Scancode scan_code;
- int mouse_button;
- SDL_Mouse *mouse;
- float norm_x, norm_y;
-
- if (!_this) {
- return;
- }
-
-#if SDL_USE_LIBUDEV
- SDL_UDEV_Poll();
-#endif
-
- mouse = SDL_GetMouse();
-
- for (item = _this->first; item != NULL; item = item->next) {
- while ((len = read(item->fd, events, (sizeof events))) > 0) {
- len /= sizeof(events[0]);
- for (i = 0; i < len; ++i) {
- /* special handling for touchscreen, that should eventually be
- used for all devices */
- if (item->out_of_sync && item->is_touchscreen &&
- events[i].type == EV_SYN && events[i].code != SYN_REPORT) {
- break;
- }
-
- switch (events[i].type) {
- case EV_KEY:
- if (events[i].code >= BTN_MOUSE && events[i].code < BTN_MOUSE + SDL_arraysize(EVDEV_MouseButtons)) {
- mouse_button = events[i].code - BTN_MOUSE;
- if (events[i].value == 0) {
- SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, EVDEV_MouseButtons[mouse_button]);
- } else if (events[i].value == 1) {
- SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, EVDEV_MouseButtons[mouse_button]);
- }
- break;
- }
-
- /* Probably keyboard */
- scan_code = SDL_EVDEV_translate_keycode(events[i].code);
- if (scan_code != SDL_SCANCODE_UNKNOWN) {
- if (events[i].value == 0) {
- SDL_SendKeyboardKey(SDL_RELEASED, scan_code);
- } else if (events[i].value == 1 || events[i].value == 2 /* key repeated */) {
- SDL_SendKeyboardKey(SDL_PRESSED, scan_code);
-#ifdef SDL_INPUT_LINUXKD
- SDL_EVDEV_do_text_input(events[i].code);
-#endif /* SDL_INPUT_LINUXKD */
- }
- }
- break;
- case EV_ABS:
- switch(events[i].code) {
- case ABS_MT_SLOT:
- if (!item->is_touchscreen) /* FIXME: temp hack */
- break;
- item->touchscreen_data->current_slot = events[i].value;
- break;
- case ABS_MT_TRACKING_ID:
- if (!item->is_touchscreen) /* FIXME: temp hack */
- break;
- if (events[i].value >= 0) {
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].tracking_id = events[i].value;
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].delta = EVDEV_TOUCH_SLOTDELTA_DOWN;
- } else {
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].delta = EVDEV_TOUCH_SLOTDELTA_UP;
- }
- break;
- case ABS_MT_POSITION_X:
- if (!item->is_touchscreen) /* FIXME: temp hack */
- break;
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].x = events[i].value;
- if (item->touchscreen_data->slots[item->touchscreen_data->current_slot].delta == EVDEV_TOUCH_SLOTDELTA_NONE) {
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].delta = EVDEV_TOUCH_SLOTDELTA_MOVE;
- }
- break;
- case ABS_MT_POSITION_Y:
- if (!item->is_touchscreen) /* FIXME: temp hack */
- break;
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].y = events[i].value;
- if (item->touchscreen_data->slots[item->touchscreen_data->current_slot].delta == EVDEV_TOUCH_SLOTDELTA_NONE) {
- item->touchscreen_data->slots[item->touchscreen_data->current_slot].delta = EVDEV_TOUCH_SLOTDELTA_MOVE;
- }
- break;
- case ABS_X:
- if (item->is_touchscreen) /* FIXME: temp hack */
- break;
- SDL_SendMouseMotion(mouse->focus, mouse->mouseID, SDL_FALSE, events[i].value, mouse->y);
- break;
- case ABS_Y:
- if (item->is_touchscreen) /* FIXME: temp hack */
- break;
- SDL_SendMouseMotion(mouse->focus, mouse->mouseID, SDL_FALSE, mouse->x, events[i].value);
- break;
- default:
- break;
- }
- break;
- case EV_REL:
- switch(events[i].code) {
- case REL_X:
- SDL_SendMouseMotion(mouse->focus, mouse->mouseID, SDL_TRUE, events[i].value, 0);
- break;
- case REL_Y:
- SDL_SendMouseMotion(mouse->focus, mouse->mouseID, SDL_TRUE, 0, events[i].value);
- break;
- case REL_WHEEL:
- SDL_SendMouseWheel(mouse->focus, mouse->mouseID, 0, events[i].value, SDL_MOUSEWHEEL_NORMAL);
- break;
- case REL_HWHEEL:
- SDL_SendMouseWheel(mouse->focus, mouse->mouseID, events[i].value, 0, SDL_MOUSEWHEEL_NORMAL);
- break;
- default:
- break;
- }
- break;
- case EV_SYN:
- switch (events[i].code) {
- case SYN_REPORT:
- if (!item->is_touchscreen) /* FIXME: temp hack */
- break;
-
- for(j = 0; j < item->touchscreen_data->max_slots; j++) {
- norm_x = (float)(item->touchscreen_data->slots[j].x - item->touchscreen_data->min_x) /
- (float)item->touchscreen_data->range_x;
- norm_y = (float)(item->touchscreen_data->slots[j].y - item->touchscreen_data->min_y) /
- (float)item->touchscreen_data->range_y;
-
- switch(item->touchscreen_data->slots[j].delta) {
- case EVDEV_TOUCH_SLOTDELTA_DOWN:
- SDL_SendTouch(item->fd, item->touchscreen_data->slots[j].tracking_id, SDL_TRUE, norm_x, norm_y, 1.0f);
- item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE;
- break;
- case EVDEV_TOUCH_SLOTDELTA_UP:
- SDL_SendTouch(item->fd, item->touchscreen_data->slots[j].tracking_id, SDL_FALSE, norm_x, norm_y, 1.0f);
- item->touchscreen_data->slots[j].tracking_id = -1;
- item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE;
- break;
- case EVDEV_TOUCH_SLOTDELTA_MOVE:
- SDL_SendTouchMotion(item->fd, item->touchscreen_data->slots[j].tracking_id, norm_x, norm_y, 1.0f);
- item->touchscreen_data->slots[j].delta = EVDEV_TOUCH_SLOTDELTA_NONE;
- break;
- default:
- break;
- }
- }
-
- if (item->out_of_sync)
- item->out_of_sync = 0;
- break;
- case SYN_DROPPED:
- if (item->is_touchscreen)
- item->out_of_sync = 1;
- SDL_EVDEV_sync_device(item);
- break;
- default:
- break;
- }
- break;
- }
- }
- }
- }
-}
-
-static SDL_Scancode
-SDL_EVDEV_translate_keycode(int keycode)
-{
- SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
-
- if (keycode < SDL_arraysize(linux_scancode_table))
- scancode = linux_scancode_table[keycode];
-
- if (scancode == SDL_SCANCODE_UNKNOWN) {
- SDL_Log("The key you just pressed is not recognized by SDL. To help "
- "get this fixed, please report this to the SDL mailing list "
- "<sdl@libsdl.org> EVDEV KeyCode %d\n", keycode);
- }
-
- return scancode;
-}
-
-#ifdef SDL_USE_LIBUDEV
-static int
-SDL_EVDEV_init_touchscreen(SDL_evdevlist_item* item)
-{
- int ret, i;
- char name[64];
- struct input_absinfo abs_info;
-
- if (!item->is_touchscreen)
- return 0;
-
- item->touchscreen_data = SDL_calloc(1, sizeof(*item->touchscreen_data));
- if (item->touchscreen_data == NULL)
- return SDL_OutOfMemory();
-
- ret = ioctl(item->fd, EVIOCGNAME(sizeof(name)), name);
- if (ret < 0) {
- SDL_free(item->touchscreen_data);
- return SDL_SetError("Failed to get evdev touchscreen name");
- }
-
- item->touchscreen_data->name = SDL_strdup(name);
- if (item->touchscreen_data->name == NULL) {
- SDL_free(item->touchscreen_data);
- return SDL_OutOfMemory();
- }
-
- ret = ioctl(item->fd, EVIOCGABS(ABS_MT_POSITION_X), &abs_info);
- if (ret < 0) {
- SDL_free(item->touchscreen_data->name);
- SDL_free(item->touchscreen_data);
- return SDL_SetError("Failed to get evdev touchscreen limits");
- }
- item->touchscreen_data->min_x = abs_info.minimum;
- item->touchscreen_data->max_x = abs_info.maximum;
- item->touchscreen_data->range_x = abs_info.maximum - abs_info.minimum;
-
- ret = ioctl(item->fd, EVIOCGABS(ABS_MT_POSITION_Y), &abs_info);
- if (ret < 0) {
- SDL_free(item->touchscreen_data->name);
- SDL_free(item->touchscreen_data);
- return SDL_SetError("Failed to get evdev touchscreen limits");
- }
- item->touchscreen_data->min_y = abs_info.minimum;
- item->touchscreen_data->max_y = abs_info.maximum;
- item->touchscreen_data->range_y = abs_info.maximum - abs_info.minimum;
-
- ret = ioctl(item->fd, EVIOCGABS(ABS_MT_SLOT), &abs_info);
- if (ret < 0) {
- SDL_free(item->touchscreen_data->name);
- SDL_free(item->touchscreen_data);
- return SDL_SetError("Failed to get evdev touchscreen limits");
- }
- item->touchscreen_data->max_slots = abs_info.maximum + 1;
-
- item->touchscreen_data->slots = SDL_calloc(
- item->touchscreen_data->max_slots,
- sizeof(*item->touchscreen_data->slots));
- if (item->touchscreen_data->slots == NULL) {
- SDL_free(item->touchscreen_data->name);
- SDL_free(item->touchscreen_data);
- return SDL_OutOfMemory();
- }
-
- for(i = 0; i < item->touchscreen_data->max_slots; i++) {
- item->touchscreen_data->slots[i].tracking_id = -1;
- }
-
- ret = SDL_AddTouch(item->fd, /* I guess our fd is unique enough */
- item->touchscreen_data->name);
- if (ret < 0) {
- SDL_free(item->touchscreen_data->slots);
- SDL_free(item->touchscreen_data->name);
- SDL_free(item->touchscreen_data);
- return ret;
- }
-
- return 0;
-}
-#endif /* SDL_USE_LIBUDEV */
-
-static void
-SDL_EVDEV_destroy_touchscreen(SDL_evdevlist_item* item) {
- if (!item->is_touchscreen)
- return;
-
- SDL_DelTouch(item->fd);
- SDL_free(item->touchscreen_data->slots);
- SDL_free(item->touchscreen_data->name);
- SDL_free(item->touchscreen_data);
-}
-
-static void
-SDL_EVDEV_sync_device(SDL_evdevlist_item *item)
-{
-#ifdef EVIOCGMTSLOTS
- int i, ret;
- struct input_absinfo abs_info;
- /*
- * struct input_mt_request_layout {
- * __u32 code;
- * __s32 values[num_slots];
- * };
- *
- * this is the structure we're trying to emulate
- */
- __u32* mt_req_code;
- __s32* mt_req_values;
- size_t mt_req_size;
-
- /* TODO: sync devices other than touchscreen */
- if (!item->is_touchscreen)
- return;
-
- mt_req_size = sizeof(*mt_req_code) +
- sizeof(*mt_req_values) * item->touchscreen_data->max_slots;
-
- mt_req_code = SDL_calloc(1, mt_req_size);
- if (mt_req_code == NULL) {
- return;
- }
-
- mt_req_values = (__s32*)mt_req_code + 1;
-
- *mt_req_code = ABS_MT_TRACKING_ID;
- ret = ioctl(item->fd, EVIOCGMTSLOTS(mt_req_size), mt_req_code);
- if (ret < 0) {
- SDL_free(mt_req_code);
- return;
- }
- for(i = 0; i < item->touchscreen_data->max_slots; i++) {
- /*
- * This doesn't account for the very edge case of the user removing their
- * finger and replacing it on the screen during the time we're out of sync,
- * which'll mean that we're not going from down -> up or up -> down, we're
- * going from down -> down but with a different tracking id, meaning we'd
- * have to tell SDL of the two events, but since we wait till SYN_REPORT in
- * SDL_EVDEV_Poll to tell SDL, the current structure of this code doesn't
- * allow it. Lets just pray to God it doesn't happen.
- */
- if (item->touchscreen_data->slots[i].tracking_id < 0 &&
- mt_req_values[i] >= 0) {
- item->touchscreen_data->slots[i].tracking_id = mt_req_values[i];
- item->touchscreen_data->slots[i].delta = EVDEV_TOUCH_SLOTDELTA_DOWN;
- } else if (item->touchscreen_data->slots[i].tracking_id >= 0 &&
- mt_req_values[i] < 0) {
- item->touchscreen_data->slots[i].tracking_id = -1;
- item->touchscreen_data->slots[i].delta = EVDEV_TOUCH_SLOTDELTA_UP;
- }
- }
-
- *mt_req_code = ABS_MT_POSITION_X;
- ret = ioctl(item->fd, EVIOCGMTSLOTS(mt_req_size), mt_req_code);
- if (ret < 0) {
- SDL_free(mt_req_code);
- return;
- }
- for(i = 0; i < item->touchscreen_data->max_slots; i++) {
- if (item->touchscreen_data->slots[i].tracking_id >= 0 &&
- item->touchscreen_data->slots[i].x != mt_req_values[i]) {
- item->touchscreen_data->slots[i].x = mt_req_values[i];
- if (item->touchscreen_data->slots[i].delta ==
- EVDEV_TOUCH_SLOTDELTA_NONE) {
- item->touchscreen_data->slots[i].delta =
- EVDEV_TOUCH_SLOTDELTA_MOVE;
- }
- }
- }
-
- *mt_req_code = ABS_MT_POSITION_Y;
- ret = ioctl(item->fd, EVIOCGMTSLOTS(mt_req_size), mt_req_code);
- if (ret < 0) {
- SDL_free(mt_req_code);
- return;
- }
- for(i = 0; i < item->touchscreen_data->max_slots; i++) {
- if (item->touchscreen_data->slots[i].tracking_id >= 0 &&
- item->touchscreen_data->slots[i].y != mt_req_values[i]) {
- item->touchscreen_data->slots[i].y = mt_req_values[i];
- if (item->touchscreen_data->slots[i].delta ==
- EVDEV_TOUCH_SLOTDELTA_NONE) {
- item->touchscreen_data->slots[i].delta =
- EVDEV_TOUCH_SLOTDELTA_MOVE;
- }
- }
- }
-
- ret = ioctl(item->fd, EVIOCGABS(ABS_MT_SLOT), &abs_info);
- if (ret < 0) {
- SDL_free(mt_req_code);
- return;
- }
- item->touchscreen_data->current_slot = abs_info.value;
-
- SDL_free(mt_req_code);
-
-#endif /* EVIOCGMTSLOTS */
-}
-
-#if SDL_USE_LIBUDEV
-static int
-SDL_EVDEV_device_added(const char *dev_path, int udev_class)
-{
- int ret;
- SDL_evdevlist_item *item;
-
- /* Check to make sure it's not already in list. */
- for (item = _this->first; item != NULL; item = item->next) {
- if (SDL_strcmp(dev_path, item->path) == 0) {
- return -1; /* already have this one */
- }
- }
-
- item = (SDL_evdevlist_item *) SDL_calloc(1, sizeof (SDL_evdevlist_item));
- if (item == NULL) {
- return SDL_OutOfMemory();
- }
-
- item->fd = open(dev_path, O_RDONLY | O_NONBLOCK);
- if (item->fd < 0) {
- SDL_free(item);
- return SDL_SetError("Unable to open %s", dev_path);
- }
-
- item->path = SDL_strdup(dev_path);
- if (item->path == NULL) {
- close(item->fd);
- SDL_free(item);
- return SDL_OutOfMemory();
- }
-
- if (udev_class & SDL_UDEV_DEVICE_TOUCHSCREEN) {
- item->is_touchscreen = 1;
-
- if ((ret = SDL_EVDEV_init_touchscreen(item)) < 0) {
- close(item->fd);
- SDL_free(item);
- return ret;
- }
- }
-
- if (_this->last == NULL) {
- _this->first = _this->last = item;
- } else {
- _this->last->next = item;
- _this->last = item;
- }
-
- SDL_EVDEV_sync_device(item);
-
- return _this->num_devices++;
-}
-#endif /* SDL_USE_LIBUDEV */
-
-static int
-SDL_EVDEV_device_removed(const char *dev_path)
-{
- SDL_evdevlist_item *item;
- SDL_evdevlist_item *prev = NULL;
-
- for (item = _this->first; item != NULL; item = item->next) {
- /* found it, remove it. */
- if (SDL_strcmp(dev_path, item->path) == 0) {
- if (prev != NULL) {
- prev->next = item->next;
- } else {
- SDL_assert(_this->first == item);
- _this->first = item->next;
- }
- if (item == _this->last) {
- _this->last = prev;
- }
- if (item->is_touchscreen) {
- SDL_EVDEV_destroy_touchscreen(item);
- }
- close(item->fd);
- SDL_free(item->path);
- SDL_free(item);
- _this->num_devices--;
- return 0;
- }
- prev = item;
- }
-
- return -1;
-}
-
-
-#endif /* SDL_INPUT_LINUXEV */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_evdev.h b/3rdparty/SDL2/src/core/linux/SDL_evdev.h
deleted file mode 100644
index 85b193864ce..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_evdev.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#include "../../SDL_internal.h"
-
-#ifndef _SDL_evdev_h
-#define _SDL_evdev_h
-
-#ifdef SDL_INPUT_LINUXEV
-
-#include "SDL_events.h"
-
-extern int SDL_EVDEV_Init(void);
-extern void SDL_EVDEV_Quit(void);
-extern void SDL_EVDEV_Poll(void);
-
-#endif /* SDL_INPUT_LINUXEV */
-
-#endif /* _SDL_evdev_h */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_fcitx.c b/3rdparty/SDL2/src/core/linux/SDL_fcitx.c
deleted file mode 100644
index 83d19e690c5..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_fcitx.c
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-#include "../../SDL_internal.h"
-
-#ifdef HAVE_FCITX_FRONTEND_H
-
-#include <fcitx/frontend.h>
-#include <unistd.h>
-
-#include "SDL_fcitx.h"
-#include "SDL_keycode.h"
-#include "SDL_keyboard.h"
-#include "../../events/SDL_keyboard_c.h"
-#include "SDL_dbus.h"
-#include "SDL_syswm.h"
-#if SDL_VIDEO_DRIVER_X11
-# include "../../video/x11/SDL_x11video.h"
-#endif
-#include "SDL_hints.h"
-
-#define FCITX_DBUS_SERVICE "org.fcitx.Fcitx"
-
-#define FCITX_IM_DBUS_PATH "/inputmethod"
-#define FCITX_IC_DBUS_PATH "/inputcontext_%d"
-
-#define FCITX_IM_DBUS_INTERFACE "org.fcitx.Fcitx.InputMethod"
-#define FCITX_IC_DBUS_INTERFACE "org.fcitx.Fcitx.InputContext"
-
-#define IC_NAME_MAX 64
-#define DBUS_TIMEOUT 500
-
-typedef struct _FcitxClient
-{
- SDL_DBusContext *dbus;
-
- char servicename[IC_NAME_MAX];
- char icname[IC_NAME_MAX];
-
- int id;
-
- SDL_Rect cursor_rect;
-} FcitxClient;
-
-static FcitxClient fcitx_client;
-
-static int
-GetDisplayNumber()
-{
- const char *display = SDL_getenv("DISPLAY");
- const char *p = NULL;
- int number = 0;
-
- if (display == NULL)
- return 0;
-
- display = SDL_strchr(display, ':');
- if (display == NULL)
- return 0;
-
- display++;
- p = SDL_strchr(display, '.');
- if (p == NULL && display != NULL) {
- number = SDL_strtod(display, NULL);
- } else {
- char *buffer = SDL_strdup(display);
- buffer[p - display] = '\0';
- number = SDL_strtod(buffer, NULL);
- SDL_free(buffer);
- }
-
- return number;
-}
-
-static char*
-GetAppName()
-{
-#if defined(__LINUX__) || defined(__FREEBSD__)
- char *spot;
- char procfile[1024];
- char linkfile[1024];
- int linksize;
-
-#if defined(__LINUX__)
- SDL_snprintf(procfile, sizeof(procfile), "/proc/%d/exe", getpid());
-#elif defined(__FREEBSD__)
- SDL_snprintf(procfile, sizeof(procfile), "/proc/%d/file", getpid());
-#endif
- linksize = readlink(procfile, linkfile, sizeof(linkfile) - 1);
- if (linksize > 0) {
- linkfile[linksize] = '\0';
- spot = SDL_strrchr(linkfile, '/');
- if (spot) {
- return SDL_strdup(spot + 1);
- } else {
- return SDL_strdup(linkfile);
- }
- }
-#endif /* __LINUX__ || __FREEBSD__ */
-
- return SDL_strdup("SDL_App");
-}
-
-/*
- * Copied from fcitx source
- */
-#define CONT(i) ISUTF8_CB(in[i])
-#define VAL(i, s) ((in[i]&0x3f) << s)
-
-static char *
-_fcitx_utf8_get_char(const char *i, uint32_t *chr)
-{
- const unsigned char* in = (const unsigned char *)i;
- if (!(in[0] & 0x80)) {
- *(chr) = *(in);
- return (char *)in + 1;
- }
-
- /* 2-byte, 0x80-0x7ff */
- if ((in[0] & 0xe0) == 0xc0 && CONT(1)) {
- *chr = ((in[0] & 0x1f) << 6) | VAL(1, 0);
- return (char *)in + 2;
- }
-
- /* 3-byte, 0x800-0xffff */
- if ((in[0] & 0xf0) == 0xe0 && CONT(1) && CONT(2)) {
- *chr = ((in[0] & 0xf) << 12) | VAL(1, 6) | VAL(2, 0);
- return (char *)in + 3;
- }
-
- /* 4-byte, 0x10000-0x1FFFFF */
- if ((in[0] & 0xf8) == 0xf0 && CONT(1) && CONT(2) && CONT(3)) {
- *chr = ((in[0] & 0x7) << 18) | VAL(1, 12) | VAL(2, 6) | VAL(3, 0);
- return (char *)in + 4;
- }
-
- /* 5-byte, 0x200000-0x3FFFFFF */
- if ((in[0] & 0xfc) == 0xf8 && CONT(1) && CONT(2) && CONT(3) && CONT(4)) {
- *chr = ((in[0] & 0x3) << 24) | VAL(1, 18) | VAL(2, 12) | VAL(3, 6) | VAL(4, 0);
- return (char *)in + 5;
- }
-
- /* 6-byte, 0x400000-0x7FFFFFF */
- if ((in[0] & 0xfe) == 0xfc && CONT(1) && CONT(2) && CONT(3) && CONT(4) && CONT(5)) {
- *chr = ((in[0] & 0x1) << 30) | VAL(1, 24) | VAL(2, 18) | VAL(3, 12) | VAL(4, 6) | VAL(5, 0);
- return (char *)in + 6;
- }
-
- *chr = *in;
-
- return (char *)in + 1;
-}
-
-static size_t
-_fcitx_utf8_strlen(const char *s)
-{
- unsigned int l = 0;
-
- while (*s) {
- uint32_t chr;
-
- s = _fcitx_utf8_get_char(s, &chr);
- l++;
- }
-
- return l;
-}
-
-static DBusHandlerResult
-DBus_MessageFilter(DBusConnection *conn, DBusMessage *msg, void *data)
-{
- SDL_DBusContext *dbus = (SDL_DBusContext *)data;
-
- if (dbus->message_is_signal(msg, FCITX_IC_DBUS_INTERFACE, "CommitString")) {
- DBusMessageIter iter;
- const char *text = NULL;
-
- dbus->message_iter_init(msg, &iter);
- dbus->message_iter_get_basic(&iter, &text);
-
- if (text)
- SDL_SendKeyboardText(text);
-
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- if (dbus->message_is_signal(msg, FCITX_IC_DBUS_INTERFACE, "UpdatePreedit")) {
- DBusMessageIter iter;
- const char *text;
-
- dbus->message_iter_init(msg, &iter);
- dbus->message_iter_get_basic(&iter, &text);
-
- if (text && *text) {
- char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
- size_t text_bytes = SDL_strlen(text), i = 0;
- size_t cursor = 0;
-
- while (i < text_bytes) {
- size_t sz = SDL_utf8strlcpy(buf, text + i, sizeof(buf));
- size_t chars = _fcitx_utf8_strlen(buf);
-
- SDL_SendEditingText(buf, cursor, chars);
-
- i += sz;
- cursor += chars;
- }
- }
-
- SDL_Fcitx_UpdateTextRect(NULL);
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static DBusMessage*
-FcitxClientICNewMethod(FcitxClient *client,
- const char *method)
-{
- SDL_DBusContext *dbus = client->dbus;
- return dbus->message_new_method_call(
- client->servicename,
- client->icname,
- FCITX_IC_DBUS_INTERFACE,
- method);
-}
-
-static void
-FcitxClientICCallMethod(FcitxClient *client,
- const char *method)
-{
- SDL_DBusContext *dbus = client->dbus;
- DBusMessage *msg = FcitxClientICNewMethod(client, method);
-
- if (msg == NULL)
- return ;
-
- if (dbus->connection_send(dbus->session_conn, msg, NULL)) {
- dbus->connection_flush(dbus->session_conn);
- }
-
- dbus->message_unref(msg);
-}
-
-static void
-Fcitx_SetCapabilities(void *data,
- const char *name,
- const char *old_val,
- const char *internal_editing)
-{
- FcitxClient *client = (FcitxClient *)data;
- SDL_DBusContext *dbus = client->dbus;
- Uint32 caps = CAPACITY_NONE;
-
- DBusMessage *msg = FcitxClientICNewMethod(client, "SetCapacity");
- if (msg == NULL)
- return ;
-
- if (!(internal_editing && *internal_editing == '1')) {
- caps |= CAPACITY_PREEDIT;
- }
-
- dbus->message_append_args(msg,
- DBUS_TYPE_UINT32, &caps,
- DBUS_TYPE_INVALID);
- if (dbus->connection_send(dbus->session_conn, msg, NULL)) {
- dbus->connection_flush(dbus->session_conn);
- }
-
- dbus->message_unref(msg);
-}
-
-static void
-FcitxClientCreateIC(FcitxClient *client)
-{
- char *appname = NULL;
- pid_t pid = 0;
- int id = 0;
- SDL_bool enable;
- Uint32 arg1, arg2, arg3, arg4;
-
- SDL_DBusContext *dbus = client->dbus;
- DBusMessage *reply = NULL;
- DBusMessage *msg = dbus->message_new_method_call(
- client->servicename,
- FCITX_IM_DBUS_PATH,
- FCITX_IM_DBUS_INTERFACE,
- "CreateICv3"
- );
-
- if (msg == NULL)
- return ;
-
- appname = GetAppName();
- pid = getpid();
- dbus->message_append_args(msg,
- DBUS_TYPE_STRING, &appname,
- DBUS_TYPE_INT32, &pid,
- DBUS_TYPE_INVALID);
-
- do {
- reply = dbus->connection_send_with_reply_and_block(
- dbus->session_conn,
- msg,
- DBUS_TIMEOUT,
- NULL);
-
- if (!reply)
- break;
- if (!dbus->message_get_args(reply, NULL,
- DBUS_TYPE_INT32, &id,
- DBUS_TYPE_BOOLEAN, &enable,
- DBUS_TYPE_UINT32, &arg1,
- DBUS_TYPE_UINT32, &arg2,
- DBUS_TYPE_UINT32, &arg3,
- DBUS_TYPE_UINT32, &arg4,
- DBUS_TYPE_INVALID))
- break;
-
- if (id < 0)
- break;
- client->id = id;
-
- SDL_snprintf(client->icname, IC_NAME_MAX,
- FCITX_IC_DBUS_PATH, client->id);
-
- dbus->bus_add_match(dbus->session_conn,
- "type='signal', interface='org.fcitx.Fcitx.InputContext'",
- NULL);
- dbus->connection_add_filter(dbus->session_conn,
- &DBus_MessageFilter, dbus,
- NULL);
- dbus->connection_flush(dbus->session_conn);
-
- SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, &Fcitx_SetCapabilities, client);
- }
- while (0);
-
- if (reply)
- dbus->message_unref(reply);
- dbus->message_unref(msg);
- SDL_free(appname);
-}
-
-static Uint32
-Fcitx_ModState(void)
-{
- Uint32 fcitx_mods = 0;
- SDL_Keymod sdl_mods = SDL_GetModState();
-
- if (sdl_mods & KMOD_SHIFT) fcitx_mods |= FcitxKeyState_Shift;
- if (sdl_mods & KMOD_CAPS) fcitx_mods |= FcitxKeyState_CapsLock;
- if (sdl_mods & KMOD_CTRL) fcitx_mods |= FcitxKeyState_Ctrl;
- if (sdl_mods & KMOD_ALT) fcitx_mods |= FcitxKeyState_Alt;
- if (sdl_mods & KMOD_NUM) fcitx_mods |= FcitxKeyState_NumLock;
- if (sdl_mods & KMOD_LGUI) fcitx_mods |= FcitxKeyState_Super;
- if (sdl_mods & KMOD_RGUI) fcitx_mods |= FcitxKeyState_Meta;
-
- return fcitx_mods;
-}
-
-SDL_bool
-SDL_Fcitx_Init()
-{
- fcitx_client.dbus = SDL_DBus_GetContext();
-
- fcitx_client.cursor_rect.x = -1;
- fcitx_client.cursor_rect.y = -1;
- fcitx_client.cursor_rect.w = 0;
- fcitx_client.cursor_rect.h = 0;
-
- SDL_snprintf(fcitx_client.servicename, IC_NAME_MAX,
- "%s-%d",
- FCITX_DBUS_SERVICE, GetDisplayNumber());
-
- FcitxClientCreateIC(&fcitx_client);
-
- return SDL_TRUE;
-}
-
-void
-SDL_Fcitx_Quit()
-{
- FcitxClientICCallMethod(&fcitx_client, "DestroyIC");
-}
-
-void
-SDL_Fcitx_SetFocus(SDL_bool focused)
-{
- if (focused) {
- FcitxClientICCallMethod(&fcitx_client, "FocusIn");
- } else {
- FcitxClientICCallMethod(&fcitx_client, "FocusOut");
- }
-}
-
-void
-SDL_Fcitx_Reset(void)
-{
- FcitxClientICCallMethod(&fcitx_client, "Reset");
- FcitxClientICCallMethod(&fcitx_client, "CloseIC");
-}
-
-SDL_bool
-SDL_Fcitx_ProcessKeyEvent(Uint32 keysym, Uint32 keycode)
-{
- DBusMessage *msg = NULL;
- DBusMessage *reply = NULL;
- SDL_DBusContext *dbus = fcitx_client.dbus;
-
- Uint32 state = 0;
- SDL_bool handled = SDL_FALSE;
- int type = FCITX_PRESS_KEY;
- Uint32 event_time = 0;
-
- msg = FcitxClientICNewMethod(&fcitx_client, "ProcessKeyEvent");
- if (msg == NULL)
- return SDL_FALSE;
-
- state = Fcitx_ModState();
- dbus->message_append_args(msg,
- DBUS_TYPE_UINT32, &keysym,
- DBUS_TYPE_UINT32, &keycode,
- DBUS_TYPE_UINT32, &state,
- DBUS_TYPE_INT32, &type,
- DBUS_TYPE_UINT32, &event_time,
- DBUS_TYPE_INVALID);
-
- reply = dbus->connection_send_with_reply_and_block(dbus->session_conn,
- msg,
- -1,
- NULL);
-
- if (reply) {
- dbus->message_get_args(reply,
- NULL,
- DBUS_TYPE_INT32, &handled,
- DBUS_TYPE_INVALID);
-
- dbus->message_unref(reply);
- }
-
- if (handled) {
- SDL_Fcitx_UpdateTextRect(NULL);
- }
-
- return handled;
-}
-
-void
-SDL_Fcitx_UpdateTextRect(SDL_Rect *rect)
-{
- SDL_Window *focused_win = NULL;
- SDL_SysWMinfo info;
- int x = 0, y = 0;
- SDL_Rect *cursor = &fcitx_client.cursor_rect;
-
- SDL_DBusContext *dbus = fcitx_client.dbus;
- DBusMessage *msg = NULL;
- DBusConnection *conn;
-
- if (rect) {
- SDL_memcpy(cursor, rect, sizeof(SDL_Rect));
- }
-
- focused_win = SDL_GetKeyboardFocus();
- if (!focused_win) {
- return ;
- }
-
- SDL_VERSION(&info.version);
- if (!SDL_GetWindowWMInfo(focused_win, &info)) {
- return;
- }
-
- SDL_GetWindowPosition(focused_win, &x, &y);
-
-#if SDL_VIDEO_DRIVER_X11
- if (info.subsystem == SDL_SYSWM_X11) {
- SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayForWindow(focused_win)->driverdata;
-
- Display *x_disp = info.info.x11.display;
- Window x_win = info.info.x11.window;
- int x_screen = displaydata->screen;
- Window unused;
- X11_XTranslateCoordinates(x_disp, x_win, RootWindow(x_disp, x_screen), 0, 0, &x, &y, &unused);
- }
-#endif
-
- if (cursor->x == -1 && cursor->y == -1 && cursor->w == 0 && cursor->h == 0) {
- // move to bottom left
- int w = 0, h = 0;
- SDL_GetWindowSize(focused_win, &w, &h);
- cursor->x = 0;
- cursor->y = h;
- }
-
- x += cursor->x;
- y += cursor->y;
-
- msg = FcitxClientICNewMethod(&fcitx_client, "SetCursorRect");
- if (msg == NULL)
- return ;
-
- dbus->message_append_args(msg,
- DBUS_TYPE_INT32, &x,
- DBUS_TYPE_INT32, &y,
- DBUS_TYPE_INT32, &cursor->w,
- DBUS_TYPE_INT32, &cursor->h,
- DBUS_TYPE_INVALID);
-
- conn = dbus->session_conn;
- if (dbus->connection_send(conn, msg, NULL))
- dbus->connection_flush(conn);
-
- dbus->message_unref(msg);
-}
-
-void
-SDL_Fcitx_PumpEvents()
-{
- SDL_DBusContext *dbus = fcitx_client.dbus;
- DBusConnection *conn = dbus->session_conn;
-
- dbus->connection_read_write(conn, 0);
-
- while (dbus->connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS) {
- /* Do nothing, actual work happens in DBus_MessageFilter */
- usleep(10);
- }
-}
-
-#endif /* HAVE_FCITX_FRONTEND_H */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_fcitx.h b/3rdparty/SDL2/src/core/linux/SDL_fcitx.h
deleted file mode 100644
index 64020475c0a..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_fcitx.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#ifndef _SDL_fcitx_h
-#define _SDL_fcitx_h
-
-#include "../../SDL_internal.h"
-
-#include "SDL_stdinc.h"
-#include "SDL_rect.h"
-
-extern SDL_bool SDL_Fcitx_Init(void);
-extern void SDL_Fcitx_Quit(void);
-extern void SDL_Fcitx_SetFocus(SDL_bool focused);
-extern void SDL_Fcitx_Reset(void);
-extern SDL_bool SDL_Fcitx_ProcessKeyEvent(Uint32 keysym, Uint32 keycode);
-extern void SDL_Fcitx_UpdateTextRect(SDL_Rect *rect);
-extern void SDL_Fcitx_PumpEvents();
-
-#endif /* _SDL_fcitx_h */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_ibus.c b/3rdparty/SDL2/src/core/linux/SDL_ibus.c
deleted file mode 100644
index 3d63b8b30c3..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_ibus.c
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-#include "../../SDL_internal.h"
-
-#ifdef HAVE_IBUS_IBUS_H
-#include "SDL.h"
-#include "SDL_syswm.h"
-#include "SDL_ibus.h"
-#include "SDL_dbus.h"
-#include "../../video/SDL_sysvideo.h"
-#include "../../events/SDL_keyboard_c.h"
-
-#if SDL_VIDEO_DRIVER_X11
- #include "../../video/x11/SDL_x11video.h"
-#endif
-
-#include <sys/inotify.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-static const char IBUS_SERVICE[] = "org.freedesktop.IBus";
-static const char IBUS_PATH[] = "/org/freedesktop/IBus";
-static const char IBUS_INTERFACE[] = "org.freedesktop.IBus";
-static const char IBUS_INPUT_INTERFACE[] = "org.freedesktop.IBus.InputContext";
-
-static char *input_ctx_path = NULL;
-static SDL_Rect ibus_cursor_rect = { 0, 0, 0, 0 };
-static DBusConnection *ibus_conn = NULL;
-static char *ibus_addr_file = NULL;
-int inotify_fd = -1, inotify_wd = -1;
-
-static Uint32
-IBus_ModState(void)
-{
- Uint32 ibus_mods = 0;
- SDL_Keymod sdl_mods = SDL_GetModState();
-
- /* Not sure about MOD3, MOD4 and HYPER mappings */
- if (sdl_mods & KMOD_LSHIFT) ibus_mods |= IBUS_SHIFT_MASK;
- if (sdl_mods & KMOD_CAPS) ibus_mods |= IBUS_LOCK_MASK;
- if (sdl_mods & KMOD_LCTRL) ibus_mods |= IBUS_CONTROL_MASK;
- if (sdl_mods & KMOD_LALT) ibus_mods |= IBUS_MOD1_MASK;
- if (sdl_mods & KMOD_NUM) ibus_mods |= IBUS_MOD2_MASK;
- if (sdl_mods & KMOD_MODE) ibus_mods |= IBUS_MOD5_MASK;
- if (sdl_mods & KMOD_LGUI) ibus_mods |= IBUS_SUPER_MASK;
- if (sdl_mods & KMOD_RGUI) ibus_mods |= IBUS_META_MASK;
-
- return ibus_mods;
-}
-
-static const char *
-IBus_GetVariantText(DBusConnection *conn, DBusMessageIter *iter, SDL_DBusContext *dbus)
-{
- /* The text we need is nested weirdly, use dbus-monitor to see the structure better */
- const char *text = NULL;
- const char *struct_id = NULL;
- DBusMessageIter sub1, sub2;
-
- if (dbus->message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT) {
- return NULL;
- }
-
- dbus->message_iter_recurse(iter, &sub1);
-
- if (dbus->message_iter_get_arg_type(&sub1) != DBUS_TYPE_STRUCT) {
- return NULL;
- }
-
- dbus->message_iter_recurse(&sub1, &sub2);
-
- if (dbus->message_iter_get_arg_type(&sub2) != DBUS_TYPE_STRING) {
- return NULL;
- }
-
- dbus->message_iter_get_basic(&sub2, &struct_id);
- if (!struct_id || SDL_strncmp(struct_id, "IBusText", sizeof("IBusText")) != 0) {
- return NULL;
- }
-
- dbus->message_iter_next(&sub2);
- dbus->message_iter_next(&sub2);
-
- if (dbus->message_iter_get_arg_type(&sub2) != DBUS_TYPE_STRING) {
- return NULL;
- }
-
- dbus->message_iter_get_basic(&sub2, &text);
-
- return text;
-}
-
-static size_t
-IBus_utf8_strlen(const char *str)
-{
- size_t utf8_len = 0;
- const char *p;
-
- for (p = str; *p; ++p) {
- if (!((*p & 0x80) && !(*p & 0x40))) {
- ++utf8_len;
- }
- }
-
- return utf8_len;
-}
-
-static DBusHandlerResult
-IBus_MessageHandler(DBusConnection *conn, DBusMessage *msg, void *user_data)
-{
- SDL_DBusContext *dbus = (SDL_DBusContext *)user_data;
-
- if (dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "CommitText")) {
- DBusMessageIter iter;
- const char *text;
-
- dbus->message_iter_init(msg, &iter);
-
- text = IBus_GetVariantText(conn, &iter, dbus);
- if (text && *text) {
- char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
- size_t text_bytes = SDL_strlen(text), i = 0;
-
- while (i < text_bytes) {
- size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf));
- SDL_SendKeyboardText(buf);
-
- i += sz;
- }
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- if (dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "UpdatePreeditText")) {
- DBusMessageIter iter;
- const char *text;
-
- dbus->message_iter_init(msg, &iter);
- text = IBus_GetVariantText(conn, &iter, dbus);
-
- if (text) {
- char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
- size_t text_bytes = SDL_strlen(text), i = 0;
- size_t cursor = 0;
-
- do {
- size_t sz = SDL_utf8strlcpy(buf, text+i, sizeof(buf));
- size_t chars = IBus_utf8_strlen(buf);
-
- SDL_SendEditingText(buf, cursor, chars);
-
- i += sz;
- cursor += chars;
- } while (i < text_bytes);
- }
-
- SDL_IBus_UpdateTextRect(NULL);
-
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- if (dbus->message_is_signal(msg, IBUS_INPUT_INTERFACE, "HidePreeditText")) {
- SDL_SendEditingText("", 0, 0);
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static char *
-IBus_ReadAddressFromFile(const char *file_path)
-{
- char addr_buf[1024];
- SDL_bool success = SDL_FALSE;
- FILE *addr_file;
-
- addr_file = fopen(file_path, "r");
- if (!addr_file) {
- return NULL;
- }
-
- while (fgets(addr_buf, sizeof(addr_buf), addr_file)) {
- if (SDL_strncmp(addr_buf, "IBUS_ADDRESS=", sizeof("IBUS_ADDRESS=")-1) == 0) {
- size_t sz = SDL_strlen(addr_buf);
- if (addr_buf[sz-1] == '\n') addr_buf[sz-1] = 0;
- if (addr_buf[sz-2] == '\r') addr_buf[sz-2] = 0;
- success = SDL_TRUE;
- break;
- }
- }
-
- fclose(addr_file);
-
- if (success) {
- return SDL_strdup(addr_buf + (sizeof("IBUS_ADDRESS=") - 1));
- } else {
- return NULL;
- }
-}
-
-static char *
-IBus_GetDBusAddressFilename(void)
-{
- SDL_DBusContext *dbus;
- const char *disp_env;
- char config_dir[PATH_MAX];
- char *display = NULL;
- const char *addr;
- const char *conf_env;
- char *key;
- char file_path[PATH_MAX];
- const char *host;
- char *disp_num, *screen_num;
-
- if (ibus_addr_file) {
- return SDL_strdup(ibus_addr_file);
- }
-
- dbus = SDL_DBus_GetContext();
- if (!dbus) {
- return NULL;
- }
-
- /* Use this environment variable if it exists. */
- addr = SDL_getenv("IBUS_ADDRESS");
- if (addr && *addr) {
- return SDL_strdup(addr);
- }
-
- /* Otherwise, we have to get the hostname, display, machine id, config dir
- and look up the address from a filepath using all those bits, eek. */
- disp_env = SDL_getenv("DISPLAY");
-
- if (!disp_env || !*disp_env) {
- display = SDL_strdup(":0.0");
- } else {
- display = SDL_strdup(disp_env);
- }
-
- host = display;
- disp_num = SDL_strrchr(display, ':');
- screen_num = SDL_strrchr(display, '.');
-
- if (!disp_num) {
- SDL_free(display);
- return NULL;
- }
-
- *disp_num = 0;
- disp_num++;
-
- if (screen_num) {
- *screen_num = 0;
- }
-
- if (!*host) {
- host = "unix";
- }
-
- SDL_memset(config_dir, 0, sizeof(config_dir));
-
- conf_env = SDL_getenv("XDG_CONFIG_HOME");
- if (conf_env && *conf_env) {
- SDL_strlcpy(config_dir, conf_env, sizeof(config_dir));
- } else {
- const char *home_env = SDL_getenv("HOME");
- if (!home_env || !*home_env) {
- SDL_free(display);
- return NULL;
- }
- SDL_snprintf(config_dir, sizeof(config_dir), "%s/.config", home_env);
- }
-
- key = dbus->get_local_machine_id();
-
- SDL_memset(file_path, 0, sizeof(file_path));
- SDL_snprintf(file_path, sizeof(file_path), "%s/ibus/bus/%s-%s-%s",
- config_dir, key, host, disp_num);
- dbus->free(key);
- SDL_free(display);
-
- return SDL_strdup(file_path);
-}
-
-static SDL_bool IBus_CheckConnection(SDL_DBusContext *dbus);
-
-static void
-IBus_SetCapabilities(void *data, const char *name, const char *old_val,
- const char *internal_editing)
-{
- SDL_DBusContext *dbus = SDL_DBus_GetContext();
-
- if (IBus_CheckConnection(dbus)) {
-
- DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
- input_ctx_path,
- IBUS_INPUT_INTERFACE,
- "SetCapabilities");
- if (msg) {
- Uint32 caps = IBUS_CAP_FOCUS;
- if (!(internal_editing && *internal_editing == '1')) {
- caps |= IBUS_CAP_PREEDIT_TEXT;
- }
-
- dbus->message_append_args(msg,
- DBUS_TYPE_UINT32, &caps,
- DBUS_TYPE_INVALID);
- }
-
- if (msg) {
- if (dbus->connection_send(ibus_conn, msg, NULL)) {
- dbus->connection_flush(ibus_conn);
- }
- dbus->message_unref(msg);
- }
- }
-}
-
-
-static SDL_bool
-IBus_SetupConnection(SDL_DBusContext *dbus, const char* addr)
-{
- const char *path = NULL;
- SDL_bool result = SDL_FALSE;
- DBusMessage *msg;
- DBusObjectPathVTable ibus_vtable;
-
- SDL_zero(ibus_vtable);
- ibus_vtable.message_function = &IBus_MessageHandler;
-
- ibus_conn = dbus->connection_open_private(addr, NULL);
-
- if (!ibus_conn) {
- return SDL_FALSE;
- }
-
- dbus->connection_flush(ibus_conn);
-
- if (!dbus->bus_register(ibus_conn, NULL)) {
- ibus_conn = NULL;
- return SDL_FALSE;
- }
-
- dbus->connection_flush(ibus_conn);
-
- msg = dbus->message_new_method_call(IBUS_SERVICE, IBUS_PATH, IBUS_INTERFACE, "CreateInputContext");
- if (msg) {
- const char *client_name = "SDL2_Application";
- dbus->message_append_args(msg,
- DBUS_TYPE_STRING, &client_name,
- DBUS_TYPE_INVALID);
- }
-
- if (msg) {
- DBusMessage *reply;
-
- reply = dbus->connection_send_with_reply_and_block(ibus_conn, msg, 1000, NULL);
- if (reply) {
- if (dbus->message_get_args(reply, NULL,
- DBUS_TYPE_OBJECT_PATH, &path,
- DBUS_TYPE_INVALID)) {
- if (input_ctx_path) {
- SDL_free(input_ctx_path);
- }
- input_ctx_path = SDL_strdup(path);
- result = SDL_TRUE;
- }
- dbus->message_unref(reply);
- }
- dbus->message_unref(msg);
- }
-
- if (result) {
- SDL_AddHintCallback(SDL_HINT_IME_INTERNAL_EDITING, &IBus_SetCapabilities, NULL);
-
- dbus->bus_add_match(ibus_conn, "type='signal',interface='org.freedesktop.IBus.InputContext'", NULL);
- dbus->connection_try_register_object_path(ibus_conn, input_ctx_path, &ibus_vtable, dbus, NULL);
- dbus->connection_flush(ibus_conn);
- }
-
- SDL_IBus_SetFocus(SDL_GetKeyboardFocus() != NULL);
- SDL_IBus_UpdateTextRect(NULL);
-
- return result;
-}
-
-static SDL_bool
-IBus_CheckConnection(SDL_DBusContext *dbus)
-{
- if (!dbus) return SDL_FALSE;
-
- if (ibus_conn && dbus->connection_get_is_connected(ibus_conn)) {
- return SDL_TRUE;
- }
-
- if (inotify_fd > 0 && inotify_wd > 0) {
- char buf[1024];
- ssize_t readsize = read(inotify_fd, buf, sizeof(buf));
- if (readsize > 0) {
-
- char *p;
- SDL_bool file_updated = SDL_FALSE;
-
- for (p = buf; p < buf + readsize; /**/) {
- struct inotify_event *event = (struct inotify_event*) p;
- if (event->len > 0) {
- char *addr_file_no_path = SDL_strrchr(ibus_addr_file, '/');
- if (!addr_file_no_path) return SDL_FALSE;
-
- if (SDL_strcmp(addr_file_no_path + 1, event->name) == 0) {
- file_updated = SDL_TRUE;
- break;
- }
- }
-
- p += sizeof(struct inotify_event) + event->len;
- }
-
- if (file_updated) {
- char *addr = IBus_ReadAddressFromFile(ibus_addr_file);
- if (addr) {
- SDL_bool result = IBus_SetupConnection(dbus, addr);
- SDL_free(addr);
- return result;
- }
- }
- }
- }
-
- return SDL_FALSE;
-}
-
-SDL_bool
-SDL_IBus_Init(void)
-{
- SDL_bool result = SDL_FALSE;
- SDL_DBusContext *dbus = SDL_DBus_GetContext();
-
- if (dbus) {
- char *addr_file = IBus_GetDBusAddressFilename();
- char *addr;
- char *addr_file_dir;
-
- if (!addr_file) {
- return SDL_FALSE;
- }
-
- /* !!! FIXME: if ibus_addr_file != NULL, this will overwrite it and leak (twice!) */
- ibus_addr_file = SDL_strdup(addr_file);
-
- addr = IBus_ReadAddressFromFile(addr_file);
- if (!addr) {
- SDL_free(addr_file);
- return SDL_FALSE;
- }
-
- if (inotify_fd < 0) {
- inotify_fd = inotify_init();
- fcntl(inotify_fd, F_SETFL, O_NONBLOCK);
- }
-
- addr_file_dir = SDL_strrchr(addr_file, '/');
- if (addr_file_dir) {
- *addr_file_dir = 0;
- }
-
- inotify_wd = inotify_add_watch(inotify_fd, addr_file, IN_CREATE | IN_MODIFY);
- SDL_free(addr_file);
-
- if (addr) {
- result = IBus_SetupConnection(dbus, addr);
- SDL_free(addr);
- }
- }
-
- return result;
-}
-
-void
-SDL_IBus_Quit(void)
-{
- SDL_DBusContext *dbus;
-
- if (input_ctx_path) {
- SDL_free(input_ctx_path);
- input_ctx_path = NULL;
- }
-
- if (ibus_addr_file) {
- SDL_free(ibus_addr_file);
- ibus_addr_file = NULL;
- }
-
- dbus = SDL_DBus_GetContext();
-
- if (dbus && ibus_conn) {
- dbus->connection_close(ibus_conn);
- dbus->connection_unref(ibus_conn);
- }
-
- if (inotify_fd > 0 && inotify_wd > 0) {
- inotify_rm_watch(inotify_fd, inotify_wd);
- inotify_wd = -1;
- }
-
- SDL_DelHintCallback(SDL_HINT_IME_INTERNAL_EDITING, &IBus_SetCapabilities, NULL);
-
- SDL_memset(&ibus_cursor_rect, 0, sizeof(ibus_cursor_rect));
-}
-
-static void
-IBus_SimpleMessage(const char *method)
-{
- SDL_DBusContext *dbus = SDL_DBus_GetContext();
-
- if (IBus_CheckConnection(dbus)) {
- DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
- input_ctx_path,
- IBUS_INPUT_INTERFACE,
- method);
- if (msg) {
- if (dbus->connection_send(ibus_conn, msg, NULL)) {
- dbus->connection_flush(ibus_conn);
- }
- dbus->message_unref(msg);
- }
- }
-}
-
-void
-SDL_IBus_SetFocus(SDL_bool focused)
-{
- const char *method = focused ? "FocusIn" : "FocusOut";
- IBus_SimpleMessage(method);
-}
-
-void
-SDL_IBus_Reset(void)
-{
- IBus_SimpleMessage("Reset");
-}
-
-SDL_bool
-SDL_IBus_ProcessKeyEvent(Uint32 keysym, Uint32 keycode)
-{
- SDL_bool result = SDL_FALSE;
- SDL_DBusContext *dbus = SDL_DBus_GetContext();
-
- if (IBus_CheckConnection(dbus)) {
- DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
- input_ctx_path,
- IBUS_INPUT_INTERFACE,
- "ProcessKeyEvent");
- if (msg) {
- Uint32 mods = IBus_ModState();
- dbus->message_append_args(msg,
- DBUS_TYPE_UINT32, &keysym,
- DBUS_TYPE_UINT32, &keycode,
- DBUS_TYPE_UINT32, &mods,
- DBUS_TYPE_INVALID);
- }
-
- if (msg) {
- DBusMessage *reply;
-
- reply = dbus->connection_send_with_reply_and_block(ibus_conn, msg, 300, NULL);
- if (reply) {
- if (!dbus->message_get_args(reply, NULL,
- DBUS_TYPE_BOOLEAN, &result,
- DBUS_TYPE_INVALID)) {
- result = SDL_FALSE;
- }
- dbus->message_unref(reply);
- }
- dbus->message_unref(msg);
- }
-
- }
-
- SDL_IBus_UpdateTextRect(NULL);
-
- return result;
-}
-
-void
-SDL_IBus_UpdateTextRect(SDL_Rect *rect)
-{
- SDL_Window *focused_win;
- SDL_SysWMinfo info;
- int x = 0, y = 0;
- SDL_DBusContext *dbus;
-
- if (rect) {
- SDL_memcpy(&ibus_cursor_rect, rect, sizeof(ibus_cursor_rect));
- }
-
- focused_win = SDL_GetKeyboardFocus();
- if (!focused_win) {
- return;
- }
-
- SDL_VERSION(&info.version);
- if (!SDL_GetWindowWMInfo(focused_win, &info)) {
- return;
- }
-
- SDL_GetWindowPosition(focused_win, &x, &y);
-
-#if SDL_VIDEO_DRIVER_X11
- if (info.subsystem == SDL_SYSWM_X11) {
- SDL_DisplayData *displaydata = (SDL_DisplayData *) SDL_GetDisplayForWindow(focused_win)->driverdata;
-
- Display *x_disp = info.info.x11.display;
- Window x_win = info.info.x11.window;
- int x_screen = displaydata->screen;
- Window unused;
-
- X11_XTranslateCoordinates(x_disp, x_win, RootWindow(x_disp, x_screen), 0, 0, &x, &y, &unused);
- }
-#endif
-
- x += ibus_cursor_rect.x;
- y += ibus_cursor_rect.y;
-
- dbus = SDL_DBus_GetContext();
-
- if (IBus_CheckConnection(dbus)) {
- DBusMessage *msg = dbus->message_new_method_call(IBUS_SERVICE,
- input_ctx_path,
- IBUS_INPUT_INTERFACE,
- "SetCursorLocation");
- if (msg) {
- dbus->message_append_args(msg,
- DBUS_TYPE_INT32, &x,
- DBUS_TYPE_INT32, &y,
- DBUS_TYPE_INT32, &ibus_cursor_rect.w,
- DBUS_TYPE_INT32, &ibus_cursor_rect.h,
- DBUS_TYPE_INVALID);
- }
-
- if (msg) {
- if (dbus->connection_send(ibus_conn, msg, NULL)) {
- dbus->connection_flush(ibus_conn);
- }
- dbus->message_unref(msg);
- }
- }
-}
-
-void
-SDL_IBus_PumpEvents(void)
-{
- SDL_DBusContext *dbus = SDL_DBus_GetContext();
-
- if (IBus_CheckConnection(dbus)) {
- dbus->connection_read_write(ibus_conn, 0);
-
- while (dbus->connection_dispatch(ibus_conn) == DBUS_DISPATCH_DATA_REMAINS) {
- /* Do nothing, actual work happens in IBus_MessageHandler */
- }
- }
-}
-
-#endif
diff --git a/3rdparty/SDL2/src/core/linux/SDL_ibus.h b/3rdparty/SDL2/src/core/linux/SDL_ibus.h
deleted file mode 100644
index 5ee7a8e407c..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_ibus.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#include "../../SDL_internal.h"
-
-#ifndef _SDL_ibus_h
-#define _SDL_ibus_h
-
-#ifdef HAVE_IBUS_IBUS_H
-#define SDL_USE_IBUS 1
-#include "SDL_stdinc.h"
-#include <ibus-1.0/ibus.h>
-
-extern SDL_bool SDL_IBus_Init(void);
-extern void SDL_IBus_Quit(void);
-
-/* Lets the IBus server know about changes in window focus */
-extern void SDL_IBus_SetFocus(SDL_bool focused);
-
-/* Closes the candidate list and resets any text currently being edited */
-extern void SDL_IBus_Reset(void);
-
-/* Sends a keypress event to IBus, returns SDL_TRUE if IBus used this event to
- update its candidate list or change input methods. PumpEvents should be
- called some time after this, to recieve the TextInput / TextEditing event back. */
-extern SDL_bool SDL_IBus_ProcessKeyEvent(Uint32 keysym, Uint32 keycode);
-
-/* Update the position of IBus' candidate list. If rect is NULL then this will
- just reposition it relative to the focused window's new position. */
-extern void SDL_IBus_UpdateTextRect(SDL_Rect *window_relative_rect);
-
-/* Checks DBus for new IBus events, and calls SDL_SendKeyboardText /
- SDL_SendEditingText for each event it finds */
-extern void SDL_IBus_PumpEvents();
-
-#endif /* HAVE_IBUS_IBUS_H */
-
-#endif /* _SDL_ibus_h */
-
-/* vi: set ts=4 sw=4 expandtab: */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_ime.c b/3rdparty/SDL2/src/core/linux/SDL_ime.c
deleted file mode 100644
index 049bd6e02e9..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_ime.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#include "SDL_ime.h"
-#include "SDL_ibus.h"
-#include "SDL_fcitx.h"
-
-typedef SDL_bool (*_SDL_IME_Init)();
-typedef void (*_SDL_IME_Quit)();
-typedef void (*_SDL_IME_SetFocus)(SDL_bool);
-typedef void (*_SDL_IME_Reset)();
-typedef SDL_bool (*_SDL_IME_ProcessKeyEvent)(Uint32, Uint32);
-typedef void (*_SDL_IME_UpdateTextRect)(SDL_Rect *);
-typedef void (*_SDL_IME_PumpEvents)();
-
-static _SDL_IME_Init SDL_IME_Init_Real = NULL;
-static _SDL_IME_Quit SDL_IME_Quit_Real = NULL;
-static _SDL_IME_SetFocus SDL_IME_SetFocus_Real = NULL;
-static _SDL_IME_Reset SDL_IME_Reset_Real = NULL;
-static _SDL_IME_ProcessKeyEvent SDL_IME_ProcessKeyEvent_Real = NULL;
-static _SDL_IME_UpdateTextRect SDL_IME_UpdateTextRect_Real = NULL;
-static _SDL_IME_PumpEvents SDL_IME_PumpEvents_Real = NULL;
-
-static void
-InitIME()
-{
- static SDL_bool inited = SDL_FALSE;
-#ifdef HAVE_FCITX_FRONTEND_H
- const char *im_module = SDL_getenv("SDL_IM_MODULE");
- const char *xmodifiers = SDL_getenv("XMODIFIERS");
-#endif
-
- if (inited == SDL_TRUE)
- return;
-
- inited = SDL_TRUE;
-
- /* See if fcitx IME support is being requested */
-#ifdef HAVE_FCITX_FRONTEND_H
- if (!SDL_IME_Init_Real &&
- ((im_module && SDL_strcmp(im_module, "fcitx") == 0) ||
- (!im_module && xmodifiers && SDL_strstr(xmodifiers, "@im=fcitx") != NULL))) {
- SDL_IME_Init_Real = SDL_Fcitx_Init;
- SDL_IME_Quit_Real = SDL_Fcitx_Quit;
- SDL_IME_SetFocus_Real = SDL_Fcitx_SetFocus;
- SDL_IME_Reset_Real = SDL_Fcitx_Reset;
- SDL_IME_ProcessKeyEvent_Real = SDL_Fcitx_ProcessKeyEvent;
- SDL_IME_UpdateTextRect_Real = SDL_Fcitx_UpdateTextRect;
- SDL_IME_PumpEvents_Real = SDL_Fcitx_PumpEvents;
- }
-#endif /* HAVE_FCITX_FRONTEND_H */
-
- /* default to IBus */
-#ifdef HAVE_IBUS_IBUS_H
- if (!SDL_IME_Init_Real) {
- SDL_IME_Init_Real = SDL_IBus_Init;
- SDL_IME_Quit_Real = SDL_IBus_Quit;
- SDL_IME_SetFocus_Real = SDL_IBus_SetFocus;
- SDL_IME_Reset_Real = SDL_IBus_Reset;
- SDL_IME_ProcessKeyEvent_Real = SDL_IBus_ProcessKeyEvent;
- SDL_IME_UpdateTextRect_Real = SDL_IBus_UpdateTextRect;
- SDL_IME_PumpEvents_Real = SDL_IBus_PumpEvents;
- }
-#endif /* HAVE_IBUS_IBUS_H */
-}
-
-SDL_bool
-SDL_IME_Init(void)
-{
- InitIME();
-
- if (SDL_IME_Init_Real)
- return SDL_IME_Init_Real();
-
- return SDL_FALSE;
-}
-
-void
-SDL_IME_Quit(void)
-{
- if (SDL_IME_Quit_Real)
- SDL_IME_Quit_Real();
-}
-
-void
-SDL_IME_SetFocus(SDL_bool focused)
-{
- if (SDL_IME_SetFocus_Real)
- SDL_IME_SetFocus_Real(focused);
-}
-
-void
-SDL_IME_Reset(void)
-{
- if (SDL_IME_Reset_Real)
- SDL_IME_Reset_Real();
-}
-
-SDL_bool
-SDL_IME_ProcessKeyEvent(Uint32 keysym, Uint32 keycode)
-{
- if (SDL_IME_ProcessKeyEvent_Real)
- return SDL_IME_ProcessKeyEvent_Real(keysym, keycode);
-
- return SDL_FALSE;
-}
-
-void
-SDL_IME_UpdateTextRect(SDL_Rect *rect)
-{
- if (SDL_IME_UpdateTextRect_Real)
- SDL_IME_UpdateTextRect_Real(rect);
-}
-
-void
-SDL_IME_PumpEvents()
-{
- if (SDL_IME_PumpEvents_Real)
- SDL_IME_PumpEvents_Real();
-}
diff --git a/3rdparty/SDL2/src/core/linux/SDL_ime.h b/3rdparty/SDL2/src/core/linux/SDL_ime.h
deleted file mode 100644
index 22b31de398b..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_ime.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#ifndef _SDL_ime_h
-#define _SDL_ime_h
-
-#include "../../SDL_internal.h"
-
-#include "SDL_stdinc.h"
-#include "SDL_rect.h"
-
-extern SDL_bool SDL_IME_Init();
-extern void SDL_IME_Quit();
-extern void SDL_IME_SetFocus(SDL_bool focused);
-extern void SDL_IME_Reset();
-extern SDL_bool SDL_IME_ProcessKeyEvent(Uint32 keysym, Uint32 keycode);
-extern void SDL_IME_UpdateTextRect(SDL_Rect *rect);
-extern void SDL_IME_PumpEvents();
-
-#endif /* _SDL_ime_h */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_udev.c b/3rdparty/SDL2/src/core/linux/SDL_udev.c
deleted file mode 100644
index ae78ddd6849..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_udev.c
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-/*
- * To list the properties of a device, try something like:
- * udevadm info -a -n snd/hwC0D0 (for a sound card)
- * udevadm info --query=all -n input/event3 (for a keyboard, mouse, etc)
- * udevadm info --query=property -n input/event2
- */
-#include "SDL_udev.h"
-
-#ifdef SDL_USE_LIBUDEV
-
-#include <linux/input.h>
-
-#include "SDL.h"
-
-static const char* SDL_UDEV_LIBS[] = { "libudev.so.1", "libudev.so.0" };
-
-#define _THIS SDL_UDEV_PrivateData *_this
-static _THIS = NULL;
-
-static SDL_bool SDL_UDEV_load_sym(const char *fn, void **addr);
-static int SDL_UDEV_load_syms(void);
-static SDL_bool SDL_UDEV_hotplug_update_available(void);
-static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev);
-
-static SDL_bool
-SDL_UDEV_load_sym(const char *fn, void **addr)
-{
- *addr = SDL_LoadFunction(_this->udev_handle, fn);
- if (*addr == NULL) {
- /* Don't call SDL_SetError(): SDL_LoadFunction already did. */
- return SDL_FALSE;
- }
-
- return SDL_TRUE;
-}
-
-static int
-SDL_UDEV_load_syms(void)
-{
- /* cast funcs to char* first, to please GCC's strict aliasing rules. */
- #define SDL_UDEV_SYM(x) \
- if (!SDL_UDEV_load_sym(#x, (void **) (char *) & _this->x)) return -1
-
- SDL_UDEV_SYM(udev_device_get_action);
- SDL_UDEV_SYM(udev_device_get_devnode);
- SDL_UDEV_SYM(udev_device_get_subsystem);
- SDL_UDEV_SYM(udev_device_get_parent_with_subsystem_devtype);
- SDL_UDEV_SYM(udev_device_get_property_value);
- SDL_UDEV_SYM(udev_device_get_sysattr_value);
- SDL_UDEV_SYM(udev_device_new_from_syspath);
- SDL_UDEV_SYM(udev_device_unref);
- SDL_UDEV_SYM(udev_enumerate_add_match_property);
- SDL_UDEV_SYM(udev_enumerate_add_match_subsystem);
- SDL_UDEV_SYM(udev_enumerate_get_list_entry);
- SDL_UDEV_SYM(udev_enumerate_new);
- SDL_UDEV_SYM(udev_enumerate_scan_devices);
- SDL_UDEV_SYM(udev_enumerate_unref);
- SDL_UDEV_SYM(udev_list_entry_get_name);
- SDL_UDEV_SYM(udev_list_entry_get_next);
- SDL_UDEV_SYM(udev_monitor_enable_receiving);
- SDL_UDEV_SYM(udev_monitor_filter_add_match_subsystem_devtype);
- SDL_UDEV_SYM(udev_monitor_get_fd);
- SDL_UDEV_SYM(udev_monitor_new_from_netlink);
- SDL_UDEV_SYM(udev_monitor_receive_device);
- SDL_UDEV_SYM(udev_monitor_unref);
- SDL_UDEV_SYM(udev_new);
- SDL_UDEV_SYM(udev_unref);
- SDL_UDEV_SYM(udev_device_new_from_devnum);
- SDL_UDEV_SYM(udev_device_get_devnum);
- #undef SDL_UDEV_SYM
-
- return 0;
-}
-
-static SDL_bool
-SDL_UDEV_hotplug_update_available(void)
-{
- if (_this->udev_mon != NULL) {
- const int fd = _this->udev_monitor_get_fd(_this->udev_mon);
- fd_set fds;
- struct timeval tv;
-
- FD_ZERO(&fds);
- FD_SET(fd, &fds);
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- if ((select(fd+1, &fds, NULL, NULL, &tv) > 0) && (FD_ISSET(fd, &fds))) {
- return SDL_TRUE;
- }
- }
- return SDL_FALSE;
-}
-
-
-int
-SDL_UDEV_Init(void)
-{
- int retval = 0;
-
- if (_this == NULL) {
- _this = (SDL_UDEV_PrivateData *) SDL_calloc(1, sizeof(*_this));
- if(_this == NULL) {
- return SDL_OutOfMemory();
- }
-
- retval = SDL_UDEV_LoadLibrary();
- if (retval < 0) {
- SDL_UDEV_Quit();
- return retval;
- }
-
- /* Set up udev monitoring
- * Listen for input devices (mouse, keyboard, joystick, etc) and sound devices
- */
-
- _this->udev = _this->udev_new();
- if (_this->udev == NULL) {
- SDL_UDEV_Quit();
- return SDL_SetError("udev_new() failed");
- }
-
- _this->udev_mon = _this->udev_monitor_new_from_netlink(_this->udev, "udev");
- if (_this->udev_mon == NULL) {
- SDL_UDEV_Quit();
- return SDL_SetError("udev_monitor_new_from_netlink() failed");
- }
-
- _this->udev_monitor_filter_add_match_subsystem_devtype(_this->udev_mon, "input", NULL);
- _this->udev_monitor_filter_add_match_subsystem_devtype(_this->udev_mon, "sound", NULL);
- _this->udev_monitor_enable_receiving(_this->udev_mon);
-
- /* Do an initial scan of existing devices */
- SDL_UDEV_Scan();
-
- }
-
- _this->ref_count += 1;
-
- return retval;
-}
-
-void
-SDL_UDEV_Quit(void)
-{
- SDL_UDEV_CallbackList *item;
-
- if (_this == NULL) {
- return;
- }
-
- _this->ref_count -= 1;
-
- if (_this->ref_count < 1) {
-
- if (_this->udev_mon != NULL) {
- _this->udev_monitor_unref(_this->udev_mon);
- _this->udev_mon = NULL;
- }
- if (_this->udev != NULL) {
- _this->udev_unref(_this->udev);
- _this->udev = NULL;
- }
-
- /* Remove existing devices */
- while (_this->first != NULL) {
- item = _this->first;
- _this->first = _this->first->next;
- SDL_free(item);
- }
-
- SDL_UDEV_UnloadLibrary();
- SDL_free(_this);
- _this = NULL;
- }
-}
-
-void
-SDL_UDEV_Scan(void)
-{
- struct udev_enumerate *enumerate = NULL;
- struct udev_list_entry *devs = NULL;
- struct udev_list_entry *item = NULL;
-
- if (_this == NULL) {
- return;
- }
-
- enumerate = _this->udev_enumerate_new(_this->udev);
- if (enumerate == NULL) {
- SDL_UDEV_Quit();
- SDL_SetError("udev_monitor_new_from_netlink() failed");
- return;
- }
-
- _this->udev_enumerate_add_match_subsystem(enumerate, "input");
- _this->udev_enumerate_add_match_subsystem(enumerate, "sound");
-
- _this->udev_enumerate_scan_devices(enumerate);
- devs = _this->udev_enumerate_get_list_entry(enumerate);
- for (item = devs; item; item = _this->udev_list_entry_get_next(item)) {
- const char *path = _this->udev_list_entry_get_name(item);
- struct udev_device *dev = _this->udev_device_new_from_syspath(_this->udev, path);
- if (dev != NULL) {
- device_event(SDL_UDEV_DEVICEADDED, dev);
- _this->udev_device_unref(dev);
- }
- }
-
- _this->udev_enumerate_unref(enumerate);
-}
-
-
-void
-SDL_UDEV_UnloadLibrary(void)
-{
- if (_this == NULL) {
- return;
- }
-
- if (_this->udev_handle != NULL) {
- SDL_UnloadObject(_this->udev_handle);
- _this->udev_handle = NULL;
- }
-}
-
-int
-SDL_UDEV_LoadLibrary(void)
-{
- int retval = 0, i;
-
- if (_this == NULL) {
- return SDL_SetError("UDEV not initialized");
- }
-
-
- if (_this->udev_handle == NULL) {
- for( i = 0 ; i < SDL_arraysize(SDL_UDEV_LIBS); i++) {
- _this->udev_handle = SDL_LoadObject(SDL_UDEV_LIBS[i]);
- if (_this->udev_handle != NULL) {
- retval = SDL_UDEV_load_syms();
- if (retval < 0) {
- SDL_UDEV_UnloadLibrary();
- }
- else {
- break;
- }
- }
- }
-
- if (_this->udev_handle == NULL) {
- retval = -1;
- /* Don't call SDL_SetError(): SDL_LoadObject already did. */
- }
- }
-
- return retval;
-}
-
-#define BITS_PER_LONG (sizeof(unsigned long) * 8)
-#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
-#define OFF(x) ((x)%BITS_PER_LONG)
-#define BIT(x) (1UL<<OFF(x))
-#define LONG(x) ((x)/BITS_PER_LONG)
-#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
-
-static void get_caps(struct udev_device *dev, struct udev_device *pdev, const char *attr, unsigned long *bitmask, size_t bitmask_len)
-{
- const char *value;
- char text[4096];
- char *word;
- int i;
- unsigned long v;
-
- SDL_memset(bitmask, 0, bitmask_len*sizeof(*bitmask));
- value = _this->udev_device_get_sysattr_value(pdev, attr);
- if (!value) {
- return;
- }
-
- SDL_strlcpy(text, value, sizeof(text));
- i = 0;
- while ((word = SDL_strrchr(text, ' ')) != NULL) {
- v = SDL_strtoul(word+1, NULL, 16);
- if (i < bitmask_len) {
- bitmask[i] = v;
- }
- ++i;
- *word = '\0';
- }
- v = SDL_strtoul(text, NULL, 16);
- if (i < bitmask_len) {
- bitmask[i] = v;
- }
-}
-
-static int
-guess_device_class(struct udev_device *dev)
-{
- int devclass = 0;
- struct udev_device *pdev;
- unsigned long bitmask_ev[NBITS(EV_MAX)];
- unsigned long bitmask_abs[NBITS(ABS_MAX)];
- unsigned long bitmask_key[NBITS(KEY_MAX)];
- unsigned long bitmask_rel[NBITS(REL_MAX)];
- unsigned long keyboard_mask;
-
- /* walk up the parental chain until we find the real input device; the
- * argument is very likely a subdevice of this, like eventN */
- pdev = dev;
- while (pdev && !_this->udev_device_get_sysattr_value(pdev, "capabilities/ev")) {
- pdev = _this->udev_device_get_parent_with_subsystem_devtype(pdev, "input", NULL);
- }
- if (!pdev) {
- return 0;
- }
-
- get_caps(dev, pdev, "capabilities/ev", bitmask_ev, SDL_arraysize(bitmask_ev));
- get_caps(dev, pdev, "capabilities/abs", bitmask_abs, SDL_arraysize(bitmask_abs));
- get_caps(dev, pdev, "capabilities/rel", bitmask_rel, SDL_arraysize(bitmask_rel));
- get_caps(dev, pdev, "capabilities/key", bitmask_key, SDL_arraysize(bitmask_key));
-
- if (test_bit(EV_ABS, bitmask_ev) &&
- test_bit(ABS_X, bitmask_abs) && test_bit(ABS_Y, bitmask_abs)) {
- if (test_bit(BTN_STYLUS, bitmask_key) || test_bit(BTN_TOOL_PEN, bitmask_key)) {
- ; /* ID_INPUT_TABLET */
- } else if (test_bit(BTN_TOOL_FINGER, bitmask_key) && !test_bit(BTN_TOOL_PEN, bitmask_key)) {
- ; /* ID_INPUT_TOUCHPAD */
- } else if (test_bit(BTN_MOUSE, bitmask_key)) {
- devclass |= SDL_UDEV_DEVICE_MOUSE; /* ID_INPUT_MOUSE */
- } else if (test_bit(BTN_TOUCH, bitmask_key)) {
- /* TODO: better determining between touchscreen and multitouch touchpad,
- see https://github.com/systemd/systemd/blob/master/src/udev/udev-builtin-input_id.c */
- devclass |= SDL_UDEV_DEVICE_TOUCHSCREEN; /* ID_INPUT_TOUCHSCREEN */
- }
-
- if (test_bit(BTN_TRIGGER, bitmask_key) ||
- test_bit(BTN_A, bitmask_key) ||
- test_bit(BTN_1, bitmask_key) ||
- test_bit(ABS_RX, bitmask_abs) ||
- test_bit(ABS_RY, bitmask_abs) ||
- test_bit(ABS_RZ, bitmask_abs) ||
- test_bit(ABS_THROTTLE, bitmask_abs) ||
- test_bit(ABS_RUDDER, bitmask_abs) ||
- test_bit(ABS_WHEEL, bitmask_abs) ||
- test_bit(ABS_GAS, bitmask_abs) ||
- test_bit(ABS_BRAKE, bitmask_abs)) {
- devclass |= SDL_UDEV_DEVICE_JOYSTICK; /* ID_INPUT_JOYSTICK */
- }
- }
-
- if (test_bit(EV_REL, bitmask_ev) &&
- test_bit(REL_X, bitmask_rel) && test_bit(REL_Y, bitmask_rel) &&
- test_bit(BTN_MOUSE, bitmask_key)) {
- devclass |= SDL_UDEV_DEVICE_MOUSE; /* ID_INPUT_MOUSE */
- }
-
- /* the first 32 bits are ESC, numbers, and Q to D; if we have any of
- * those, consider it a keyboard device; do not test KEY_RESERVED, though */
- keyboard_mask = 0xFFFFFFFE;
- if ((bitmask_key[0] & keyboard_mask) != 0)
- devclass |= SDL_UDEV_DEVICE_KEYBOARD; /* ID_INPUT_KEYBOARD */
-
- return devclass;
-}
-
-static void
-device_event(SDL_UDEV_deviceevent type, struct udev_device *dev)
-{
- const char *subsystem;
- const char *val = NULL;
- int devclass = 0;
- const char *path;
- SDL_UDEV_CallbackList *item;
-
- path = _this->udev_device_get_devnode(dev);
- if (path == NULL) {
- return;
- }
-
- subsystem = _this->udev_device_get_subsystem(dev);
- if (SDL_strcmp(subsystem, "sound") == 0) {
- devclass = SDL_UDEV_DEVICE_SOUND;
- } else if (SDL_strcmp(subsystem, "input") == 0) {
- /* udev rules reference: http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-input_id.c */
-
- val = _this->udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK");
- if (val != NULL && SDL_strcmp(val, "1") == 0 ) {
- devclass |= SDL_UDEV_DEVICE_JOYSTICK;
- }
-
- val = _this->udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
- if (val != NULL && SDL_strcmp(val, "1") == 0 ) {
- devclass |= SDL_UDEV_DEVICE_MOUSE;
- }
-
- val = _this->udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN");
- if (val != NULL && SDL_strcmp(val, "1") == 0 ) {
- devclass |= SDL_UDEV_DEVICE_TOUCHSCREEN;
- }
-
- /* The undocumented rule is:
- - All devices with keys get ID_INPUT_KEY
- - From this subset, if they have ESC, numbers, and Q to D, it also gets ID_INPUT_KEYBOARD
-
- Ref: http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-input_id.c#n183
- */
- val = _this->udev_device_get_property_value(dev, "ID_INPUT_KEY");
- if (val != NULL && SDL_strcmp(val, "1") == 0 ) {
- devclass |= SDL_UDEV_DEVICE_KEYBOARD;
- }
-
- if (devclass == 0) {
- /* Fall back to old style input classes */
- val = _this->udev_device_get_property_value(dev, "ID_CLASS");
- if (val != NULL) {
- if (SDL_strcmp(val, "joystick") == 0) {
- devclass = SDL_UDEV_DEVICE_JOYSTICK;
- } else if (SDL_strcmp(val, "mouse") == 0) {
- devclass = SDL_UDEV_DEVICE_MOUSE;
- } else if (SDL_strcmp(val, "kbd") == 0) {
- devclass = SDL_UDEV_DEVICE_KEYBOARD;
- } else {
- return;
- }
- } else {
- /* We could be linked with libudev on a system that doesn't have udev running */
- devclass = guess_device_class(dev);
- }
- }
- } else {
- return;
- }
-
- /* Process callbacks */
- for (item = _this->first; item != NULL; item = item->next) {
- item->callback(type, devclass, path);
- }
-}
-
-void
-SDL_UDEV_Poll(void)
-{
- struct udev_device *dev = NULL;
- const char *action = NULL;
-
- if (_this == NULL) {
- return;
- }
-
- while (SDL_UDEV_hotplug_update_available()) {
- dev = _this->udev_monitor_receive_device(_this->udev_mon);
- if (dev == NULL) {
- break;
- }
- action = _this->udev_device_get_action(dev);
-
- if (SDL_strcmp(action, "add") == 0) {
- /* Wait for the device to finish initialization */
- SDL_Delay(100);
-
- device_event(SDL_UDEV_DEVICEADDED, dev);
- } else if (SDL_strcmp(action, "remove") == 0) {
- device_event(SDL_UDEV_DEVICEREMOVED, dev);
- }
-
- _this->udev_device_unref(dev);
- }
-}
-
-int
-SDL_UDEV_AddCallback(SDL_UDEV_Callback cb)
-{
- SDL_UDEV_CallbackList *item;
- item = (SDL_UDEV_CallbackList *) SDL_calloc(1, sizeof (SDL_UDEV_CallbackList));
- if (item == NULL) {
- return SDL_OutOfMemory();
- }
-
- item->callback = cb;
-
- if (_this->last == NULL) {
- _this->first = _this->last = item;
- } else {
- _this->last->next = item;
- _this->last = item;
- }
-
- return 1;
-}
-
-void
-SDL_UDEV_DelCallback(SDL_UDEV_Callback cb)
-{
- SDL_UDEV_CallbackList *item;
- SDL_UDEV_CallbackList *prev = NULL;
-
- for (item = _this->first; item != NULL; item = item->next) {
- /* found it, remove it. */
- if (item->callback == cb) {
- if (prev != NULL) {
- prev->next = item->next;
- } else {
- SDL_assert(_this->first == item);
- _this->first = item->next;
- }
- if (item == _this->last) {
- _this->last = prev;
- }
- SDL_free(item);
- return;
- }
- prev = item;
- }
-
-}
-
-
-#endif /* SDL_USE_LIBUDEV */
diff --git a/3rdparty/SDL2/src/core/linux/SDL_udev.h b/3rdparty/SDL2/src/core/linux/SDL_udev.h
deleted file mode 100644
index 9ffbb3252b2..00000000000
--- a/3rdparty/SDL2/src/core/linux/SDL_udev.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Simple DirectMedia Layer
- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-
-#include "../../SDL_internal.h"
-
-#ifndef _SDL_udev_h
-#define _SDL_udev_h
-
-#if HAVE_LIBUDEV_H
-
-#ifndef SDL_USE_LIBUDEV
-#define SDL_USE_LIBUDEV 1
-#endif
-
-#include "SDL_loadso.h"
-#include "SDL_events.h"
-#include <libudev.h>
-#include <sys/time.h>
-#include <sys/types.h>
-
-/**
- * \brief Device type
- */
-
-typedef enum
-{
- SDL_UDEV_DEVICEADDED = 1,
- SDL_UDEV_DEVICEREMOVED
-} SDL_UDEV_deviceevent;
-
-/* A device can be any combination of these classes */
-typedef enum
-{
- SDL_UDEV_DEVICE_UNKNOWN = 0x0000,
- SDL_UDEV_DEVICE_MOUSE = 0x0001,
- SDL_UDEV_DEVICE_KEYBOARD = 0x0002,
- SDL_UDEV_DEVICE_JOYSTICK = 0x0004,
- SDL_UDEV_DEVICE_SOUND = 0x0008,
- SDL_UDEV_DEVICE_TOUCHSCREEN = 0x0010
-} SDL_UDEV_deviceclass;
-
-typedef void (*SDL_UDEV_Callback)(SDL_UDEV_deviceevent udev_type, int udev_class, const char *devpath);
-
-typedef struct SDL_UDEV_CallbackList {
- SDL_UDEV_Callback callback;
- struct SDL_UDEV_CallbackList *next;
-} SDL_UDEV_CallbackList;
-
-typedef struct SDL_UDEV_PrivateData
-{
- const char *udev_library;
- void *udev_handle;
- struct udev *udev;
- struct udev_monitor *udev_mon;
- int ref_count;
- SDL_UDEV_CallbackList *first, *last;
-
- /* Function pointers */
- const char *(*udev_device_get_action)(struct udev_device *);
- const char *(*udev_device_get_devnode)(struct udev_device *);
- const char *(*udev_device_get_subsystem)(struct udev_device *);
- struct udev_device *(*udev_device_get_parent_with_subsystem_devtype)(struct udev_device *udev_device, const char *subsystem, const char *devtype);
- const char *(*udev_device_get_property_value)(struct udev_device *, const char *);
- const char *(*udev_device_get_sysattr_value)(struct udev_device *udev_device, const char *sysattr);
- struct udev_device *(*udev_device_new_from_syspath)(struct udev *, const char *);
- void (*udev_device_unref)(struct udev_device *);
- int (*udev_enumerate_add_match_property)(struct udev_enumerate *, const char *, const char *);
- int (*udev_enumerate_add_match_subsystem)(struct udev_enumerate *, const char *);
- struct udev_list_entry *(*udev_enumerate_get_list_entry)(struct udev_enumerate *);
- struct udev_enumerate *(*udev_enumerate_new)(struct udev *);
- int (*udev_enumerate_scan_devices)(struct udev_enumerate *);
- void (*udev_enumerate_unref)(struct udev_enumerate *);
- const char *(*udev_list_entry_get_name)(struct udev_list_entry *);
- struct udev_list_entry *(*udev_list_entry_get_next)(struct udev_list_entry *);
- int (*udev_monitor_enable_receiving)(struct udev_monitor *);
- int (*udev_monitor_filter_add_match_subsystem_devtype)(struct udev_monitor *, const char *, const char *);
- int (*udev_monitor_get_fd)(struct udev_monitor *);
- struct udev_monitor *(*udev_monitor_new_from_netlink)(struct udev *, const char *);
- struct udev_device *(*udev_monitor_receive_device)(struct udev_monitor *);
- void (*udev_monitor_unref)(struct udev_monitor *);
- struct udev *(*udev_new)(void);
- void (*udev_unref)(struct udev *);
- struct udev_device * (*udev_device_new_from_devnum)(struct udev *udev, char type, dev_t devnum);
- dev_t (*udev_device_get_devnum) (struct udev_device *udev_device);
-} SDL_UDEV_PrivateData;
-
-extern int SDL_UDEV_Init(void);
-extern void SDL_UDEV_Quit(void);
-extern void SDL_UDEV_UnloadLibrary(void);
-extern int SDL_UDEV_LoadLibrary(void);
-extern void SDL_UDEV_Poll(void);
-extern void SDL_UDEV_Scan(void);
-extern int SDL_UDEV_AddCallback(SDL_UDEV_Callback cb);
-extern void SDL_UDEV_DelCallback(SDL_UDEV_Callback cb);
-
-
-
-
-#endif /* HAVE_LIBUDEV_H */
-
-#endif /* _SDL_udev_h */