Commit Graph

4808 Commits

Author SHA1 Message Date
Hans de Goede
023d9c0d91 Release 0.6.3 2010-10-18 14:52:43 +02:00
Hans de Goede
df6df8e587 Make the gui use Application::hide_gui rather then hide_me
Now that Application::hide_me actually does what the name suggests
(hide the entire client, ie all client windows), the gui using it to
not show the gui layer leads to the entire client disappearing when
one presses close in the GUI or dismisses a GUI dialog. This patch makes
the GUI code call hide_gui instead of hide_me, fixing this.
2010-10-18 14:43:06 +02:00
Hans de Goede
bbc079955a Bump version to 0.6.2 2010-10-18 11:22:19 +02:00
Hans de Goede
cef69ac424 Update NEWS for 0.6.2 release 2010-10-18 11:18:48 +02:00
Hans de Goede
d08b8120d6 spicec-x11: Fix window management under KDE
There were 2 issues with window management under KDE
1) When an app does its own focus management like we do, kwin expects
   an explicit raise for the app to get to the top, so we did have focus,
   but would have other windows (partially) covering the client window
   -> do a raise after setting focus to ourselves
2) When switching from fullscreen <-> window, we unmap and remap our
   window, then set focus to ourselves. kwin thinks this means we're trying
   to steal the focus without the user asking for it. This patch makes us
   set the _NET_WM_USER_TIME property on our window, this helps kwin's
   focus stealing code to see that we are really not stealing the focus,
   just responding to a user event.
2010-10-18 10:40:51 +02:00
Hans de Goede
421ddb7422 client: change monitor mode setting <-> fullscreen window mode setting order
1) Make the order when starting up in fullscreen mode the same as when
   switching from window -> fullscreen:
   First set the mode, then make the window fullscreen
2) Change the order when leaving fullscreen mode, first restore the original
   monitor mode, then make the window non fullscreen. Changing the monitor
   mode in X11 causes the window manager to re-arrange windows, and if this
   happens while compiz is busy mapping the window it gets confused and
   maps the window with a maxmimized size.
2010-10-18 10:40:51 +02:00
Hans de Goede
0b07ca2775 spicec-x11: Change WmSizeHints in fullscreen mode
Some window managers will ignore the fullscreen hint, unless WmSizeHints
allow them to resize the window so that they can give it the size of
the roo-window. This fixes fullscreen mode in compiz.
2010-10-18 10:40:51 +02:00
Hans de Goede
203a39761f spicec-x11: Add missing XLockDisplay around XRRSet* calls
XRRSet* calls wait for a XReply, so add a missing XLockDisplay,
this fixes a hang (due to a race so not always) when switching between
windowed and fullscreen mode.
2010-10-18 10:40:51 +02:00
Hans de Goede
607d58f4eb client: Do not try to send display_config until we've received the agent caps
Currenty, we check the agent caps in RedClient::handle_agent_connected
for VD_AGENT_CAP_DISPLAY_CONFIG and if present send display_config, but at
this time we have not received the caps yet, so remove this.

Also the send_agent_display_config call in on_agent_announce_capabilities
lacks a check for _agent_disp_config_sent, and we send the display config
before announcing that we may do so by sending our own caps, which seems
inpolite.
2010-10-18 10:40:51 +02:00
Arnon Gilboa
4d0e6e525c spicec: add controller
Spice client controller enables external control (e.g., by XPI or ActiveX) of
the client functionality.

The controller protocol enables setting parameters (host, port, sport, pwd,
secure channels, disabled channels, title, menus, hotkeys etc.), connecting
the server, showing and hiding the client etc.

The controller is based on the cross-platform named pipe.
2010-10-18 10:17:28 +02:00
Arnon Gilboa
20c550d278 spicec: add foreign menu
Spice foreign menu enables external control of the client menu.

The foreignmenu protocol enables an external application to:
add a submenu, set its title, clear it, add/modify/remove an item etc.

Foreign menu is based on the cross-platform named pipe.
2010-10-18 10:03:46 +02:00
Arnon Gilboa
e789c8b9aa spicec-win: move named_pipe defines 2010-10-17 17:03:37 +02:00
Arnon Gilboa
b04bf7f9b0 spicec-win: fix menu id push to free_sys_menu_id 2010-10-17 17:03:33 +02:00
Arnon Gilboa
1d08cc1458 spicec: enable multiple CmdLineParser instantiations
Used by controller. One instance at a time, not thread-safe.
Add basename() for win32.
2010-10-17 17:02:49 +02:00
Arnon Gilboa
e8d4757451 spicec: name host param 2010-10-17 11:46:37 +02:00
Arnon Gilboa
5808a99052 spicec: add ProcessLoop::on_start_running() 2010-10-17 11:45:50 +02:00
Arnon Gilboa
e50c565b44 spicec: extract RedScreen::update_menu() 2010-10-17 11:45:13 +02:00
Arnon Gilboa
793dd31cad spicec: add menu id & find_sub() 2010-10-17 11:44:13 +02:00
Hans de Goede
21f586762f server: remove useless agent send_tokens
We are keeping track of tokens for sending agent data to the client, but
the client send an initial value of ~0, and never gives us new send tokens
so this is all rather useless -> remove it.

Note that it is kept in the migration data struct for compatibility reasons.
2010-10-16 15:46:50 +02:00
Hans de Goede
0b2336cd9c Call read_from_vdi_port() from vdi_read_buf_release()
read_from_vdi_port(), called from vdagent_char_device_wakeup() may
fail to consume all data because no buffers are available in the
read_bufs ring. When this happens we would fail to ever read more data
from the agent on the guest as the port is throttled and stays throttled
until we've consumed all data from the current buffer.

This patch re-enables the call to read_from_vdi_port() from
vdi_read_buf_release(), so that we will try the read again when space
becomes available in the read_bufs ring.

Together with another nasty hack in the linux guest virtio_console
driver, where it waits for a write to be acked by the host before
continuing with the next one, this can lead to a linux guest
getting stuck / hang (until the write is read by the spice-server
which never happens becaus of the above issues).

Note that even with this patch, the guest will still gets stuck due to
a bug in watch_update_mask in spice-core in qemu, which causes writing
to the client to never resume once it blocked. A patch for this has been
submitted to qemu.
2010-10-15 10:22:37 +02:00
Hans de Goede
a52324525d server: always call read_from_vdi_port() in a while loop
read_from_vdi_port() MUST always be called in a while loop until it returns 0.

This is needed because it can cause new data available events and its
recursion protection causes those to get lost. Calling it until it returns 0
ensures that all data has been consumed.

Example scenario where we can fail to read the available data otherwise:
- server/reds.c: vdagent_char_device_wakeup get called
  by hw/spice-vmc.c because data has arrived from the guest,
- hw/spice-vmc.c: vmc_read get calls
- If the vmc_read call depletes the current buffer it calls
  virtio_serial_throttle_port(&svc->port, false)
- This causes vmc_have_data to get called, which if in the
  mean time another buffer has arrived causes
  vdagent_char_device_wakeup to gets called again
  (so recursively)
- vdagent_char_device_wakeup is protected against recursive
  calling and ignores the second call (a nasty hack)
- if no other data arrives, the arrived data will not get read
2010-10-15 10:22:37 +02:00
Hans de Goede
d37adccfa7 Don't crash when a client disconnects while there were pending writes 2010-10-15 10:22:37 +02:00
Hans de Goede
f78ad47407 spicec-x11: add support for image copy and paste 2010-10-15 10:22:37 +02:00
Alexander Larsson
da35f9acd6 Replace epoll with select in X client
The use of epoll in the client is totally overkill in terms of
scalability, and its a problem for portability. The OSX port converts
this to use select, but keeps some of the old complexities in the code.
This new patch makes it simpler and look much more like the windows
code.
2010-10-12 13:43:44 +02:00
Gerd Hoffmann
97f33fa86a server: add channel notifications.
This patch adds a channel event callback to the spice core interface.
This new callback will be called for three events:

  (1) A new connection has been established.
  (2) The channel is ready (i.e. authentication is done,
      link message verification passed all tests, channel
      is ready to use).
  (3) Channel was disconnected.

Qemu will use this to send notifications to the management app.
2010-10-12 11:11:26 +02:00
Hans de Goede
f8c6e1c42a spicec-x11: Put locks around xlib calls which wait for a reply
Since libX11-1.3.4 the multi-threading handling code of libX11 has been
changed, see:
http://cgit.freedesktop.org/xorg/lib/libX11/commit/?id=933aee1d5c53b0cc7d608011a29188b594c8d70b

This causes several issues. One of them is the display inside the
client not getting updated when there are no XEvents being generated,
this is caused by the following part of the referenced commit message:

Caveats:
- If one thread is waiting for events and another thread tries to read a reply,
  both will hang until an event arrives. Previously, if this happened it might
  work sometimes, but otherwise would trigger either an assertion failure or
  a permanent hang.

We were depending on the otherwise behavior and apparently were lucky.
This can be seen by starting F14 in runlevel 3 and then doing startx
and not touching the mouse / keyb afterwards. Once you move the mouse
(generate an event you see the UI contents being updated but not before.

Another thing both I and Alon (iirc) have seen are hangs where 2
threads are stuck in XSync waiting for a reply simultaneously. This might
be related to libxcb version, according to the libX11 commit a libxcb
newer then 1.6 was needed, and my system had 1.5 at the time I saw this
after updating to libxcb 1.7 I can no longer reproduce.

This patch tackles both problems (and is needed for the 1st one
indepently of the 2nd one possibly being fixed) by adding XLockDisplay
calls around all libX11 calls which wait for a reply or an event.
2010-10-11 22:36:42 +02:00
Arnon Gilboa
57cea3235f spice-win: handle multiple types on clipboard grab send & receive 2010-10-11 17:29:46 +02:00
Arnon Gilboa
1148edfea4 spice-win: remove clipboard_changer hack
Instead of keeping a flag, we simply check wether the new owner is us or not
2010-10-11 17:29:44 +02:00
Arnon Gilboa
f2ef521740 spice-win: handle type VD_AGENT_CLIPBOARD_NONE in Platform::on_clipboard_notify() 2010-10-11 17:29:43 +02:00
Arnon Gilboa
26814c4f9c spice-win: remove windows-specific bitmap cut & paste support
will wait until png comes in
2010-10-11 17:29:00 +02:00
Hans de Goede
3a4051d7ce spicec: Do not try to do accounting of pci memory
Without this patch spicec reproducely hangs in
GlzDecoderWindow::pre_decode_update_window().

When GlzDecoderWindow::will_overflow() returns true,
GlzDecoderWindow::pre_decode_update_window(),
waits for a call to GlzDecoderWindow::post_decode()
to free up some memory

This happens even though there still is pci memory
available (otherwise the driver would not have
been able to send an image to decode in the first
place).

The GlzDecoderWindow::post_decode() call never happens
as the server is waiting for a reply to the decode
of the hanging image, causing the client to hang
for ever.

This patch fixes this by simply removing the
"attempted" pci memory accounting. As there is no
need for that, as the driver already must keep
track of pci memory usage.

I've verified that both the old and new Xorg drivers
take care of not overusing the pci memory themselves
I would expect the same to be true for the windows
driver.

Note the calculating of the glz_window_size in
red_client.cpp cannot be removed as the calculated
value is send as part of the SpiceMsgcDisplayInit on
connect.
2010-10-09 22:27:53 +02:00
Hans de Goede
1e34c14c64 spicec: only send display-config if the agent can handle it 2010-10-06 20:13:01 +02:00
Hans de Goede
ab8bac36bd spicec-x11: Drop annoying useless warning
Every time an events comes past where the Window is None (which happens
about once every 5 minutes or so), this annoying "invalid window" message
gets printed. Remove it!
2010-10-06 19:52:49 +02:00
Hans de Goede
9b00e93efb spicec: don't send agent messages directly from ClipboardListener callbacks
ClipboardListener callbacks can run from another thread then the
main channel loop thread, where agent messages are normally dispatched from.

So they may not send agent messages directly, instead they should post
events to the main channel loop.
2010-10-06 19:17:08 +02:00
Hans de Goede
dddb6ad48a spicec-x11: Remove a race window in selection ownership release code
Well almost remove it, it was possible that another x11 app would acquire
selection ownership, and we would receive a release message from the
agent before having processed the xselection ownership change event.

Then we would set the selection owner to none, overriding the new owner.
As the comment in the patch indicates there still is a minute window left
where something similar can happen after this patch. Nothing we can do
about that (I blame the libX11 selection API).
2010-10-06 19:17:08 +02:00
Hans de Goede
7b84db7a74 spicec: Move setting of clipboard_owner to guest to platform code
Atleast under x11 there is a race condition when setting the clipboard
owner to guest from the RedClient code rather then doing it in Platform.

After the XSetSelectionOwner() in Platform::on_clipboard_grab(), which runs
from the main message loop thread, the x11 event thread can receive a
SelectionRequest event from another x11 app, before the RedClient code
has set the clipboard owner, which will trigger the owner != guest
check in the SelectionRequest event handling code.

By moving the setting of the owner in to Platform::on_clipboard_grab() it
gets protected by the clipboard lock, which closes this tiny race.
2010-10-06 19:17:08 +02:00
Hans de Goede
34bfaa302d spicec-x11: make get_clipboard_type handle the None Atom 2010-10-04 14:41:23 +02:00
Hans de Goede
b74f21ce66 spicec-x11: protect against recursive incr properties 2010-10-04 14:41:23 +02:00
Hans de Goede
ca3d290294 spicec-x11: If the clipboard was large return the memory to the system 2010-10-04 14:41:23 +02:00
Hans de Goede
ff434c288f spicec-x11: use malloc / free / realloc for clipboard data
As we need a realloc function it is better to use malloc / free /
realloc then to diy, esp. as realloc can grow the buffer without
needing a memcpy.
2010-10-04 14:41:23 +02:00
Hans de Goede
348e62bd88 spicec-x11: Use a queue for XSelectionRequest events
XSelectionRequest events must be answered in the order they were
received. But for TARGETS request we can answer directly, where as
other requests need to go through the agent. This causes us to handle
things out of order, and this can cause us to have more then one
requets outstanding with the agent, which is also not what we want.

So this patch introduces a queue for XSelectionRequest events, causing
us to handle them 1 at a time and always in order.
2010-10-04 14:41:23 +02:00
Hans de Goede
252ded1063 spicec-x11: handle multiple types per grab
And also handle many x11 targets (ie utf8 variants) to a single agent
type mapping.
2010-10-04 11:49:58 +02:00
Hans de Goede
57bfa782d8 spicec-x11: Add XFlush calls were needed
Since we do not always "pump" libX11's event loop by calling
XPending (we only call XPending when there is data to read from the
display fd), we must always explictly flush any outstanding requests.

This patch adds a whole bunch of missing XFlush calls.
2010-10-04 11:49:14 +02:00
Hans de Goede
aabca2864d spicec-x11: Force processing of ownerchange event when releasing the cb
Make sure we process the XFixesSetSelectionOwnerNotify event caused by
us setting the clipboard owner to none, directly after setting the owner
to none. Otherwise we may end up changing the clipboard owner to none, after
it has already been re-owned because the XFixesSetSelectionOwnerNotify event
to owner none is event is still pending when we set the new owner, and
then changes the owner back to none once processed messing up our clipboard
ownership state tracking.

I saw this happening when doing copy twice in succession inside the guest.
2010-10-04 11:49:14 +02:00
Hans de Goede
a2492d5ae3 spicec-x11: Request targets from new clipboard owner
Request targets from new clipboard owner, rather then assuming UTF-8
(not entirely complete yet, the last pieces will be in another patch).

Atleast as important this code unifies the selection getting code
for incr and non incr getting of selection data so that it can be
used for both getting regular selection data and for getting targets
selection data.

This also fixes a big bug in the (I believe untested sofar) incr support
code which was interpreting the contents of PropertyNotify events as
XSelectionEvents rather then as XpropertyEvents which are completely
differen structs!
2010-10-04 11:49:10 +02:00
Hans de Goede
a3bf9d331d spicec-x11: remove clipboard_changer hack
Instead of keeping a flag, we can and should simply check wether the
new owner reported in the event it us or not. Also check for the
new owner being none and send a clipboard_release when that is the
case (through set_clipboard_owner(owner_none)).
2010-10-03 10:56:20 +02:00
Hans de Goede
8a160078d0 Keep track of clipboard ownership
Given that all clipboard handling is async, it is possible to for
example receive a request for clipboard data from the agent
while the client no longer owns the clipboard (ie a
VD_AGENT_CLIPBOARD_RELEASE message is in transit to the agent).

Thus it is necessary to keep track of our notion of clipboard ownership
and check received clipboard messages (both from other apps on the client
machine and from the agent) to see if they match our notion and if not
drop, or in case were a counter message is expected nack the clipboard
message.
2010-10-02 16:29:36 +02:00
Hans de Goede
deb849dfd5 Rename platform clipboard handling functions
Rename the 4 platform clipboard functions which get called
upon receival of an agent clipboard message to on_clipboard_*

The old set_clipboard_* names were confusing as they suggest being
a class property setter (like set_event_listener) rather then
event handler, and set_clipboard_owner was causing a name conflict
with the next patch in this series.
2010-10-02 15:32:48 +02:00
Hans de Goede
5781c97a17 Move checking for on demand clipboard cap closer to sending of agent messages
This way the events will always get generated and other things
(such as clipboard ownership administration, see the next patches)
can be done in repsonse to the events, even though no message will be send.

This patch also removes the !_agent_caps check from the capability
checks, this is not needed as VD_AGENT_HAS_CAPABILITY checks _agent_caps_size
which will be 0 when _agent_caps is NULL.
2010-10-02 15:32:28 +02:00
Hans de Goede
bc9f00961f Respond to clipb request with an unsupported type with data with a none type
Currently we send a VD_AGENT_CLIPBOARD_RELEASE when we receive a
VD_AGENT_CLIPBOARD_REQUEST with a type which we do not support. This is not
correct, as this means given up clipboard ownership while we may be able
to answer requests with different types. The correct response is to
nack the request by sending a VD_AGENT_CLIPBOARD (data) message with a type
of VD_AGENT_CLIPBOARD_NONE.
2010-10-01 20:14:16 +02:00