diff --git a/TODO b/TODO index bfc9c53c..278caa7f 100644 --- a/TODO +++ b/TODO @@ -1,21 +1,86 @@ - - how does clients move their surfaces? set a full tri-mesh every - time? probably just go back to x and y position, let the compositor - do the fancy stuff. How does the server apply transformations to a - surface behind the clients back? (wobbly, minimize, zoom) Maybe - wobble is client side? +Core wayland protocol + - implement glyph cache and dnd - - when a surface is the size of the screen and on top, we can set the + - dnd, figure out large object transfer: through wayland protocol or + pass an fd through the compositor to the other client and let them + sort it out? + + - 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). + + - protocol for setting the cursor image + + - should we have a mechanism to attach surface to cursor for + guaranteed non-laggy drag? + + - drawing cursors, moving them, cursor themes, attaching surfaces + to cursors. How do you change cursors when you mouse over a + text field if you don't have subwindows? This is what we do: a + client can set a cursor for a surface and wayland will set that + on enter and revert to default on leave + + - 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. + + - Move/resize protocols? In the style of the dnd protocol, if a + surface has grabbed an input, it can request a resize (top/bottom | + left/right) or a move. Goes on for duration of grab or until + surface cancels. Surface gets resize(w,h) during resize events and + must reallocate buffer and redraw. + + - Initial surface placement issue. + + - Consolidate drm buffer upload with a create_buffer request, returns + buffer object we can use in surface.attach, cache.upload and + input.attach? Will increase object id usage significantly, each + buffer swap allocates and throws away a new id. Does consolidate + the details of a buffer very nicely though. + + compositor.create_buffer(new_id, visual, name, stride, width, height) + + surface.attach(buffer) + + cache.upload(buffer, x, y, width, height) + + input.set_cursor(buffer, hotspot_x, hotspot_y) + + Doesn't increase id usage too much, can keep buffers around. + + - Move/resize protocol in the style of the dnd protocol: a surface + who has a grabbed device can send a request to initiate a + resize(top/bottom+rigth/left) or a move. The compositor will then + resize or move the window and take into account windows, panels and + screen edges and constrain and snap the motion accordingly. As the + cursor moves, the compositor sends resize or move (maybe not move + events?) events to the app, which responds by attaching a new + surface at the new size (optionally, reducing the allocated space + to satisfy aspect ratio or resize increments). + + - 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). + + - 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. + 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 - input device discovery, hotplug @@ -24,45 +89,55 @@ "org.wayland.input.x" to identify the axes. - keyboard state, layout events at connect time and when it - changes + changes, keyboard leds - relative events - - input handling - keyboard focus, multiple input devices, - multiple pointers, multi touch. + - multi touch? - - wayland-system-compositor + - sparse/gcc plugin based idl compiler - - device kit/libudev/console kit integration to discover seats, - that is, groups of input devices and outputs that provide a - means for one user to interact with the system. That is, - typically a mouse, keyboard and a screen. The input devices - will just be evdev devices, the outputs will be a drm device - filename and the specific outputs accessible throught that drm - device. + - crack? - - send drm device in connection info, probably just udev path. + - xml based description instead? - - cairo-drm; wayland needs cairo-drm one way or another: + - actually make batch/commit batch up commands - - chris wilson (ickle) is doing cairo-drm for i915 now, basically - the pixman-drm idean, but inside cairo instead. + - 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. - - pixman-drm; move the ddx driver batchbuffer logic into libdrm - and write native, direct rendering acceleration code in - pixman-drm. is a clean approach in that we avoid the mess of - the global GL context leaking through to applications, and we - can bootstrap this project by pulling in the EXA hooks from the - DDX drivers. + - or just pass the fd over dbus - - use open gl behind the scenes a la glitz. + - drm bo access control, authentication, flink_to - - should be possible to provide a realistic api and then stub out - the implementation with pwrite and pread so gtk+ port can proceed. + - 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 + + - synaptics, 3-button emulation, scim + + - what to do when protocol out buffer fills up? Just block on write + would work I guess. Clients are supposed to throttle using the + bread crumb events, so we shouldn't get into this situation. - - XKB like client side library for translating keyboard events to - more useful keycodes and modifiers etc. Will probably be shared - between toolkits as a low-level library. +Clients and ports - port gtk+ @@ -131,66 +206,3 @@ - clutter as a wayland compositors - argh, mutter - - - make libwayland-client less ghetto - - - sparse based idl compiler - - - crack? - - - xml based description instead? - - - actually make batch/commit batch up commands - - - protocol for setting the cursor image - - - should we have a mechanism to attach surface to cursor for - guaranteed non-laggy drag? - - - drawing cursors, moving them, cursor themes, attaching surfaces - to cursors. How do you change cursors when you mouse over a - text field if you don't have subwindows? This is what we do: a - client can set a cursor for a surface and wayland will set that - on enter and revert to default on leave - - - server should be able to discard surfaces, and send a re-render - event to clients to get them to render and provide the surface - 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. - - - 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. - - - multi gpu, needs queue and seqno to wait on in requests - - - opaque region, window rect - - - save and restore state on crash, clients reconnect, re-render - buffers - - - how do apps share the glyph cache? what is the glyph cache, how - does it work? pixbuf cache? - - - synaptics, 3-button emulation, scim - - - what to do when protocol out buffer fills up? Just block on write - would work I guess. Clients are supposed to throttle using the - bread crumb events, so we shouldn't get into this situation.