This file lists TODO items for the compositing code.

See file COMPOSITE_HOWTO for setting up kwin_composite.
See file HACKING for details on developing KWin, including building
    the kwin_composite branch.
See effects/howto.* for a HOWTO on writting effects.
See documentation in source (mainly in scene.cpp) for description
    of the design of the compositing framework.

TODO
=================================

* = not done, will be either done by me, or should be at least discussed first with me
+ = not done, I don't plan on doing it that soon
    - in other words, these should be the best ones for you if you want to help
! = like +, but they should be relatively simple
    - in other words, these should be the best if you want to get started with the code
/ = work in progress
? = should it be done?
% = should be probably done later, during cleanups and preparations for being stable


KDE 4.0 TODO
=================================

/ shortcut configuration
    / configurable per effect (in the options dialog)

/ different handling of differeng gfx cards
    / check that nvidia/ati/intel work and add specific hacks if needed
    / the same about driver versions

- default effects and their settings

- effects (to do)
    / add configuration options (dialogs)
    - add generic support to use effect only for certain window types [Seli]
    / split effects to groups (eyecandy, accessibility, whatever)
    - login effect, e.g. fade to desktop
    - logout effect [Seli]
    - explosion
?       - use for forcible killing (add support to windowClosed())
    - diminactive
*       - needs grouping for unmanaged windows [Seli]
        - trailfocus (windows keep getting darker over time)
*   - inactive window notification (when it stops responding) [Seli]
    - shadow
        - xrender mode
        - needs to follow the window shape
    - make transparent
        - make windows that are moved/resized by the user slightly transparent
    - hide all testing, demo etc. effects in final builds
    - boxswitch
        - should share some features (next/previous, etc.) with presentwindows
?           - duplicate code or try to share it?
    - desktopgrid
        - should preserve aspect ratio (as an option?)
    - taskbar thumbnail [Seli]
        - define protocol (with _KDE prefix for now?)
        - add support to taskbar
    - rollup animation when shading/unshading window  [Seli]
        - also use it for comboboxes
    - select a region to zoom
        - needs mouse to be warped

- fix inclusion of config-X11.h in installed headers [Seli]

/ IHV database - set config settings according to card/driver
?   - some sort of performance slider

? - unredirect fullscreen windows

- fix shading
- window-specific rules need to apply to unmanaged windows as well (where applicable)
- some window-specific rules also related to compositing
    - opacity

? generic dbus scripting support

/ check effects' dependencies when loading [rivo]

/ handling of window pixmaps for unmapped windows [Seli]
  - config option?

- shm mode needs support for more data formats than GL_BGRA

? __GL_YIELD=NOTHING

- check what works with XRender

- more notification functions for effects

- documentation

- disable application effects when kwin can provide them, e.g. shadow/transparency

- since API won't be stable, a version check for modules is needed


General TODO
=================================

? alpha clear hack
    - some decorations have parts transparent, probably because they don't expect
        to have an alpha channel
    - should be probably simply fixed in the decorations
    - if not feasible, code that makes non-alpha windows opaque (SceneOpenGL::Window::prepareRenderStates())
        could be used to also ignore alpha channel of the decoration

? wait for decoration repaints
    - it is sometimes visible that the window contents are painted first and the decoration
        only afterwards with a small delay
?       - this has been already greatly improved by r632378, so it's maybe not worth it anymore
    - maybe posted paint events need to be processed immediatelly, or maybe the compositing
        code should not update the window until the decoration is finished painting

? Expose events for overlay window - is it necessary to track it, like with root window?

% paint throttling
    - there's 5ms grace period per repaint to avoid overloading the system with just compositing
        and not letting the system do anything else - check and evaluate 

* handle properly stacking order of deleted windows for showing in effects

* handle properly deleted windows that reappear (windowReadded() function?)

% during screensaving, do no let non-screensaver windows show above screensaver
    - kdesktop_lock watches for such things and raises again, but there's a small gap

% nvidia drivers by default use fake refresh rates as a workaround for some X limitations
    - see the DynamicTwinView section in nvidia README
    - this makes KWin repaint at a different rate than it should

/ handling of window pixmap for unmapped windows
    - currently it's kept around after a window is unmapped
*       - but it's still discarded on e.g. resize - how to solve this?
*   - perhaps there should be an option not to unmap windows in order to always have live thumbnails
*       - another option could be to unmap but quickly map when a live thumbnail is needed

* cursorPos() does not work reliably now (not from e.g. timers, it needs events), so it's disabled

* window grouping is not implemented for unmanaged windows (used e.g. by DimInactive)

% clean up and sort out shortcuts so that they don't conflict and make sense
    - also make configurable etc.

% installed headers currently include config.h files to find out about e.g. OpenGL
    - this needs to be sorted out somehow, installed headers shouldn't do this

? hidden previews currently needs input shape extension, otherwise the window can possibly interfere
    - not very likely though, so is this worth bothering at all?

+ hidden preview has two modes unimplemented

- global setting for animation speed?
- effects (to do)
    - effect for windows demanding attention
        - rays? ripples?


OpenGL TODO
=================================

/ Check/make it work with other gfx cards

% Xgl support
    - should work
    - in SceneGL::Texture::findTarget() there is a hack that makes KWin work with XGL
        without requiring KWin to be built against the libGL version that Compiz is
        built against
%       - that may not be necessary somewhen later
    - interesting observation: normally run glxgears performs somewhat poorly compared
        to normal nvidia mode, changing glxgears to be override-redirect (i.e. no reparenting)
        however makes glxgears to be even faster than without any compositing at all,
        in this case however kwin's redrawing speed drops somewhat

% AIGLX support
    - should work
+   - it needs indirect rendering, should be autodetected and disabled somehow
%   - may require LIBGL_ALWAYS_INDIRECT set with older X.org
        (http://lists.kde.org/?l=kwin&m=116439615124838&w=2)
        (http://lists.freedesktop.org/archives/xorg/2006-December/020323.html)

/ GL_ARB_texture_rectangle vs GL_ARB_texture_non_power_of_two
%   - works; bugs in tfp_mode with power_of_two textures
        - ati (others?): power_of_two windows are drawn white unless non-tfp_mode
            is forced in findTextureTarget()

+ strict binding
    - there is code to support strict binding as required by AIGLX, but it's disabled, because
        copy_buffer in bindTexture() ensures strict binding as a side-effect
    - http://lists.kde.org/?l=kwin&m=116363084129170&w=2

% bindTexture() optimize copied areas
    - right now bindTexture() updates every damaged area and resets the window damage
    - it might make things faster to update only areas that need to be repainted
        and keep the rest damaged until needed

% clipping optimization
    - like XRender code has paintTransformedScreen(), avoid painting parts that are
        obscured (makes a difference with many windows open)
    - http://lists.kde.org/?l=kwin&m=116585618111882&w=2

! shm mode needs support for more data formats than GL_BGRA
    - http://www.xfree86.org/current/glTexImage2D.3.html
    - this now works for 16bpp, but maybe not 15bpp or less
    - endian issues?

% __GL_YIELD=NOTHING for NVidia reportedly improves perceived performance
    - it needs to be set somehow (http://lists.kde.org/?l=kwin&m=117794153720348&w=2)

XRender TODO
==============================

+ SceneXrender::Window::performPaint() doesn't use saturation
+ SceneXrender::Window::performPaint() doesn't use brightness

+ SceneXrender::paintTransformedScreen() doesn't handle properly extending of painted area
    in window's pre-paint - see the transformedShape() comment


Effects framework TODO
==============================

* more notification functions for effects are needed
    - currently there are only very few notification functions (windowAdded, windowActivated,...)
!   - window state changes
    ? more

/ shadows

/ support for grabbing input
    - during some more complicated effects, input (at least mouse) should be disabled,
        because currently there is no way to do input redirection

* PAINT_DISABLED turning off from effects needs some improvement
    - a window may have painting disabled for various reasons and their numbers may increase
        over time
        - so e.g. an effect showing minimized windows cannot simply turn off DISABLED
            for minimized windows, because it may be disabled also for other reasons
        - there should be some utility function that will be called by the effect
            with arguments saying which disabled windows it wants enabled

+ EffectWindow should be completely opaque when kept as the only API for effects
    - no inlines, etc.

+ API for tabbox for effects should be cleaned up

* check Scene::updateTimeDiff() - should the time be 0 or 1?

% post calls are probably not necessary by now (http://lists.kde.org/?t=117770818100003&r=1&w=2)

% consider using http://lists.kde.org/?l=kwin&m=118094888517415&w=2 for notification functions

% API cleanups and making sure it will stay backwards compatible
?   - should we try at all for 4.0? it will be probably still too "unstable" at that point


Effects TODO
===============================

+ minimize/shade effects
    - to replace the ones from KWin core
/       - minimizing
            - check support for it and the avoid_animation flag
+       - shading
            - shading will probably need special support

/ zoom effect
    - enlarge a portion of the screen

+ logout effect
*   - should be triggered by ksmserver somehow

+ effects to replace widget effects (the ones in the Effects tab in "kcmshell style")

/ showfps effect
    - for debugging, just shows transparent fps in some corner
    - just painting the number in paintScreen() should do, with glPushMatrix() and glLoadIdentity()
        to avoid all transformations
+   - needs bindPixmapToTexture() or something like that, for displaying the text
    - should also detect kwin being idle - it probably should detect in pre-paint that the only
        damage is its own area and avoid damaging for the next round in post-paint
    - should also have a graph showing how much of the screen is redraw, to detect too big redraws

+ debugpaint effect
    - should show what is damaged during each repaint step
    - probably just e.g. paint a red almost transparent area over damaged areas
    - needs special care to avoid causing infinite loops by its own damage (i.e. it damages
        part of screen to clear its own painting, that triggers itself again next repaint)

? other effects

+ virtual desktop change effects
+   - ... yes, you guessed it, the cube
/   - something that presents all virtual desktops as being in grid (as in pager)
        and zooms out of the old one and into the new one
    - or whatever

/ present windows
+    - option to show windows with relative sizes to each other

/ scalein
+    - should scale in from e.g. 80%, not 0%, to just "pop up"

+ effect for drawing attention to windows demanding attention

* DimInactive flickers when switching between windows (temporarily no window becomes active)

+ generic class for shader effects

- focus effect (windows waves a little when it gets focus)