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 ================================= - animations - need to be faster (300ms at most) - global setting? - 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] - effect for windows demanding attention - rays? ripples? - 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? - strict binding - 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 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)