]> git.pld-linux.org Git - packages/WindowMaker.git/blob - WindowMaker-0.91.0-translucency-1.patch
- updated for 0.92.0 + cvs patch
[packages/WindowMaker.git] / WindowMaker-0.91.0-translucency-1.patch
1 Submitted By: Oliver Brakmann <obrakmann AT gmx DOT net>
2 Date: 2004-10-27
3 Initial Package version: Windowmaker 0.91.0
4 Origin: http://vlaadworld.net/
5 Description: Adds translucency to Windowmaker menus. To set the level of
6              translucency, start WPrefs.app and select 'Apperance
7              Preferences -> Options -> Transparency'
8
9 diff -Naur WindowMaker-0.91.0-orig/WPrefs.app/Appearance.c WindowMaker-0.91.0/WPrefs.app/Appearance.c
10 --- WindowMaker-0.91.0-orig/WPrefs.app/Appearance.c     2004-10-26 18:34:28.000000000 +0200
11 +++ WindowMaker-0.91.0/WPrefs.app/Appearance.c  2004-10-26 18:40:51.000000000 +0200
12 @@ -82,6 +82,11 @@
13      WMFrame *taliF;
14      WMButton *taliB[3];
15  
16 +       WMFrame *tranceF;
17 +       WMButton *tranceB;
18 +       WMSlider *tranceSl;
19 +       WMLabel *tranceL;
20 +
21      /* root bg */
22      WMFrame *bgF;
23  
24 @@ -1714,6 +1719,23 @@
25      }
26  }
27  
28 +static void 
29 +tranceCallback(WMWidget *self, void *data)
30 +{
31 +       _Panel *panel = (_Panel*)data;
32 +       char buffer[5];
33 +       int i;
34 +
35 +       i = WMGetSliderValue(panel->tranceSl);
36 +       i = 10*(10-i);
37 +
38 +       if (i == 0) {
39 +       WMSetLabelText(panel->tranceL, "OFF");
40 +       } else {
41 +       sprintf(buffer, "%i%%", i);
42 +       WMSetLabelText(panel->tranceL, buffer);
43 +       }
44 +}
45  
46  static void
47  createPanel(Panel *p)
48 @@ -2005,7 +2027,7 @@
49  
50  
51      panel->taliF = WMCreateFrame(panel->optF);
52 -    WMResizeWidget(panel->taliF, 110, 80);
53 +    WMResizeWidget(panel->taliF, 105, 80);
54      WMMoveWidget(panel->taliF, 15, 100);
55      WMSetFrameTitle(panel->taliF, _("Title Alignment"));
56  
57 @@ -2023,7 +2045,7 @@
58              WMSetButtonText(panel->taliB[i], _("Right"));
59              break;
60          }
61 -        WMResizeWidget(panel->taliB[i], 90, 18);
62 +        WMResizeWidget(panel->taliB[i], 85, 18);
63          WMMoveWidget(panel->taliB[i], 10, 15 + 20*i);
64      }
65      WMGroupButtons(panel->taliB[0], panel->taliB[1]);
66 @@ -2031,6 +2053,36 @@
67  
68      WMMapSubwidgets(panel->taliF);
69  
70 +       panel->tranceF = WMCreateFrame(panel->optF);
71 +       WMResizeWidget(panel->tranceF, 105,80);
72 +       WMMoveWidget(panel->tranceF, 125, 100);
73 +       WMSetFrameTitle(panel->tranceF,_("Transparency"));
74 +
75 +       WMSetBalloonTextForView(_("<yermom> i love windowmaker\n"
76 +                                                 "<tarzeau> get some fresh sand-wich-es\n"
77 +                                                 "<flip-> heh\n"
78 +                                                 "<flip-> transparency\n"
79 +                                                 "<flip-> moo\n"
80 +                                                 "<flip-> :P\n"), WMWidgetView(panel->tranceF));
81 +
82 +       panel->tranceB = WMCreateSwitchButton(panel->tranceF);
83 +       WMSetButtonText(panel->tranceB, _("Menu"));
84 +       WMResizeWidget(panel->tranceB,85,18);
85 +       WMMoveWidget(panel->tranceB, 10, 15);
86 +    
87 +       panel->tranceSl = WMCreateSlider(panel->tranceF);
88 +       WMResizeWidget(panel->tranceSl, 70, 18);
89 +       WMMoveWidget(panel->tranceSl, 17, 15 + 20*2);
90 +       WMSetSliderMinValue(panel->tranceSl, 0);
91 +       WMSetSliderMaxValue(panel->tranceSl, 10);
92 +       WMSetSliderAction(panel->tranceSl, tranceCallback, panel);
93 +
94 +       panel->tranceL = WMCreateLabel(panel->tranceF);
95 +       WMResizeWidget(panel->tranceL, 27, 18);
96 +       WMMoveWidget(panel->tranceL, 40, 35);
97 +
98 +       WMMapSubwidgets(panel->tranceF);
99 +
100      WMMapSubwidgets(panel->optF);
101  
102      /**/
103 @@ -2089,6 +2141,7 @@
104  static void
105  showData(_Panel *panel)
106  {
107 +       int x;
108      int i;
109      char *str;
110  
111 @@ -2134,6 +2187,13 @@
112  
113      WMSetButtonSelected(panel->mstyB[panel->menuStyle], True);
114      WMSetButtonSelected(panel->taliB[panel->titleAlignment], True);
115 +
116 +
117 +       WMSetButtonSelected(panel->tranceB, GetBoolForKey("MenuTrance"));
118 +
119 +       x = GetIntegerForKey("TranceAmount");
120 +       WMSetSliderValue(panel->tranceSl, x);
121 +       tranceCallback(NULL, panel);
122  }
123  
124  
125 @@ -2185,6 +2245,9 @@
126          SetStringForKey("center", "TitleJustify");
127          break;
128      }
129 +
130 +       SetBoolForKey(WMGetButtonSelected(panel->tranceB), "MenuTrance");
131 +       SetIntegerForKey(WMGetSliderValue(panel->tranceSl), "TranceAmount");
132  }
133  
134  
135 diff -Naur WindowMaker-0.91.0-orig/src/WindowMaker.h WindowMaker-0.91.0/src/WindowMaker.h
136 --- WindowMaker-0.91.0-orig/src/WindowMaker.h   2004-10-26 18:34:28.000000000 +0200
137 +++ WindowMaker-0.91.0/src/WindowMaker.h        2004-10-26 18:40:51.000000000 +0200
138 @@ -339,6 +339,8 @@
139      char opaque_move;                 /* update window position during */
140      /* move */
141  
142 +       char menu_trance;               /* whether menu should be translucent */
143 +       int trance_amount;              /* percentage of translucency */
144      char wrap_menus;                  /* wrap menus at edge of screen */
145      char scrollable_menus;            /* let them be scrolled */
146      char align_menus;                 /* align menu with their parents */
147 diff -Naur WindowMaker-0.91.0-orig/src/defaults.c WindowMaker-0.91.0/src/defaults.c
148 --- WindowMaker-0.91.0-orig/src/defaults.c      2004-10-26 18:34:28.000000000 +0200
149 +++ WindowMaker-0.91.0/src/defaults.c   2004-10-26 18:40:51.000000000 +0200
150 @@ -502,6 +502,12 @@
151      {"UseSaveUnders",  "NO",                   NULL,
152      &wPreferences.use_saveunders,      getBool,        NULL
153      },
154 +       {"MenuTrance",  "NO",                   NULL,
155 +         &wPreferences.menu_trance,    getBool,        NULL
156 +       },
157 +       {"TranceAmount",        "30",           NULL,
158 +         &wPreferences.trance_amount,  getInt,         NULL
159 +       },
160      {"OpaqueMove",     "NO",                   NULL,
161      &wPreferences.opaque_move, getBool,        NULL
162      },
163 diff -Naur WindowMaker-0.91.0-orig/src/menu.c WindowMaker-0.91.0/src/menu.c
164 --- WindowMaker-0.91.0-orig/src/menu.c  2004-10-26 18:34:28.000000000 +0200
165 +++ WindowMaker-0.91.0/src/menu.c       2004-10-26 18:40:51.000000000 +0200
166 @@ -93,6 +93,7 @@
167  static void menuCloseClick(WCoreWindow *sender, void *data, XEvent *event);
168  
169  static void updateTexture(WMenu *menu);
170 +static void clipDimensionsToScreen(WMenu *menu, int *x, int *y, int *width, int *height);
171  
172  #ifndef LITE
173  static int saveMenuRecurs(WMPropList *menus, WScreen *scr, WMenu *menu);
174 @@ -498,6 +499,120 @@
175  
176  
177  static void
178 +clipDimensionsToScreen(WMenu *menu, int *x, int *y, int *width, int *height)
179 +{
180 +    int sw, sh;
181 +    int fx, fy;
182 +    
183 +    sw = menu->menu->screen_ptr->scr_width;
184 +    sh = menu->menu->screen_ptr->scr_height;
185 +        
186 +    fx = *x + *width;
187 +    fy = *y + *height;
188 +    
189 +    /* CLAMP everything */
190 +    if (*x > sw) { *x = sw; } else if (*x < 0) { *x = 0; }
191 +    if (*y > sh) { *y = sh; } else if (*y < 0) { *y = 0; }
192 +    if (fx > sw) { fx = sw; } else if (fx < 0) { fx = 0; }
193 +    if (fy > sh) { fy = sh; } else if (fy < 0) { fy = 0; } 
194 +    
195 +    /* Make sure that height and width are positive */
196 +    if (fx < *x) { *width = 0; } else { *width = fx - *x; }
197 +    if (fy < *y) { *height = 0; } else { *height = fy - *y; } 
198 +}
199 +
200 +static Pixmap
201 +tranceMenu(WMenu *menu)
202 +{
203 +    WScreen *scr = menu->menu->screen_ptr;
204 +       
205 +       XImage *back, *front;
206 +       RImage *trance, *menu_image, *msnormal;
207 +       Pixmap original, result;
208 +
209 +       int mw, mh, dx, dy; /* these correspond to the menu proper */
210 +       int gx, gy, gw, gh; /* these correspond to what we grab from the root window */
211 +       int tamount;
212 +       unsigned long red_mask, green_mask, blue_mask; 
213 +
214 +       unsigned int w, h, bar;
215 +       int foo; 
216 +       Window baz;
217 +       
218 +       mw = gw = menu->menu->width;
219 +       mh = gh = menu->menu->height;
220 +       dx = gx = menu->frame_x + 1;
221 +       dy = gy = menu->frame_y + menu->frame->top_width + 1;
222 +
223 +       tamount = wPreferences.trance_amount;
224 +       clipDimensionsToScreen(menu, &gx, &gy, &gw, &gh);
225 +       back = XGetImage(dpy, scr->root_win, gx, gy, gw, gh,
226 +                                       AllPlanes, ZPixmap);
227 +       if (!back) {
228 +       wwarning(_("error capturing \"back\" image"),RMessageForError(RErrorCode));
229 +       return None;
230 +       } else {
231 +               red_mask = back->red_mask;
232 +               green_mask = back->green_mask;
233 +               blue_mask = back->blue_mask;
234 +
235 +               trance = RCreateImageFromXImage(scr->rcontext, back, NULL);
236 +               XDestroyImage(back);
237 +               if (!trance) {
238 +               wwarning(_("error rendering \"trance\" image"),
239 +                                               RMessageForError(RErrorCode));
240 +               return None;
241 +               } else {
242 +               /************************************************************/
243 +                       original = renderTexture(menu);
244 +
245 +                   XGetGeometry(dpy, original, &baz, &foo, 
246 +                                               &foo, &w, &h, &bar, &bar);
247 +                       front = XGetImage(dpy, original, 0, 0, w, h,
248 +                                                               AllPlanes, ZPixmap);
249 +                       if (!front) {
250 +                       wwarning(_("error capturing \"front\" image"),
251 +                                                       RMessageForError(RErrorCode));
252 +                       return None;
253 +                       } 
254 +                       front->red_mask = red_mask;
255 +                       front->green_mask = green_mask;
256 +                       front->blue_mask = blue_mask;
257 +
258 +                       menu_image=RCreateImageFromXImage(scr->rcontext,front,NULL);
259 +
260 +                       XDestroyImage(front);
261 +               /************************************************************/
262 +                       if (original) {
263 +                               FREE_PIXMAP(original);
264 +                       }
265 +                       if (!menu_image) {
266 +                       wwarning(_("error rendering \"menu_image\""),
267 +                                                       RMessageForError(RErrorCode));
268 +                       return None;
269 +                       } else {
270 +                               if (wPreferences.menu_style == MS_NORMAL) {
271 +                                       msnormal = RMakeTiledImage(menu_image, mw, mh);
272 +                                       RCombineAreaWithOpaqueness(trance, msnormal,0,0,gw,gh,
273 +                                                                                       gx - dx,gy - dy,256*tamount/10);
274 +                                       RReleaseImage(menu_image);
275 +                                       RReleaseImage(msnormal);
276 +                               } else {
277 +                               RCombineAreaWithOpaqueness(trance, menu_image,0,0,gw,gh,
278 +                                                       gx - dx,gy - dy,256*tamount/10);
279 +                                       RReleaseImage(menu_image);
280 +                               }
281 +                               RConvertImage(scr->rcontext, trance,
282 +                                                       &result);
283 +                       }
284 +                       RReleaseImage(trance);
285 +               }
286 +       }
287 +       return result;
288 +}
289 +
290 +
291 +static void
292  updateTexture(WMenu *menu)
293  {
294      WScreen *scr = menu->menu->screen_ptr;
295 @@ -507,7 +622,11 @@
296          if (!menu->flags.brother) {
297              FREE_PIXMAP(menu->menu_texture_data);
298  
299 -            menu->menu_texture_data = renderTexture(menu);
300 +               if (wPreferences.menu_trance) {
301 +                       menu->menu_texture_data = tranceMenu(menu);
302 +               } else {
303 +               menu->menu_texture_data = renderTexture(menu);
304 +               }
305  
306              XSetWindowBackgroundPixmap(dpy, menu->menu->window,
307                                         menu->menu_texture_data);
308 @@ -1163,6 +1282,11 @@
309          XMoveWindow(dpy, menu->frame->core->window, x, y);
310          menu->frame_x = x;
311          menu->frame_y = y;
312 +               /* FIXME: needs an if */
313 +               if (wPreferences.menu_trance) {
314 +                       updateTexture(menu);
315 +               }
316 +               /*      */
317          XMapWindow(dpy, menu->frame->core->window);
318          wRaiseFrame(menu->frame->core);
319          menu->flags.mapped = 1;
320 @@ -1187,6 +1311,11 @@
321          menu->frame_y = menu->frame->screen_ptr->app_menu_y;
322          XMoveWindow(dpy, menu->frame->core->window, menu->frame_x, menu->frame_y);
323      }
324 +       /* FIXME: needs an if */
325 +       if (wPreferences.menu_trance) {
326 +               updateTexture(menu);
327 +       }
328 +       /*      */
329      XMapWindow(dpy, menu->frame->core->window);
330      wRaiseFrame(menu->frame->core);
331      menu->flags.mapped = 1;
This page took 0.0821 seconds and 3 git commands to generate.