UI patch queue
-----BEGIN PGP SIGNATURE----- iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmVKA7McHG1hcmNhbmRy ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5Z47D/4/SrS87f62a8Xczc4U fj8idH8a9rC/Rbd/AXDDIIgEb3Om4xWI4M5FZrx2K+D38hgc4atRuQhTHPi/SdEK zlNkKcePNRs7/hh8ZWUnLtu+EqJS3HqmcJfahkzV6U0vn6BxPrdX/5Qdryix4gr3 C2RRxJx8RdZ5R7V9pm4JTgqGnXkKwDN4W06/btrhz7YNgyXls0PVrHm4lE01HDnX D0ZxWo3gXAiK1dQlaT5qHsegpPPJ2LB3O6gU3yLDBpsD3elkjgbB5seycgeJmO1R kMBA+HUf2PS0gdUATs/KqjVyoSbWoIeyOTTb8ol8cQSWruqfSLUnJLP4lFBCKbMt NH4KqqPvZZuJh4K1ir1/eANC6Du7hotavmV+57Vv73N91IQ0PUEzoUbLL1PN25RZ +q5chBClAvc9IRbnDSM6EXpxznzAkPYQo8JyRPkHE9w9dFfOIRsAK3WGcVkwMmaQ 4v4OAM/CQlfqcwpVsmT/prkoaCceJHE6IO7hOkV1QOe+I5yzZF9PJpVsONhhCXUD XVaoOMeZYmT8lIEPm099MwjmGKKxTroEo+n18xQOV+ZXGdIsmkvrYffqAO5y/hB3 m8ucVWeoXq50IYPoxxdw86NyadHvSBb6fMNjU2fEtYId+Tm7T0ud77uIY8rU6euc x7w6wDUm4C2K7fHrtYzBLhUj7A== =upvZ -----END PGP SIGNATURE----- Merge tag 'ui-pull-request' of https://gitlab.com/marcandre.lureau/qemu into staging UI patch queue # -----BEGIN PGP SIGNATURE----- # # iQJQBAABCAA6FiEEh6m9kz+HxgbSdvYt2ujhCXWWnOUFAmVKA7McHG1hcmNhbmRy # ZS5sdXJlYXVAcmVkaGF0LmNvbQAKCRDa6OEJdZac5Z47D/4/SrS87f62a8Xczc4U # fj8idH8a9rC/Rbd/AXDDIIgEb3Om4xWI4M5FZrx2K+D38hgc4atRuQhTHPi/SdEK # zlNkKcePNRs7/hh8ZWUnLtu+EqJS3HqmcJfahkzV6U0vn6BxPrdX/5Qdryix4gr3 # C2RRxJx8RdZ5R7V9pm4JTgqGnXkKwDN4W06/btrhz7YNgyXls0PVrHm4lE01HDnX # D0ZxWo3gXAiK1dQlaT5qHsegpPPJ2LB3O6gU3yLDBpsD3elkjgbB5seycgeJmO1R # kMBA+HUf2PS0gdUATs/KqjVyoSbWoIeyOTTb8ol8cQSWruqfSLUnJLP4lFBCKbMt # NH4KqqPvZZuJh4K1ir1/eANC6Du7hotavmV+57Vv73N91IQ0PUEzoUbLL1PN25RZ # +q5chBClAvc9IRbnDSM6EXpxznzAkPYQo8JyRPkHE9w9dFfOIRsAK3WGcVkwMmaQ # 4v4OAM/CQlfqcwpVsmT/prkoaCceJHE6IO7hOkV1QOe+I5yzZF9PJpVsONhhCXUD # XVaoOMeZYmT8lIEPm099MwjmGKKxTroEo+n18xQOV+ZXGdIsmkvrYffqAO5y/hB3 # m8ucVWeoXq50IYPoxxdw86NyadHvSBb6fMNjU2fEtYId+Tm7T0ud77uIY8rU6euc # x7w6wDUm4C2K7fHrtYzBLhUj7A== # =upvZ # -----END PGP SIGNATURE----- # gpg: Signature made Tue 07 Nov 2023 17:30:27 HKT # 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: Replacing pointer in function ui/cocoa: add zoom-to-fit display option ui/gtk-egl: apply scale factor when calculating window's dimension ui/gtk-egl: Check EGLSurface before doing scanout ui/gtk: force realization of drawing area Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
7eee58ae3b
@ -1409,13 +1409,18 @@
|
|||||||
# codes match their position on non-Mac keyboards and you can use
|
# codes match their position on non-Mac keyboards and you can use
|
||||||
# Meta/Super and Alt where you expect them. (default: off)
|
# Meta/Super and Alt where you expect them. (default: off)
|
||||||
#
|
#
|
||||||
|
# @zoom-to-fit: Zoom guest display to fit into the host window. When
|
||||||
|
# turned off the host window will be resized instead. Defaults to
|
||||||
|
# "off". (Since 8.2)
|
||||||
|
#
|
||||||
# Since: 7.0
|
# Since: 7.0
|
||||||
##
|
##
|
||||||
{ 'struct': 'DisplayCocoa',
|
{ 'struct': 'DisplayCocoa',
|
||||||
'data': {
|
'data': {
|
||||||
'*left-command-key': 'bool',
|
'*left-command-key': 'bool',
|
||||||
'*full-grab': 'bool',
|
'*full-grab': 'bool',
|
||||||
'*swap-opt-cmd': 'bool'
|
'*swap-opt-cmd': 'bool',
|
||||||
|
'*zoom-to-fit': 'bool'
|
||||||
} }
|
} }
|
||||||
|
|
||||||
##
|
##
|
||||||
|
32
ui/cocoa.m
32
ui/cocoa.m
@ -1247,7 +1247,6 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||||||
[normalWindow makeKeyAndOrderFront:self];
|
[normalWindow makeKeyAndOrderFront:self];
|
||||||
[normalWindow center];
|
[normalWindow center];
|
||||||
[normalWindow setDelegate: self];
|
[normalWindow setDelegate: self];
|
||||||
stretch_video = false;
|
|
||||||
|
|
||||||
/* Used for displaying pause on the screen */
|
/* Used for displaying pause on the screen */
|
||||||
pauseLabel = [NSTextField new];
|
pauseLabel = [NSTextField new];
|
||||||
@ -1671,7 +1670,9 @@ static void create_initial_menus(void)
|
|||||||
// View menu
|
// View menu
|
||||||
menu = [[NSMenu alloc] initWithTitle:@"View"];
|
menu = [[NSMenu alloc] initWithTitle:@"View"];
|
||||||
[menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen
|
[menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen
|
||||||
[menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" action:@selector(zoomToFit:) keyEquivalent:@""] autorelease]];
|
menuItem = [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" action:@selector(zoomToFit:) keyEquivalent:@""] autorelease];
|
||||||
|
[menuItem setState: stretch_video ? NSControlStateValueOn : NSControlStateValueOff];
|
||||||
|
[menu addItem: menuItem];
|
||||||
menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""] autorelease];
|
menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""] autorelease];
|
||||||
[menuItem setSubmenu:menu];
|
[menuItem setSubmenu:menu];
|
||||||
[[NSApp mainMenu] addItem:menuItem];
|
[[NSApp mainMenu] addItem:menuItem];
|
||||||
@ -2041,18 +2042,6 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||||||
|
|
||||||
[QemuApplication sharedApplication];
|
[QemuApplication sharedApplication];
|
||||||
|
|
||||||
create_initial_menus();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create the menu entries which depend on QEMU state (for consoles
|
|
||||||
* and removable devices). These make calls back into QEMU functions,
|
|
||||||
* which is OK because at this point we know that the second thread
|
|
||||||
* holds the iothread lock and is synchronously waiting for us to
|
|
||||||
* finish.
|
|
||||||
*/
|
|
||||||
add_console_menu_entries();
|
|
||||||
addRemovableDevicesMenuItems();
|
|
||||||
|
|
||||||
// Create an Application controller
|
// Create an Application controller
|
||||||
QemuCocoaAppController *controller = [[QemuCocoaAppController alloc] init];
|
QemuCocoaAppController *controller = [[QemuCocoaAppController alloc] init];
|
||||||
[NSApp setDelegate:controller];
|
[NSApp setDelegate:controller];
|
||||||
@ -2077,6 +2066,21 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||||||
left_command_key_enabled = 0;
|
left_command_key_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts->u.cocoa.has_zoom_to_fit && opts->u.cocoa.zoom_to_fit) {
|
||||||
|
stretch_video = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
create_initial_menus();
|
||||||
|
/*
|
||||||
|
* Create the menu entries which depend on QEMU state (for consoles
|
||||||
|
* and removable devices). These make calls back into QEMU functions,
|
||||||
|
* which is OK because at this point we know that the second thread
|
||||||
|
* holds the iothread lock and is synchronously waiting for us to
|
||||||
|
* finish.
|
||||||
|
*/
|
||||||
|
add_console_menu_entries();
|
||||||
|
addRemovableDevicesMenuItems();
|
||||||
|
|
||||||
// register vga output callbacks
|
// register vga output callbacks
|
||||||
register_displaychangelistener(&dcl);
|
register_displaychangelistener(&dcl);
|
||||||
|
|
||||||
|
31
ui/gtk-egl.c
31
ui/gtk-egl.c
@ -69,15 +69,16 @@ void gd_egl_draw(VirtualConsole *vc)
|
|||||||
#ifdef CONFIG_GBM
|
#ifdef CONFIG_GBM
|
||||||
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
|
QemuDmaBuf *dmabuf = vc->gfx.guest_fb.dmabuf;
|
||||||
#endif
|
#endif
|
||||||
int ww, wh;
|
int ww, wh, ws;
|
||||||
|
|
||||||
if (!vc->gfx.gls) {
|
if (!vc->gfx.gls) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
window = gtk_widget_get_window(vc->gfx.drawing_area);
|
window = gtk_widget_get_window(vc->gfx.drawing_area);
|
||||||
ww = gdk_window_get_width(window);
|
ws = gdk_window_get_scale_factor(window);
|
||||||
wh = gdk_window_get_height(window);
|
ww = gdk_window_get_width(window) * ws;
|
||||||
|
wh = gdk_window_get_height(window) * ws;
|
||||||
|
|
||||||
if (vc->gfx.scanout_mode) {
|
if (vc->gfx.scanout_mode) {
|
||||||
#ifdef CONFIG_GBM
|
#ifdef CONFIG_GBM
|
||||||
@ -243,12 +244,19 @@ void gd_egl_scanout_texture(DisplayChangeListener *dcl,
|
|||||||
vc->gfx.h = h;
|
vc->gfx.h = h;
|
||||||
vc->gfx.y0_top = backing_y_0_top;
|
vc->gfx.y0_top = backing_y_0_top;
|
||||||
|
|
||||||
eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
|
if (!vc->gfx.esurface) {
|
||||||
vc->gfx.esurface, vc->gfx.ectx);
|
gd_egl_init(vc);
|
||||||
|
if (!vc->gfx.esurface) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
gtk_egl_set_scanout_mode(vc, true);
|
eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
|
||||||
egl_fb_setup_for_tex(&vc->gfx.guest_fb, backing_width, backing_height,
|
vc->gfx.esurface, vc->gfx.ectx);
|
||||||
backing_id, false);
|
|
||||||
|
gtk_egl_set_scanout_mode(vc, true);
|
||||||
|
egl_fb_setup_for_tex(&vc->gfx.guest_fb, backing_width, backing_height,
|
||||||
|
backing_id, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
|
void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
|
||||||
@ -312,7 +320,7 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
|
|||||||
{
|
{
|
||||||
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
||||||
GdkWindow *window;
|
GdkWindow *window;
|
||||||
int ww, wh;
|
int ww, wh, ws;
|
||||||
|
|
||||||
if (!vc->gfx.scanout_mode) {
|
if (!vc->gfx.scanout_mode) {
|
||||||
return;
|
return;
|
||||||
@ -325,8 +333,9 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
|
|||||||
vc->gfx.esurface, vc->gfx.ectx);
|
vc->gfx.esurface, vc->gfx.ectx);
|
||||||
|
|
||||||
window = gtk_widget_get_window(vc->gfx.drawing_area);
|
window = gtk_widget_get_window(vc->gfx.drawing_area);
|
||||||
ww = gdk_window_get_width(window);
|
ws = gdk_window_get_scale_factor(window);
|
||||||
wh = gdk_window_get_height(window);
|
ww = gdk_window_get_width(window) * ws;
|
||||||
|
wh = gdk_window_get_height(window) * ws;
|
||||||
egl_fb_setup_default(&vc->gfx.win_fb, ww, wh);
|
egl_fb_setup_default(&vc->gfx.win_fb, ww, wh);
|
||||||
if (vc->gfx.cursor_fb.texture) {
|
if (vc->gfx.cursor_fb.texture) {
|
||||||
egl_texture_blit(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.guest_fb,
|
egl_texture_blit(vc->gfx.gls, &vc->gfx.win_fb, &vc->gfx.guest_fb,
|
||||||
|
12
ui/gtk.c
12
ui/gtk.c
@ -1400,7 +1400,7 @@ static void gd_menu_untabify(GtkMenuItem *item, void *opaque)
|
|||||||
eglDestroySurface(qemu_egl_display, vc->gfx.esurface);
|
eglDestroySurface(qemu_egl_display, vc->gfx.esurface);
|
||||||
vc->gfx.esurface = NULL;
|
vc->gfx.esurface = NULL;
|
||||||
}
|
}
|
||||||
if (vc->gfx.esurface) {
|
if (vc->gfx.ectx) {
|
||||||
eglDestroyContext(qemu_egl_display, vc->gfx.ectx);
|
eglDestroyContext(qemu_egl_display, vc->gfx.ectx);
|
||||||
vc->gfx.ectx = NULL;
|
vc->gfx.ectx = NULL;
|
||||||
}
|
}
|
||||||
@ -2371,6 +2371,7 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||||||
GdkDisplay *window_display;
|
GdkDisplay *window_display;
|
||||||
GtkIconTheme *theme;
|
GtkIconTheme *theme;
|
||||||
char *dir;
|
char *dir;
|
||||||
|
int idx;
|
||||||
|
|
||||||
if (!gtkinit) {
|
if (!gtkinit) {
|
||||||
fprintf(stderr, "gtk initialization failed\n");
|
fprintf(stderr, "gtk initialization failed\n");
|
||||||
@ -2434,6 +2435,15 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
|
|||||||
gtk_container_add(GTK_CONTAINER(s->window), s->vbox);
|
gtk_container_add(GTK_CONTAINER(s->window), s->vbox);
|
||||||
|
|
||||||
gtk_widget_show_all(s->window);
|
gtk_widget_show_all(s->window);
|
||||||
|
|
||||||
|
for (idx = 0;; idx++) {
|
||||||
|
QemuConsole *con = qemu_console_lookup_by_index(idx);
|
||||||
|
if (!con) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
gtk_widget_realize(s->vc[idx].gfx.drawing_area);
|
||||||
|
}
|
||||||
|
|
||||||
if (opts->u.gtk.has_show_menubar &&
|
if (opts->u.gtk.has_show_menubar &&
|
||||||
!opts->u.gtk.show_menubar) {
|
!opts->u.gtk.show_menubar) {
|
||||||
gtk_widget_hide(s->menu_bar);
|
gtk_widget_hide(s->menu_bar);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user