294 lines
11 KiB
Plaintext
294 lines
11 KiB
Plaintext
Core wayland protocol
|
|
|
|
- surface.set_grab_mode(GRAB_OWNER_EVENTS vs GRAB_SURFACE_EVENTS), to
|
|
make menus work right: click and drag in a menubar grabs the
|
|
pointer to the menubar (which we need for detecting motion into
|
|
another menu item), but we need events for the popup menu surface
|
|
as well.
|
|
|
|
- The message format has to include information about number of fds
|
|
in the message so we can skip a message correctly. Or we should
|
|
just give up on trying to recover from unknown messages.
|
|
|
|
- generate pointer_focus (and drag focus) on raise/lower, move
|
|
windows, all kinds of changes in surface stacking.
|
|
|
|
- glyph cache
|
|
|
|
buffer = drm.create_buffer(); /* buffer with stuff in it */
|
|
|
|
cache.upload(buffer, x, y, width, height, int hash)
|
|
|
|
drm.buffer: id, name, stride etc /* event to announce cache buffer */
|
|
|
|
cache.image: hash, buffer, x, y, stride /* event to announce
|
|
* location in cache */
|
|
|
|
cache.reject: hash /* no upload for you! */
|
|
|
|
cache.retire: buffer /* cache has stopped using buffer, please
|
|
* reupload whatever you had in that buffer */
|
|
|
|
|
|
- DnD issues:
|
|
|
|
Root window must send NULL type (to decline drop) or
|
|
x-wayland/root-something type if the source offers that. But the
|
|
target deletes the drag_offer object when drag.pointer_focus leaves
|
|
the surface...
|
|
|
|
How do we animate the drag icon back to the drag origin in case of
|
|
a failed drag?
|
|
|
|
How to handle surfaces from clients that don't know about dnd or
|
|
don't care? Maybe the dnd object should have a
|
|
dnd.register_surface() method so clients can opt-in the surfaces
|
|
that will participate in dnd. Or just assume client is not
|
|
participating until we receive an accept request.
|
|
|
|
- Selection/copy+paste
|
|
|
|
- Similar to dnd, create a selection object for a device to offer
|
|
selection data:
|
|
|
|
selection = shell.create(input_device)
|
|
|
|
Requests:
|
|
- selection.offer(type)
|
|
- selection.activate(time)
|
|
- selection.destroy()
|
|
|
|
Events:
|
|
- selection.finish(type, fd)
|
|
- selection.discard() /* somebody else took the selection */
|
|
|
|
- Notes: no window owner, which seems to be mostly there as a way
|
|
to identify the client and to allow None (instead of a release
|
|
request). Possibly also to make the selection go away
|
|
automatically when the window with the contents go away, or
|
|
possibly as a way for the source to distinguish between multiple
|
|
selections. Toolkits generally just create a dummy-toplevel for
|
|
selections though.
|
|
|
|
- Per-device selection. The selection is per device. Different
|
|
keyboards copy and paste to different selections.
|
|
|
|
- Selection offer object. Introduced just before a surface
|
|
receives keyboard_focus event or when somebody claims the
|
|
selection and on keyboard_focus? That way only keyboard_focus
|
|
owner will know the types... limits pasting to the
|
|
keyboard_focus surface.
|
|
|
|
Requests:
|
|
- selection_offer.receive(type, fd)
|
|
|
|
Events:
|
|
- selection_offer.offer(type)
|
|
- selection_offer.keyboard_focus()
|
|
|
|
- Pointer image issue:
|
|
|
|
- A touch input device doesn't have a pointer; indicate that
|
|
somehow.
|
|
|
|
- Cursor themes, tie in with glyph/image cache.
|
|
|
|
- copy-n-paste, store data in server (only one mime-type available)
|
|
or do X style (content mime-type negotiation, but data goes away
|
|
when client quits).
|
|
|
|
- Discard buffer, as in "wayland discarded your buffer, it's no
|
|
longer visible, you can stop updating it now.", reattach, as in "oh
|
|
hey, I'm about to show your buffer that I threw away, what was it
|
|
again?". for wayland system compositor vt switcing, for example,
|
|
to be able to throw away the surfaces in the session we're
|
|
switching away from. for minimized windows that we don't want live
|
|
thumb nails for. etc.
|
|
|
|
- Initial placement of surfaces. Guess we can do, 1)
|
|
surface-relative (menus), 2) pointer-relative (tooltips and
|
|
right-click menus) or 3) server-decides (all other top-levels).
|
|
|
|
- Per client id space. Each client has an entire 32 bit id namespace
|
|
to itself. On the server side, each struct wl_client has an object
|
|
hash table. Object announcements use a server id space and clients
|
|
must respond with subscribe request with a client id for the
|
|
object. Part of wl_proxy_create_for_id():
|
|
|
|
wl_display_subscribe(display, id, new_id, my_version);
|
|
|
|
or maybe
|
|
|
|
wl_display_bind(display, id, new_id, my_version);
|
|
|
|
Fixes a few things:
|
|
|
|
- Maps the global object into the client id space, lets client
|
|
allocate the id. All ids are allocated by the client this way,
|
|
which fixes the range protocol problem.
|
|
|
|
- Tells the server that the client is interested in events from
|
|
the object. Lets the server know that a client participates in a
|
|
certain protocol (like drag and drop), so the server can account
|
|
for whether or not the client is expected to reply
|
|
|
|
- Server emits initial object state event(s) in reponse to
|
|
receiving the subscribe request. Introduces an extra round trip
|
|
at initialization time, but the server will still announces all
|
|
objects in one burst and the client can subscribe in a burst as
|
|
well.
|
|
|
|
- Separates client resources, since each client will have it's own
|
|
hash table. It's not longer possible to guess the id of another
|
|
surface and access it.
|
|
|
|
- Server must track the client id for each client an object is
|
|
exposed to. In some cases we know this (a surface is always
|
|
only owned by one client), in other cases it provides a way to
|
|
track who's interested in the object events. For input device
|
|
events, we can look up the client name when it receives pointer
|
|
focus or keyboard focus and cache it in the device.
|
|
|
|
- Server must know which id to send when passing object references
|
|
in events. We could say that any object we're passing to a
|
|
client must have a server id, and each client has a server id ->
|
|
client id hash.
|
|
|
|
- When a surface is the size of the screen and on top, we can set the
|
|
scanout buffer to that surface directly. Like compiz unredirect
|
|
top-level window feature. Except it won't have any protocol state
|
|
side-effects and the client that owns the surface won't know. We
|
|
lose control of updates. Should work well for X server root window
|
|
under wayland. Should be possible for yuv overlays as well.
|
|
|
|
- what about cursors then? maybe use hw cursors if the cursor
|
|
satisfies hw limitations (64x64, only one cursor), switch to
|
|
composited cursors if not.
|
|
|
|
- clients needs to allocate the surface to be suitable for
|
|
scanout, which they can do whenever they go fullscreen.
|
|
|
|
- multihead, screen geometry and crtc layout protocol, hotplug, lcd
|
|
subpixel info
|
|
|
|
- a wayland settings protocol to tell clients about themes (icons,
|
|
cursors, widget themes), fonts details (family, hinting
|
|
preferences) etc. Just send all settings at connect time, send
|
|
updates when a setting change. Getting a little close to gconf
|
|
here, but could be pretty simple:
|
|
|
|
interface "settings":
|
|
event int_value(string name, int value)
|
|
event string_value(string name, string value)
|
|
|
|
but maybe it's better to just require that clients get that from
|
|
somewhere else (gconf/dbus).
|
|
|
|
- input device discovery, hotplug
|
|
|
|
- Advertise axes as part of the discovery, use something like
|
|
"org.wayland.input.x" to identify the axes.
|
|
|
|
- keyboard state, layout events at connect time and when it
|
|
changes, keyboard leds
|
|
|
|
- relative events
|
|
|
|
- multi touch?
|
|
|
|
- synaptics, 3-button emulation, scim
|
|
|
|
- auth; We need to generate a random socket name and advertise that
|
|
on dbus along with a connection cookie. Something like a method
|
|
that returns the socket name and a connection cookie. The
|
|
connection cookie is just another random string that the client
|
|
must pass to the wayland server to become authenticated. The
|
|
Wayland server generates the cookie on demand when the dbus method
|
|
is called and expires it after 5s or so.
|
|
|
|
- or just pass the fd over dbus
|
|
|
|
- drm bo access control, authentication, flink_to
|
|
|
|
- Range protocol may not be sufficient... if a server cycles through
|
|
2^32 object IDs we don't have a way to handle wrapping. And since
|
|
we hand out a range of 256 IDs to each new clients, we're just
|
|
talking about 2^24 clients. That's 31 years with a new client
|
|
every minute... Maybe just use bigger ranges, then it's feasible
|
|
to track and garbage collect them when a client dies.
|
|
|
|
- Add protocol to let applications specify the effective/logical
|
|
surface rectangle, that is, the edge of the window, ignoring drop
|
|
shadows and other padding. The compositor needs this for snapping
|
|
and constraining window motion. Also, maybe communicate the opaque
|
|
region of the window (or just a conservative, simple estimate), to
|
|
let the compositor reduce overdraw.
|
|
|
|
- multi gpu, needs queue and seqno to wait on in requests
|
|
|
|
Clients and ports
|
|
|
|
- port gtk+
|
|
|
|
- draw window decorations in gtkwindow.c
|
|
|
|
- Details about pointer grabs. wayland doesn't have active grabs,
|
|
menus will behave subtly different. Under X, clicking a menu
|
|
open grabs the pointer and clicking outside the window pops down
|
|
the menu and swallows the click. without active grabs we can't
|
|
swallow the click. I'm sure there much more...
|
|
|
|
- Port Qt? There's already talk about this on the list.
|
|
|
|
- X on Wayland
|
|
|
|
- move most of the code from xf86-video-intel into a Xorg wayland
|
|
module.
|
|
|
|
- don't ask KMS for available output and modes, use the info from
|
|
the wayland server. then stop mooching off of drmmode.c.
|
|
|
|
- map multiple wayland input devices to MPX in Xorg.
|
|
|
|
- rootless; avoid allocating and setting the front buffer, draw
|
|
window decorations in the X server (!), how to map input?
|
|
|
|
- gnome-shell as a wayland session compositor
|
|
|
|
- runs as a client of the wayland session compositor, uses
|
|
clutter+egl on wayland
|
|
|
|
- talks to an Xorg server as the compositing and window manager
|
|
for that server and renders the output to a wayland surface.
|
|
the Xorg server should be modified to take input from the system
|
|
compositor through gnome-shell, but not allocate a front buffer.
|
|
|
|
- make gnome-shell itself a nested wayland server and allow native
|
|
wayland clients to connect and can native wayland windows with
|
|
the windows from the X server.
|
|
|
|
- qemu as a wayland client; session surface as X case
|
|
|
|
- qemu has too simple acceleration, so a Wayland backend like the
|
|
SDL/VNC ones it has now is trivial.
|
|
|
|
- paravirt: forward wayland screen info as mmio, expose gem ioctls as mmio
|
|
|
|
- mapping vmem is tricky, should try to only use ioctl (pwrite+pread)
|
|
|
|
- not useful for Windows without a windows paravirt driver.
|
|
|
|
- two approaches: 1) do a toplevel qemu window, or 2) expose a
|
|
wayland server in the guest that forwards to the host wayland
|
|
server, ie a "remote" compositor, but with the gem buffers
|
|
shared. could do a wl_connection directly on mmio memory, with
|
|
head and tail pointers. use an alloc_head register to indicate
|
|
desired data to write, if it overwrites tail, block guest. just
|
|
a socket would be easier.
|
|
|
|
- moblin as a wayland compositor
|
|
|
|
- clutter as a wayland compositors
|
|
|
|
- argh, mutter
|