Commit Graph

64 Commits

Author SHA1 Message Date
Marc-André Lureau
006fcf859c window: keep display size when leaving fullscreen for first time
If the application was started in fullscreen, window geometry has not
been saved, since the window was not realized. We can unfullscreen and
restore 1:1 window to match guest display size with
virt_viewer_display_queue_resize()

https://bugzilla.redhat.com/show_bug.cgi?id=916810
2013-03-26 12:35:52 +01:00
Marc-André Lureau
f507f30904 window: save window geometry if the window is realized
Protect against re-entering fullscreen by moving pre-condition,
keey the last know window geometry, since it stays valid.
2013-03-26 12:34:30 +01:00
Marc-André Lureau
d2c4739dc5 window: resize to monitor geometry
This code is potentially bad, we should set size request to the size of the monitor
2013-03-26 12:31:25 +01:00
Marc-André Lureau
910692b140 Forward directly key events to display
Even if the display is disabled, we should keep sending key events to
guest. It can wake up from sleep for instance.

There is a single widget per window, so we can directly send key
events there. If the menu is active, it has the grab, so the window
doesn't receive those key events.

https://bugzilla.redhat.com/show_bug.cgi?id=870710
2013-03-23 00:51:46 +01:00
Hans de Goede
f7c11ac899 virt-viewer-window: Don't use priv->display when it is NULL
Add some missing checks for not having a display. Note that where
functions should not be called (ie menu items should be disabled) I've
used g_return_if_fail.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2013-03-21 17:25:35 +01:00
Hans de Goede
9893c23830 virt-viewer-window: Store the monitor locally
With commit 81ed9d13 "virt_viewer_window_enter_fullscreen: Pass in monitor for
fullscreen window" we need a monitor number to determine where to move
the window when going fullscreen.

Since the VirtViewerDisplay needs to know the fullscreen monitor number too,
to determine the fullscreen size it was being stored there. But we don't
always have a display, leading to errors like:

(remote-viewer:7996): remote-viewer-CRITICAL **:
virt_viewer_display_get_monitor: assertion `VIRT_VIEWER_IS_DISPLAY(self)'
failed

And to the monitor number not always being stored. This patchset fixes this
by storing the monitor number inside VirtViewerWindow, and passing it to
VirtViewerDisplay only when we've a display.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2013-03-21 17:25:35 +01:00
Hans de Goede
81ed9d13a8 virt_viewer_window_enter_fullscreen: Pass in monitor for fullscreen window
Rather then passing in a move boolean + coordinates to move the window
to for fullscreen mode, simply pass in the monitor, so that the underlying
objects can also use the monitors size to determine the display size.

Note: pass in -1 to use the monitor the window is currently on.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2013-03-20 15:26:47 +01:00
Hans de Goede
b529b60525 Fix send-key menu not showing in fullscreen with gtk3 (rhbz#913601)
This should also fix the send-key menu showing in the wrong position with a
gtk2 build, when the tooltray icon is clicked on the 2nd or higher monitor.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2013-02-21 18:16:14 +01:00
Marc-André Lureau
a52b5ea88c build-sys: add --with-buildid to details build version
Add a configure argument to append build version details, similar to
what Daniel Berrange proposed in the "use finer package version in
mingw-virt-viewer" thread on the ML.
2013-02-12 18:56:33 +01:00
Hans de Goede
ea6c9d2673 virtviewer-window: Make sure fullscreen window stays on the same monitor
Sometimes the guest may shortly disable and then re-enable a monitor while
in fullscreen mode, this happens for example when changing display resolution
through gnome-display-properties inside the guest. This causes the client
window-manager to remap the window, and this can cause it to end up
on a different monitor.

This patch fixes this by remembering the position the window is places at
when going fullcreen and moving it there again when its gets (re-)shown.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2013-02-11 14:25:01 +01:00
Christophe Fergeau
0577c703fb Improve check for overridden grab key combination
remote-viewer can either use the default grab/ungrab handled by
spice-gtk, or override it and use the standard gtk+ accelerator
mechanism. However, the code currently assumes that if any accelerator
is set in remote-viewer, then the grab key has been overridden.
This commit makes sure the grab key is actually overridden before assuming
so.
2012-12-20 12:22:14 +01:00
Christophe Fergeau
8a7aa6a1e1 Make sure png screenshots have a .png extensions
When falling back to saving to .png, the filename might not
end with .png. This commit appends the .png extension to the
screenshot filename if it's missing.
2012-11-15 10:21:03 +01:00
Christophe Fergeau
f9935c832b Allow to save to other formats than png
Currently, the screenshots can only be saved to png. This commit
checks if the file extension is a known one, and will save to this
format if it is. Otherwise it will fallback to saving to png.
2012-11-15 10:21:03 +01:00
Christophe Fergeau
45a791082e Set a default dir/name for screenshots
It makes sense for the screenshots to be saved in ~/Images,
especially as otherwise the filechooser will display
'recent documents' to which we cannot save. This commit also sets
the default screenshot name to 'Screenshot'.
2012-11-15 10:21:03 +01:00
Marc-André Lureau
143bc8a33f Do not resize window to minimum when toggling auto-resize
The virt_viewer_display_idle() will queue a resize event that will
result in display size requisition of 50x50. If we later resize the
window to 1x1 in virt_viewer_window_resize() we end up with a tiny
window.

It is legitimate not to force that 1x1 window resize when toggling the
option. After the rest of the logic in virt_viewer_window_resize(), if
the remote desktop ends up being resize, that will trigger another
virt_viewer_set_desktop_size() and finally change the window size
appropriately.

https://bugzilla.redhat.com/show_bug.cgi?id=856610
2012-10-16 20:41:47 +02:00
Marc-André Lureau
e88f5a52cf Show status page by default if display not ready
Switch back to status page if display is not ready.
2012-07-23 16:27:33 +02:00
Marc-André Lureau
37c30a4569 Add virt_viewer_window_get_display()
Getter used in following changes.
2012-07-23 16:27:33 +02:00
Marc-André Lureau
2a085766f1 Add a DISABLED display hint
This flag will help to track whether the display has been
removed/closed and whether it really has a valid display.

Ready in contrast, is used to "hide" temporarily the display (when
starting or redrawing the display, to avoid artifacts)
2012-07-23 16:27:32 +02:00
Marc-André Lureau
0897382b45 Use virt_viewer_connect_object() for display
When display is released, detach signal automatically.

Fix various crash related to not cleaning up signal handlers properly,
due to no longer 1-1 only relation between display widget and channel.
2012-07-23 16:27:32 +02:00
Marc-André Lureau
02b326f80b Run-time check values before doing bad computation 2012-07-23 16:27:32 +02:00
Marc-André Lureau
560767b573 Turn display:show-hint into flags type 2012-07-23 16:27:32 +02:00
Christophe Fergeau
afb278958e Fix various memory leaks
==25063== 59 bytes in 1 blocks are definitely lost in loss record 5,163 of 9,502
==25063==    at 0x4A0884D: malloc (vg_replace_malloc.c:263)
==25063==    by 0x3DE384D2BE: g_malloc (gmem.c:159)
==25063==    by 0x3DE3862D0B: g_strdup (gstrfuncs.c:356)
==25063==    by 0x41F40A: connected (remote-viewer-main.c:186)
==25063==    by 0x3DE400F663: g_closure_invoke (gclosure.c:777)
==25063==    by 0x3DE40206D7: signal_emit_unlocked_R (gsignal.c:3547)
==25063==    by 0x3DE402866C: g_signal_emit_valist (gsignal.c:3296)
==25063==    by 0x3DE4028CCF: g_signal_emit_by_name (gsignal.c:3389)
==25063==    by 0x41AA53: reemit_signal_VOID (virt-viewer-session-ovirt.c:211)
==25063==    by 0x3DE400F942: _g_closure_invoke_va (gclosure.c:840)
==25063==    by 0x3DE4027D87: g_signal_emit_valist (gsignal.c:3207)
==25063==    by 0x3DE4028CCF: g_signal_emit_by_name (gsignal.c:3389)

==25063== 14 bytes in 1 blocks are definitely lost in loss record 623 of 9,502
==25063==    at 0x4A0884D: malloc (vg_replace_malloc.c:263)
==25063==    by 0x34561092F7: __vasprintf_chk (vasprintf_chk.c:82)
==25063==    by 0x3DE3882F1A: g_vasprintf (stdio2.h:199)
==25063==    by 0x3DE3862EDC: g_strdup_vprintf (gstrfuncs.c:509)
==25063==    by 0x3DE3862F7B: g_strdup_printf (gstrfuncs.c:535)
==25063==    by 0x40CBAE: virt_viewer_app_update_pretty_address (virt-viewer-app.c:1538)
==25063==    by 0x40FB55: virt_viewer_app_free_connect_info (virt-viewer-app.c:1707)
==25063==    by 0x40FBE9: virt_viewer_app_dispose (virt-viewer-app.c:1291)
==25063==    by 0x3DE40144F7: g_object_unref (gobject.c:2981)
==25063==    by 0x40C31A: main (remote-viewer-main.c:336)

==25063== 10 bytes in 1 blocks are definitely lost in loss record 491 of 9,502
==25063==    at 0x4A0884D: malloc (vg_replace_malloc.c:263)
==25063==    by 0x34561092F7: __vasprintf_chk (vasprintf_chk.c:82)
==25063==    by 0x3DE3882F1A: g_vasprintf (stdio2.h:199)
==25063==    by 0x3DE3862EDC: g_strdup_vprintf (gstrfuncs.c:509)
==25063==    by 0x3DE3862F7B: g_strdup_printf (gstrfuncs.c:535)
==25063==    by 0x40DE36: window_update_menu_displays_cb (virt-viewer-app.c:1640)
==25063==    by 0x3DE383833F: g_hash_table_foreach (ghash.c:1524)
==25063==    by 0x3DE400F663: g_closure_invoke (gclosure.c:777)
==25063==    by 0x3DE40206D7: signal_emit_unlocked_R (gsignal.c:3547)
==25063==    by 0x3DE402866C: g_signal_emit_valist (gsignal.c:3296)
==25063==    by 0x3DE40287C1: g_signal_emit (gsignal.c:3352)
==25063==    by 0x5772F95: gtk_widget_show (gtkwidget.c:3225)

==25063== 8,431 (72 direct, 8,359 indirect) bytes in 1 blocks are definitely lost in loss record 9,468 of 9,502
==25063==    at 0x4A0884D: malloc (vg_replace_malloc.c:263)
==25063==    by 0x3DE384D2BE: g_malloc (gmem.c:159)
==25063==    by 0x3DE38616B1: g_slice_alloc (gslice.c:1003)
==25063==    by 0x3DE3861C05: g_slice_alloc0 (gslice.c:1029)
==25063==    by 0x3DE402F96F: g_type_create_instance (gtype.c:1872)
==25063==    by 0x3DE40147A7: g_object_constructor (gobject.c:1849)
==25063==    by 0x3DE4016260: g_object_newv (gobject.c:1632)
==25063==    by 0x3DE40168AB: g_object_new (gobject.c:1542)
==25063==    by 0x40C4BD: virt_viewer_util_load_ui (virt-viewer-util.c:41)
==25063==    by 0x40C7EB: virt_viewer_auth_collect_credentials (virt-viewer-auth.c:43)
==25063==    by 0x41B391: authenticate_cb (virt-viewer-session-ovirt.c:430)
==25063==    by 0x3458C05E8F: ffi_call_unix64 (unix64.S:75)

==25063== 32 (16 direct, 16 indirect) bytes in 1 blocks are definitely lost in loss record 3,962 of 9,502
==25063==    at 0x4A0884D: malloc (vg_replace_malloc.c:263)
==25063==    by 0x3DE384D2BE: g_malloc (gmem.c:159)
==25063==    by 0x3DE38616B1: g_slice_alloc (gslice.c:1003)
==25063==    by 0x3DE38629F2: g_slist_append (gslist.c:222)
==25063==    by 0x41483C: virt_viewer_window_init (virt-viewer-window.c:323)
==25063==    by 0x3DE402FA05: g_type_create_instance (gtype.c:1892)
==25063==    by 0x3DE40147A7: g_object_constructor (gobject.c:1849)
==25063==    by 0x3DE4015D70: g_object_newv (gobject.c:1713)
==25063==    by 0x3DE401655F: g_object_new_valist (gobject.c:1830)
==25063==    by 0x3DE4016893: g_object_new (gobject.c:1545)
==25063==    by 0x40DA34: virt_viewer_app_window_new (virt-viewer-app.c:590)
==25063==    by 0x40E300: virt_viewer_app_constructor (virt-viewer-app.c:1336)

==30355== 4 bytes in 1 blocks are definitely lost in loss record 53 of 9,267
==30355==    at 0x4A0884D: malloc (vg_replace_malloc.c:263)
==30355==    by 0x3DE384D2BE: g_malloc (gmem.c:159)
==30355==    by 0x3DE3862D0B: g_strdup (gstrfuncs.c:356)
==30355==    by 0x3DE40360FC: value_copy_string (gvaluetypes.c:276)
==30355==    by 0x3DE40340CA: g_value_transform (gvalue.c:535)
==30355==    by 0x3FDAE621DD: gdk_screen_get_setting (gdkevents-x11.c:3022)
==30355==    by 0x3FDB3C7415: gtk_settings_get_property (gtksettings.c:1152)
==30355==    by 0x3DE4017A74: g_object_get_property (gobject.c:1289)
==30355==    by 0x414991: virt_viewer_window_disable_modifiers (virt-viewer-window.c:616)
==30355==    by 0x415922: virt_viewer_window_keyboard_grab (virt-viewer-window.c:931)
==30355==    by 0x3DE400F942: _g_closure_invoke_va (gclosure.c:840)
==30355==    by 0x3DE4027D87: g_signal_emit_valist (gsignal.c:3207)
2012-06-13 12:17:16 +02:00
Daniel P. Berrange
f34edd09cb Ensure windows are destroyed when display closes
When running virt-viewer with the --reconnect argument, when
the session closes, the VirtViewerWindow instances were being
freed, but not the GtkWindow itself. So the orphaned window
stayed around doing nothing. The GtkBuilder instance was also
leaked.

Fix these two leaks & also add some debugging to help future
troubleshooting
2012-05-04 17:22:44 +01:00
Daniel P. Berrange
831ebf5dab Fix close of VNC displays
When clicking the close button on a virt-viewer window with
a VNC session open, while the VNC session terminates, the
window does not go away.

The problem is that the virt_viewer_session_vnc_disconnected
method never gets invoked. The close button triggers a call
to virt_viewer_session_clear_displays which unrefs the
VirtViewerDisplayVnc instance. This in turn triggers a call
to gtk_container_destroy, which destroys all widgets it
contains, ie the VncDisplay * object.

With the VncDisplay object in its dispose phase, no signals
will ever be emitted, thus the 'vnc-disconnected' signal
never gets seen.

The design issue is that VirtViewerDisplayVnc is assuming
it owns the VncDisplay, whereas in fact the real owner is
the VirtViewerSessionVnc object.

The solution is to introduce a new virt_viewer_display_close
method which can be used to de-parent the widget before
VirtViewerDisplay is unref'd.

The VirtViewerSessionVnc object also needs to hold a full ref
on the VncDisplay object, not merely a floating reference

* virt-viewer-display-spice.c, virt-viewer-display.c,
  virt-viewer-display.h: Add virt_viewer_display_close
* virt-viewer-display-vnc.c: Deparent VNC widget in
  virt_viewer_display_close impl
* virt-viewer-session-vnc.c: Improve logging
* virt-viewer-session.c: Call virt_viewer_display_close
  before unrefing display
* virt-viewer-window.c: Improve logging

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-04-04 10:41:32 +01:00
Marc-André Lureau
a48856f10e Disable mnemonics via gtk-enable-mnemonics settings
This has 2 advantages, and I can't figure any drawback:
- it fixes the issue of mnemonic hints being draw when pressing Alt
  key (character underlined), even when they were disabled.
- it simplifies the code :)
2012-04-01 20:09:16 +02:00
Marc-André Lureau
261b692657 Disable menu items that would fail when there is no display 2012-04-01 20:09:16 +02:00
Marc-André Lureau
7ffd3d4f7e Display correct key bindings to release cursor
If the accels are enabled (with Spice controller custom bindings),
show the configured keybinding in the title bar.
2012-03-21 16:21:32 +01:00
Marc-André Lureau
cf8e5b029c spice: implement --fullscreen=auto-conf
- auto-conf is an optionnal argument to --fullscreen:
it will set the guest display configuration to match the client
display configuration, by sending the client monitors size and
position to capable guests.
2012-03-21 16:20:37 +01:00
Marc-André Lureau
4f142b1f16 Add a send-key menu in fullscreen 2012-03-08 14:19:46 +01:00
Hans de Goede
3123a1107c virt-viewer-window: Don't try to resize non visible windows
Trying to resize not visible windows leads to the following being printed
to the console:
Gdk-CRITICAL **: IA__gdk_window_get_origin: assertion `GDK_IS_WINDOW (window)'

This gets triggered by the gdk_screen_get_monitor_geometry() call in
virt_viewer_window_resize()

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-07 20:33:12 +01:00
Hans de Goede
5b7985b927 virt-viewer-window: Add show / hide utility functions
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-07 20:33:12 +01:00
Hans de Goede
81cdc24470 virt-viewer-window: Move checks before resize to virt_viewer_window_resize
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-07 20:33:12 +01:00
Hans de Goede
1b48cd0c0e virt-viewer-window: Remove useless tests for priv->window != NULL
priv->window gets set on init and never unset, so there is no need to check
for it.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-07 20:33:12 +01:00
Hans de Goede
50dd8c29ee virt-viewer-window: Add a USB device selection to the fullscreen menu (v2)
Note this button only gets shown on USB redir capable virtual machines.

Changes in v2:
-Use gtk_widget_set_visible for simpler code

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-06 12:55:30 +01:00
Hans de Goede
ec5eaecb42 window: Call virt_viewer_app_quit instead of gtk_main_quit
When quiting from the fullscreen menu call virt_viewer_app_quit instead of
gtk_main_quit so that the session gets properly disconnected before quiting.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-06 12:55:30 +01:00
Hans de Goede
963c7ebd65 virt-viewer-window: Use a borrowed reference to app
Before this patch there was a cyclic reference between VirtViewerApp and
VirtViewerWindow, since all VirtViewerWindows are created / destroyed by
VirtViewerApp it is safe to assume that lifetime of VirtViewerApp >=
VirtViewerWindow, so VirtViewerWindow can take a borrowed reference
breaking the circle, and allowing proper cleanup on exit.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-03-06 12:55:30 +01:00
Christophe Fergeau
f3ba403680 Don't attempt to translate ""
The empty string has a magic meaning for gettext, it's used to
store a translation header with all kind of information about the
po file. This is not something we want to use as a window title, so
change to _("") to "" when we want an empty string.
2012-03-05 20:03:41 +01:00
Marc-André Lureau
50b0c72392 Fix compilation with gtk 2.18 2012-03-01 15:15:51 +01:00
Marc-André Lureau
946a70762e Small code simplification 2012-02-22 16:45:02 +01:00
Marc-André Lureau
51ca18beee Use the accelgroup to define key bindings
With accelgroups, we can redefine the keybindings
2012-02-22 16:45:00 +01:00
Marc-André Lureau
e6dfd324c4 Add hidden menu smartcard remove/insert and release-cursor 2012-02-22 16:44:27 +01:00
Marc-André Lureau
23dc09eacb Do not disable accelgroup if accels are enabled 2012-02-22 16:43:49 +01:00
Daniel P. Berrange
b0ba9e626a Set transient parent for screenshot dialog 2012-02-08 19:37:09 +00:00
Marc-André Lureau
bbf040b777 Do not resize guest desktop if !auto-resize
If auto-resize is enabled, the guest desktop size will be resized to
match current window*zoom size.

This can be a problem if the user explicitely set the desktop size to
a different resolution and want to keep it. Disabling auto-resize
sounds like a simple way to allow that.
2012-02-08 17:15:20 +00:00
Daniel P. Berrange
e9ff27efe2 Ensure About dialog has transient hints setup 2012-02-08 17:15:16 +00:00
Daniel P. Berrange
a893d5ef61 Update copyright headers 2012-02-06 12:42:18 +00:00
Daniel P. Berrange
e1283a9a60 Convert TABS to spaces & reindent everywhere 2012-02-06 12:40:09 +00:00
Hans de Goede
c67a8cfdbe Only make the USB device selection sensitive when the vm is USB capable 2012-02-06 12:30:27 +00:00
Hans de Goede
b272e08541 Add a menu entry for USB device selection 2012-02-06 12:30:08 +00:00
Marc-André Lureau
80a3192603 Add a few property getters, used by controller
- virt_viewer_app_get_windows()
- virt_viewer_window_get_builder()
- "VirtViewerSessionSpice:spice-session" property
2012-01-30 17:42:11 +00:00