]>
Commit | Line | Data |
---|---|---|
32630864 | 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; |