~dbarth/compiz/reworked-fix-744104

« back to all changes in this revision

Viewing changes to unity/unity_window_decorator/src/util.c

  • Committer: David Barth
  • Date: 2011-04-05 20:20:54 UTC
  • Revision ID: david.barth@canonical.com-20110405202054-fnh0y5t2s228mf4k
re-integrate the unity-window-decorator, for real this time

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "gtk-window-decorator.h"
 
2
 
 
3
double
 
4
square (double x)
 
5
{
 
6
    return x * x;
 
7
}
 
8
 
 
9
double
 
10
dist (double x1, double y1,
 
11
      double x2, double y2)
 
12
{
 
13
    return sqrt (square (x1 - x2) + square (y1 - y2));
 
14
}
 
15
 
 
16
gboolean
 
17
get_window_prop (Window xwindow,
 
18
                 Atom   atom,
 
19
                 Window *val)
 
20
{
 
21
    Atom   type;
 
22
    int    format;
 
23
    gulong nitems;
 
24
    gulong bytes_after;
 
25
    Window *w;
 
26
    int    err, result;
 
27
 
 
28
    *val = 0;
 
29
 
 
30
    gdk_error_trap_push ();
 
31
 
 
32
    type = None;
 
33
    result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
 
34
                                 xwindow,
 
35
                                 atom,
 
36
                                 0, G_MAXLONG,
 
37
                                 False, XA_WINDOW, &type, &format, &nitems,
 
38
                                 &bytes_after, (void*) &w);
 
39
    err = gdk_error_trap_pop ();
 
40
    if (err != Success || result != Success)
 
41
        return FALSE;
 
42
 
 
43
    if (type != XA_WINDOW)
 
44
    {
 
45
        XFree (w);
 
46
        return FALSE;
 
47
    }
 
48
 
 
49
    *val = *w;
 
50
    XFree (w);
 
51
 
 
52
    return TRUE;
 
53
}
 
54
 
 
55
unsigned int
 
56
get_mwm_prop (Window xwindow)
 
57
{
 
58
    Display       *xdisplay;
 
59
    Atom          actual;
 
60
    int           err, result, format;
 
61
    unsigned long n, left;
 
62
    unsigned char *data;
 
63
    unsigned int  decor = MWM_DECOR_ALL;
 
64
 
 
65
    xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
 
66
 
 
67
    gdk_error_trap_push ();
 
68
 
 
69
    result = XGetWindowProperty (xdisplay, xwindow, mwm_hints_atom,
 
70
                                 0L, 20L, FALSE, mwm_hints_atom,
 
71
                                 &actual, &format, &n, &left, &data);
 
72
 
 
73
    err = gdk_error_trap_pop ();
 
74
    if (err != Success || result != Success)
 
75
        return decor;
 
76
 
 
77
    if (data)
 
78
    {
 
79
        MwmHints *mwm_hints = (MwmHints *) data;
 
80
 
 
81
        if (n >= PROP_MOTIF_WM_HINT_ELEMENTS)
 
82
        {
 
83
            if (mwm_hints->flags & MWM_HINTS_DECORATIONS)
 
84
                decor = mwm_hints->decorations;
 
85
        }
 
86
 
 
87
        XFree (data);
 
88
    }
 
89
 
 
90
    return decor;
 
91
}
 
92
 
 
93
/* from clearlooks theme */
 
94
static void
 
95
rgb_to_hls (gdouble *r,
 
96
            gdouble *g,
 
97
            gdouble *b)
 
98
{
 
99
    gdouble min;
 
100
    gdouble max;
 
101
    gdouble red;
 
102
    gdouble green;
 
103
    gdouble blue;
 
104
    gdouble h, l, s;
 
105
    gdouble delta;
 
106
 
 
107
    red = *r;
 
108
    green = *g;
 
109
    blue = *b;
 
110
 
 
111
    if (red > green)
 
112
    {
 
113
        if (red > blue)
 
114
            max = red;
 
115
        else
 
116
            max = blue;
 
117
 
 
118
        if (green < blue)
 
119
            min = green;
 
120
        else
 
121
            min = blue;
 
122
    }
 
123
    else
 
124
    {
 
125
        if (green > blue)
 
126
            max = green;
 
127
        else
 
128
            max = blue;
 
129
 
 
130
        if (red < blue)
 
131
            min = red;
 
132
        else
 
133
            min = blue;
 
134
    }
 
135
 
 
136
    l = (max + min) / 2;
 
137
    s = 0;
 
138
    h = 0;
 
139
 
 
140
    if (max != min)
 
141
    {
 
142
        if (l <= 0.5)
 
143
            s = (max - min) / (max + min);
 
144
        else
 
145
            s = (max - min) / (2 - max - min);
 
146
 
 
147
        delta = max -min;
 
148
        if (red == max)
 
149
            h = (green - blue) / delta;
 
150
        else if (green == max)
 
151
            h = 2 + (blue - red) / delta;
 
152
        else if (blue == max)
 
153
            h = 4 + (red - green) / delta;
 
154
 
 
155
        h *= 60;
 
156
        if (h < 0.0)
 
157
            h += 360;
 
158
    }
 
159
 
 
160
    *r = h;
 
161
    *g = l;
 
162
    *b = s;
 
163
}
 
164
 
 
165
static void
 
166
hls_to_rgb (gdouble *h,
 
167
            gdouble *l,
 
168
            gdouble *s)
 
169
{
 
170
    gdouble hue;
 
171
    gdouble lightness;
 
172
    gdouble saturation;
 
173
    gdouble m1, m2;
 
174
    gdouble r, g, b;
 
175
 
 
176
    lightness = *l;
 
177
    saturation = *s;
 
178
 
 
179
    if (lightness <= 0.5)
 
180
        m2 = lightness * (1 + saturation);
 
181
    else
 
182
        m2 = lightness + saturation - lightness * saturation;
 
183
 
 
184
    m1 = 2 * lightness - m2;
 
185
 
 
186
    if (saturation == 0)
 
187
    {
 
188
        *h = lightness;
 
189
        *l = lightness;
 
190
        *s = lightness;
 
191
    }
 
192
    else
 
193
    {
 
194
        hue = *h + 120;
 
195
        while (hue > 360)
 
196
            hue -= 360;
 
197
        while (hue < 0)
 
198
            hue += 360;
 
199
 
 
200
        if (hue < 60)
 
201
            r = m1 + (m2 - m1) * hue / 60;
 
202
        else if (hue < 180)
 
203
            r = m2;
 
204
        else if (hue < 240)
 
205
            r = m1 + (m2 - m1) * (240 - hue) / 60;
 
206
        else
 
207
            r = m1;
 
208
 
 
209
        hue = *h;
 
210
        while (hue > 360)
 
211
            hue -= 360;
 
212
        while (hue < 0)
 
213
            hue += 360;
 
214
 
 
215
        if (hue < 60)
 
216
            g = m1 + (m2 - m1) * hue / 60;
 
217
        else if (hue < 180)
 
218
            g = m2;
 
219
        else if (hue < 240)
 
220
            g = m1 + (m2 - m1) * (240 - hue) / 60;
 
221
        else
 
222
            g = m1;
 
223
 
 
224
        hue = *h - 120;
 
225
        while (hue > 360)
 
226
            hue -= 360;
 
227
        while (hue < 0)
 
228
            hue += 360;
 
229
 
 
230
        if (hue < 60)
 
231
            b = m1 + (m2 - m1) * hue / 60;
 
232
        else if (hue < 180)
 
233
            b = m2;
 
234
        else if (hue < 240)
 
235
            b = m1 + (m2 - m1) * (240 - hue) / 60;
 
236
        else
 
237
            b = m1;
 
238
 
 
239
        *h = r;
 
240
        *l = g;
 
241
        *s = b;
 
242
    }
 
243
}
 
244
 
 
245
void
 
246
shade (const decor_color_t *a,
 
247
       decor_color_t       *b,
 
248
       float               k)
 
249
{
 
250
    double red;
 
251
    double green;
 
252
    double blue;
 
253
 
 
254
    red   = a->r;
 
255
    green = a->g;
 
256
    blue  = a->b;
 
257
 
 
258
    rgb_to_hls (&red, &green, &blue);
 
259
 
 
260
    green *= k;
 
261
    if (green > 1.0)
 
262
        green = 1.0;
 
263
    else if (green < 0.0)
 
264
        green = 0.0;
 
265
 
 
266
    blue *= k;
 
267
    if (blue > 1.0)
 
268
        blue = 1.0;
 
269
    else if (blue < 0.0)
 
270
        blue = 0.0;
 
271
 
 
272
    hls_to_rgb (&red, &green, &blue);
 
273
 
 
274
    b->r = red;
 
275
    b->g = green;
 
276
    b->b = blue;
 
277
}
 
278