-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: rxvt-unicode-sixel
action: commit
revision:
path_from:
revision_from: 3329d347625de89dceaab4c6f61c7266a1dcf589:
path_to:
revision_to:

git.thebackupbox.net

rxvt-unicode-sixel

git://git.thebackupbox.net/rxvt-unicode-sixel

commit 3329d347625de89dceaab4c6f61c7266a1dcf589
Author: Sasha Vasko <sashavasko@gmail.com>
Date:   Mon Aug 13 22:41:34 2007 +0000

    refactored check_parents into bgPixmap.render(), started cleaning up am_transparent stuff

diff --git a/src/command.C b/src/command.C

index fe90a6eb2b962906bd7baffa786df2cc1b099db8..

index ..6fb40924b1b7ad6264f9b9eef92450c567ede80f 100644

--- a/src/command.C
+++ b/src/command.C
@@ -1490,7 +1490,7 @@ rxvt_term::x_cb (XEvent &ev)
                 /* TODO: replace with update_pixmap() that should unify transparency and bg image handling ! */
                 if (!option (Opt_transparent) && bgPixmap.window_size_sensitive ())
                   {
-                    bgPixmap.render_background ();
+                    bgPixmap.render ();
                     scr_touch (true);
                   }
 #endif
@@ -1500,7 +1500,7 @@ rxvt_term::x_cb (XEvent &ev)

 #ifdef ENABLE_TRANSPARENCY
             if (option (Opt_transparent))
-              bgPixmap.render_background ();
+              bgPixmap.render ();
 #endif
           }
         break;
@@ -1579,11 +1579,6 @@ rxvt_term::x_cb (XEvent &ev)
                 scrollBar.setIdle ();
                 scrollbar_show (0);
               }
-
-#ifdef ENABLE_TRANSPARENCY
-            if (am_transparent && ev.xany.window == parent[0])
-              XClearWindow (dpy, ev.xany.window);
-#endif
           }
         break;

@@ -1841,7 +1836,7 @@ rxvt_term::rootwin_cb (XEvent &ev)
             || ev.xproperty.atom == xa[XA_ESETROOT_PMAP_ID])
           {
             bgPixmap.set_root_pixmap ();
-            bgPixmap.render_background ();
+            bgPixmap.render ();
           }
         break;
     }
@@ -3442,11 +3437,7 @@ rxvt_term::process_xterm_seq (int op, const char *str, char resp)
           else
             changed = bgPixmap.unset_tint ();
           if (changed)
-            {
-              bgPixmap.render_background ();
-              if (am_transparent)
-                want_full_refresh = want_refresh = 1;
-            }
+            bgPixmap.render ();
         }

         break;
@@ -3486,7 +3477,7 @@ rxvt_term::process_xterm_seq (int op, const char *str, char resp)
               }
             if (changed)
               {
-                bgPixmap.render_background ();
+                bgPixmap.render ();
                 scr_touch (true);
               }
           }
diff --git a/src/main.C b/src/main.C

index eaa43d42b55257e20a48bbfa35164826f3598aac..

index ..c80c7ef3dbe74e5ea2d9d609664f1cf5c15848b5 100644

--- a/src/main.C
+++ b/src/main.C
@@ -549,7 +549,7 @@ rxvt_term::init (int argc, const char *const *argv, stringvec *envv)
 #endif
     if (changed)
       {
-        bgPixmap.render_background ();
+        bgPixmap.render ();
         scr_touch (true);
       }
   }
@@ -1154,7 +1154,7 @@ rxvt_term::resize_all_windows (unsigned int newwidth, unsigned int newheight, in
       scr_clear ();
 #ifdef XPM_BACKGROUND
       /* TODO: should that really be here ? */
-      bgPixmap.render_background ();
+      bgPixmap.render ();
 #endif
     }

diff --git a/src/rxvt.h b/src/rxvt.h

index cdc2358d5169942332bfc742c2a95c32aedf72aa..

index ..a31877a2b8f98cebd6a5b9b4accb1e236f7b4d90 100644

--- a/src/rxvt.h
+++ b/src/rxvt.h
@@ -185,8 +185,10 @@ struct  bgPixmap_t {
     tintNeeded      = (1UL<<9),
     tintServerSide  = (1UL<<10),
     tintFlags       = (tintSet|tintServerSide|tintNeeded),
+    blurNeeded      = (1UL<<11),

-    isTransparent   = (1UL<<16)
+    isTransparent   = (1UL<<16),
+    isInvalid       = (1UL<<17)
   };

   unsigned long flags;
@@ -230,7 +232,14 @@ struct  bgPixmap_t {
   bool unset_tint ();
   bool set_shade (const char *shade_str);
   bool set_root_pixmap ();
-  bool make_transparency_pixmap ();
+
+  enum {
+    transpPmapTiled = (1UL<<0),
+    transpPmapTinted = tintNeeded,
+    transpPmapBlured = blurNeeded,
+    transpTransformations = (tintNeeded|blurNeeded)
+  };
+  unsigned long make_transparency_pixmap ();/* returns combination of the above flags */
 # endif

   Pixmap pixmap;
@@ -238,9 +247,9 @@ struct  bgPixmap_t {
   unsigned int pmap_depth;

   bool window_size_sensitive ();
-  void apply_background ();
-  bool render_background ();
-
+  void apply ();
+  bool render ();
+  void invalidate () { flags |= isInvalid; };
 };
 #else
 # undef HAVE_BG_PIXMAP
diff --git a/src/screen.C b/src/screen.C

index 096493ab9259e71356cc35881337e0d5462e692d..

index ..e52b8d16da44eb7d2c50caf542121ee3a0308ac7 100644

--- a/src/screen.C
+++ b/src/screen.C
@@ -1650,9 +1650,6 @@ rxvt_term::scr_rvideo_mode (bool on) NOTHROW
       ::swap (pix_colors[Color_fg], pix_colors[Color_bg]);
 #ifdef HAVE_BG_PIXMAP
       if (bgPixmap.pixmap == None)
-#endif
-#if ENABLE_TRANSPARENCY
-        if (!option (Opt_transparent) || am_transparent == 0)
 #endif
           XSetWindowBackground (dpy, vt, pix_colors[Color_bg]);

@@ -2006,9 +2003,6 @@ rxvt_term::scr_refresh () NOTHROW

 #ifdef HAVE_BG_PIXMAP
   have_bg |= bgPixmap.pixmap != None;
-#endif
-#if ENABLE_TRANSPARENCY
-  have_bg |= option (Opt_transparent) && am_transparent;
 #endif
   ocrow = oldcursor.row; /* is there an old outline cursor on screen? */

@@ -2480,28 +2474,22 @@ rxvt_term::scr_remap_chars () NOTHROW
 void
 rxvt_term::scr_recolour () NOTHROW
 {
-  if (1
-#if ENABLE_TRANSPARENCY
-      && !am_transparent
-#endif
 #ifdef HAVE_BG_PIXMAP
-      && !bgPixmap.pixmap
-#endif
-      )
-    {
-      XSetWindowBackground (dpy, parent[0], pix_colors[Color_border]);
-      XClearWindow (dpy, parent[0]);
-      XSetWindowBackground (dpy, vt, pix_colors[Color_bg]);
-#if HAVE_SCROLLBARS
-      if (scrollBar.win)
-        {
-          XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]);
-          scrollBar.setIdle ();
-          scrollbar_show (0);
-        }
+  bgPixmap.apply ();
+#else
+  XSetWindowBackground (dpy, parent[0], pix_colors[Color_border]);
+  XClearWindow (dpy, parent[0]);
+  XSetWindowBackground (dpy, vt, pix_colors[Color_bg]);
+# if HAVE_SCROLLBARS
+  if (scrollBar.win)
+   {
+     XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]);
+     scrollBar.setIdle ();
+     scrollbar_show (0);
+   }
+# endif
 #endif
-    }
-
+
   scr_clear ();
   scr_touch (true);
   want_refresh = 1;
diff --git a/src/xpm.C b/src/xpm.C

index 133753a3b52a6657fbddda4950ce853eda2eb530..

index ..2e10727474ad77d44bebf07a383a08da06850be1 100644

--- a/src/xpm.C
+++ b/src/xpm.C
@@ -680,11 +680,13 @@ bgPixmap_t::set_shade (const char *shade_str)
  * that pixmap contains tiled portion of the root pixmap that is supposed to be covered by
  * our window.
  */
-bool
+unsigned long
 bgPixmap_t::make_transparency_pixmap ()
 {
+  unsigned long result = 0;
+
   if (target == NULL)
-    return false;
+    return 0;

   /* root dimentions may change from call to call - but Display structure should
    * be always up-to-date, so let's use it :
@@ -705,7 +707,7 @@ bgPixmap_t::make_transparency_pixmap ()
   /* check if we are outside of the visible part of the virtual screen : */
   if (sx + window_width <= 0 || sy + window_height <= 0
       || sx >= root_width || sy >= root_height)
-    return false;
+    return 0;

   if (root_pixmap != None)
     {/* we want to validate the pixmap and get it's size at the same time : */
@@ -722,7 +724,7 @@ bgPixmap_t::make_transparency_pixmap ()
   GC gc = NULL;

   if (tiled_root_pmap == None) /* something really bad happened - abort */
-    return false;
+    return 0;

   if (root_pixmap == None)
     { /* use tricks to obtain the root background image :*/
@@ -755,8 +757,11 @@ bgPixmap_t::make_transparency_pixmap ()
           if (ev_count > 0);
             { /* hooray! - we can grab the image! */
               gc = XCreateGC (dpy, root, 0, NULL);
-              XCopyArea (dpy, src, tiled_root_pmap, gc, 0, 0, window_width, window_height, 0, 0);
-              success = true;
+              if (gc)
+                {
+                  XCopyArea (dpy, src, tiled_root_pmap, gc, 0, 0, window_width, window_height, 0, 0);
+                  success = true;
+                }
             }
           XDestroyWindow (dpy, src);
           XUngrabServer (dpy);
@@ -767,6 +772,8 @@ bgPixmap_t::make_transparency_pixmap ()
             XFreePixmap (dpy, tiled_root_pmap);
             tiled_root_pmap = None;
           }
+        else
+          result |= transpPmapTiled;
     }
   else
     {/* strightforward pixmap copy */
@@ -777,7 +784,11 @@ bgPixmap_t::make_transparency_pixmap ()
       gcv.ts_x_origin = -sx;
       gcv.ts_y_origin = -sy;
       gc = XCreateGC (dpy, root, GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin, &gcv);
-      XFillRectangle (dpy, tiled_root_pmap, gc, 0, 0, window_width, window_height);
+      if (gc)
+        {
+          XFillRectangle (dpy, tiled_root_pmap, gc, 0, 0, window_width, window_height);
+          result |= transpPmapTiled;
+        }
     }

     if (tiled_root_pmap != None)
@@ -800,7 +811,11 @@ bgPixmap_t::make_transparency_pixmap ()
                   XChangeGC (dpy, gc, GCFillStyle | GCForeground | GCFunction, &gcv);
                 else
                   gc = XCreateGC (dpy, root, GCFillStyle | GCForeground | GCFunction, &gcv);
-                XFillRectangle (dpy, tiled_root_pmap, gc, 0, 0, window_width, window_height);
+                if (gc)
+                  {
+                    XFillRectangle (dpy, tiled_root_pmap, gc, 0, 0, window_width, window_height);
+                    result |= transpPmapTinted;
+                  }
               }
            }
         if (pixmap)
@@ -813,6 +828,8 @@ bgPixmap_t::make_transparency_pixmap ()

     if (gc)
       XFreeGC (dpy, gc);
+
+    return result;
 }

 bool
@@ -834,23 +851,110 @@ bgPixmap_t::set_root_pixmap ()
 # endif /* ENABLE_TRANSPARENCY */

 bool
-bgPixmap_t::render_background ()
+bgPixmap_t::render ()
 {
-  /* TODO: temporary implementation - need to move check_parents stuff in here */
+  unsigned long background_flags = 0;
+
+  if (target == NULL)
+    return false;
+
+  invalidate();
 # ifdef ENABLE_TRANSPARENCY
   if (flags & isTransparent)
     {
       /*  we need to re-generate transparency pixmap in that case ! */
-      target->check_our_parents ();
-      return true;
+      background_flags = make_transparency_pixmap ();
+      if (background_flags == 0)
+        return false;
     }
 # endif
+
+  XImage *result = NULL;
 # ifdef HAVE_AFTERIMAGE
-  render_asim (NULL, TINT_LEAVE_SAME);
-  apply_background ();
-  return true;
+  if (original_asim
+      || (background_flags & transpTransformations) != (flags & transpTransformations))
+    {
+      ASImage *background = NULL;
+      ARGB32 as_tint = TINT_LEAVE_SAME;
+      if (background_flags)
+          background = pixmap2ximage (target->asv, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, 100);
+
+      if (!(background_flags & transpPmapTinted) && (flags & tintNeeded))
+        {
+          ShadingInfo as_shade;
+          as_shade.shading = (shade == 0) ? 100 : shade;
+
+          rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
+          tint.get (c);
+          as_shade.tintColor.red = c.r;
+          as_shade.tintColor.green = c.g;
+          as_shade.tintColor.blue = c.b;
+
+          as_tint = shading2tint32 (&as_shade);
+        }
+      if (render_asim (background, as_tint))
+        flags = flags & ~isInvalid;
+      if (background)
+          destroy_asimage (&background);
+    }
+  else if (background_flags && pmap_depth != target->depth)
+    {
+      result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap);
+    }
+# else /* our own client-side tinting */
+  if (background_flags &&
+      (!(background_flags & transpPmapTinted) && (flags & tintNeeded)) || pmap_depth != target->depth)
+    {
+      result = XGetImage (target->dpy, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, ZPixmap);
+      success = False;
+      if (result != NULL && !(background_flags & transpPmapTinted) && (flags & tintNeeded))
+        {
+          rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
+          tint.get (c);
+          ShadeXImage (this, result, shade, c.r, c.g, c.b);
+        }
+    }
 # endif
-  return false;
+  if (result != NULL)
+    {
+      GC gc = XCreateGC (target->dpy, target->vt, 0UL, NULL);
+      if (gc)
+        {
+          if (pmap_depth != target->depth && pixmap != None)
+            {
+              XFreePixmap (target->dpy, pixmap);
+              pixmap = None;
+            }
+          if (pixmap == None)
+            {
+              pixmap = XCreatePixmap (target->dpy, target->vt, result->width, result->height, target->depth);
+              pmap_width = result->width;
+              pmap_height = result->height;
+              pmap_depth = target->depth;
+            }
+          XPutImage (target->dpy, pixmap, gc, result, 0, 0, 0, 0, result->width, result->height);
+          XFreeGC (target->dpy, gc);
+          flags = flags & ~isInvalid;
+        }
+        XDestroyImage (result);
+    }
+
+  if (flags & isInvalid)
+    {
+      if (pixmap != None)
+        {
+          XFreePixmap (target->dpy, pixmap);
+          pixmap = None;
+        }
+// TODO : we need to get rid of that garbadge :
+      target->am_transparent = target->am_pixmap_trans = 0;
+    }
+  else
+    target->am_transparent = target->am_pixmap_trans = 1;
+
+  apply ();
+
+  return true;
 }

 bool
@@ -869,7 +973,7 @@ bgPixmap_t::set_target (rxvt_term *new_target)
 }

 void
-bgPixmap_t::apply_background()
+bgPixmap_t::apply()
 {
   if (target)
     {
@@ -880,28 +984,47 @@ bgPixmap_t::apply_background()
             {
               XSetWindowBackgroundPixmap (target->dpy, target->parent[0], pixmap);
               XSetWindowBackgroundPixmap (target->dpy, target->vt, ParentRelative);
+#  if HAVE_SCROLLBARS
               if (target->scrollBar.win)
                 XSetWindowBackgroundPixmap (target->dpy, target->scrollBar.win, ParentRelative);
+#  endif
             }
           else
 # endif
             {
               /* force old pixmap dereference in case it was transparent before :*/
-              XSetWindowBackground (target->dpy, target->parent[0], target->pix_colors[Color_bg]);
+              XSetWindowBackground (target->dpy, target->parent[0], target->pix_colors[Color_border]);
               XSetWindowBackgroundPixmap (target->dpy, target->vt, pixmap);
               /* do we also need to set scrollbar's background here ? */
+# if HAVE_SCROLLBARS
+              if (target->scrollBar.win)
+                  XSetWindowBackground (target->dpy, target->scrollBar.win, target->pix_colors[Color_border]);
+# endif
             }
         }
       else
         { /* set target background to a pixel */
-          XSetWindowBackground (target->dpy, target->parent[0], target->pix_colors[Color_bg]);
+          XSetWindowBackground (target->dpy, target->parent[0], target->pix_colors[Color_border]);
           XSetWindowBackground (target->dpy, target->vt, target->pix_colors[Color_bg]);
           /* do we also need to set scrollbar's background here ? */
+# if HAVE_SCROLLBARS
+          if (target->scrollBar.win)
+              XSetWindowBackground (target->dpy, target->scrollBar.win, target->pix_colors[Color_border]);
+# endif
         }
       /* don't want Expose on the parent */
       XClearArea (target->dpy, target->parent[0], 0, 0, 0, 0, False);
       /* do want Expose on the vt */
       XClearArea (target->dpy, target->parent[0], 0, 0, 0, 0, True);
+#if HAVE_SCROLLBARS
+      if (target->scrollBar.win)
+        {
+          target->scrollBar.setIdle ();
+          target->scrollbar_show (0);
+        }
+#endif
+      target->want_refresh = target->want_full_refresh = 1;
+      target->flush ();
     }
 }
 #endif				/* HAVE_BG_PIXMAP */
@@ -1184,6 +1307,8 @@ rxvt_term::check_our_parents ()
 void
 rxvt_term::check_our_parents_cb (time_watcher &w)
 {
+#if 0  /* replaced by a bgPixmap_t::render() - leve here temporarily for reference */
+
   int i, aformat, rootdepth;
   unsigned long nitems, bytes_after;
   Atom atype;
@@ -1366,7 +1491,7 @@ rxvt_term::check_our_parents_cb (time_watcher &w)
       if (gc != NULL)
         XFreeGC (dpy, gc);

-      bgPixmap.apply_background();
+      bgPixmap.apply();
       if (!success)
           am_pixmap_trans = 0;
       else
@@ -1390,5 +1515,6 @@ rxvt_term::check_our_parents_cb (time_watcher &w)
             flush ();
         }
     }
+#endif
 }
 #endif

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 11:26:30 2024