Commit Graph

58 Commits

Author SHA1 Message Date
Richard Grenville 07e4420ab4 Improvement: Pregenerate alpha pictures
Pregenerate alpha pictures to save time when painting. Add --alpha-step
to control the step of alpha picture generation (the opacity difference
between two consecutively generated alpha pictures).
2012-10-13 19:11:25 +08:00
Richard Grenville 72ea4b5f47 Misc: Code clean-up
- Fix a memory leak in register_cm().

- Print a warning message if argument of --vsync is invalid.

- Known bug: compton will probably freeze X if another compositing
  window manager is running and --vsync opengl is enabled, with
  nvidia-drivers-304.51. Probably an issue on the driver. I could see no
  workaround.
2012-10-10 21:17:48 +08:00
Richard Grenville b59e592588 Feature: #7: VSync
- Add VSync feature. 3 possible VSync methods available: "sw" (software,
  not too reliable, but at least you have something to fallback to),
  "drm" (using DRM_IOCTL_WAIT_VBLANK, should work only on DRI drivers),
  "opengl" (using SGI_swap_control extension OpenGL, might work on more
  drivers than the DRM method). "sw" and "opengl" are briefly tested,
  "drm" received utterly no test (because I use the nVidia binary blob).
  They are enabled with "--vsync sw" / "--vsync drm" / "--vsync opengl".

- Add --refresh-rate to let user specify a refresh rate for software
  VSync, in case the automatic refresh rate detection does not work
  well.

- Seemingly the automatic refresh rate detection using X RandR in
  software VSync detects refresh rate incorrectly. Need further investigation.

- Fix a few bugs in fading timing.

- Add a workaround for client window detection on Fluxbox, as Fluxbox
  (incorrectly?) sets the override-redirect flag upon all frame
  windows.

- Software VSync adds dependency on librt (a part of glibc) for
  nanosecond-level timing functions, and libXrandr for automatic refresh
  rate detection; DRM VSync adds dependency on libdrm to use its drm.h,
  but does not link to libdrm; OpenGL VSync adds dependency on libGL.

- Print timing information on DEBUG_REPAINT.
2012-10-08 10:36:28 +08:00
Richard Grenville 1306b1591f Improvement: Support reading _NET_WM_OPACITY from client windows
- Some WMs don't respect Keith Packard's proposal of
  _NET_WM_WINDOW_OPACITY, and do not copy _NET_WM_OPACITY attribute of a
  client window to its frame windows, thus cause opacity set by
  non-override-redirect windows to have no effect. This commit adds
  support for reading _NET_WM_OPACITY from client windows if running
  with --detect-client-opacity. Thanks to pvanek for reporting.

- Change Makefile logic to determine options from 3 variables
  (NO_LIBCONFIG, NO_REGEX_PCRE, NO_REGEX_PCRE_JIT) instead of CFG to
  ensure compatibility when we add new options. CFG variable is no
  longer been respected.
2012-10-03 21:21:43 +08:00
Richard Grenville f95093358e Improvement: Change in client window lookup & wintype detection
- Revert to WM_STATE for client window lookup, as WM_CLASS is
  unreliable, either, but set the client window of an override-redirect
  window to itself.

- Conform to EWMH to make assumptions about window types when
  _NET_WM_WINDOW_TYPE is not available.

- Remove determine_wintype() and completely rely on client window for
  window type detection.
2012-10-02 21:46:37 +08:00
Christopher Jeffrey c7ca3454ee Merge branch 'richardgv-dev' 2012-09-30 22:57:46 -05:00
Richard Grenville 2f0417cd74 Feature: #27: Detect shaped windows and disable shadow on them
- Optionally detect shaped windows using X Shape extension and disable
  shadow on them with --shadow-ignore-shaped.

- Some windows are bounding-shaped just to support rounded corners, like
  Chromium windows (when system titlebar is disabled in its settings).
  Add --detect-rounded-corners to treat them as non-shaped windows (thus
  enable shadow on them). The algorithm I use is not perfect and wrong
  detection results are pretty possible to appear.

- Many windows don't use X Shape extensions to add shapes but use ARGB
  background instead. These windows could only be blacklisted with
  --shadow-blacklist.

- Rename a few functions. Code clean up.
2012-10-01 10:41:51 +08:00
Richard Grenville 8d7d6405b6 Improvement: Wait infinitely for events when idling
Wait infinitely for events when idling, instead of always calling
paint_preprocess(), to reduce CPU usage in the case. Thanks to valr for
help.
2012-09-29 22:53:57 +08:00
Richard Grenville 5a3dfbc064 Improvement: Split shadow_pict to shadow_pict & shadow_alpha_pict
Split w->shadow_pict to w->shadow_pict and w->shadow_alpha_pict, so that
the whole w->shadow_pict need not to be rebuild on shadow opacity
change. This greatly reduces CPU usage of compton when a window with
shadow is fading. (My test shows the CPU usage of compton process
dropped from 1.15% to 0.35% when constantly fading in and out a window.)
It uses a rather painful and slow method in shadow_picture() to get
around the limitation of PictStandardA8 to make colored shadows work. I
wonder if there's a better approach.

- Merge variables gsize and cgsize as they seemingly represent the same
  thing.
2012-09-29 13:21:39 +08:00
Christopher Jeffrey 7c1838cfd8 Merge commit '69513d6'
Conflicts:
	src/compton.c
	src/compton.h
2012-09-28 12:22:25 -05:00
Richard Grenville 9139d038c2 Bug fix: #48: Compilation failure with old libconfig/libpcre
- Fix compilation failure with <libpcre-8.20 and <libconfig-1.4. Tested
  with libpcre-8.12 and libconfig-1.3.2, but not extensively tested.
  libconfig-1.3* probably has more limitations on configuration file
  syntax (enforces comma at the end of a setting?) and does not support
  @include.

- Make it possible to turn off PCRE and libconfig support using
  environment variable "CFG". Not well tested. CMake might provide a
  better solution.
2012-09-28 09:19:53 +08:00
Richard Grenville 69513d6231 Bug fix: Issue #47: Locale cause problems with float arguments
A locale using comma instead of dot in floating point values causes
unexpected behavior when parsing floating point commandline arguments.
This commits enforces LC_NUMERIC="C" during commandline argument parsing.
2012-09-27 22:30:16 +08:00
Richard Grenville 75ebe94bb6 Feature: --no-fading-openclose to partially simulate -F
-F hasn't being working for long. This commit adds a switch
--no-fading-openclose (and a configuration file option of the same name)
to simulate the behavior when only -F is enabled, which disables fading
when opening/closing windows, and makes -F an alias for -f.
2012-09-26 21:47:32 +08:00
Richard Grenville 8c0379180b Bug fix: Issue #46: Optionally mark override-redirect windows as active
Attempt to fix the transparency issue of Firefox and Chromium location
bar dropdown window by marking override_redirect windows as active. This
may not work completely and could have other side effects. Experimental.
Enable by using --mark-ovredir-focused.
2012-09-26 19:48:36 +08:00
Richard Grenville 606e2d7061 Misc: Code clean-up
- Change some members of options_t. Clean up wrongly replaced option
  names in comments. Rename "options" to "opts", to avoid breaking line
  width too much, and to minimize typing as it's so frequently used.
  :-)

- Let general options in commandline arguments override wintype-specific
  options in a configuration file, which could be a more natural
  behavior.
2012-09-26 18:54:35 +08:00
Christopher Jeffrey bccda565a2 initialize fade_time just to be explicit. 2012-09-26 03:18:10 -05:00
Christopher Jeffrey e4e1ed092f remove fade_time from options struct. 2012-09-26 02:38:51 -05:00
Christopher Jeffrey 93c82a84ef add global options struct. 2012-09-25 20:56:02 -05:00
Richard Grenville 564e55e22c Feature: Wintype-specific options in configuration files
- Add support of window-type-specific options (fade, shadow, and
  opacity) in configuration file parsing. Syntax shown in
  compton.sample.conf.

- Replace wintype_name() with an array of window type names. Code
  clean-up.
2012-09-25 21:08:54 +08:00
Richard Grenville ee9e90efec Feature: Configuration file parsing
- Add support for parsing configuration files using libconfig.
  (Dependency on libconfig could be made optional once we get some
  better building system.) Few tests has been done, bugs to be expected.
  compton searches for a configuration file mostly according to the XDG
  standard. Firstly the configuration file requested by --config, then
  $XDG_CONFIG_HOME/compton.conf (~/.config/compton.conf, usually), then
  ~/.compton.conf, then compton.conf under $XDG_DATA_DIRS (often
  /etc/xdg/compton.conf). A sample configuration file is supplied as
  compton.sample.conf. Configuration file syntax may change in the
  future.  Commandline switches has higher priority than configuration
  file, except for --shadow-exclude. Use --config /dev/null to
  temporarily disable configuration file.

- Fix a bug that causes windows to disappear or be partially rendered on
  opacity changes.

- Fix a bug that causes some windows to ignore -i (inactive_opacity) and
  --inactive-dim, caused by the default window type change in
  a5d9955ca4.
2012-09-25 10:32:41 +08:00
Richard Grenville ce51d564d5 Misc: Fix two memory leaks
- Fix two small memory leaks. valgrind detects another memory leak
  possibly caused by XGetTextProperty(), probably a bug in libX11, I
  couldn't fix that one.

- Use predefined atoms in Xatom.h to replace a few XInternAtom() calls.
2012-09-23 11:49:02 +08:00
Richard Grenville a5d9955ca4 Improvement: Change window type detection
- Let window type detection start with the client window if there's one,
  in hope to enhance performance.

- Change get_wintype_prop() to fetch the property only once.

- Default to WINTYPE_UNKNOWN instead of WINTYPE_NORMAL if
  _NET_WM_WINDOW_TYPE is missing.

- Fix a mistake in calc_opacity().

- Add some items to .gitignore.

- Fix a typo in usage().
2012-09-22 20:59:26 +08:00
Richard Grenville 0d6724385e Feature: Issue #29: Alternative shadow blacklist implementation
- Add shadow blacklist feature, but a different implementation from
  nicklan's. 5 matching modes (exact, starts-with, contains, wildcard,
  PCRE) and 3 matching targets (window name, window class instance,
  window general class). Not extensively tested, bugs to be expected.
  It's slower for exact matching than nicklan's as it uses linear search
  instead of hash table. Also, PCRE's JIT optimization may cause issues
  on PaX kernels.

- Add dependency to libpcre. Could be made optional if we have a
  graceful way to handle that in Makefile.

- Some matching functions are GNU extensions of glibc. So this version
  may have troubles running on platforms not using glibc.

- Fix a bug that access freed memory blocks in set_fade_callcack() and
  check_fade_fin(). valgrind found it out.

- Use WM_CLASS to detect client windows instead of WM_STATE. Some client
  windows (like notification windows) have WM_CLASS but not WM_STATE.

- Mark the extents as damaged if shadow state changed in
  determine_shadow().

- Rewrite wid_get_name(). Code clean-up.

- Two debugging options: DEBUG_WINDATA and DEBUG_WINMATCH.

- As the matching system is ready, it should be rather easy to add other
  kinds of blacklists, like fading blacklist.
2012-09-22 11:42:39 +08:00
Richard Grenville 8724101c0a Bug fix: Detect and mark WM windows as active
See chjj's comments on issue #39:
https://github.com/chjj/compton/issues/39#issuecomment-8533360

- Add a switch --mark-wmwin-focused that try to detect WM windows and
  mark them active.

- Fix a bug that causes BadDrawable, etc. if a window is mapped then
  immediately unmapped.

- Fix a bug in determine_evmask().

- Add a debug option DEBUG_CLIENTWIN.

- Force window repaint on window frame extent change.

- Code cleanup.
2012-09-20 14:11:50 +08:00
Richard Grenville 778a8b177c Improvement: Change fading mechanism
- Change fading mechanism for better modularity. Remove fade queue and
  use members in struct _win to record fading data. In contrast to
  previous commits, this one actually could make the program slower (but
  very slightly, hardly noticeable if your CPU is anywhere close to AMD
  K7). As this commit changes lots of things, bugs are to be expected.

- Currently -F does not do its job. -f actually equals -fF. (While in
  the past -F equals nothing and -f is just -f.) A fix will be made
  soon. I suppose it isn't hard.

- Add a preprocessor function paint_preprocess() and move all
  preprocessing code in paint_all() to it.

- Add window flag support but currently unused.

- Add DamageNotify handling to ev_window().

- I'm considering removing HAS_NAME_WINDOW_PIXMAP = 0 support as I
  couldn't see what it is good for. Nor do I know what CAN_DO_USABLE
  does. Basically all my changes ignore these cases.
2012-09-19 21:14:28 +08:00
Richard Grenville e7da88890d Bug fix: Issue #23, notify-osd not rendered
More details in the issue report.

- Add ClientMessage detection to ev_name() and ev_window(), although we
  don't actually handle the event.
2012-09-18 11:28:09 +08:00
Richard Grenville 1437e406c7 Improvement: Defer shadow picture generation
- Defer shadow picture generation to minimize interactions with X,
  hoping to boost performance.

- Fix a rendering issue caused by clip_changed in configure_win().
  Remove clip_changed altogether.

- Split generation of shadow picture from calculating its geometry.

- Cache width/height including borders in struct _win as it's frequently
  used.
2012-09-17 22:15:04 +08:00
Richard Grenville cdf7db750d Improvement: Change painting sequence
- Now compton paints windows from the lowest to the highest.  Warning:
  I'm not completely certain that the change won't introduce unexpected
  glitches. This commit may be revoked in the future.

- Remove w->border_clip since it's no longer needed.

- Correct a mistake in find_toplevel2(). (clang --analyze found it out.)

- Change "func_name()" prototypes to "func_name(void)". If I remember
  correctly, "func_name()" means you are remaining silent about this
  function's parameters instead of stating it has no parameter in ANSI
  C.

- Add timestamps to error messages.

- Suppress error messages caused by free_damage().
2012-09-17 16:04:04 +08:00
Richard Grenville dfde67255f Improvement: Change generating process of alpha_pict, etc.
- Change how w->alpha_pict is generated, in hope to boost performance,
  slightly, and as a step to eventually move handling code of most resources
  used when painting to paint_preprocess().

- Remove alpha_pict parameter of shadow_picture() as it's not
  necessary.

- Let window opacity affect frame opacity.

- Rename some members of struct _win.
2012-09-17 12:41:41 +08:00
Richard Grenville 64d53f6534 Misc: Clean up
- Add 4 helper free functions that free XserverRegion, Damage, Picture,
  and Pixmap.

- Rename w->shadow to w->shadow_pict. Add a bool member w->shadow to
  prepare for a future change.
2012-09-16 23:17:34 +08:00
Richard Grenville 4293a4626a Bug fix: Issue #43, better client window lookup
More details on the issue report.

- Look up the client window of a WM frame when it's mapped instead of when
  it's created, for better reliability.

- Fix a warning when building.
2012-09-14 11:51:46 +08:00
Christopher Jeffrey 0d4c6fc5cc fix code duplication resulting from rebase 2012-09-13 10:28:27 -05:00
Christopher Jeffrey e2c14ee545 fix determine_evmask warnings 2012-09-13 10:24:37 -05:00
Christopher Jeffrey 0064894bf6 more style changes 2012-09-13 10:24:14 -05:00
Christopher Jeffrey 5bcbf87f32 stay consistent with code style 2012-09-13 10:00:57 -05:00
Christopher Jeffrey 5112f91c48 whitespace 2012-09-13 09:59:50 -05:00
Richard Grenville 271d894eae Bug fix: Segfault when meeting FocusIn/Out from destoryed windows
I found compton segfaults sometimes when starting from .xinitrc.
Debugging reveals my conky window was just reparented to a fvwm's
frame window before compton picked up a FocusOut event on this conky
window that has just been destroyed in the event queue. find_win()
call in ev_focus_in/out() returned a NULL pointer. When it tried to
use the pointer segfault happens.

- Add extra check to ev_focus_in/out() to stop the segfault.

- Reset window event mask on window reparenting to a non-root window to
  minimize wrong events.

- More abstraction for determining window event mask.
2012-09-13 22:30:18 +08:00
Richard Grenville 18b3a96d0b Improvement: Use find_toplevel() to find WM frame
Use find_toplevel() to find out the WM frame of a client window. I
didn't noticed it beforehand. Fallback to the old method as compton does
not always get correct client windows.

- Clean up find_client_win() a bit. A BFS search algorithm could be more
  optimal yet it requires a queue implementation.
2012-09-13 21:38:55 +08:00
Richard Grenville d0399313fc Improvement: Do not track focus changes unless necessary
Stop tracking focus changes unless either inactive_opacity or
inactive_dim is enabled, small performance boost in certain cases.
2012-09-13 11:47:31 +08:00
Richard Grenville 3abeb58690 Bug fix: Issue #40: -z does not work as expected
More information in the issue report.

- Let window opacity affect the opacity of its shadow and frames even if
  -z is enabled.

- Check for the range of -o to eliminate potential segfault.
2012-09-12 21:01:06 +08:00
Richard Grenville 6f079af2f0 Bug fix: Double free when XQueryTree() fails
Take care of failure of XQueryTree() to prevent it from causing a
double-free crash. This usually happens when X is initializing and windows
are constantly changing.
2012-09-12 12:14:24 +08:00
Richard Grenville 35f7d45130 Bug fix: Issue #39: Render windows just mapped && focused incorrectly
More info in the issue description. This also fixes the problem for
--inactive-dim.
2012-09-12 11:06:16 +08:00
Richard Grenville e9cfa49c86 Feature: Issue #2: Support dim inactive windows
- Add a switch --inactive-dim that dims inactive windows.

- The window dimming feature is implemented in a pretty ugly way.
  Improve it if possible.
2012-09-12 10:52:52 +08:00
Richard Grenville f280750a03 Debug: Enhanced debugging capability
- Change all #if DEBUG_XXX directives to #ifdef, thus making it
  possible to directly enable debugging options with CFLAGS
  (-DDEBUG_XXX).

- Print timestamp before event debugging messages.
2012-09-12 09:08:15 +08:00
Richard Grenville c905c882b4 Bug fix: Segfault when encountering invalid long option
I didn't read the documentation of getopt_long() carefully.
2012-09-11 23:11:23 +08:00
Richard Grenville 129115171a Bug fix: Issue #37, fix 5 opacity-related bugs
More details in the bug report.

- Rewritten much of the opacity calculation, code cleanup.

- Commandline switch --inactive_opacity_override to restore the old
  behavior in which inactive_opacity has higher priority than
  _NET_WM_OPACITY.
2012-09-11 22:22:58 +08:00
Richard Grenville deaaf5c5cf Feature: Issue #35, Add colored shadows
- Use getopt_long() instead of getopt() for argument parsing, making
  long options possible.

- Add support of colored shadows with 3 commandline switches.
2012-09-11 21:57:50 +08:00
Richard Grenville f5aed89a67 Bug fix: Issue #36: Chromium window painting problems
More descriptions on issue #36.

- Listens ShapeNotify event to get around the Chromium window painting
  issues.

- Adds dependency on X Shape extension.

- Adds a few functions for convenience, so a bit code clean up.

- Better event debug support, adds restack_win() debug.
2012-09-11 21:33:03 +08:00
Richard Grenville 8628371a83 Bug fix: Issue #38, fixes painting specially-shaped semi-transparent windows
Fix taken from xcompmgr.
2012-09-11 21:11:06 +08:00
Christopher Jeffrey eb3b13145d avoid allocating a new win struct if possible 2012-09-08 21:13:56 -05:00