| 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. We need |
| to make sure you never get a message from an interface you don't |
| know about (using per-client id space and subscribe) or include |
| information on number of fds, so marshalling logic can skip. |
| |
| - 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 issues: is it sufficient to only introduce the |
| selection offer when a client receives kb focus? Or maybe it is |
| actually a security feature? Clipboard manager in server for |
| retained selections? |
| |
| - Pointer image issue: |
| |
| - A direct touch input device (eg touch screen) doesn't have a |
| pointer; indicate that somehow. |
| |
| - Cursor themes, tie in with glyph/image cache. |
| |
| - 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. |
| |
| - Import relevants bits from EWMH spec, stuff like window title, |
| window class, app groups, icons, lower window, need attention, |
| fullscreen (maybe different types of fullscreen). |
| |
| - 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 |
| |
| - 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 |