Hey all,

this series introduces very basic seamless (aka unity aka coherence, ...) mode
support for spice-gtk and both Windows and Linux vdagent.
Many other rival companies have already added this feature to their products,
therefore it might be the right time to cover it too...

Agent sends list of visible areas/change in visible area whenever a window
is created, moved or closed/hidden. The client then masks out the areas
that shoud not be visible accordingly.

The spice-gtk and  linux agent implementation is heavily based on older work
from Ondřej Holý and Lukáš Venhoda, so big shout-out for them.
I merged the initial commits in spice-gtk and fixed some minor issues.
You can have a look at the original version here, if you wish to,
on branch "seamless-mode":

spice-protocol: git://people.freedesktop.org/~lvenhoda/spice-protocol
spice-gtk:      git://people.freedesktop.org/~lvenhoda/spice-gtk
linux vdagent:  git://people.freedesktop.org/~lvenhoda/vd_agent

Further progress can be tracked on my Github,
again branch "seamless-mode" (might not be always stable):

spice-protocol: https://github.com/jjanku/spice-protocol.git
spice-gtk:      https://github.com/jjanku/spice-gtk.git
linux vdagent:  https://github.com/jjanku/linux-vd_agent.git
win32 vdagent:  https://github.com/jjanku/win32-vd_agent.git

If everything goes well, you should hopefully see output similar to this:
(windows leaving traces have been fixed since then)

Has been tested on:
Fedora 25 with Gnome, Win7, Win8.1, Win10; all with basic preinstalled programs
(there seem to be some extra windows that pass the filter on Win8.1,
 other versions should work just fine)

spice-gtk: commit ba87ba2: removes drawing function that was in the original
implementation and I found it redundant, it works fine without it for me.
If you have any problems with transparency, delete this commit and
give it another try, otherwise it shall be merged with the initial commit.

- window integration could be better (currently one window that stays on top),
  maybe create some dummy windows that would control the actual windows on
  remote system? not sure really, any ideas?
- multi monitor/workspace support
- launching programs: currently no way for linux, Start menu on Windows
- drag & drop (started some research for Win, see below if you're interested)
- clicking through: gdk_window_input_shape_combine_region() is not supported
  on Win, gdk_window_shape_combine_region() might do the trick
  (as it does on some linux systems), not tested though
- Wayland support?
- windows in Gnome have no border/shadow, they blend into the background,
  maybe we should draw shadows/borders for them in spice-gtk? (low priority)
- Windows: switch to in-context event hooks? (low priority)

- any suggestions are welcomed :) The points above should be discussed.

Related: https://www.spice-space.org/page/Features/RootlessWindows

J. Janků

DRAG & DROP for Win:
Quick search has revealed three potential solutions so far
(I haven't tested any of them):

- seems simple and straightforward, but outdated and not very well supported,
  probably not the way to go

[2] Register IDropSource and simulate mouse movement
+ no hassle with finding the correct window user wanted to drop files into
- might result in poor user experience because of the mouse simulation
- DoDragDrop() blocks calling thread until the drop is finished

[3] Find the window for drag&drop ourselves,
    inject a DLL into the process that owns the given window,
    get IDropTarget and call Drop()
+ completely in background
- need to find the correct window

Has anyone tried something like that? Any help/suggestions would be appreciated.

Spice-devel mailing list

Reply via email to