]> git.pld-linux.org Git - packages/WindowMaker.git/blame - WindowMaker-0.91.0-translucency-1.patch
- updated for 0.92.0 + cvs patch
[packages/WindowMaker.git] / WindowMaker-0.91.0-translucency-1.patch
CommitLineData
32630864 1Submitted By: Oliver Brakmann <obrakmann AT gmx DOT net>
2Date: 2004-10-27
3Initial Package version: Windowmaker 0.91.0
4Origin: http://vlaadworld.net/
5Description: Adds translucency to Windowmaker menus. To set the level of
6 translucency, start WPrefs.app and select 'Apperance
7 Preferences -> Options -> Transparency'
8
9diff -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
135diff -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 */
147diff -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 },
163diff -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.071662 seconds and 4 git commands to generate.