gtk/sdl build tweaks
fix gtk 3.20 warnings gtk clipboard support spice-gl monitor config support fix coverity warnings -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJXNcjvAAoJEEy22O7T6HE4nIsQAJpmBUBwaYbRpzba14EK5NKj iEevQsmj0/oNTXbt06uCGD+asjgk65a//YcYtArzHCAyn889mdyCeVMUZwf5fvSq wqZaA2KVa4XIVKUT4L69qOBL3Ab17+/A2AVFCGmPQ5lKZWGNmia1/48to6ztPNTk SaO0mvktWeZPTbdTmTW3Nk+LoH5Ps9b/YKM+cLv2YkeBG/cjTR2rUckOCcCyHKHA K/kj5aYOZ5mZbsF1m7hVhxVrHPg+/KS1laBLHlJPBOwuXsCeAb4AEKmlrxgNAESv gs9RPXYbd1mpzbg5ZwaTXWO7nqDHnRjHl4rzyXIbriFQyah4p29ogYDkMX8WhbXM qlAt3ZWf9NzzO/E3m3/uUbP9wHKbpJIJUJPv49epUDgE68UwuW6IaQWMAQJRCZWs XLqbGwY0Uq7PyJVYuqkoaEKE64tcjDqikifS+1WtS/LAxt1GN5mYJsNpggADh8oC Z5X+y1e1CA3+X6bkwBKGxnmQ1DU5mJJcIk4kkfK2p2LlHNvwhzvy6uIS/TyFYsFP qUgkzz5hsgkJOKrInKYtygdN0X3ZrIhdIhgMnxyGoFiUbfDvSXzIP/s40uT+gEvq hVk2yr6b2JtbVlfFq0Q42bWEYcuBgGTwQBw8IDDax22ol3cMOBMuBZnNHgVWDFbN WjDcH6jF3ThQPHGawpqY =7sds -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/pull-ui-20160513-1' into staging gtk/sdl build tweaks fix gtk 3.20 warnings gtk clipboard support spice-gl monitor config support fix coverity warnings # gpg: Signature made Fri 13 May 2016 13:30:39 BST 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-20160513-1: gtk: don't leak the GtkBorder with VTE 0.36 gtk: update grab code for gtk 3.20 spice: fix coverity complains egl-helpers: fix possible resource leak Changed malloc to g_malloc, free to g_free in ui/shader.c spice/gl: add & use qemu_spice_gl_monitor_config ui/gtk: copy to clipboard support ui: gtk: Fix some deprecation warnings ui: gtk: Fix a runtime warning on vte >= 0.37 configure: support vte-2.91 configure: report SDL version configure: report GTK version configure: add echo_version helper configure: error on unknown --with-sdlabi value configure: build SDL if only SDL2 available ui: sdl2: Release grab before opening console window ui: gtk: fix crash when terminal inner-border is NULL Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
70f87e0f0a
60
configure
vendored
60
configure
vendored
|
@ -207,7 +207,7 @@ fdt=""
|
||||||
netmap="no"
|
netmap="no"
|
||||||
pixman=""
|
pixman=""
|
||||||
sdl=""
|
sdl=""
|
||||||
sdlabi="1.2"
|
sdlabi=""
|
||||||
virtfs=""
|
virtfs=""
|
||||||
vnc="yes"
|
vnc="yes"
|
||||||
sparse="no"
|
sparse="no"
|
||||||
|
@ -2157,6 +2157,7 @@ if test "$gtk" != "no"; then
|
||||||
if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
|
if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
|
||||||
gtk_cflags=`$pkg_config --cflags $gtkpackage`
|
gtk_cflags=`$pkg_config --cflags $gtkpackage`
|
||||||
gtk_libs=`$pkg_config --libs $gtkpackage`
|
gtk_libs=`$pkg_config --libs $gtkpackage`
|
||||||
|
gtk_version=`$pkg_config --modversion $gtkpackage`
|
||||||
if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
|
if $pkg_config --exists "$gtkx11package >= $gtkversion"; then
|
||||||
gtk_cflags="$gtk_cflags $x11_cflags"
|
gtk_cflags="$gtk_cflags $x11_cflags"
|
||||||
gtk_libs="$gtk_libs $x11_libs"
|
gtk_libs="$gtk_libs $x11_libs"
|
||||||
|
@ -2392,20 +2393,25 @@ fi
|
||||||
|
|
||||||
if test "$vte" != "no"; then
|
if test "$vte" != "no"; then
|
||||||
if test "$gtkabi" = "3.0"; then
|
if test "$gtkabi" = "3.0"; then
|
||||||
|
vteminversion="0.32.0"
|
||||||
|
if $pkg_config --exists "vte-2.91"; then
|
||||||
|
vtepackage="vte-2.91"
|
||||||
|
else
|
||||||
vtepackage="vte-2.90"
|
vtepackage="vte-2.90"
|
||||||
vteversion="0.32.0"
|
fi
|
||||||
else
|
else
|
||||||
vtepackage="vte"
|
vtepackage="vte"
|
||||||
vteversion="0.24.0"
|
vteminversion="0.24.0"
|
||||||
fi
|
fi
|
||||||
if $pkg_config --exists "$vtepackage >= $vteversion"; then
|
if $pkg_config --exists "$vtepackage >= $vteminversion"; then
|
||||||
vte_cflags=`$pkg_config --cflags $vtepackage`
|
vte_cflags=`$pkg_config --cflags $vtepackage`
|
||||||
vte_libs=`$pkg_config --libs $vtepackage`
|
vte_libs=`$pkg_config --libs $vtepackage`
|
||||||
|
vteversion=`$pkg_config --modversion $vtepackage`
|
||||||
libs_softmmu="$vte_libs $libs_softmmu"
|
libs_softmmu="$vte_libs $libs_softmmu"
|
||||||
vte="yes"
|
vte="yes"
|
||||||
elif test "$vte" = "yes"; then
|
elif test "$vte" = "yes"; then
|
||||||
if test "$gtkabi" = "3.0"; then
|
if test "$gtkabi" = "3.0"; then
|
||||||
feature_not_found "vte" "Install libvte-2.90 devel"
|
feature_not_found "vte" "Install libvte-2.90/2.91 devel"
|
||||||
else
|
else
|
||||||
feature_not_found "vte" "Install libvte devel"
|
feature_not_found "vte" "Install libvte devel"
|
||||||
fi
|
fi
|
||||||
|
@ -2420,13 +2426,25 @@ fi
|
||||||
# Look for sdl configuration program (pkg-config or sdl-config). Try
|
# Look for sdl configuration program (pkg-config or sdl-config). Try
|
||||||
# sdl-config even without cross prefix, and favour pkg-config over sdl-config.
|
# sdl-config even without cross prefix, and favour pkg-config over sdl-config.
|
||||||
|
|
||||||
|
if test "$sdlabi" = ""; then
|
||||||
|
if $pkg_config --exists "sdl"; then
|
||||||
|
sdlabi=1.2
|
||||||
|
elif $pkg_config --exists "sdl2"; then
|
||||||
|
sdlabi=2.0
|
||||||
|
else
|
||||||
|
sdlabi=1.2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if test $sdlabi = "2.0"; then
|
if test $sdlabi = "2.0"; then
|
||||||
sdl_config=$sdl2_config
|
sdl_config=$sdl2_config
|
||||||
sdlname=sdl2
|
sdlname=sdl2
|
||||||
sdlconfigname=sdl2_config
|
sdlconfigname=sdl2_config
|
||||||
else
|
elif test $sdlabi = "1.2"; then
|
||||||
sdlname=sdl
|
sdlname=sdl
|
||||||
sdlconfigname=sdl_config
|
sdlconfigname=sdl_config
|
||||||
|
else
|
||||||
|
error_exit "Unknown sdlabi $sdlabi, must be 1.2 or 2.0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "`basename $sdl_config`" != $sdlconfigname && ! has ${sdl_config}; then
|
if test "`basename $sdl_config`" != $sdlconfigname && ! has ${sdl_config}; then
|
||||||
|
@ -2435,10 +2453,10 @@ fi
|
||||||
|
|
||||||
if $pkg_config $sdlname --exists; then
|
if $pkg_config $sdlname --exists; then
|
||||||
sdlconfig="$pkg_config $sdlname"
|
sdlconfig="$pkg_config $sdlname"
|
||||||
_sdlversion=`$sdlconfig --modversion 2>/dev/null | sed 's/[^0-9]//g'`
|
sdlversion=`$sdlconfig --modversion 2>/dev/null`
|
||||||
elif has ${sdl_config}; then
|
elif has ${sdl_config}; then
|
||||||
sdlconfig="$sdl_config"
|
sdlconfig="$sdl_config"
|
||||||
_sdlversion=`$sdlconfig --version | sed 's/[^0-9]//g'`
|
sdlversion=`$sdlconfig --version`
|
||||||
else
|
else
|
||||||
if test "$sdl" = "yes" ; then
|
if test "$sdl" = "yes" ; then
|
||||||
feature_not_found "sdl" "Install SDL devel"
|
feature_not_found "sdl" "Install SDL devel"
|
||||||
|
@ -2463,7 +2481,7 @@ EOF
|
||||||
sdl_libs=`$sdlconfig --libs 2> /dev/null`
|
sdl_libs=`$sdlconfig --libs 2> /dev/null`
|
||||||
fi
|
fi
|
||||||
if compile_prog "$sdl_cflags" "$sdl_libs" ; then
|
if compile_prog "$sdl_cflags" "$sdl_libs" ; then
|
||||||
if test "$_sdlversion" -lt 121 ; then
|
if test `echo $sdlversion | sed 's/[^0-9]//g'` -lt 121 ; then
|
||||||
sdl_too_old=yes
|
sdl_too_old=yes
|
||||||
else
|
else
|
||||||
sdl=yes
|
sdl=yes
|
||||||
|
@ -4718,6 +4736,12 @@ EOF
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo_version() {
|
||||||
|
if test "$1" = "yes" ; then
|
||||||
|
echo "($2)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# prepend pixman and ftd flags after all config tests are done
|
# prepend pixman and ftd flags after all config tests are done
|
||||||
QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
|
QEMU_CFLAGS="$pixman_cflags $fdt_cflags $QEMU_CFLAGS"
|
||||||
libs_softmmu="$pixman_libs $libs_softmmu"
|
libs_softmmu="$pixman_libs $libs_softmmu"
|
||||||
|
@ -4767,22 +4791,18 @@ if test "$darwin" = "yes" ; then
|
||||||
echo "Cocoa support $cocoa"
|
echo "Cocoa support $cocoa"
|
||||||
fi
|
fi
|
||||||
echo "pixman $pixman"
|
echo "pixman $pixman"
|
||||||
echo "SDL support $sdl"
|
echo "SDL support $sdl `echo_version $sdl $sdlversion`"
|
||||||
echo "GTK support $gtk"
|
echo "GTK support $gtk `echo_version $gtk $gtk_version`"
|
||||||
echo "GTK GL support $gtk_gl"
|
echo "GTK GL support $gtk_gl"
|
||||||
|
echo "VTE support $vte `echo_version $vte $vteversion`"
|
||||||
echo "GNUTLS support $gnutls"
|
echo "GNUTLS support $gnutls"
|
||||||
echo "GNUTLS hash $gnutls_hash"
|
echo "GNUTLS hash $gnutls_hash"
|
||||||
echo "GNUTLS rnd $gnutls_rnd"
|
echo "GNUTLS rnd $gnutls_rnd"
|
||||||
echo "libgcrypt $gcrypt"
|
echo "libgcrypt $gcrypt"
|
||||||
echo "libgcrypt kdf $gcrypt_kdf"
|
echo "libgcrypt kdf $gcrypt_kdf"
|
||||||
if test "$nettle" = "yes"; then
|
echo "nettle $nettle `echo_version $nettle $nettle_version`"
|
||||||
echo "nettle $nettle ($nettle_version)"
|
|
||||||
else
|
|
||||||
echo "nettle $nettle"
|
|
||||||
fi
|
|
||||||
echo "nettle kdf $nettle_kdf"
|
echo "nettle kdf $nettle_kdf"
|
||||||
echo "libtasn1 $tasn1"
|
echo "libtasn1 $tasn1"
|
||||||
echo "VTE support $vte"
|
|
||||||
echo "curses support $curses"
|
echo "curses support $curses"
|
||||||
echo "virgl support $virglrenderer"
|
echo "virgl support $virglrenderer"
|
||||||
echo "curl support $curl"
|
echo "curl support $curl"
|
||||||
|
@ -4831,11 +4851,7 @@ echo "Trace backends $trace_backends"
|
||||||
if have_backend "simple"; then
|
if have_backend "simple"; then
|
||||||
echo "Trace output file $trace_file-<pid>"
|
echo "Trace output file $trace_file-<pid>"
|
||||||
fi
|
fi
|
||||||
if test "$spice" = "yes"; then
|
echo "spice support $spice `echo_version $spice $spice_protocol_version/$spice_server_version`"
|
||||||
echo "spice support $spice ($spice_protocol_version/$spice_server_version)"
|
|
||||||
else
|
|
||||||
echo "spice support $spice"
|
|
||||||
fi
|
|
||||||
echo "rbd support $rbd"
|
echo "rbd support $rbd"
|
||||||
echo "xfsctl support $xfs"
|
echo "xfsctl support $xfs"
|
||||||
echo "smartcard support $smartcard"
|
echo "smartcard support $smartcard"
|
||||||
|
|
|
@ -71,6 +71,7 @@ typedef struct QXLCookie {
|
||||||
QXLRect area;
|
QXLRect area;
|
||||||
int redraw;
|
int redraw;
|
||||||
} render;
|
} render;
|
||||||
|
void *data;
|
||||||
} u;
|
} u;
|
||||||
} QXLCookie;
|
} QXLCookie;
|
||||||
|
|
||||||
|
|
|
@ -49,18 +49,15 @@ int qemu_egl_rendernode_open(void)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = asprintf(&p, "/dev/dri/%s", e->d_name);
|
p = g_strdup_printf("/dev/dri/%s", e->d_name);
|
||||||
if (r < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = open(p, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
|
r = open(p, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
free(p);
|
g_free(p);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
fd = r;
|
fd = r;
|
||||||
free(p);
|
g_free(p);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
115
ui/gtk.c
115
ui/gtk.c
|
@ -139,6 +139,7 @@ struct GtkDisplayState {
|
||||||
GtkWidget *view_menu_item;
|
GtkWidget *view_menu_item;
|
||||||
GtkWidget *view_menu;
|
GtkWidget *view_menu;
|
||||||
GtkWidget *full_screen_item;
|
GtkWidget *full_screen_item;
|
||||||
|
GtkWidget *copy_item;
|
||||||
GtkWidget *zoom_in_item;
|
GtkWidget *zoom_in_item;
|
||||||
GtkWidget *zoom_out_item;
|
GtkWidget *zoom_out_item;
|
||||||
GtkWidget *zoom_fixed_item;
|
GtkWidget *zoom_fixed_item;
|
||||||
|
@ -328,7 +329,23 @@ static void gd_update_geometry_hints(VirtualConsole *vc)
|
||||||
#if defined(CONFIG_VTE)
|
#if defined(CONFIG_VTE)
|
||||||
} else if (vc->type == GD_VC_VTE) {
|
} else if (vc->type == GD_VC_VTE) {
|
||||||
VteTerminal *term = VTE_TERMINAL(vc->vte.terminal);
|
VteTerminal *term = VTE_TERMINAL(vc->vte.terminal);
|
||||||
GtkBorder *ib;
|
GtkBorder padding = { 0 };
|
||||||
|
|
||||||
|
#if VTE_CHECK_VERSION(0, 37, 0)
|
||||||
|
gtk_style_context_get_padding(
|
||||||
|
gtk_widget_get_style_context(vc->vte.terminal),
|
||||||
|
gtk_widget_get_state_flags(vc->vte.terminal),
|
||||||
|
&padding);
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
GtkBorder *ib = NULL;
|
||||||
|
gtk_widget_style_get(vc->vte.terminal, "inner-border", &ib, NULL);
|
||||||
|
if (ib) {
|
||||||
|
padding = *ib;
|
||||||
|
gtk_border_free(ib);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
geo.width_inc = vte_terminal_get_char_width(term);
|
geo.width_inc = vte_terminal_get_char_width(term);
|
||||||
geo.height_inc = vte_terminal_get_char_height(term);
|
geo.height_inc = vte_terminal_get_char_height(term);
|
||||||
|
@ -339,11 +356,11 @@ static void gd_update_geometry_hints(VirtualConsole *vc)
|
||||||
geo.min_width = geo.width_inc * VC_TERM_X_MIN;
|
geo.min_width = geo.width_inc * VC_TERM_X_MIN;
|
||||||
geo.min_height = geo.height_inc * VC_TERM_Y_MIN;
|
geo.min_height = geo.height_inc * VC_TERM_Y_MIN;
|
||||||
mask |= GDK_HINT_MIN_SIZE;
|
mask |= GDK_HINT_MIN_SIZE;
|
||||||
gtk_widget_style_get(vc->vte.terminal, "inner-border", &ib, NULL);
|
|
||||||
geo.base_width += ib->left + ib->right;
|
geo.base_width += padding.left + padding.right;
|
||||||
geo.base_height += ib->top + ib->bottom;
|
geo.base_height += padding.top + padding.bottom;
|
||||||
geo.min_width += ib->left + ib->right;
|
geo.min_width += padding.left + padding.right;
|
||||||
geo.min_height += ib->top + ib->bottom;
|
geo.min_height += padding.top + padding.bottom;
|
||||||
geo_widget = vc->vte.terminal;
|
geo_widget = vc->vte.terminal;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -463,12 +480,21 @@ static void gd_refresh(DisplayChangeListener *dcl)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 0, 0)
|
||||||
|
static GdkDevice *gd_get_pointer(GdkDisplay *dpy)
|
||||||
|
{
|
||||||
|
#if GTK_CHECK_VERSION(3, 20, 0)
|
||||||
|
return gdk_seat_get_pointer(gdk_display_get_default_seat(dpy));
|
||||||
|
#else
|
||||||
|
return gdk_device_manager_get_client_pointer(
|
||||||
|
gdk_display_get_device_manager(dpy));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void gd_mouse_set(DisplayChangeListener *dcl,
|
static void gd_mouse_set(DisplayChangeListener *dcl,
|
||||||
int x, int y, int visible)
|
int x, int y, int visible)
|
||||||
{
|
{
|
||||||
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
|
||||||
GdkDisplay *dpy;
|
GdkDisplay *dpy;
|
||||||
GdkDeviceManager *mgr;
|
|
||||||
gint x_root, y_root;
|
gint x_root, y_root;
|
||||||
|
|
||||||
if (qemu_input_is_absolute()) {
|
if (qemu_input_is_absolute()) {
|
||||||
|
@ -476,10 +502,9 @@ static void gd_mouse_set(DisplayChangeListener *dcl,
|
||||||
}
|
}
|
||||||
|
|
||||||
dpy = gtk_widget_get_display(vc->gfx.drawing_area);
|
dpy = gtk_widget_get_display(vc->gfx.drawing_area);
|
||||||
mgr = gdk_display_get_device_manager(dpy);
|
|
||||||
gdk_window_get_root_coords(gtk_widget_get_window(vc->gfx.drawing_area),
|
gdk_window_get_root_coords(gtk_widget_get_window(vc->gfx.drawing_area),
|
||||||
x, y, &x_root, &y_root);
|
x, y, &x_root, &y_root);
|
||||||
gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
|
gdk_device_warp(gd_get_pointer(dpy),
|
||||||
gtk_widget_get_screen(vc->gfx.drawing_area),
|
gtk_widget_get_screen(vc->gfx.drawing_area),
|
||||||
x_root, y_root);
|
x_root, y_root);
|
||||||
vc->s->last_x = x;
|
vc->s->last_x = x;
|
||||||
|
@ -1307,7 +1332,31 @@ static void gd_menu_zoom_fit(GtkMenuItem *item, void *opaque)
|
||||||
gd_update_full_redraw(vc);
|
gd_update_full_redraw(vc);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 20, 0)
|
||||||
|
static void gd_grab_update(VirtualConsole *vc, bool kbd, bool ptr)
|
||||||
|
{
|
||||||
|
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
||||||
|
GdkSeat *seat = gdk_display_get_default_seat(display);
|
||||||
|
GdkWindow *window = gtk_widget_get_window(vc->gfx.drawing_area);
|
||||||
|
GdkSeatCapabilities caps = 0;
|
||||||
|
GdkCursor *cursor = NULL;
|
||||||
|
|
||||||
|
if (kbd) {
|
||||||
|
caps |= GDK_SEAT_CAPABILITY_KEYBOARD;
|
||||||
|
}
|
||||||
|
if (ptr) {
|
||||||
|
caps |= GDK_SEAT_CAPABILITY_ALL_POINTING;
|
||||||
|
cursor = vc->s->null_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (caps) {
|
||||||
|
gdk_seat_grab(seat, window, caps, false, cursor,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
} else {
|
||||||
|
gdk_seat_ungrab(seat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif GTK_CHECK_VERSION(3, 0, 0)
|
||||||
static void gd_grab_devices(VirtualConsole *vc, bool grab,
|
static void gd_grab_devices(VirtualConsole *vc, bool grab,
|
||||||
GdkInputSource source, GdkEventMask mask,
|
GdkInputSource source, GdkEventMask mask,
|
||||||
GdkCursor *cursor)
|
GdkCursor *cursor)
|
||||||
|
@ -1344,7 +1393,9 @@ static void gd_grab_keyboard(VirtualConsole *vc, const char *reason)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 20, 0)
|
||||||
|
gd_grab_update(vc, true, vc->s->ptr_owner == vc);
|
||||||
|
#elif GTK_CHECK_VERSION(3, 0, 0)
|
||||||
gd_grab_devices(vc, true, GDK_SOURCE_KEYBOARD,
|
gd_grab_devices(vc, true, GDK_SOURCE_KEYBOARD,
|
||||||
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
|
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1367,7 +1418,9 @@ static void gd_ungrab_keyboard(GtkDisplayState *s)
|
||||||
}
|
}
|
||||||
s->kbd_owner = NULL;
|
s->kbd_owner = NULL;
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 20, 0)
|
||||||
|
gd_grab_update(vc, false, vc->s->ptr_owner == vc);
|
||||||
|
#elif GTK_CHECK_VERSION(3, 0, 0)
|
||||||
gd_grab_devices(vc, false, GDK_SOURCE_KEYBOARD, 0, NULL);
|
gd_grab_devices(vc, false, GDK_SOURCE_KEYBOARD, 0, NULL);
|
||||||
#else
|
#else
|
||||||
gdk_keyboard_ungrab(GDK_CURRENT_TIME);
|
gdk_keyboard_ungrab(GDK_CURRENT_TIME);
|
||||||
|
@ -1388,8 +1441,11 @@ static void gd_grab_pointer(VirtualConsole *vc, const char *reason)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
#if GTK_CHECK_VERSION(3, 20, 0)
|
||||||
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
gd_grab_update(vc, vc->s->kbd_owner == vc, true);
|
||||||
|
gdk_device_get_position(gd_get_pointer(display),
|
||||||
|
NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
|
||||||
|
#elif GTK_CHECK_VERSION(3, 0, 0)
|
||||||
gd_grab_devices(vc, true, GDK_SOURCE_MOUSE,
|
gd_grab_devices(vc, true, GDK_SOURCE_MOUSE,
|
||||||
GDK_POINTER_MOTION_MASK |
|
GDK_POINTER_MOTION_MASK |
|
||||||
GDK_BUTTON_PRESS_MASK |
|
GDK_BUTTON_PRESS_MASK |
|
||||||
|
@ -1397,7 +1453,7 @@ static void gd_grab_pointer(VirtualConsole *vc, const char *reason)
|
||||||
GDK_BUTTON_MOTION_MASK |
|
GDK_BUTTON_MOTION_MASK |
|
||||||
GDK_SCROLL_MASK,
|
GDK_SCROLL_MASK,
|
||||||
vc->s->null_cursor);
|
vc->s->null_cursor);
|
||||||
gdk_device_get_position(gdk_device_manager_get_client_pointer(mgr),
|
gdk_device_get_position(gd_get_pointer(display),
|
||||||
NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
|
NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
|
||||||
#else
|
#else
|
||||||
gdk_pointer_grab(gtk_widget_get_window(vc->gfx.drawing_area),
|
gdk_pointer_grab(gtk_widget_get_window(vc->gfx.drawing_area),
|
||||||
|
@ -1421,17 +1477,21 @@ static void gd_grab_pointer(VirtualConsole *vc, const char *reason)
|
||||||
static void gd_ungrab_pointer(GtkDisplayState *s)
|
static void gd_ungrab_pointer(GtkDisplayState *s)
|
||||||
{
|
{
|
||||||
VirtualConsole *vc = s->ptr_owner;
|
VirtualConsole *vc = s->ptr_owner;
|
||||||
|
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
||||||
|
|
||||||
if (vc == NULL) {
|
if (vc == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s->ptr_owner = NULL;
|
s->ptr_owner = NULL;
|
||||||
|
|
||||||
GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
|
#if GTK_CHECK_VERSION(3, 20, 0)
|
||||||
#if GTK_CHECK_VERSION(3, 0, 0)
|
gd_grab_update(vc, vc->s->kbd_owner == vc, false);
|
||||||
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
|
gdk_device_warp(gd_get_pointer(display),
|
||||||
|
gtk_widget_get_screen(vc->gfx.drawing_area),
|
||||||
|
vc->s->grab_x_root, vc->s->grab_y_root);
|
||||||
|
#elif GTK_CHECK_VERSION(3, 0, 0)
|
||||||
gd_grab_devices(vc, false, GDK_SOURCE_MOUSE, 0, NULL);
|
gd_grab_devices(vc, false, GDK_SOURCE_MOUSE, 0, NULL);
|
||||||
gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
|
gdk_device_warp(gd_get_pointer(display),
|
||||||
gtk_widget_get_screen(vc->gfx.drawing_area),
|
gtk_widget_get_screen(vc->gfx.drawing_area),
|
||||||
vc->s->grab_x_root, vc->s->grab_y_root);
|
vc->s->grab_x_root, vc->s->grab_y_root);
|
||||||
#else
|
#else
|
||||||
|
@ -1570,6 +1630,14 @@ static GSList *gd_vc_menu_init(GtkDisplayState *s, VirtualConsole *vc,
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_VTE)
|
#if defined(CONFIG_VTE)
|
||||||
|
static void gd_menu_copy(GtkMenuItem *item, void *opaque)
|
||||||
|
{
|
||||||
|
GtkDisplayState *s = opaque;
|
||||||
|
VirtualConsole *vc = gd_vc_find_current(s);
|
||||||
|
|
||||||
|
vte_terminal_copy_clipboard(VTE_TERMINAL(vc->vte.terminal));
|
||||||
|
}
|
||||||
|
|
||||||
static void gd_vc_adjustment_changed(GtkAdjustment *adjustment, void *opaque)
|
static void gd_vc_adjustment_changed(GtkAdjustment *adjustment, void *opaque)
|
||||||
{
|
{
|
||||||
VirtualConsole *vc = opaque;
|
VirtualConsole *vc = opaque;
|
||||||
|
@ -1806,6 +1874,10 @@ static void gd_connect_signals(GtkDisplayState *s)
|
||||||
G_CALLBACK(gd_menu_powerdown), s);
|
G_CALLBACK(gd_menu_powerdown), s);
|
||||||
g_signal_connect(s->quit_item, "activate",
|
g_signal_connect(s->quit_item, "activate",
|
||||||
G_CALLBACK(gd_menu_quit), s);
|
G_CALLBACK(gd_menu_quit), s);
|
||||||
|
#if defined(CONFIG_VTE)
|
||||||
|
g_signal_connect(s->copy_item, "activate",
|
||||||
|
G_CALLBACK(gd_menu_copy), s);
|
||||||
|
#endif
|
||||||
g_signal_connect(s->full_screen_item, "activate",
|
g_signal_connect(s->full_screen_item, "activate",
|
||||||
G_CALLBACK(gd_menu_full_screen), s);
|
G_CALLBACK(gd_menu_full_screen), s);
|
||||||
g_signal_connect(s->zoom_in_item, "activate",
|
g_signal_connect(s->zoom_in_item, "activate",
|
||||||
|
@ -1939,6 +2011,11 @@ static GtkWidget *gd_create_menu_view(GtkDisplayState *s)
|
||||||
|
|
||||||
s->full_screen_item = gtk_menu_item_new_with_mnemonic(_("_Fullscreen"));
|
s->full_screen_item = gtk_menu_item_new_with_mnemonic(_("_Fullscreen"));
|
||||||
|
|
||||||
|
#if defined(CONFIG_VTE)
|
||||||
|
s->copy_item = gtk_menu_item_new_with_mnemonic(_("_Copy"));
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), s->copy_item);
|
||||||
|
#endif
|
||||||
|
|
||||||
gtk_accel_group_connect(s->accel_group, GDK_KEY_f, HOTKEY_MODIFIERS, 0,
|
gtk_accel_group_connect(s->accel_group, GDK_KEY_f, HOTKEY_MODIFIERS, 0,
|
||||||
g_cclosure_new_swap(G_CALLBACK(gd_accel_full_screen), s, NULL));
|
g_cclosure_new_swap(G_CALLBACK(gd_accel_full_screen), s, NULL));
|
||||||
#if GTK_CHECK_VERSION(3, 8, 0)
|
#if GTK_CHECK_VERSION(3, 8, 0)
|
||||||
|
|
|
@ -357,6 +357,10 @@ static void handle_keydown(SDL_Event *ev)
|
||||||
case SDL_SCANCODE_7:
|
case SDL_SCANCODE_7:
|
||||||
case SDL_SCANCODE_8:
|
case SDL_SCANCODE_8:
|
||||||
case SDL_SCANCODE_9:
|
case SDL_SCANCODE_9:
|
||||||
|
if (gui_grab) {
|
||||||
|
sdl_grab_end(scon);
|
||||||
|
}
|
||||||
|
|
||||||
win = ev->key.keysym.scancode - SDL_SCANCODE_1;
|
win = ev->key.keysym.scancode - SDL_SCANCODE_1;
|
||||||
if (win < sdl2_num_outputs) {
|
if (win < sdl2_num_outputs) {
|
||||||
sdl2_console[win].hidden = !sdl2_console[win].hidden;
|
sdl2_console[win].hidden = !sdl2_console[win].hidden;
|
||||||
|
|
|
@ -83,12 +83,12 @@ GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src)
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
|
||||||
errmsg = malloc(length);
|
errmsg = g_malloc(length);
|
||||||
glGetShaderInfoLog(shader, length, &length, errmsg);
|
glGetShaderInfoLog(shader, length, &length, errmsg);
|
||||||
fprintf(stderr, "%s: compile %s error\n%s\n", __func__,
|
fprintf(stderr, "%s: compile %s error\n%s\n", __func__,
|
||||||
(type == GL_VERTEX_SHADER) ? "vertex" : "fragment",
|
(type == GL_VERTEX_SHADER) ? "vertex" : "fragment",
|
||||||
errmsg);
|
errmsg);
|
||||||
free(errmsg);
|
g_free(errmsg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return shader;
|
return shader;
|
||||||
|
@ -108,10 +108,10 @@ GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag)
|
||||||
glGetProgramiv(program, GL_LINK_STATUS, &status);
|
glGetProgramiv(program, GL_LINK_STATUS, &status);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
|
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
|
||||||
errmsg = malloc(length);
|
errmsg = g_malloc(length);
|
||||||
glGetProgramInfoLog(program, length, &length, errmsg);
|
glGetProgramInfoLog(program, length, &length, errmsg);
|
||||||
fprintf(stderr, "%s: link program: %s\n", __func__, errmsg);
|
fprintf(stderr, "%s: link program: %s\n", __func__, errmsg);
|
||||||
free(errmsg);
|
g_free(errmsg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return program;
|
return program;
|
||||||
|
|
|
@ -660,6 +660,11 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token)
|
||||||
qemu_bh_schedule(ssd->gl_unblock_bh);
|
qemu_bh_schedule(ssd->gl_unblock_bh);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QXL_COOKIE_TYPE_IO:
|
||||||
|
if (cookie->io == QXL_IO_MONITORS_CONFIG_ASYNC) {
|
||||||
|
g_free(cookie->u.data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
/* should never be called, used in qxl native mode only */
|
/* should never be called, used in qxl native mode only */
|
||||||
|
@ -769,9 +774,7 @@ static void display_mouse_define(DisplayChangeListener *dcl,
|
||||||
SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl);
|
SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl);
|
||||||
|
|
||||||
qemu_mutex_lock(&ssd->lock);
|
qemu_mutex_lock(&ssd->lock);
|
||||||
if (c) {
|
|
||||||
cursor_get(c);
|
cursor_get(c);
|
||||||
}
|
|
||||||
cursor_put(ssd->cursor);
|
cursor_put(ssd->cursor);
|
||||||
ssd->cursor = c;
|
ssd->cursor = c;
|
||||||
ssd->hot_x = c->hot_x;
|
ssd->hot_x = c->hot_x;
|
||||||
|
@ -795,6 +798,29 @@ static const DisplayChangeListenerOps display_listener_ops = {
|
||||||
|
|
||||||
#ifdef HAVE_SPICE_GL
|
#ifdef HAVE_SPICE_GL
|
||||||
|
|
||||||
|
static void qemu_spice_gl_monitor_config(SimpleSpiceDisplay *ssd,
|
||||||
|
int x, int y, int w, int h)
|
||||||
|
{
|
||||||
|
QXLMonitorsConfig *config;
|
||||||
|
QXLCookie *cookie;
|
||||||
|
|
||||||
|
config = g_malloc0(sizeof(QXLMonitorsConfig) + sizeof(QXLHead));
|
||||||
|
config->count = 1;
|
||||||
|
config->max_allowed = 1;
|
||||||
|
config->heads[0].x = x;
|
||||||
|
config->heads[0].y = y;
|
||||||
|
config->heads[0].width = w;
|
||||||
|
config->heads[0].height = h;
|
||||||
|
cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO,
|
||||||
|
QXL_IO_MONITORS_CONFIG_ASYNC);
|
||||||
|
cookie->u.data = config;
|
||||||
|
|
||||||
|
spice_qxl_monitors_config_async(&ssd->qxl,
|
||||||
|
(uintptr_t)config,
|
||||||
|
MEMSLOT_GROUP_HOST,
|
||||||
|
(uintptr_t)cookie);
|
||||||
|
}
|
||||||
|
|
||||||
static void qemu_spice_gl_block(SimpleSpiceDisplay *ssd, bool block)
|
static void qemu_spice_gl_block(SimpleSpiceDisplay *ssd, bool block)
|
||||||
{
|
{
|
||||||
uint64_t timeout;
|
uint64_t timeout;
|
||||||
|
@ -858,6 +884,8 @@ static void qemu_spice_gl_scanout(DisplayChangeListener *dcl,
|
||||||
surface_width(ssd->ds),
|
surface_width(ssd->ds),
|
||||||
surface_height(ssd->ds),
|
surface_height(ssd->ds),
|
||||||
stride, fourcc, y_0_top);
|
stride, fourcc, y_0_top);
|
||||||
|
|
||||||
|
qemu_spice_gl_monitor_config(ssd, x, y, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qemu_spice_gl_update(DisplayChangeListener *dcl,
|
static void qemu_spice_gl_update(DisplayChangeListener *dcl,
|
||||||
|
|
Loading…
Reference in a new issue