Remove alpha_step, and support all 256 alpha values.
1 pixel pictures don't really use that many resources.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
When using DRI2, Mesa uses XESetWireToEvent to hook into Xlib's event
handling loop, so it can get notified when certain DRI2 event happens,
which is crucial to the normal functioning of GLX.
When xcb is owning the event queue (meaning libxcb is doing all the
event handling), those functions registered by Mesa will never be
called, thus GLX will malfunction, leading to screen flickers or visual
artifacts.
This commit uses a hack from Qt to manually call those functions in
compton.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Multipass blur is not properly implemented for xrender backend. There is
visible artifacts when it is used. And it is quite difficult to
implement correctly and efficiently for the xrender backend.
Print a warning message for multipass blur so we can survey whether it
is actually been used.
No functionality is removed in this commit.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Setting it on the target buffer picture has no effect. Fix performance
problem when using xrender with virtual box.
Fixes#40
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
When this option is enabled for a window type, shadow will be drawn in
areas that are obscure by the shape of the window.
Useful when the given window type has parts of the window transparent,
and you want to have shadows in those areas.
Fixes#45
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This reverts commit 50e2259404.
Temporarily revert the removal until we have more information about this whole
thing.
Turns out a couple of drivers don't work properly without the sync fence,
including intel, llvmpipe and NVIDIA.
Although sync fence is needed, from the information I have gathered (looking
at old bug reports, protocol specifications, look at other compositors' code),
compton's usage of it is not proper. So we need to rewrite it in the future,
after we get more information from driver developers.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
It will cause compton to print out some rudimentary diagnostics.
Also small improvements of the meson.build.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Use optnone instead, this does require a more recent clang though. In
general, just don't use -ffast-math.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Interesting this problem only surface when using GTK applications on
KDE. Maybe on other WMs there are some other events after window
restacking that triggers repaint of the window.
Fixes#28
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This was a dubious "fix" for a Nvidia driver problem. The problem was
never fully understood, and the then developers took a shotgun approach
and implemented xsync fences as a fix. Which somehow fixed the problem.
Again, I don't see any indication that the developers understood why
this "fix" worked.
(for details, see chjj/compton#152 and chjj/compton#181)
The driver problem should have been fixed almost 5 years ago. So this
shouldn't be needed anymore. In addition the way compton uses xsync fences
is apparently wrong according to the xsync spec (fences are attached to
screen, but compton uses them as if they were attached to drawables).
So, I will try removing it and see if anyone will complain. If there are
real concrete reasons why fences are needed, it will be brought back.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This is a potentially useful feature for debugging the xrender backend,
so make it a commandline option rather than an obscure compiler flag.
Also this is only usable with xrender, for glx there are better tools
for debugging.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
--dbe does not seem to have an effect on tearing, as noted in the old
manpage, and confirmed by my own testing.
So remove it, since it complicates the logic of painting.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This way we don't need to update the bounding region after window moves.
Also add some comments about the coordinate systems in compton.
Also change a few function that takes a `bool global` parameter to
always return region in local coordinates.
win_rounded_corners is called by win_updated_bounding_shape, so there is
no need for the former to call the later.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
With libX11, the library calls an I/O error handler if the connection to
the server breaks. The default I/O error handler prints an error message
and calls exit(). This can be seen when running a "pre-xcb" compton
against Xephyr and then closing the Xephyr window:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":1"
after 241 requests (241 known processed) with 0 events remaining.
The current compton would just continue running. After this commit, it
instead exits with this message:
handle_queued_x_events(): X11 server connection broke (error 1)
Signed-off-by: Uli Schlachter <psychon@znc.in>
Xlib uses unsigned long for XIDs, but xcb always uses uint32_t. Thus,
this needs the format string for uint32_t now.
Signed-off-by: Uli Schlachter <psychon@znc.in>
IANAL, but I think I am allowed to add missing copyright notices for
someone else. And I did my best job using git history to figure out who
wrote which functions. So I hope everything is fine.
Bugs:
* There seems to be a noticeable frame loss when window
is being opened/closed. But the same problem also exists
in master/next, so this is not a regression.
* Using --sw-opti and --benchmark at the same time causing
compton to draw more frequently than permitted by the
arguments. That is because the sleep interval calculation
is flawed. Not really a regression either.
Verified still working:
* Usual painting
* Fade
* Benchmark mode
* --sw-opti (with or without benchmark mode)
* DBus
* Unredir delay
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Re-did the painting logic, and document it.
It is unclear to me what is the previous painting logic. But the current
one is basically this:
1. Go through all windows top to bottom, and put visible windows (not
unmapped, opacity > 0, etc) into a linked list, from bottom to top
2. Accumulate a region of ignore on each window, which is basically the
region of screen that is obscured by all the windows above current
one.
3. Paint all the visible windows from bottom to top. Subtract the region
of ignore from the painting region. If we need to paint shadow, we
subtract the body of the window from the shadow painting region too,
because we don't want shadow behind the window.
4. region of ignore is invalidated when window stack change, an
window on top moved or changed shape, when window changed between
opaque and transparent, etc.
Notes:
It is unclear whether all the different shapes of a window (extents,
noframe, border, bounding shape, etc) are calculated correctly or not.
It is unclear if window shape related events are handled correctly or
not. Need more testing.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Change `win *` to `win **`, because a window could be freed by the
callback, so we can set `*w` to NULL to communicate that.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Also remove some debug function calls (there are better tools for opengl
debugging now). Also remove copysubbuffermesa
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
Instead use win_has_alpha to check for alpha channel, window mode is
reserved for determine if the window is possibly transparent.
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
The existing mechanism with set_ignore_next() is (IMHO) ugly and also
does not work with XCB requests. This commit adds a new function
set_ignore_cookie() and fixes callers that were converted to XCB to use
this new function instead.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Errors for requests sent via Xlib that expect a reply are handled via
XSetErrorHandler(), which sets up a callback function that Xlib calls.
Errors for requests that do not expect a reply or for errors caused via
unchecked XCB requests show up as events of type 0 in the event handling
function.
Before this commit, errors were ignored here. This commit changes the
code so that the errors are printed instead.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Note that this adds an include for Xfixes.h, because that header is
still needed and was previously included through Xcomposite.h.
Signed-off-by: Uli Schlachter <psychon@znc.in>
The X11 server's answer is not \0-terminated, so xcb_str_name() also
does not provide a \0-terminated pointer.
Signed-off-by: Uli Schlachter <psychon@znc.in>
No functional changes intended. The new xcb_damage_query_version() was
previously done by XDamageQueryExtension() internally.
Signed-off-by: Uli Schlachter <psychon@znc.in>
If an X event is received at a very specific point in time, it can trigger
a race condition in Xlib. Said event will be read, but Xlib will
nonetheless be completely unaware of the event.
This cause compton to sometimes block on select() while there are events
ready to be processed. If the event is a damage report, screen freeze
will happen until some other event is received.
The proper fix is to switch to xcb for event handling, thus avoid this
problem entirely.
There seems to be a race between DamageAdd (what the client uses
to report damage to Xserver) and DamageSubtract (what compton uses
to clear the reported damage, so it can receive new ones). I am not
sure how to confirm this. But this (terrible) workaround seems to
solve this problem.
* Move code around
* Remove unneeded forward declaration
* Rename win->damaged to win->ever_damaged, to be less confusing
* Expose debug functions even when DEBUG is not enabled. Compiler
would remove the dead code for us anyway.
* Some code cleanup
Also move static function prototypes out of compton.h. Seems like the
previous developers didn't know what header files are for.
Seems to have bugs after the split.
Before becoming the selection owner for _NET_WM_CM_Sn, compton will now check if
that selection is already owned (which means that another composite manager is
already running). If this check fails, startup will be refused. This behaviour
is required by EWMH / ICCCM.
Because this should catch all composite managers, the error message that was
used before when another manager is already running is reworded to mention that
the other manager does not follow EWMH.
Signed-off-by: Uli Schlachter <psychon@znc.in>
Under extreme race conditions (window A close at the same time as window
B create), there can be multiple windows with same id in compton's window
list. If at this point window B closes itself as well, finish_destroy_win
might destroy a different window as what's passed to destroy_callback.
This can be a problem because someone can still hold a reference to that
window (e.g. 't' in paint_preprocess), and there's no way to clear that
reference. If finish_destroy_win always destroy the same window passed
to destroy_callback, this will not be a problem.
- Remove the const function attribute from get_time_*(), since the
functions they call that actually get the time probably access global
variables or have other behaviors unacceptable for const functions.
- Change the const function attribute on win_has_frame() to pure, as it
accesses memory its parameter points to, which is invalid for a const
function.
Bug fix: Select the larger of the X window border width and
_NET_FRAME_EXTENTS, instead of adding them together, when determining
the frame extents. (Supposedly) more EWMH compliant, as EWMH
_NET_FRAME_EXTENTS should include the X window border width already. We
did not choose to completely rely on _NET_FRAME_EXTENTS to remove the
need to keep track of whether there is a _NET_FRAME_EXTENTS, and
(hopefully) take care of some cases when it is wrong. The commit should
fix awesomeWM/awesome#425. Thanks to psychon for the information. (#302)
The commit fixes the bug in win_get_region_noframe() that the X window
border width is not considered when determining the width/height of the
window without frame, as well.
- Add margin_t, a structure that represents margins around a rectangle.
- Store frame extents of a window with margin_t, replacing the 4
fields ({left,right,top,bottom}_width) in struct _win.
- Add two helper macros, cmemzero() and cmemzero_one(), that zero out a
block of memory.
Fix the bug that --active-opacity state does not change
on `--focus-exclude`-ed windows correctly, since win_update_focused()
enables the WFLAG_OPCT_CHANGE flag on a window only if w->focused
changes, while --active-opacity depends on the output of
win_is_focused_real() instead of w->focused, which could be changed even
if w->focused does not change (e.g. when the window is
`--focus-exclude`-ed).
Always redirect std{out,err} if --logpath is specified, instead of only
redirect after fork, to correct the inconsistent behavior of --logpath
when getppid() returns 1. (#263)
- Add disabled-at-compile-time note in usage text with NO_LIBCONFIG.
- Fix the incorrect disabled-at-compile-time note for --backend.
- Move position of the disabled-at-compile-time note of --dbus
slightly.
- Fix the bug that --no-fading-openclose doesn not work when fading out
by writing w->fade_last as well in win_determine_fade().
- Write w->fade_last for applying w->fade_force, as well.
- Reformat usage text by adding a blank line between descriptions of
two switches. (#215)
- Update documentation for a bit. Correct some wrong statements and
clarify some others.
- Add glx_take_screenshot() for taking a screenshot. With ImageMagick
the output data could be viewed in this way:
display -size [SCREEN-WIDTH]x[SCREEN-HEIGHT] -depth 8 -flip
rgb:[PATH]
(#204)
- Add D-Bus command `opts_get string:paint_on_overlay_id` to get X
Composite overlay window ID. (#204)
- Code cleanup.
- Separate GLX parts from session_t into glx_session_t.
- Add --rererdir-on-root-change and --glx-reinit-on-root-change, as
possible solutions for #217. Thanks to jlindgren90 for reporting.
- Add --glx-fshader-win, which specifies a custom fragment shader for
painting windows. compton-default-fshader-win.glsl is the shader with
default behavior, and compton-fake-transparency-fshader-win.glsl
provides a template of fake transparency. (#183)
- Add --force-win-blend to force all windows to be painted with
blending.
- Add --no-fading-destroyed-argb, as a workaround of bugs in some WMs.
(#193)
Add `bounding_shape` and `rounded_corners` as condition match target.
Deprecate --shadow-ignore-shaped. Add rounded-corners detection to
win_is_fullscreen(). Slightly modify win_rounded_corners() logic. Thanks
to tdryer for reporting. (#191)
- Try to avoid evaluating conditions after window unmap/destruction.
Unfortunately, frequently this doesn't work due to the asynchronous
nature of X.
- Add _GTK_FRAME_EXTENTS exclusion rules to compton.sample.conf. Thanks
to memeplex, hexchain, and others for info. (#189)
- Add debugging option --show-all-xerrors, and other debugging changes.
Doc update.
- Add --xrender-sync{,-fence} to deal with redraw lag issue on GLX
backend. --xrender-sync-fence requires a sufficiently new xorg-server
and libXext. NO_XSYNC=1 may be used to disable it at compile time.
Thanks to tchebb for reporting and everybody else for testing. (#181)
- A bit code clean-up. Replace a few XSync() with XFlush() to minimize
the latency.
- Add "xr-glx-hybrid" as an alias of "xr_glx_hybrid". (#163)
- Clear damage history in expose_root() and when root window size
changes. Unfortunately this doesn't fix#181.
- Add new backend "xr_glx_hybird", which uses X Render for all
compositing but GLX on the last step of rendering to screen. This
makes GLX-backend-specific VSync methods usable while may avoid
certain bugs with GLX backend. The idea comes from ali1234.
Experimental.
- GLX backend: Stop using or rendering to depth buffer.
- Use glFinish() instead of glFlush() before VSync. It probably uses
more CPU but could be more reliable than glFlush().
- Add --write-pid-path to write process ID to a file, to help
determining compton's process ID when -b is used.
- Add a few extra targets to query through D-Bus opts_get (version, pid,
etc.) and through win_get, primarily for debugging.
- Add helper macros likely(), unlikely(), cmalloc(), ccalloc(),
crealloc().
- Change w->opacity_set to opacity_t. Determine display_repr in
session_init(), etc.
Possible fix for a very rare timing issue in focus detection. Compton
may fail to detect the currently focused window, when a window newly
mapped gets focused, we failed to listen to events and get FocusIn from
it in time, and a series of focus change events before it happens stay
in the event queue and puzzled compton. My choice is to force focus
recheck on all focus-related events. More roundtrips to X, but not
necessarily worse performance, due to the high cost of focus flipping
especially when there's a lot of conditions. Thanks to SlackBox for
reporting. (#153)
- Fix a bug that --opacity-rule misbehaves with a value higher than 50%
on 32-bit systems. Thanks to mrinx for reporting. (#149)
- Fix a bug that opacity-rule in configuration file does not work.
- Rewrite focus detection logic. Remove w->focused_real and use
ps->active_win to identify focused window uniformly. Use a more
expensive way to filter FocusIn/Out events to improve reliability.
Only limited tests are done, and bugs are likely to be introduced.
(#99)
- Known issue: Under fvwm, compton sometimes does not consistently
report the window input gets sent to. But there's something wrong in
that case: XGetInputFocus() shows the root window is focused but
another window is receiving input.
- Possible fix for high CPU usage with a low --unredir-possible-delay.
Thanks to Feltzer for reporting. (#140)
- Rewrite some parts to (hopefully) increase performance, especially
with --unredir-if-possible.
- Known issue: With GTX 670 and x11-drivers/nvidia-drivers-325.15, and
compton --unredir-if-possible --config /dev/null, if you send a
SIGUSR1 to compton when a full-screen solid window is there, in which
case compton either redirects then immediately unredirects the screen,
or just don't redirect it altogether, X freezes after compton
unredirects the screen. Requests sent by other X clients are not
responded until compton is killed, which indicates the possibility of
a bug in X. Attaching to X process shows X is on ./os/waitFor.c.
Backend does not matter. --paint-on-overlay fixes the issue somehow.
compton-git-v0.1_beta1-5-g4600f43-2013-08-28 doesn't exhibit the
issue, but it's probably timing-related.
- Add --unredir-if-possible-exclude, to exclude certain windows when
evaluating --unredir-if-possible. (#140)
- Add --unredir-if-possible-delay, to add some delay before
unredirecting screen. (#138, #140)
- Code clean-up.
- Add stoppaint_force option, controlled via D-Bus, to stop painting
completely, which may look better than unredirecting the screen,
sometimes. (#41)
- Add x2, y2 matching targets.
- Update documentation.
- Fix OpenGL 3.0 compatibility by changing glFramebufferTexture() to
glFramebufferTexture2D(). Thanks to danfe for suggestion!
- Add notification about DocBook toolchina dependencies. Thanks to
danfe. (#121)
- Add --paint-exclude to prevent certain windows from being painted, for
debugging purposes.
- Add predefined matching target "x", "y", "width", "height", "widthb",
"heightb", "border_width", and "fullscreen".
- Fix bug #119, wrong man page install dir in CMake configuration.
Thanks to sstewartgallus for reporting.
- Add --shadow-exclude-reg, which excludes certain regions on the screen
to have shadows painted in. (#116)
- Adjust session initialization order. Now X root and screen info and
basic X extensions are available in configuration parsing step.
- Add --opacity-rule, which sets opacity based on conditions, as
requested by zabbal. (#113)
- Add a data field for each condition.
- Correct the FAQ link in README.md. Silly me.
- Code clean-up.
- Add multipass blur support. Note GLX Framebuffer support is required.
My benchmark shows multipass blur brings 5% performance boost for X
Render backend (3x3box). On GLX backend it brings 10% performance
boost for 5x5box but negatively affects performance for 3x3box. Thanks
to jrfonseca for advice. (#107)
- GLX backend: Cache blur texture for each window, for a 12% performance
boost.
- Add D-Bus fading control. Thanks to yulan6248 for testing. (#112)
- Fix FAQ link in README.md. Thanks to lorenzos for report. (#111)
- Correctly deinitialize VSync on on-the-fly VSync method switch.
- X Render backend: Normalize blur kernel.
- Code clean-up.
- Known issue: Linear corruption on border of a window may appear with X
Render multi-pass blur. Possible to fix but probably not worthwhile.
- GLX backend: Add DEBUG_GLX_MARK, to add GL marks around functions with
glStringMarkerGREMEDY(), and mark frame termination with
glFrameTerminatorGREMEDY().
- Print output of `compton -h` to stdout. (#110)
- GLX backend: Strip out elements with factor 0 in GLSL blur code.
Thanks to jrfonseca for guides. (#107)
- Fix GL_TEXTURE_RECTANGLE support. Thanks to amonakov for guides.
(#107)
- Enhance --glx-copy-from-front to improve performance and make it work
with --glx-swap-method, copied from kwin patch. Thanks to bwat47 for
info. (#107)
- Add texture2Doffset() support in blur GLSL shader. Thanks to amonakov
for advice. No visible benefit here, though. (#107)
- Only limited tests are done and I'm super sleepy. Bugs expected
- Fix --resize-damage. I forgot to shrink the painting region back when
actually copying to destination.
- Include extra pixels around the blur texture to avoid some possible
small issues, if --resize-damage is positive.
- Known issue: Line artifacts may still appear with --dbe (X Render
backend) or --glx-swap-method (GLX backend). I doubt if there's way to
fix this without very inefficient mechanisms.
- Add --resize-damage to enlarge/shrink repaint region by a specific
number of pixels, used for solving the line corruption issue with
blur. Thanks to Nuck and jerri in #104 for reporting.
- Fix the memory leak of blur shader string.
- Add blur convolution kernel customization, --blur-kern. The format is
a bit tricky so be sure to read the description in `compton -h`. Not
much tests received.
- GLX backend: Tolerate missing GLSL uniforms for strangely shaped
convolution kernel.
- Fix a memory leak that blur-background blacklist is not freed.
- GLX backend: Add --glx-swap-method, to reduce painting region if the
driver uses exchange or copy buffer swaps. Untested.
- Add --fade-exclude, to disable fading on specific windows based on
some conditions. Untested.
- Expose GLX backend options through configuration file. Add fetching of
GLX backend options through D-Bus.
- Use NULL pointer instead of element count to delimit string arrays in
parse_vsync()/parse_backend()/parse_glx_swap_method().
- Add documentation about "wintypes" section in configuration file.
- GLX backend: Fix broken dim and blur with --glx-no-stencil when
dealing with shaped windows.
- GLX backend: Cache region contents and do a local region intersection
instead of using XFixesIntersectRegion(). Drastic reduction in CPU
usage for --glx-no-stencil. Now --glx-no-stencil substantially
outperforms (~15%) normal mode.
- Use macros to reuse paint-in-region code in opengl.c . Add new type
"reg_data_t" to store XserverRegion cache.
- Cache region contents in is_region_empty(), mostly useful only for GLX
backend to save one roundtrip to X.
- GLX backend: Add --glx-no-rebind-pixmap, which prevents rebinding of
GLX texture to pixmap on content change. It doesn't work on some
drivers, but it saves some CPU on those where it does.
- Wrap XFree() with a new function cxfree() since its man page claims
NULL pointers are not acceptable (although in fact it does...).
- Use macro to save some code in get_cfg(). Code clean-up.
- GLX backend: Fix broken --inactive-dim.
- GLX backend: Fix bugs when inverting colors of windows. Thanks to
madsy and neure for help.
- GLX backend: Lift `glx_no_stencil` restriction from glx_init_blur().
It still probably won't work, but the user can try.
- XRender backend: Use XRenderFillRectangles() instead of
XRenderComposite() to do dimming.
- Add --blur-background-exclude. (#98)
- Add `opengl-mswc` VSync, which uses MESA_swap_control instead of
SGI_swap_control. I don't expect it to perform better than
SGI_swap_control, though.
- Update CMakeLists.txt .
- Add a few targets for D-Bus `win_get`. Misc changes.
- Known issue: Apparently I've forgotten implementing --inactive-dim on
GLX backend... Silly me.
- GLX backend: Add --glx-use-copysubbuffermesa, to use
MESA_copy_sub_buffer to do partial screen update. Huge performance
boost on mesa drivers for partial screen updates, but does not work
for nvidia-drivers and may break VSync. Automagically overrides
--glx-copy-from-front.
- Add rect_is_fullscreen() to reuse code. Misc changes.
- GLX backend: Add blur background support using a GLSL shader. Only
tested with nvidia-drivers-313.26. Known to cause quite some decrease
in performance (~10%?).
- Detach shaders in glx_create_program(). Misc changes.
- GLX backend: Add --glx-copy-front, which copies all unmodified regions
from front buffer to back buffer instead of redrawing the whole
screen. Unfortunately, probably because glCopyPixels() isn't usually
well-optimized on graphic cards, this option appears very unstable in
its effect: Over 20% boost in performance when only 1/4 of the screen
is modified, but 10% decrease when the whole screen is. Thus, not
enabled by default.
- GLX backend: Add glx_blur_dst(), to prepare for the background blur
feature. It currently is capable to modify background in the desired
way, but the core blur shader is absent. glConvolution2D() seemingly
relies entirely on CPU and has horrifying performance. I've hesitating
about whether I should use ARB assembly language or GLSL for the
shader.
- GLX backend: Invert y-axis GL matrix. It's upside-down previously
because that's what dcompmgr uses. Seemingly a "normal" y-axis is
required for glCopyPixels() to operate correctly.
- GLX backend: Fix some GLX_TEXTURE_RECTANGLE compatibility issues.
Still, not actually tested.
- Add benchmark mode (--benchmark & --benchmark-wid).
- Misc changes.
- GLX backend: Use GL_SCISSOR_TEST instead of STENCIL_TEST if there's
only one rectangle in glx_set_clip(). Profiling with gDebugger shows a
10% performance improvement.
- Add .desktop installation rules. (#97)
- GLX backend: Fix a bug that ARGB windows / shadows are rendered too
dark. Thanks to derhass in FreeNode/##opengl for help.
- GLX backend: Fix a problem that during window resize the content looks
jittering, by letting compton fetch pixmap sizes with XGetGeometry()
instead of relying on window width/height, which could be inaccurate
during window resize. Negative effect on performance. Thanks to M4he
for reporting. (#7)
- Add .desktop file. Thanks to quequotion for providing it. (#97)
- Avoid checking presence of window pixmap, because they may not exist
with very old X Composite implementations.
- Add workaround for a strange window restack issue when compton
receieves a ConfigureNotify with non-existent new above window.
- Add debugging function hexdump(). Extra sanity checks on various
places.
- GLX backend: Fix a bug that window content does not get updated on
VirtualBox, by rebinding texture when window content changes. This may
have a negative effect on performance.
- GLX backend: Add --glx-no-stencil to restore the old clipping method,
just in case.
- GLX backend: Apply stricter checks on texture-pixmap binding.
- GLX backend: Fix a bug that glx_set_clip() behaves incorrectly when
None is passed in.
- GLX backend: Use glEnable()/glDisable() to toggle stencil tests, in
hope to increase performance.
- Move window pixmap/picture fetching to win_paint_win(), in hope to
increase performance.
- Intersect shadow painting region with its bounding rectangle, in hope
to increase performance.
- Fix a bug that glx_bind_pixmap() doesn't work with mesa drivers.
Thanks to Janhouse and mkraemer for reporting. (#7)
- Use stencil buffer to attempt to eliminate potential double-paint
issue in glx_render(). X Fixes doesn't guarantee the rectangles in a
region do not overlap, and this may cause some regions to be painted
twice, which would be a problem if we are painting transparent things.
Now the target window must have a stencil buffer. Compiz uses its own
region implementation to deal with this, but as a lightweight
compositor we can't really do the same. It may have a positive or
negative effort over performance. Callgrind result indicates basically
no change in performance, but this may or may not be true.
- Correctly distinguish GL extensions and GLX extensions. Sorry. :-D
- Handle screen size. Thanks to tsmithe for reporting. (#7)
- Rename OpenGL backend to GLX backend, because, we might have a EGL
backend someday.
- Add configuration file option `backend` to specify backend. Add
`backend` to D-Bus `opts_get`.
- Add OpenGL shader compilation code, but currently unused.
- Minor adjustments.
- Known issue: Window content doesn't get updated in VirtualBox,
probably because its OpenGL implementation requires constant rebinding
of texture. But that's really slow...
- Known issue: Blur feature is still unimplemented in GLX backend.
- Add experimental OpenGL backend (--opengl). --blur-background is
currently not possible with this backend, because I'm still trying to
find a proper way to do blur with OpenGL. Flipping backend on-the-fly
is really hard, so it isn't supported right now. No configuration file
option exists to enable this, because it isn't stable enough.
- Add `opengl-swc` VSync method that uses SGI_swap_control to control
buffer swap, with OpenGL backend. (#7)
- Fix a potential read-from-freed-memory issue in paint_all().
- Correctly reattach GLX context after fork.
- Dump error text in error(). Add GLX error code handling.
- Code clean-up.
- Known issues: Region operations take a lot of time in glx_render().
I'm hesitating about what to do.
- Create OpenGL context only after initializing overlay, which fixes a
bug that --paint-on-overlay does not work with OpenGL VSync. Thanks to
tsmithe for reporting. (#7)
- Fix an assertion failure that occurs when a window is reparented to
the root window then immediately to another window. Thanks to smlx for
reporting.
- Add extra debugging info for ReparentNotify.
- #91: Use pkg-config to find drm.h to avoid issues on FreeBSD. Thanks
to hun7err for pointing out and providing patch.
- #89: Add default shadow exclusion rule for notify-osd. Thanks to
DanielRS.
- Check for abundant positional arguments.
- Use paint target window (root window / overlay window) instead of
ps->reg_win to create GLXContext. (May have negative effects on OpenGL
VSync.) Add new OpenGL helpers functions, to prepare for the new
OpenGL backend.
- Dump more info of a PropertyNotify with DEBUG_EVENTS.
- Add on-the-fly VSync option modification via D-Bus, as requested by
kunitoki (#80). Expose parse_vsync(), create vsync_init() and
ensure_glx_context().
- Change default value of ps->drm_fd to -1.
- Update Makefile. Change the install/uninstall rules and add doc
installation, requested by hasufell in #85.
- Mark window not damaged in map_win(). It helps in reducing flickering
with inverted window color, but I'm not completely sure if it's safe.
- Avoid modifying w->invert_color when window is unmapped.
- Update documentation. Thanks to hasufell for pointing out.
- Add "vsync-oml" VSync method, using GLX_OML_sync_control. Untested,
because it's not supported by my driver.
- Unredirect ps->reg_win, because DRI wiki says it's related to the
behavior of OpenGL VSync extensions.
- Add glFlush() and glXWaitX() calls, in hope they are slightly helpful
for VSync.
- Change a few functions to make error handling more graceful. Make some
errors fatal. Code clean-up.
- Add unused function make_text_prop().
- Try to improve the performance of color inversion by applying clipping
region during color inversion. (#75)
- Validate pixmap on window unmap/destruction. Probably slightly helpful
for #52.
- Change the design of unmap_win() and destroy_win(), a bit.
- Add warning message to help messages about features disabled at
compile time, instead of dropping their description completely. (#85)
- Silence some warnings. Code clean-up.
- Add advanced window matching system, capable of matching against
arbitrary window properties as well as a series of internal
properties, with 4 additional operators (>, <, >=, <=) useful for
integer targets, and support of logical operators. The old matching
system is removed, but compatibility with the format is retained.
- As the new matching system is pretty complicated, and I have no past
experience in writing a parser, it's pretty possible that bugs are
present. It also has inferior performance, but I hope it doesn't
matter on modern CPUs.
- It's possible to disable matching system at compile time with NO_C2=1
now.
- Add ps->o.config_file to track which config file we have actually
read. Queryable via D-Bus.
- Parse -d in first pass in get_cfg() as c2 needs to query X to get
atoms during condition parsing.
- Fix a bug in wid_get_prop_adv() that 0 == rformat is not handled
correctly.
- Fix incompatibility with FreeBSD sed in dbus-examples/cdbus-driver.sh
.
- Add recipe to generate .clang_complete in Makefile, used by Vim
clang_complete plugin.
- Add DEBUG_C2 for debugging condition string parsing. DEBUG_WINMATCH is
still used for match debugging.
- Rename win_on_wdata_change() to win_on_factor_change().
- Extra malloc() failure checks. Add const to matching cache members in
session_t. Code clean-up. Documentation update.
- Fix a bug that root window is not repainted on wallpaper change unless
an Expose X event is received. Seemingly, if there's no mapped window
on a screen, X will not send an Expose event when the wallpaper
changes. Thanks to baskerville for reporting.
- Fix a X Pixmap leak when there's no existing wallpaper pixmap found.
- Fix a bug in mstrncpy() that null character is not added to the end of
the copied string.
- Make VSYNC_STRS public, for use in src/dbus.c. Adjust the type of
WINTYPES array. Add NUM_VSYNC.
- Add more targets for various D-Bus methods. Add "bad_target" D-Bus
error. Improve error handling. Add more helper functions to append
arguments to a D-Bus message. Add Introspect method to D-Bus
introspection reply.
- Add public declarations of things in the new condition format code to
common.h. Move definitions of some inline functions from compton.h to
common.h. Make some functions public. Move wid_get_prop_adv() to
compton.c. The primary code files of the new format src/c2.{c,h} will
be published when ready.
- Add support for dumping version string in Makefile (make version), to
make snapshot generation easier.
- Add repeated inclusion protection to common.h.
- Update documentation.
- Use gsed instead of sed in dbus-examples/cdbus-driver.sh if possible,
as some BSD systems does not come with GNU sed by default. Thanks to
DaChiChang for reporting.
- Code clean-up. Small type changes in register_cm() to silence
warnings. Quit on failure in parse_vsync(). Apply stricter checks in
force_repaint().
- Add D-Bus support. Currently 7 methods are available: "reset" (same as
SIGUSR1), "list_win" (list the windows compton manages), "win_get"
(get a property of the window), "win_set" (set a property of the
window), "find_win" (find window based on client window / focus),
"opts_get" (get the value of a compton option), and "opts_set" (set
the value of a compton option), together with 4 signals: "win_added",
"win_destroyed", "win_mapped", "win_unmapped".
- D-Bus support depends on libdbus.
- As there are many items and my time is tight, no much tests are done.
Bugs to be expected.
- Create a new header file `common.h` that contains shared content.
- Fix some bugs in timeout handling.
- Update file headers in all source files.
- Re-enable --unredir-if-possible on multi-screen set-ups, as the user
could turn if off manually anyway.
- Check if the window is mapped in `repair_win()`.
- Add ps->track_atom_lst and its handlers, to prepare for the new
condition format.
- Known issue 1: "win_get", "win_set", "opts_get", "opts_set" support a
very limited number of targets only. New ones will be added gradually.
- Known issue 2: Accidental drop of D-Bus connection is not handled.
- Known issue 3: Introspection does not reveal all available methods,
because some methods have unpredictable prototypes. Still hesitating
about what to do...
- Known issue 4: Error handling is not finished yet. Compton does not
always reply with the correct error message (but it does print out the
correct error message, usually).
- Fix a small bug that breaks --invert-color-include if no other
blacklists are present. Thanks to MaskRay and xiaq for reporting.
- Disable --unredir-if-possible for multi-screen setups.
- Fix a bug that causes --no-fading-openclose to have no effect in some
cases. Add w->in_openclose to keep track of window open/close state.