Core wayland protocol

 - scanner: wl_* prefix removal: split it out into a namespace part so
   we can call variables "surface" instead of "wl_surface"?

 - Framebased input event delivery.

 - Protocol for arbitrating access to scanout buffers (physically
   contiguous memory).  When a client goes fullscreen (or ideally as
   the compositor starts the animation that will make it fullscreen)
   we send a "give up your scanout buffer" to the current fullscreen
   client (if any) and when the client acks that we send a "try to
   allocate a scanout buffer now" event to the fullscreen-to-be
   client.

 - Next steps based on EGL_WL_bind_display: create EGLImageKHR from
   shm buffers? async auth in the implementation of the extension?

 - wayland-egl: lazy-copy-back swapbuffer, sub-window.

 - configure should provide dx_left, dx_right, dy_top, dy_bottom, or
   dx, dy, width and height.

 - 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.

 - glyph cache

    - Needs a mechanism to pass buffers to client.

      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:

    - Drag should not be tied to a source surface, just the client.
      the grab will break if the surface goes away, but the wl_drag
      struct doesn't need to hold on to the source surface.

    - 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?  Client should set drag icon separately,
      compositor can do it then.

    - 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.

 - A "please suspend" event from the compositor, to indicate to an
   application that it's no longer visible/active.  Or maybe 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.

 - Event when a surface moves from one output to another.

 - 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

 - multi gpu, needs queue and seqno to wait on in requests

Destkop/EWMH type protocol

 - 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.

 - Protocol for specifying title bar rectangle (for moving
   unresponsive apps) and a rectangle for the close button (for
   detecting ignored close clicks).

libxkbcommon

  - pull in actions logic from xserver

  - pull in keycode to keysym logic from libX11

  - expose alloc functions in libxkbcommon, drop xserver funcs?

  - pull the logic to write the xkb file from xkb_desc and names into
    libxkbcommon and just build up the new xkb_desc instead of
    dump+parse? (XkbWriteXKBKeymapForNames followed by
    xkb_compile_keymap_from_string in XkbDDXLoadKeymapByNames)

  - pull in keysym defs as XKB_KEY_BackSpace

  - figure out what other X headers we can get rid of, make it not
    need X at all (except when we gen the keysyms).

  - Sort out namespace pollution (XkbFoo macros, atom funcs etc).

  - Sort out 32 bit vmods and serialization


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...

    - dnd, copy-paste

 - Investigate DirectFB on Wayland (or is that Wayland on DirectFB?)

 - SDL port, bnf has work in progress here:
   http://cgit.freedesktop.org/~bnf/sdl-wayland/

 - libva + eglimage + kms integration


Ideas

 - 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).


Crazy ideas

 - AF_WAYLAND - A new socket type.  Eliminate compositor context
   switch by making kernel understand enough of wayland that it can
   forward input events as wayland events and do page flipping in
   response to surface_attach requests:

    - ioctl(wayland_fd, "surface_attach to object 5 should do a kms page
			 flip on ctrc 2");

    - what about multiple crtcs? what about frame event for other
      clients?

    - forward these input devices to the client

    - "scancode 124 pressed or released with scan codes 18,22 and 30
       held down gives control back to userspace wayland.

    - what about maintaining cursor position? what about pointer
      acceleration?  maybe this only works in "client cursor mode",
      where wayland hides the cursor and only sends relative events?
      Solves the composited cursor problem.  How does X show its
      cursor then?

    - Probably not worth it.
