mirror of https://github.com/xemu-project/xemu.git
UI: fixes
- dbus-display shared-library compilation fix - remove console_select() and fix related issues -----BEGIN PGP SIGNATURE----- iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmX66jIcHG1hcmNhbmRy ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5fJID/9dGIwuvvpKCFjNERtW yD92qo0Wx0ogcikdu/Ml5RiNS4w9gmdfxQlygLcAEk9k9ZwNeRAL5KLlfk6x4zjR gPsGI9DE+eZX+iiSMRha3nPflUoQxgnhDDBVG+rGDhHC+S1WB91D2TSqD6Fg3++3 f2BFenapzZ6wMmZfMhwl/LFk9GMeH7A7wPIp0ivip7KdSFOlJyH//QKy6bmJvYWQ s++4QnHNGGCnS0TcASvzgNYpIVGw/0GCAqZcZiyXDKBgdNmeDOSmCf6o5Zj9KRWQ 4twpCxSEyDS039IloaVOs7/0B28DfT1SmudBVSvYkGKjHHETV5HZmhwl2pk+M37Z RPJRsGQLOQhb1Pmr1YJYqXSc2K7MSq3FQ6SvEmM+zZeQ9+EfRMWtv5UFvRwt+xIH Oj3gJ4uit5Qf4refN8vF3J2vkIK7Y/1WVaaNKe7uGUgXOMxA+nfQTO204RC4olU+ 5w4oweU1PAuJd9h+QM7O/aGD0KoRYn3XT7jPXSG07kizzF0DnA/3cnlwDYSb3dtk 7kFp49Aw4//5nVLL3uI3AUI9sU0yWgU0aRkMGZMNxkYnLrgxUnorRi2qYltzsMAD avqB3qruqE9Uqf5h3YEsuMNgfKx+m9O27DW1cvEXYreFhuZ4JoIU5fps3eKjCL0P z6Ytwfo9anbWH8zMzGSfugOtuw== =rqLh -----END PGP SIGNATURE----- Merge tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu into staging UI: fixes - dbus-display shared-library compilation fix - remove console_select() and fix related issues # -----BEGIN PGP SIGNATURE----- # # iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmX66jIcHG1hcmNhbmRy # ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5fJID/9dGIwuvvpKCFjNERtW # yD92qo0Wx0ogcikdu/Ml5RiNS4w9gmdfxQlygLcAEk9k9ZwNeRAL5KLlfk6x4zjR # gPsGI9DE+eZX+iiSMRha3nPflUoQxgnhDDBVG+rGDhHC+S1WB91D2TSqD6Fg3++3 # f2BFenapzZ6wMmZfMhwl/LFk9GMeH7A7wPIp0ivip7KdSFOlJyH//QKy6bmJvYWQ # s++4QnHNGGCnS0TcASvzgNYpIVGw/0GCAqZcZiyXDKBgdNmeDOSmCf6o5Zj9KRWQ # 4twpCxSEyDS039IloaVOs7/0B28DfT1SmudBVSvYkGKjHHETV5HZmhwl2pk+M37Z # RPJRsGQLOQhb1Pmr1YJYqXSc2K7MSq3FQ6SvEmM+zZeQ9+EfRMWtv5UFvRwt+xIH # Oj3gJ4uit5Qf4refN8vF3J2vkIK7Y/1WVaaNKe7uGUgXOMxA+nfQTO204RC4olU+ # 5w4oweU1PAuJd9h+QM7O/aGD0KoRYn3XT7jPXSG07kizzF0DnA/3cnlwDYSb3dtk # 7kFp49Aw4//5nVLL3uI3AUI9sU0yWgU0aRkMGZMNxkYnLrgxUnorRi2qYltzsMAD # avqB3qruqE9Uqf5h3YEsuMNgfKx+m9O27DW1cvEXYreFhuZ4JoIU5fps3eKjCL0P # z6Ytwfo9anbWH8zMzGSfugOtuw== # =rqLh # -----END PGP SIGNATURE----- # gpg: Signature made Wed 20 Mar 2024 13:52:50 GMT # gpg: using RSA key 87A9BD933F87C606D276F62DDAE8E10975969CE5 # gpg: issuer "marcandre.lureau@redhat.com" # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" [full] # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" [full] # Primary key fingerprint: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu: ui: compile dbus-display1.c with -fPIC as necessary ui/curses: Do not use console_select() ui/cocoa: Do not use console_select() ui/vnc: Do not use console_select() ui/vc: Do not inherit the size of active console Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
54294b23e1
|
@ -413,6 +413,7 @@ void qemu_console_early_init(void);
|
|||
|
||||
void qemu_console_set_display_gl_ctx(QemuConsole *con, DisplayGLCtx *ctx);
|
||||
|
||||
QemuConsole *qemu_console_lookup_default(void);
|
||||
QemuConsole *qemu_console_lookup_by_index(unsigned int index);
|
||||
QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head);
|
||||
QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
|
||||
|
@ -432,7 +433,6 @@ int qemu_console_get_window_id(QemuConsole *con);
|
|||
/* Set the low-level window id for the console */
|
||||
void qemu_console_set_window_id(QemuConsole *con, int window_id);
|
||||
|
||||
void console_select(unsigned int index);
|
||||
void qemu_console_resize(QemuConsole *con, int width, int height);
|
||||
DisplaySurface *qemu_console_surface(QemuConsole *con);
|
||||
void coroutine_fn qemu_console_co_wait_update(QemuConsole *con);
|
||||
|
|
|
@ -99,4 +99,15 @@ bool qkbd_state_modifier_get(QKbdState *kbd, QKbdModifier mod);
|
|||
*/
|
||||
void qkbd_state_lift_all_keys(QKbdState *kbd);
|
||||
|
||||
/**
|
||||
* qkbd_state_switch_console: Switch console.
|
||||
*
|
||||
* This sends key up events to the previous console for all keys which are in
|
||||
* down state to prevent keys being stuck, and remembers the new console.
|
||||
*
|
||||
* @kbd: state tracker state.
|
||||
* @con: new QemuConsole for this state tracker.
|
||||
*/
|
||||
void qkbd_state_switch_console(QKbdState *kbd, QemuConsole *con);
|
||||
|
||||
#endif /* QEMU_UI_KBD_STATE_H */
|
||||
|
|
37
ui/cocoa.m
37
ui/cocoa.m
|
@ -102,6 +102,7 @@ static const DisplayChangeListenerOps dcl_ops = {
|
|||
static DisplayChangeListener dcl = {
|
||||
.ops = &dcl_ops,
|
||||
};
|
||||
static QKbdState *kbd;
|
||||
static int cursor_hide = 1;
|
||||
static int left_command_key_enabled = 1;
|
||||
static bool swap_opt_cmd;
|
||||
|
@ -309,7 +310,6 @@ static void handleAnyDeviceErrors(Error * err)
|
|||
NSTrackingArea *trackingArea;
|
||||
QEMUScreen screen;
|
||||
pixman_image_t *pixman_image;
|
||||
QKbdState *kbd;
|
||||
BOOL isMouseGrabbed;
|
||||
BOOL isAbsoluteEnabled;
|
||||
CFMachPortRef eventsTap;
|
||||
|
@ -361,7 +361,6 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
|
||||
screen.width = frameRect.size.width;
|
||||
screen.height = frameRect.size.height;
|
||||
kbd = qkbd_state_init(dcl.con);
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_14_0
|
||||
[self setClipsToBounds:YES];
|
||||
#endif
|
||||
|
@ -378,8 +377,6 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
pixman_image_unref(pixman_image);
|
||||
}
|
||||
|
||||
qkbd_state_free(kbd);
|
||||
|
||||
if (eventsTap) {
|
||||
CFRelease(eventsTap);
|
||||
}
|
||||
|
@ -429,6 +426,20 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
[self removeTrackingRect];
|
||||
}
|
||||
|
||||
- (void) selectConsoleLocked:(unsigned int)index
|
||||
{
|
||||
QemuConsole *con = qemu_console_lookup_by_index(index);
|
||||
if (!con) {
|
||||
return;
|
||||
}
|
||||
|
||||
unregister_displaychangelistener(&dcl);
|
||||
qkbd_state_switch_console(kbd, con);
|
||||
dcl.con = con;
|
||||
register_displaychangelistener(&dcl);
|
||||
[self updateUIInfo];
|
||||
}
|
||||
|
||||
- (void) hideCursor
|
||||
{
|
||||
if (!cursor_hide) {
|
||||
|
@ -718,7 +729,8 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
}
|
||||
|
||||
if (keysym) {
|
||||
qemu_text_console_put_keysym(NULL, keysym);
|
||||
QemuTextConsole *con = QEMU_TEXT_CONSOLE(dcl.con);
|
||||
qemu_text_console_put_keysym(con, keysym);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -898,7 +910,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
|
||||
// enable graphic console
|
||||
case '1' ... '9':
|
||||
console_select(key - '0' - 1); /* ascii math */
|
||||
[self selectConsoleLocked:key - '0' - 1]; /* ascii math */
|
||||
return true;
|
||||
|
||||
// release the mouse grab
|
||||
|
@ -909,7 +921,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
}
|
||||
}
|
||||
|
||||
if (qemu_console_is_graphic(NULL)) {
|
||||
if (qemu_console_is_graphic(dcl.con)) {
|
||||
qkbd_state_key_event(kbd, keycode, true);
|
||||
} else {
|
||||
[self handleMonitorInput: event];
|
||||
|
@ -924,7 +936,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
return true;
|
||||
}
|
||||
|
||||
if (qemu_console_is_graphic(NULL)) {
|
||||
if (qemu_console_is_graphic(dcl.con)) {
|
||||
qkbd_state_key_event(kbd, keycode, false);
|
||||
}
|
||||
return true;
|
||||
|
@ -1374,7 +1386,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||
- (void)displayConsole:(id)sender
|
||||
{
|
||||
with_bql(^{
|
||||
console_select([sender tag]);
|
||||
[cocoaView selectConsoleLocked:[sender tag]];
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1945,7 +1957,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
|
|||
pixman_image_ref(image);
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[cocoaView updateUIInfo];
|
||||
[cocoaView switchSurface:image];
|
||||
});
|
||||
}
|
||||
|
@ -1955,7 +1966,7 @@ static void cocoa_refresh(DisplayChangeListener *dcl)
|
|||
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
COCOA_DEBUG("qemu_cocoa: cocoa_refresh\n");
|
||||
graphic_hw_update(NULL);
|
||||
graphic_hw_update(dcl->con);
|
||||
|
||||
if (qemu_input_is_absolute(dcl->con)) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
|
@ -2039,8 +2050,12 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||
add_console_menu_entries();
|
||||
addRemovableDevicesMenuItems();
|
||||
|
||||
dcl.con = qemu_console_lookup_default();
|
||||
kbd = qkbd_state_init(dcl.con);
|
||||
|
||||
// register vga output callbacks
|
||||
register_displaychangelistener(&dcl);
|
||||
[cocoaView updateUIInfo];
|
||||
|
||||
qemu_event_init(&cbevent, false);
|
||||
cbowner = [[QemuCocoaPasteboardTypeOwner alloc] init];
|
||||
|
|
|
@ -35,7 +35,7 @@ struct QemuConsole {
|
|||
QTAILQ_ENTRY(QemuConsole) next;
|
||||
};
|
||||
|
||||
void qemu_text_console_select(QemuTextConsole *c);
|
||||
void qemu_text_console_update_size(QemuTextConsole *c);
|
||||
const char * qemu_text_console_get_label(QemuTextConsole *c);
|
||||
void qemu_text_console_update_cursor(void);
|
||||
void qemu_text_console_handle_keysym(QemuTextConsole *s, int keysym);
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "chardev/char.h"
|
||||
#include "ui/console-priv.h"
|
||||
|
||||
void qemu_text_console_select(QemuTextConsole *c)
|
||||
void qemu_text_console_update_size(QemuTextConsole *c)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -958,10 +958,9 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
|
|||
drv->console->echo = echo;
|
||||
}
|
||||
|
||||
void qemu_text_console_select(QemuTextConsole *c)
|
||||
void qemu_text_console_update_size(QemuTextConsole *c)
|
||||
{
|
||||
dpy_text_resize(QEMU_CONSOLE(c), c->width, c->height);
|
||||
qemu_text_console_update_cursor();
|
||||
}
|
||||
|
||||
static void vc_chr_open(Chardev *chr,
|
||||
|
@ -990,8 +989,8 @@ static void vc_chr_open(Chardev *chr,
|
|||
trace_console_txt_new(width, height);
|
||||
if (width == 0 || height == 0) {
|
||||
s = QEMU_TEXT_CONSOLE(object_new(TYPE_QEMU_TEXT_CONSOLE));
|
||||
width = qemu_console_get_width(NULL, 80 * FONT_WIDTH);
|
||||
height = qemu_console_get_height(NULL, 24 * FONT_HEIGHT);
|
||||
width = 80 * FONT_WIDTH;
|
||||
height = 24 * FONT_HEIGHT;
|
||||
} else {
|
||||
s = QEMU_TEXT_CONSOLE(object_new(TYPE_QEMU_FIXED_TEXT_CONSOLE));
|
||||
}
|
||||
|
|
133
ui/console.c
133
ui/console.c
|
@ -66,7 +66,6 @@ struct DisplayState {
|
|||
};
|
||||
|
||||
static DisplayState *display_state;
|
||||
static QemuConsole *active_console;
|
||||
static QTAILQ_HEAD(, QemuConsole) consoles =
|
||||
QTAILQ_HEAD_INITIALIZER(consoles);
|
||||
|
||||
|
@ -135,7 +134,6 @@ void graphic_hw_update_done(QemuConsole *con)
|
|||
void graphic_hw_update(QemuConsole *con)
|
||||
{
|
||||
bool async = false;
|
||||
con = con ? con : active_console;
|
||||
if (!con) {
|
||||
return;
|
||||
}
|
||||
|
@ -209,9 +207,6 @@ void qemu_console_set_window_id(QemuConsole *con, int window_id)
|
|||
|
||||
void graphic_hw_invalidate(QemuConsole *con)
|
||||
{
|
||||
if (!con) {
|
||||
con = active_console;
|
||||
}
|
||||
if (con && con->hw_ops->invalidate) {
|
||||
con->hw_ops->invalidate(con->hw);
|
||||
}
|
||||
|
@ -219,9 +214,6 @@ void graphic_hw_invalidate(QemuConsole *con)
|
|||
|
||||
void graphic_hw_text_update(QemuConsole *con, console_ch_t *chardata)
|
||||
{
|
||||
if (!con) {
|
||||
con = active_console;
|
||||
}
|
||||
if (con && con->hw_ops->text_update) {
|
||||
con->hw_ops->text_update(con->hw, chardata);
|
||||
}
|
||||
|
@ -265,12 +257,12 @@ static void dpy_gfx_update_texture(QemuConsole *con, DisplaySurface *surface,
|
|||
}
|
||||
|
||||
static void displaychangelistener_display_console(DisplayChangeListener *dcl,
|
||||
QemuConsole *con,
|
||||
Error **errp)
|
||||
{
|
||||
static const char nodev[] =
|
||||
"This VM has no graphic display device.";
|
||||
static DisplaySurface *dummy;
|
||||
QemuConsole *con = dcl->con;
|
||||
|
||||
if (!con || !console_compatible_with(con, dcl, errp)) {
|
||||
if (!dummy) {
|
||||
|
@ -305,39 +297,8 @@ static void displaychangelistener_display_console(DisplayChangeListener *dcl,
|
|||
}
|
||||
}
|
||||
|
||||
void console_select(unsigned int index)
|
||||
{
|
||||
DisplayChangeListener *dcl;
|
||||
QemuConsole *s;
|
||||
|
||||
trace_console_select(index);
|
||||
s = qemu_console_lookup_by_index(index);
|
||||
if (s) {
|
||||
DisplayState *ds = s->ds;
|
||||
|
||||
active_console = s;
|
||||
QLIST_FOREACH (dcl, &ds->listeners, next) {
|
||||
if (dcl->con != NULL) {
|
||||
continue;
|
||||
}
|
||||
displaychangelistener_display_console(dcl, s, NULL);
|
||||
}
|
||||
|
||||
if (QEMU_IS_TEXT_CONSOLE(s)) {
|
||||
qemu_text_console_select(QEMU_TEXT_CONSOLE(s));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_text_console_put_keysym(QemuTextConsole *s, int keysym)
|
||||
{
|
||||
if (!s) {
|
||||
if (!QEMU_IS_TEXT_CONSOLE(active_console)) {
|
||||
return;
|
||||
}
|
||||
s = QEMU_TEXT_CONSOLE(active_console);
|
||||
}
|
||||
|
||||
qemu_text_console_handle_keysym(s, keysym);
|
||||
}
|
||||
|
||||
|
@ -392,11 +353,6 @@ qemu_console_register(QemuConsole *c)
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!active_console || (!QEMU_IS_GRAPHIC_CONSOLE(active_console) &&
|
||||
QEMU_IS_GRAPHIC_CONSOLE(c))) {
|
||||
active_console = c;
|
||||
}
|
||||
|
||||
if (QTAILQ_EMPTY(&consoles)) {
|
||||
c->index = 0;
|
||||
QTAILQ_INSERT_TAIL(&consoles, c, next);
|
||||
|
@ -751,8 +707,6 @@ dcl_set_graphic_cursor(DisplayChangeListener *dcl, QemuGraphicConsole *con)
|
|||
|
||||
void register_displaychangelistener(DisplayChangeListener *dcl)
|
||||
{
|
||||
QemuConsole *con;
|
||||
|
||||
assert(!dcl->ds);
|
||||
|
||||
trace_displaychangelistener_register(dcl, dcl->ops->dpy_name);
|
||||
|
@ -761,13 +715,12 @@ void register_displaychangelistener(DisplayChangeListener *dcl)
|
|||
gui_setup_refresh(dcl->ds);
|
||||
if (dcl->con) {
|
||||
dcl->con->dcls++;
|
||||
con = dcl->con;
|
||||
} else {
|
||||
con = active_console;
|
||||
}
|
||||
displaychangelistener_display_console(dcl, con, dcl->con ? &error_fatal : NULL);
|
||||
if (QEMU_IS_GRAPHIC_CONSOLE(con)) {
|
||||
dcl_set_graphic_cursor(dcl, QEMU_GRAPHIC_CONSOLE(con));
|
||||
displaychangelistener_display_console(dcl, &error_fatal);
|
||||
if (QEMU_IS_GRAPHIC_CONSOLE(dcl->con)) {
|
||||
dcl_set_graphic_cursor(dcl, QEMU_GRAPHIC_CONSOLE(dcl->con));
|
||||
} else if (QEMU_IS_TEXT_CONSOLE(dcl->con)) {
|
||||
qemu_text_console_update_size(QEMU_TEXT_CONSOLE(dcl->con));
|
||||
}
|
||||
qemu_text_console_update_cursor();
|
||||
}
|
||||
|
@ -805,9 +758,6 @@ static void dpy_set_ui_info_timer(void *opaque)
|
|||
|
||||
bool dpy_ui_info_supported(const QemuConsole *con)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
if (con == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
@ -819,19 +769,11 @@ const QemuUIInfo *dpy_get_ui_info(const QemuConsole *con)
|
|||
{
|
||||
assert(dpy_ui_info_supported(con));
|
||||
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
|
||||
return &con->ui_info;
|
||||
}
|
||||
|
||||
int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info, bool delay)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
|
||||
if (!dpy_ui_info_supported(con)) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -870,7 +812,7 @@ void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
|
|||
}
|
||||
dpy_gfx_update_texture(con, con->surface, x, y, w, h);
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gfx_update) {
|
||||
|
@ -916,7 +858,7 @@ void dpy_gfx_replace_surface(QemuConsole *con,
|
|||
con->surface = new_surface;
|
||||
dpy_gfx_create_texture(con, new_surface);
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
displaychangelistener_gfx_switch(dcl, new_surface, surface ? FALSE : TRUE);
|
||||
|
@ -970,7 +912,7 @@ void dpy_text_cursor(QemuConsole *con, int x, int y)
|
|||
return;
|
||||
}
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_text_cursor) {
|
||||
|
@ -988,7 +930,7 @@ void dpy_text_update(QemuConsole *con, int x, int y, int w, int h)
|
|||
return;
|
||||
}
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_text_update) {
|
||||
|
@ -1006,7 +948,7 @@ void dpy_text_resize(QemuConsole *con, int w, int h)
|
|||
return;
|
||||
}
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_text_resize) {
|
||||
|
@ -1028,7 +970,7 @@ void dpy_mouse_set(QemuConsole *c, int x, int y, int on)
|
|||
return;
|
||||
}
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (c != (dcl->con ? dcl->con : active_console)) {
|
||||
if (c != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_mouse_set) {
|
||||
|
@ -1049,7 +991,7 @@ void dpy_cursor_define(QemuConsole *c, QEMUCursor *cursor)
|
|||
return;
|
||||
}
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (c != (dcl->con ? dcl->con : active_console)) {
|
||||
if (c != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_cursor_define) {
|
||||
|
@ -1099,7 +1041,7 @@ void dpy_gl_scanout_disable(QemuConsole *con)
|
|||
con->scanout.kind = SCANOUT_NONE;
|
||||
}
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_scanout_disable) {
|
||||
|
@ -1126,7 +1068,7 @@ void dpy_gl_scanout_texture(QemuConsole *con,
|
|||
x, y, width, height, d3d_tex2d,
|
||||
};
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_scanout_texture) {
|
||||
|
@ -1148,7 +1090,7 @@ void dpy_gl_scanout_dmabuf(QemuConsole *con,
|
|||
con->scanout.kind = SCANOUT_DMABUF;
|
||||
con->scanout.dmabuf = dmabuf;
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_scanout_dmabuf) {
|
||||
|
@ -1164,7 +1106,7 @@ void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf *dmabuf,
|
|||
DisplayChangeListener *dcl;
|
||||
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_cursor_dmabuf) {
|
||||
|
@ -1181,7 +1123,7 @@ void dpy_gl_cursor_position(QemuConsole *con,
|
|||
DisplayChangeListener *dcl;
|
||||
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_cursor_position) {
|
||||
|
@ -1197,7 +1139,7 @@ void dpy_gl_release_dmabuf(QemuConsole *con,
|
|||
DisplayChangeListener *dcl;
|
||||
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_release_dmabuf) {
|
||||
|
@ -1216,7 +1158,7 @@ void dpy_gl_update(QemuConsole *con,
|
|||
|
||||
graphic_hw_gl_block(con, true);
|
||||
QLIST_FOREACH(dcl, &s->listeners, next) {
|
||||
if (con != (dcl->con ? dcl->con : active_console)) {
|
||||
if (con != dcl->con) {
|
||||
continue;
|
||||
}
|
||||
if (dcl->ops->dpy_gl_update) {
|
||||
|
@ -1325,6 +1267,18 @@ void graphic_console_close(QemuConsole *con)
|
|||
dpy_gfx_replace_surface(con, surface);
|
||||
}
|
||||
|
||||
QemuConsole *qemu_console_lookup_default(void)
|
||||
{
|
||||
QemuConsole *con;
|
||||
|
||||
QTAILQ_FOREACH(con, &consoles, next) {
|
||||
if (QEMU_IS_GRAPHIC_CONSOLE(con)) {
|
||||
return con;
|
||||
}
|
||||
}
|
||||
return QTAILQ_FIRST(&consoles);
|
||||
}
|
||||
|
||||
QemuConsole *qemu_console_lookup_by_index(unsigned int index)
|
||||
{
|
||||
QemuConsole *con;
|
||||
|
@ -1403,30 +1357,21 @@ static QemuConsole *qemu_graphic_console_lookup_unused(void)
|
|||
|
||||
QEMUCursor *qemu_console_get_cursor(QemuConsole *con)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
return QEMU_IS_GRAPHIC_CONSOLE(con) ? QEMU_GRAPHIC_CONSOLE(con)->cursor : NULL;
|
||||
}
|
||||
|
||||
bool qemu_console_is_visible(QemuConsole *con)
|
||||
{
|
||||
return (con == active_console) || (con->dcls > 0);
|
||||
return con->dcls > 0;
|
||||
}
|
||||
|
||||
bool qemu_console_is_graphic(QemuConsole *con)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
return con && QEMU_IS_GRAPHIC_CONSOLE(con);
|
||||
}
|
||||
|
||||
bool qemu_console_is_fixedsize(QemuConsole *con)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
return con && (QEMU_IS_GRAPHIC_CONSOLE(con) || QEMU_IS_FIXED_TEXT_CONSOLE(con));
|
||||
}
|
||||
|
||||
|
@ -1493,17 +1438,11 @@ char *qemu_console_get_label(QemuConsole *con)
|
|||
|
||||
int qemu_console_get_index(QemuConsole *con)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
return con ? con->index : -1;
|
||||
}
|
||||
|
||||
uint32_t qemu_console_get_head(QemuConsole *con)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
if (con == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -1515,9 +1454,6 @@ uint32_t qemu_console_get_head(QemuConsole *con)
|
|||
|
||||
int qemu_console_get_width(QemuConsole *con, int fallback)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
if (con == NULL) {
|
||||
return fallback;
|
||||
}
|
||||
|
@ -1535,9 +1471,6 @@ int qemu_console_get_width(QemuConsole *con, int fallback)
|
|||
|
||||
int qemu_console_get_height(QemuConsole *con, int fallback)
|
||||
{
|
||||
if (con == NULL) {
|
||||
con = active_console;
|
||||
}
|
||||
if (con == NULL) {
|
||||
return fallback;
|
||||
}
|
||||
|
|
46
ui/curses.c
46
ui/curses.c
|
@ -98,7 +98,7 @@ static void curses_update(DisplayChangeListener *dcl,
|
|||
|
||||
static void curses_calc_pad(void)
|
||||
{
|
||||
if (qemu_console_is_fixedsize(NULL)) {
|
||||
if (qemu_console_is_fixedsize(dcl->con)) {
|
||||
width = gwidth;
|
||||
height = gheight;
|
||||
} else {
|
||||
|
@ -201,7 +201,7 @@ static void curses_cursor_position(DisplayChangeListener *dcl,
|
|||
curs_set(1);
|
||||
/* it seems that curs_set(1) must always be called before
|
||||
* curs_set(2) for the latter to have effect */
|
||||
if (!qemu_console_is_graphic(NULL)) {
|
||||
if (!qemu_console_is_graphic(dcl->con)) {
|
||||
curs_set(2);
|
||||
}
|
||||
return;
|
||||
|
@ -274,11 +274,11 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||
clear();
|
||||
refresh();
|
||||
curses_calc_pad();
|
||||
graphic_hw_invalidate(NULL);
|
||||
graphic_hw_invalidate(dcl->con);
|
||||
invalidate = 0;
|
||||
}
|
||||
|
||||
graphic_hw_text_update(NULL, screen);
|
||||
graphic_hw_text_update(dcl->con, screen);
|
||||
|
||||
while (1) {
|
||||
/* while there are any pending key strokes to process */
|
||||
|
@ -318,11 +318,16 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||
/* process keys reserved for qemu */
|
||||
if (keycode >= QEMU_KEY_CONSOLE0 &&
|
||||
keycode < QEMU_KEY_CONSOLE0 + 9) {
|
||||
erase();
|
||||
wnoutrefresh(stdscr);
|
||||
console_select(keycode - QEMU_KEY_CONSOLE0);
|
||||
QemuConsole *con = qemu_console_lookup_by_index(keycode - QEMU_KEY_CONSOLE0);
|
||||
if (con) {
|
||||
erase();
|
||||
wnoutrefresh(stdscr);
|
||||
unregister_displaychangelistener(dcl);
|
||||
dcl->con = con;
|
||||
register_displaychangelistener(dcl);
|
||||
|
||||
invalidate = 1;
|
||||
invalidate = 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -354,45 +359,45 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||
if (keycode == -1)
|
||||
continue;
|
||||
|
||||
if (qemu_console_is_graphic(NULL)) {
|
||||
if (qemu_console_is_graphic(dcl->con)) {
|
||||
/* since terminals don't know about key press and release
|
||||
* events, we need to emit both for each key received */
|
||||
if (keycode & SHIFT) {
|
||||
qemu_input_event_send_key_number(NULL, SHIFT_CODE, true);
|
||||
qemu_input_event_send_key_number(dcl->con, SHIFT_CODE, true);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
if (keycode & CNTRL) {
|
||||
qemu_input_event_send_key_number(NULL, CNTRL_CODE, true);
|
||||
qemu_input_event_send_key_number(dcl->con, CNTRL_CODE, true);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
if (keycode & ALT) {
|
||||
qemu_input_event_send_key_number(NULL, ALT_CODE, true);
|
||||
qemu_input_event_send_key_number(dcl->con, ALT_CODE, true);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
if (keycode & ALTGR) {
|
||||
qemu_input_event_send_key_number(NULL, GREY | ALT_CODE, true);
|
||||
qemu_input_event_send_key_number(dcl->con, GREY | ALT_CODE, true);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
|
||||
qemu_input_event_send_key_number(NULL, keycode & KEY_MASK, true);
|
||||
qemu_input_event_send_key_number(dcl->con, keycode & KEY_MASK, true);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
qemu_input_event_send_key_number(NULL, keycode & KEY_MASK, false);
|
||||
qemu_input_event_send_key_number(dcl->con, keycode & KEY_MASK, false);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
|
||||
if (keycode & ALTGR) {
|
||||
qemu_input_event_send_key_number(NULL, GREY | ALT_CODE, false);
|
||||
qemu_input_event_send_key_number(dcl->con, GREY | ALT_CODE, false);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
if (keycode & ALT) {
|
||||
qemu_input_event_send_key_number(NULL, ALT_CODE, false);
|
||||
qemu_input_event_send_key_number(dcl->con, ALT_CODE, false);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
if (keycode & CNTRL) {
|
||||
qemu_input_event_send_key_number(NULL, CNTRL_CODE, false);
|
||||
qemu_input_event_send_key_number(dcl->con, CNTRL_CODE, false);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
if (keycode & SHIFT) {
|
||||
qemu_input_event_send_key_number(NULL, SHIFT_CODE, false);
|
||||
qemu_input_event_send_key_number(dcl->con, SHIFT_CODE, false);
|
||||
qemu_input_event_send_key_delay(0);
|
||||
}
|
||||
} else {
|
||||
|
@ -400,7 +405,7 @@ static void curses_refresh(DisplayChangeListener *dcl)
|
|||
if (keysym == -1)
|
||||
keysym = chr;
|
||||
|
||||
qemu_text_console_put_keysym(NULL, keysym);
|
||||
qemu_text_console_put_keysym(QEMU_TEXT_CONSOLE(dcl->con), keysym);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -798,6 +803,7 @@ static void curses_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||
curses_winch_init();
|
||||
|
||||
dcl = g_new0(DisplayChangeListener, 1);
|
||||
dcl->con = qemu_console_lookup_default();
|
||||
dcl->ops = &dcl_ops;
|
||||
register_displaychangelistener(dcl);
|
||||
|
||||
|
|
|
@ -117,6 +117,12 @@ void qkbd_state_lift_all_keys(QKbdState *kbd)
|
|||
}
|
||||
}
|
||||
|
||||
void qkbd_state_switch_console(QKbdState *kbd, QemuConsole *con)
|
||||
{
|
||||
qkbd_state_lift_all_keys(kbd);
|
||||
kbd->con = con;
|
||||
}
|
||||
|
||||
void qkbd_state_set_delay(QKbdState *kbd, int delay_ms)
|
||||
{
|
||||
kbd->key_delay_ms = delay_ms;
|
||||
|
|
|
@ -90,8 +90,7 @@ if dbus_display
|
|||
'--interface-prefix', 'org.qemu.',
|
||||
'--c-namespace', 'QemuDBus',
|
||||
'--generate-c-code', '@BASENAME@'])
|
||||
dbus_display1_lib = static_library('dbus-display1', dbus_display1, dependencies: gio)
|
||||
dbus_display1_dep = declare_dependency(link_with: dbus_display1_lib, sources: dbus_display1[0])
|
||||
dbus_display1_dep = declare_dependency(sources: dbus_display1, dependencies: gio)
|
||||
dbus_ss.add(when: [gio, dbus_display1_dep],
|
||||
if_true: [files(
|
||||
'dbus-chardev.c',
|
||||
|
|
14
ui/vnc.c
14
ui/vnc.c
|
@ -1872,12 +1872,16 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
|||
/* QEMU console switch */
|
||||
switch (qcode) {
|
||||
case Q_KEY_CODE_1 ... Q_KEY_CODE_9: /* '1' to '9' keys */
|
||||
if (vs->vd->dcl.con == NULL && down &&
|
||||
if (down &&
|
||||
qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) &&
|
||||
qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) {
|
||||
/* Reset the modifiers sent to the current console */
|
||||
qkbd_state_lift_all_keys(vs->vd->kbd);
|
||||
console_select(qcode - Q_KEY_CODE_1);
|
||||
QemuConsole *con = qemu_console_lookup_by_index(qcode - Q_KEY_CODE_1);
|
||||
if (con) {
|
||||
unregister_displaychangelistener(&vs->vd->dcl);
|
||||
qkbd_state_switch_console(vs->vd->kbd, con);
|
||||
vs->vd->dcl.con = con;
|
||||
register_displaychangelistener(&vs->vd->dcl);
|
||||
}
|
||||
return;
|
||||
}
|
||||
default:
|
||||
|
@ -4206,7 +4210,7 @@ void vnc_display_open(const char *id, Error **errp)
|
|||
goto fail;
|
||||
}
|
||||
} else {
|
||||
con = NULL;
|
||||
con = qemu_console_lookup_default();
|
||||
}
|
||||
|
||||
if (con != vd->dcl.con) {
|
||||
|
|
Loading…
Reference in New Issue