From 280bc0fc324953e8d2cc14f13e282393a797e4e0 Mon Sep 17 00:00:00 2001
From: Richard Grenville <pyxlcy@gmail.com>
Date: Wed, 26 Sep 2012 21:40:48 +0800
Subject: 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.
---
 compton.c | 41 +++++++++++++++++++++++++++++++++--------
 compton.h |  5 ++++-
 2 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/compton.c b/compton.c
index 8294dd99d..0b6f2a05a 100644
--- a/compton.c
+++ b/compton.c
@@ -118,7 +118,7 @@ static options_t opts = {
   .fade_in_step = 0.028 * OPAQUE,
   .fade_out_step = 0.03 * OPAQUE,
   .fade_delta = 10,
-  .fade_trans = False,
+  .no_fading_openclose = False,
   .clear_shadow = False,
   .inactive_opacity = 0,
   .inactive_opacity_override = False,
@@ -1594,14 +1594,23 @@ map_win(Display *dpy, Window id,
 
   // Window type change could affect shadow and fade
   determine_shadow(dpy, w);
-  determine_fade(dpy, w);
 
   // Determine mode here just in case the colormap changes
   determine_mode(dpy, w);
 
   // Fading in
   calc_opacity(dpy, w, True);
-  set_fade_callback(dpy, w, NULL, True);
+
+  if (opts.no_fading_openclose) {
+    set_fade_callback(dpy, w, finish_map_win, True);
+    // Must be set after we execute the old fade callback, in case we
+    // receive two continuous MapNotify for the same window
+    w->fade = False;
+  }
+  else {
+    set_fade_callback(dpy, w, NULL, True);
+    determine_fade(dpy, w);
+  }
 
   calc_dim(dpy, w);
 
@@ -1620,6 +1629,12 @@ map_win(Display *dpy, Window id,
   }
 }
 
+static void
+finish_map_win(Display *dpy, win *w) {
+  if (opts.no_fading_openclose)
+    determine_fade(dpy, w);
+}
+
 static void
 finish_unmap_win(Display *dpy, win *w) {
   w->damaged = 0;
@@ -1658,6 +1673,8 @@ unmap_win(Display *dpy, Window id, Bool fade) {
   // Fading out
   w->opacity_tgt = 0;
   set_fade_callback(dpy, w, unmap_callback, False);
+  if (opts.no_fading_openclose)
+    w->fade = False;
 
   // don't care about properties anymore
   // Will get BadWindow if the window is destroyed
@@ -2854,9 +2871,10 @@ usage(void) {
     "-z\n"
     "  Zero the part of the shadow's mask behind the window (experimental).\n"
     "-f\n"
-    "  Fade windows in/out when opening/closing.\n"
+    "  Fade windows in/out when opening/closing and when opacity\n"
+    "  changes, unless --no-fading-openclose is used.\n"
     "-F\n"
-    "  Fade windows during opacity changes.\n"
+    "  Equals -f. Deprecated.\n"
     "-i opacity\n"
     "  Opacity of inactive windows. (0.1 - 1.0)\n"
     "-e opacity\n"
@@ -2885,6 +2903,8 @@ usage(void) {
     "  Exclude conditions for shadows.\n"
     "--mark-ovredir-focused\n"
     "  Mark over-redirect windows as active.\n"
+    "--no-fading-openclose\n"
+    "  Do not fade on window open/close.\n"
     "\n"
     "Format of a condition:\n"
     "\n"
@@ -3119,6 +3139,8 @@ parse_config(char *cpath, struct options_tmp *pcfgtmp) {
   // -f (fading_enable)
   if (config_lookup_bool(&cfg, "fading", &ival) && ival)
     wintype_arr_enable(opts.wintype_fade);
+  // --no-fading-open-close
+  lcfg_lookup_bool(&cfg, "no-fading-openclose", &opts.no_fading_openclose);
   // --shadow-red
   config_lookup_float(&cfg, "shadow-red", &opts.shadow_red);
   // --shadow-green
@@ -3194,6 +3216,7 @@ get_cfg(int argc, char *const *argv) {
     { "mark-wmwin-focused", no_argument, NULL, 262 },
     { "shadow-exclude", required_argument, NULL, 263 },
     { "mark-ovredir-focused", no_argument, NULL, 264 },
+    { "no-fading-openclose", no_argument, NULL, 265 },
     // Must terminate with a NULL entry
     { NULL, 0, NULL, 0 },
   };
@@ -3258,10 +3281,8 @@ get_cfg(int argc, char *const *argv) {
         cfgtmp.menu_opacity = atof(optarg);
         break;
       case 'f':
-        fading_enable = True;
-        break;
       case 'F':
-        opts.fade_trans = True;
+        fading_enable = True;
         break;
       case 'S':
         opts.synchronize = True;
@@ -3332,6 +3353,10 @@ get_cfg(int argc, char *const *argv) {
         // --mark-ovredir-focused
         opts.mark_ovredir_focused = True;
         break;
+      case 265:
+        // --no-fading-openclose
+        opts.no_fading_openclose = True;
+        break;
       default:
         usage();
         break;
diff --git a/compton.h b/compton.h
index f785981e9..0c6457c62 100644
--- a/compton.h
+++ b/compton.h
@@ -270,7 +270,7 @@ typedef struct _options {
   /// How much to fade out in a single fading step.
   opacity_t fade_out_step;
   unsigned long fade_delta;
-  Bool fade_trans;
+  Bool no_fading_openclose;
   /// Fading blacklist. A linked list of conditions.
   wincond *fade_blacklist;
 
@@ -725,6 +725,9 @@ map_win(Display *dpy, Window id,
         unsigned long sequence, Bool fade,
         Bool override_redirect);
 
+static void
+finish_map_win(Display *dpy, win *w);
+
 static void
 finish_unmap_win(Display *dpy, win *w);
 
-- 
cgit v1.2.3

