input-linux + spice fixes
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJW851FAAoJEEy22O7T6HE4wUMP/jErqMPCIvLlNssHkNgZnl3V IhjDokNjJ4pWlqpp26ZTDNZU7RGUVLu2safnRlerH7g/FC0ZxSQnj2aSyZItrQwo LMaysV4UWN8MEbd58cdzOppd4umRwyumfCetM4Vz8UdVO1Tne0yTFZsid8HyvuxU 4ETP3p9ATYlR30FV4wKb6AbRg+9HpkOxJ+9sYZM3r9C7iQem9CPmTj411at27GU6 R1jraxBaXSWMaO0ehCbmTrAKmxHjBlENFPn516JIswfGjZmtAV5yoF/ExKyALAsm IGz/5ZMaCMzFShKdRqEWIyrqYJl35l2UHqgJsniX6Z4BWA91cYl38N7lmnJ/elzZ uNVfrDr51mObaWc0aLIXftc/C3PASEVX5Yk8kQkt+Le2ri+X4YYMyFVpE0Qy6wFw aPHHYTcGFnlBlIfIxDbVeTadz6L4BTEnkWJ3oNgLLHJqr/etA1K1Ccf9o68CglFY nMzcazHhE29I/o2L2Lp52YbcmI79YFK75G07ra2NxshLFVlDjZbkqyRAPJhTkIHp c2jdJnAGUPcKe4zxwGwKxbmsmO++iYl5SdLj7/TH50xtc1PzCoF1mxyuZBBUES1X YJtDdFYXOB5KxsmiQK2EdSacTiFEK7oCredintFwJHz2JiGwvQ4fKMkFFl002rOF fDcdP21IcfG2/1mhfTgn =CxRR -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/pull-ui-20160324-1' into staging input-linux + spice fixes # gpg: Signature made Thu 24 Mar 2016 07:54:45 GMT using RSA key ID D3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" * remotes/kraxel/tags/pull-ui-20160324-1: spice: Disallow use of gl + TCP port input-linux: fix Coverity warning input-linux: switch over to -object Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
f18f2e7cfc
|
@ -1226,15 +1226,6 @@ STEXI
|
|||
Set the initial graphical resolution and depth (PPC, SPARC only).
|
||||
ETEXI
|
||||
|
||||
DEF("input-linux", 1, QEMU_OPTION_input_linux,
|
||||
"-input-linux <evdev>\n"
|
||||
" Use input device.\n", QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
@item -input-linux @var{dev}
|
||||
@findex -input-linux
|
||||
Use input device.
|
||||
ETEXI
|
||||
|
||||
DEF("vnc", HAS_ARG, QEMU_OPTION_vnc ,
|
||||
"-vnc display start a VNC server on display\n", QEMU_ARCH_ALL)
|
||||
STEXI
|
||||
|
|
161
ui/input-linux.c
161
ui/input-linux.c
|
@ -10,6 +10,7 @@
|
|||
#include "qemu/sockets.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "ui/input.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include "standard-headers/linux/input.h"
|
||||
|
@ -127,10 +128,21 @@ static int qemu_input_linux_to_qcode(unsigned int lnx)
|
|||
return linux_to_qcode[lnx];
|
||||
}
|
||||
|
||||
#define TYPE_INPUT_LINUX "input-linux"
|
||||
#define INPUT_LINUX(obj) \
|
||||
OBJECT_CHECK(InputLinux, (obj), TYPE_INPUT_LINUX)
|
||||
#define INPUT_LINUX_GET_CLASS(obj) \
|
||||
OBJECT_GET_CLASS(InputLinuxClass, (obj), TYPE_INPUT_LINUX)
|
||||
#define INPUT_LINUX_CLASS(klass) \
|
||||
OBJECT_CLASS_CHECK(InputLinuxClass, (klass), TYPE_INPUT_LINUX)
|
||||
|
||||
typedef struct InputLinux InputLinux;
|
||||
typedef struct InputLinuxClass InputLinuxClass;
|
||||
|
||||
struct InputLinux {
|
||||
const char *evdev;
|
||||
Object parent;
|
||||
|
||||
char *evdev;
|
||||
int fd;
|
||||
bool repeat;
|
||||
bool grab_request;
|
||||
|
@ -139,9 +151,14 @@ struct InputLinux {
|
|||
bool keydown[KEY_CNT];
|
||||
int keycount;
|
||||
int wheel;
|
||||
bool initialized;
|
||||
QTAILQ_ENTRY(InputLinux) next;
|
||||
};
|
||||
|
||||
struct InputLinuxClass {
|
||||
ObjectClass parent_class;
|
||||
};
|
||||
|
||||
static QTAILQ_HEAD(, InputLinux) inputs = QTAILQ_HEAD_INITIALIZER(inputs);
|
||||
|
||||
static void input_linux_toggle_grab(InputLinux *il)
|
||||
|
@ -196,6 +213,13 @@ static void input_linux_event_keyboard(void *opaque)
|
|||
*/
|
||||
continue;
|
||||
}
|
||||
if (event.code >= KEY_CNT) {
|
||||
/*
|
||||
* Should not happen. But better safe than sorry,
|
||||
* and we make Coverity happy too.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
/* keep track of key state */
|
||||
if (!il->keydown[event.code] && event.value) {
|
||||
il->keydown[event.code] = true;
|
||||
|
@ -309,25 +333,21 @@ static void input_linux_event_mouse(void *opaque)
|
|||
}
|
||||
}
|
||||
|
||||
int input_linux_init(void *opaque, QemuOpts *opts, Error **errp)
|
||||
static void input_linux_complete(UserCreatable *uc, Error **errp)
|
||||
{
|
||||
InputLinux *il = g_new0(InputLinux, 1);
|
||||
InputLinux *il = INPUT_LINUX(uc);
|
||||
uint32_t evtmap;
|
||||
int rc, ver;
|
||||
|
||||
il->evdev = qemu_opt_get(opts, "evdev");
|
||||
il->grab_all = qemu_opt_get_bool(opts, "grab-all", false);
|
||||
il->repeat = qemu_opt_get_bool(opts, "repeat", false);
|
||||
|
||||
if (!il->evdev) {
|
||||
error_setg(errp, "no input device specified");
|
||||
goto err_free;
|
||||
return;
|
||||
}
|
||||
|
||||
il->fd = open(il->evdev, O_RDWR);
|
||||
if (il->fd < 0) {
|
||||
error_setg_file_open(errp, errno, il->evdev);
|
||||
goto err_free;
|
||||
return;
|
||||
}
|
||||
qemu_set_nonblock(il->fd);
|
||||
|
||||
|
@ -356,36 +376,111 @@ int input_linux_init(void *opaque, QemuOpts *opts, Error **errp)
|
|||
}
|
||||
input_linux_toggle_grab(il);
|
||||
QTAILQ_INSERT_TAIL(&inputs, il, next);
|
||||
return 0;
|
||||
il->initialized = true;
|
||||
return;
|
||||
|
||||
err_close:
|
||||
close(il->fd);
|
||||
err_free:
|
||||
g_free(il);
|
||||
return -1;
|
||||
return;
|
||||
}
|
||||
|
||||
static QemuOptsList qemu_input_linux_opts = {
|
||||
.name = "input-linux",
|
||||
.head = QTAILQ_HEAD_INITIALIZER(qemu_input_linux_opts.head),
|
||||
.implied_opt_name = "evdev",
|
||||
.desc = {
|
||||
{
|
||||
.name = "evdev",
|
||||
.type = QEMU_OPT_STRING,
|
||||
},{
|
||||
.name = "grab-all",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
},{
|
||||
.name = "repeat",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
},
|
||||
{ /* end of list */ }
|
||||
},
|
||||
static void input_linux_instance_finalize(Object *obj)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
if (il->initialized) {
|
||||
QTAILQ_REMOVE(&inputs, il, next);
|
||||
close(il->fd);
|
||||
}
|
||||
g_free(il->evdev);
|
||||
}
|
||||
|
||||
static char *input_linux_get_evdev(Object *obj, Error **errp)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
return g_strdup(il->evdev);
|
||||
}
|
||||
|
||||
static void input_linux_set_evdev(Object *obj, const char *value,
|
||||
Error **errp)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
if (il->evdev) {
|
||||
error_setg(errp, "evdev property already set");
|
||||
return;
|
||||
}
|
||||
il->evdev = g_strdup(value);
|
||||
}
|
||||
|
||||
static bool input_linux_get_grab_all(Object *obj, Error **errp)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
return il->grab_all;
|
||||
}
|
||||
|
||||
static void input_linux_set_grab_all(Object *obj, bool value,
|
||||
Error **errp)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
il->grab_all = value;
|
||||
}
|
||||
|
||||
static bool input_linux_get_repeat(Object *obj, Error **errp)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
return il->repeat;
|
||||
}
|
||||
|
||||
static void input_linux_set_repeat(Object *obj, bool value,
|
||||
Error **errp)
|
||||
{
|
||||
InputLinux *il = INPUT_LINUX(obj);
|
||||
|
||||
il->repeat = value;
|
||||
}
|
||||
|
||||
static void input_linux_instance_init(Object *obj)
|
||||
{
|
||||
object_property_add_str(obj, "evdev",
|
||||
input_linux_get_evdev,
|
||||
input_linux_set_evdev, NULL);
|
||||
object_property_add_bool(obj, "grab_all",
|
||||
input_linux_get_grab_all,
|
||||
input_linux_set_grab_all, NULL);
|
||||
object_property_add_bool(obj, "repeat",
|
||||
input_linux_get_repeat,
|
||||
input_linux_set_repeat, NULL);
|
||||
}
|
||||
|
||||
static void input_linux_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
|
||||
|
||||
ucc->complete = input_linux_complete;
|
||||
}
|
||||
|
||||
static const TypeInfo input_linux_info = {
|
||||
.name = TYPE_INPUT_LINUX,
|
||||
.parent = TYPE_OBJECT,
|
||||
.class_size = sizeof(InputLinuxClass),
|
||||
.class_init = input_linux_class_init,
|
||||
.instance_size = sizeof(InputLinux),
|
||||
.instance_init = input_linux_instance_init,
|
||||
.instance_finalize = input_linux_instance_finalize,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_USER_CREATABLE },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
||||
static void input_linux_register_config(void)
|
||||
static void register_types(void)
|
||||
{
|
||||
qemu_add_opts(&qemu_input_linux_opts);
|
||||
type_register_static(&input_linux_info);
|
||||
}
|
||||
opts_init(input_linux_register_config);
|
||||
|
||||
type_init(register_types);
|
||||
|
|
|
@ -828,6 +828,11 @@ void qemu_spice_init(void)
|
|||
|
||||
#ifdef HAVE_SPICE_GL
|
||||
if (qemu_opt_get_bool(opts, "gl", 0)) {
|
||||
if ((port != 0) || (tls_port != 0)) {
|
||||
error_report("SPICE GL support is local-only for now and "
|
||||
"incompatible with -spice port/tls-port");
|
||||
exit(1);
|
||||
}
|
||||
if (egl_rendernode_init() == 0) {
|
||||
display_opengl = 1;
|
||||
}
|
||||
|
|
10
vl.c
10
vl.c
|
@ -3729,12 +3729,6 @@ int main(int argc, char **argv, char **envp)
|
|||
#endif
|
||||
break;
|
||||
}
|
||||
case QEMU_OPTION_input_linux:
|
||||
if (!qemu_opts_parse_noisily(qemu_find_opts("input-linux"),
|
||||
optarg, true)) {
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case QEMU_OPTION_no_acpi:
|
||||
acpi_enabled = 0;
|
||||
break;
|
||||
|
@ -4598,10 +4592,6 @@ int main(int argc, char **argv, char **envp)
|
|||
qemu_spice_display_init();
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_LINUX
|
||||
qemu_opts_foreach(qemu_find_opts("input-linux"),
|
||||
input_linux_init, NULL, &error_fatal);
|
||||
#endif
|
||||
|
||||
if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
|
||||
exit(1);
|
||||
|
|
Loading…
Reference in a new issue