]> Dogcows Code - chaz/openbox/blobdiff - render/gradient.c
don't place windows over docks. but let them place over menus and toolbars. i guess...
[chaz/openbox] / render / gradient.c
index 620848b043aac592c7a4091e1be8d9e9361c3911..94d04d258e601e83d07f60ec40613e7b2e5baa8d 100644 (file)
@@ -2,7 +2,7 @@
 
    gradient.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
    Copyright (c) 2003        Derek Foreman
 
    This program is free software; you can redistribute it and/or modify
@@ -24,6 +24,7 @@
 #include <glib.h>
 
 static void highlight(RrPixel32 *x, RrPixel32 *y, gboolean raised);
+static void gradient_parentrelative(RrAppearance *a, gint w, gint h);
 static void gradient_solid(RrAppearance *l, gint w, gint h);
 static void gradient_splitvertical(RrAppearance *a, gint w, gint h);
 static void gradient_vertical(RrSurface *sf, gint w, gint h);
@@ -41,6 +42,9 @@ void RrRender(RrAppearance *a, gint w, gint h)
     gint off, x;
 
     switch (a->surface.grad) {
+    case RR_SURFACE_PARENTREL:
+        gradient_parentrelative(a, w, h);
+        break;
     case RR_SURFACE_SOLID:
         gradient_solid(a, w, h);
         break;
@@ -190,6 +194,34 @@ static void create_bevel_colors(RrAppearance *l)
     l->surface.bevel_dark = RrColorNew(l->inst, r, g, b);
 }
 
+static void gradient_parentrelative(RrAppearance *a, gint w, gint h)
+{
+    RrPixel32 *source, *dest;
+    gint sw, sh, partial_w, partial_h, i;
+
+    g_assert (a->surface.parent);
+    g_assert (a->surface.parent->w);
+
+    sw = a->surface.parent->w;
+    sh = a->surface.parent->h;
+
+    source = (a->surface.parent->surface.pixel_data +
+            a->surface.parentx + sw * a->surface.parenty);
+    dest = a->surface.pixel_data;
+
+    if (a->surface.parentx + w > sw) {
+        partial_w = sw - a->surface.parentx;
+    } else partial_w = w;
+
+    if (a->surface.parenty + h > sh) {
+        partial_h = sh - a->surface.parenty;
+    } else partial_h = h;
+
+    for (i = 0; i < partial_h; i++, source += sw, dest += w) {
+        memcpy(dest, source, partial_w * sizeof(RrPixel32));
+    }
+}
+
 static void gradient_solid(RrAppearance *l, gint w, gint h) 
 {
     gint i;
This page took 0.022667 seconds and 4 git commands to generate.