2 * Window Maker window manager
4 * Copyright (c) 1997-2002 Alfredo K. Kojima
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
25 #include <X11/Xutil.h>
26 #ifdef KEEP_XKB_LOCK_STATUS
27 #include <X11/XKBlib.h>
28 #endif /* KEEP_XKB_LOCK_STATUS */
35 #include <WINGs/WINGsP.h>
37 #include "WindowMaker.h"
46 #define DBLCLICK_TIME wPreferences.dblclick_time
48 extern WPreferences wPreferences
;
50 static void handleExpose(WObjDescriptor
*desc
, XEvent
*event
);
51 static void handleButtonExpose(WObjDescriptor
*desc
, XEvent
*event
);
53 static void buttonMouseDown(WObjDescriptor
*desc
, XEvent
*event
);
54 static void titlebarMouseDown(WObjDescriptor
*desc
, XEvent
*event
);
55 static void resizebarMouseDown(WObjDescriptor
*desc
, XEvent
*event
);
57 static void checkTitleSize(WFrameWindow
*fwin
);
60 static void paintButton(WCoreWindow
*button
, WTexture
*texture
,
61 unsigned long color
, WPixmap
*image
, int pushed
);
63 static void updateTitlebar(WFrameWindow
*fwin
);
67 wFrameWindowCreate(WScreen
*scr
, int wlevel
, int x
, int y
,
68 int width
, int height
, int *clearance
, int flags
,
69 WTexture
**title_texture
, WTexture
**resize_texture
,
70 WMColor
**color
, WMFont
**font
)
74 fwin
= wmalloc(sizeof(WFrameWindow
));
75 memset(fwin
, 0, sizeof(WFrameWindow
));
77 fwin
->screen_ptr
= scr
;
79 fwin
->flags
.single_texture
= (flags
& WFF_SINGLE_STATE
) ? 1 : 0;
81 fwin
->title_texture
= title_texture
;
82 fwin
->resizebar_texture
= resize_texture
;
83 fwin
->title_color
= color
;
84 fwin
->title_clearance
= clearance
;
86 #ifdef KEEP_XKB_LOCK_STATUS
87 fwin
->languagemode
= XkbGroup1Index
;
88 fwin
->last_languagemode
= XkbGroup2Index
;
91 fwin
->core
= wCoreCreateTopLevel(scr
, x
, y
, width
, height
,
93 ? FRAME_BORDER_WIDTH
: 0);
94 if (wPreferences
.use_saveunders
) {
96 XSetWindowAttributes attribs
;
99 attribs
.save_under
= True
;
100 XChangeWindowAttributes(dpy
, fwin
->core
->window
, vmask
, &attribs
);
103 /* setup stacking information */
104 fwin
->core
->stacking
= wmalloc(sizeof(WStacking
));
105 fwin
->core
->stacking
->above
= NULL
;
106 fwin
->core
->stacking
->under
= NULL
;
107 fwin
->core
->stacking
->child_of
= NULL
;
108 fwin
->core
->stacking
->window_level
= wlevel
;
110 AddToStackList(fwin
->core
);
112 wFrameWindowUpdateBorders(fwin
, flags
);
120 wFrameWindowUpdateBorders(WFrameWindow
*fwin
, int flags
)
126 WScreen
*scr
= fwin
->screen_ptr
;
128 width
= fwin
->core
->width
;
129 if (flags
& WFF_IS_SHADED
)
132 height
= fwin
->core
->height
- fwin
->top_width
- fwin
->bottom_width
;
134 if (flags
& WFF_TITLEBAR
)
135 theight
= WMFontHeight(*fwin
->font
) + (*fwin
->title_clearance
+ TITLEBAR_EXTEND_SPACE
) * 2;
139 if (wPreferences
.new_style
) {
145 if (fwin
->titlebar
) {
146 /* if we had a titlebar and is requesting for one,
147 * check if the size has changed and resize it */
148 if (flags
& WFF_TITLEBAR
) {
149 fwin
->top_width
= theight
;
151 fwin
->flags
.need_texture_remake
= 1;
153 if (wPreferences
.new_style
) {
154 if (fwin
->left_button
) {
155 wCoreConfigure(fwin
->left_button
, 0, 0, bsize
, bsize
);
157 #ifdef XKB_BUTTON_HINT
158 if (fwin
->language_button
)
159 if (fwin
->flags
.hide_left_button
|| !fwin
->left_button
160 || fwin
->flags
.lbutton_dont_fit
) {
161 wCoreConfigure(fwin
->language_button
, 0, 0, bsize
, bsize
);
163 wCoreConfigure(fwin
->language_button
, bsize
, 0, bsize
, bsize
);
168 if (fwin
->right_button
) {
169 wCoreConfigure(fwin
->right_button
, width
-bsize
+1,
172 } else { /* !new_style */
173 if (fwin
->left_button
) {
174 wCoreConfigure(fwin
->left_button
, 3, (theight
-bsize
)/2,
178 #ifdef XKB_BUTTON_HINT
179 if (fwin
->language_button
) {
180 wCoreConfigure(fwin
->language_button
, 6 + bsize
, (theight
-bsize
)/2,
185 if (fwin
->right_button
) {
186 wCoreConfigure(fwin
->right_button
, width
-bsize
-3,
187 (theight
-bsize
)/2, bsize
, bsize
);
190 updateTitlebar(fwin
);
192 /* we had a titlebar, but now we don't need it anymore */
193 for (i
=0; i
< (fwin
->flags
.single_texture
? 1 : 3); i
++) {
194 FREE_PIXMAP(fwin
->title_back
[i
]);
195 if (wPreferences
.new_style
) {
196 FREE_PIXMAP(fwin
->lbutton_back
[i
]);
197 FREE_PIXMAP(fwin
->rbutton_back
[i
]);
198 #ifdef XKB_BUTTON_HINT
199 FREE_PIXMAP(fwin
->languagebutton_back
[i
]);
203 if (fwin
->left_button
)
204 wCoreDestroy(fwin
->left_button
);
205 fwin
->left_button
= NULL
;
207 #ifdef XKB_BUTTON_HINT
208 if (fwin
->language_button
)
209 wCoreDestroy(fwin
->language_button
);
210 fwin
->language_button
= NULL
;
213 if (fwin
->right_button
)
214 wCoreDestroy(fwin
->right_button
);
215 fwin
->right_button
= NULL
;
217 wCoreDestroy(fwin
->titlebar
);
218 fwin
->titlebar
= NULL
;
223 /* if we didn't have a titlebar and are being requested for
225 if (flags
& WFF_TITLEBAR
) {
226 fwin
->top_width
= theight
;
228 fwin
->flags
.titlebar
= 1;
229 fwin
->titlebar
= wCoreCreate(fwin
->core
, 0, 0, width
+1, theight
);
231 if (flags
& WFF_LEFT_BUTTON
) {
232 fwin
->flags
.left_button
= 1;
233 if (wPreferences
.new_style
) {
234 fwin
->left_button
= wCoreCreate(fwin
->core
, 0, 0,
236 if (width
< theight
*4) {
237 fwin
->flags
.lbutton_dont_fit
= 1;
239 XMapRaised(dpy
, fwin
->left_button
->window
);
243 wCoreCreate(fwin
->titlebar
, 3, (theight
-bsize
)/2,
246 XSetWindowBackground(dpy
, fwin
->left_button
->window
,
247 scr
->widget_texture
->normal
.pixel
);
249 if (width
< theight
*3) {
250 fwin
->flags
.lbutton_dont_fit
= 1;
252 XMapRaised(dpy
, fwin
->left_button
->window
);
257 #ifdef XKB_BUTTON_HINT
258 if (flags
& WFF_LANGUAGE_BUTTON
) {
259 fwin
->flags
.language_button
= 1;
260 if (wPreferences
.new_style
) {
261 fwin
->language_button
= wCoreCreate(fwin
->core
,
262 bsize
, 0, bsize
, bsize
);
264 if (width
< theight
*4) {
265 fwin
->flags
.languagebutton_dont_fit
= 1;
267 XMapRaised(dpy
, fwin
->language_button
->window
);
270 fwin
->language_button
=
271 wCoreCreate(fwin
->titlebar
, bsize
+ 6, (theight
-bsize
)/2,
274 XSetWindowBackground(dpy
, fwin
->language_button
->window
,
275 scr
->widget_texture
->normal
.pixel
);
277 if (width
< theight
*3) {
278 fwin
->flags
.languagebutton_dont_fit
= 1;
280 XMapRaised(dpy
, fwin
->language_button
->window
);
286 if (flags
& WFF_RIGHT_BUTTON
) {
287 fwin
->flags
.right_button
= 1;
288 if (wPreferences
.new_style
) {
290 wCoreCreate(fwin
->core
, width
-bsize
+1, 0,
294 wCoreCreate(fwin
->titlebar
, width
-bsize
-3,
295 (theight
-bsize
)/2, bsize
, bsize
);
296 XSetWindowBackground(dpy
, fwin
->right_button
->window
,
297 scr
->widget_texture
->normal
.pixel
);
300 if (width
< theight
*2) {
301 fwin
->flags
.rbutton_dont_fit
= 1;
303 XMapRaised(dpy
, fwin
->right_button
->window
);
307 if (wPreferences
.new_style
)
308 updateTitlebar(fwin
);
310 XMapRaised(dpy
, fwin
->titlebar
->window
);
312 fwin
->flags
.need_texture_remake
= 1;
315 checkTitleSize(fwin
);
317 if (flags
& WFF_RESIZEBAR
) {
318 fwin
->bottom_width
= RESIZEBAR_HEIGHT
;
320 if (!fwin
->resizebar
) {
321 fwin
->flags
.resizebar
= 1;
322 fwin
->resizebar
= wCoreCreate(fwin
->core
, 0,
323 height
+ fwin
->top_width
,
324 width
, RESIZEBAR_HEIGHT
);
325 fwin
->resizebar_corner_width
= RESIZEBAR_CORNER_WIDTH
;
326 if (width
< RESIZEBAR_CORNER_WIDTH
*2 + RESIZEBAR_MIN_WIDTH
) {
327 fwin
->resizebar_corner_width
= (width
- RESIZEBAR_MIN_WIDTH
)/2;
328 if (fwin
->resizebar_corner_width
< 0)
329 fwin
->resizebar_corner_width
= 0;
332 XMapWindow(dpy
, fwin
->resizebar
->window
);
333 XLowerWindow(dpy
, fwin
->resizebar
->window
);
335 fwin
->flags
.need_texture_remake
= 1;
337 if (height
+fwin
->top_width
+fwin
->bottom_width
!= fwin
->core
->height
) {
338 wCoreConfigure(fwin
->resizebar
, 0, height
+ fwin
->top_width
,
339 width
, RESIZEBAR_HEIGHT
);
343 fwin
->bottom_width
= 0;
345 if (fwin
->resizebar
) {
346 fwin
->bottom_width
= 0;
347 wCoreDestroy(fwin
->resizebar
);
348 fwin
->resizebar
= NULL
;
352 if (height
+ fwin
->top_width
+ fwin
->bottom_width
!= fwin
->core
->height
353 && !(flags
& WFF_IS_SHADED
)) {
354 wFrameWindowResize(fwin
, width
,
355 height
+ fwin
->top_width
+ fwin
->bottom_width
);
359 if (flags
& WFF_BORDER
) {
360 XSetWindowBorderWidth(dpy
, fwin
->core
->window
, FRAME_BORDER_WIDTH
);
362 XSetWindowBorderWidth(dpy
, fwin
->core
->window
, 0);
365 /* setup object descriptors */
367 if (fwin
->titlebar
) {
368 fwin
->titlebar
->descriptor
.handle_expose
= handleExpose
;
369 fwin
->titlebar
->descriptor
.parent
= fwin
;
370 fwin
->titlebar
->descriptor
.parent_type
= WCLASS_FRAME
;
371 fwin
->titlebar
->descriptor
.handle_mousedown
= titlebarMouseDown
;
374 if (fwin
->resizebar
) {
375 fwin
->resizebar
->descriptor
.handle_expose
= handleExpose
;
376 fwin
->resizebar
->descriptor
.parent
= fwin
;
377 fwin
->resizebar
->descriptor
.parent_type
= WCLASS_FRAME
;
378 fwin
->resizebar
->descriptor
.handle_mousedown
= resizebarMouseDown
;
381 if (fwin
->left_button
) {
382 fwin
->left_button
->descriptor
.handle_expose
= handleButtonExpose
;
383 fwin
->left_button
->descriptor
.parent
= fwin
;
384 fwin
->left_button
->descriptor
.parent_type
= WCLASS_FRAME
;
385 fwin
->left_button
->descriptor
.handle_mousedown
= buttonMouseDown
;
388 #ifdef XKB_BUTTON_HINT
389 if (fwin
->language_button
) {
390 fwin
->language_button
->descriptor
.handle_expose
= handleButtonExpose
;
391 fwin
->language_button
->descriptor
.parent
= fwin
;
392 fwin
->language_button
->descriptor
.parent_type
= WCLASS_FRAME
;
393 fwin
->language_button
->descriptor
.handle_mousedown
= buttonMouseDown
;
398 if (fwin
->right_button
) {
399 fwin
->right_button
->descriptor
.parent
= fwin
;
400 fwin
->right_button
->descriptor
.parent_type
= WCLASS_FRAME
;
401 fwin
->right_button
->descriptor
.handle_expose
= handleButtonExpose
;
402 fwin
->right_button
->descriptor
.handle_mousedown
= buttonMouseDown
;
405 checkTitleSize(fwin
);
411 wFrameWindowDestroy(WFrameWindow
*fwin
)
415 if (fwin
->left_button
)
416 wCoreDestroy(fwin
->left_button
);
418 #ifdef XKB_BUTTON_HINT
419 if (fwin
->language_button
)
420 wCoreDestroy(fwin
->language_button
);
423 if (fwin
->right_button
)
424 wCoreDestroy(fwin
->right_button
);
427 wCoreDestroy(fwin
->resizebar
);
430 wCoreDestroy(fwin
->titlebar
);
432 RemoveFromStackList(fwin
->core
);
434 wCoreDestroy(fwin
->core
);
439 for (i
=0; i
< (fwin
->flags
.single_texture
? 1 : 3); i
++) {
440 FREE_PIXMAP(fwin
->title_back
[i
]);
441 if (wPreferences
.new_style
) {
442 FREE_PIXMAP(fwin
->lbutton_back
[i
]);
443 #ifdef XKB_BUTTON_HINT
444 FREE_PIXMAP(fwin
->languagebutton_back
[i
]);
446 FREE_PIXMAP(fwin
->rbutton_back
[i
]);
455 wFrameWindowChangeState(WFrameWindow
*fwin
, int state
)
457 if (fwin
->flags
.state
==state
)
460 fwin
->flags
.state
= state
;
461 fwin
->flags
.need_texture_change
= 1;
463 wFrameWindowPaint(fwin
);
468 updateTitlebar(WFrameWindow
*fwin
)
473 theight
= WMFontHeight(*fwin
->font
) + (*fwin
->title_clearance
+ TITLEBAR_EXTEND_SPACE
) * 2;
476 w
= fwin
->core
->width
+ 1;
478 if (wPreferences
.new_style
) {
479 if (fwin
->flags
.hide_left_button
|| !fwin
->left_button
480 || fwin
->flags
.lbutton_dont_fit
) {
482 #ifdef XKB_BUTTON_HINT
483 if(fwin
->language_button
)
484 wCoreConfigure(fwin
->language_button
, 0, 0,
485 fwin
->language_button
->width
,
486 fwin
->language_button
->width
);
489 #ifdef XKB_BUTTON_HINT
490 if(fwin
->language_button
)
491 wCoreConfigure(fwin
->language_button
, fwin
->left_button
->width
, 0,
492 fwin
->language_button
->width
,
493 fwin
->language_button
->width
);
495 x
= fwin
->left_button
->width
;
496 w
-= fwin
->left_button
->width
;
498 #ifdef XKB_BUTTON_HINT
499 if (fwin
->flags
.hide_language_button
|| !fwin
->language_button
500 || fwin
->flags
.languagebutton_dont_fit
) {
502 x
+= fwin
->language_button
->width
;
503 w
-= fwin
->language_button
->width
;
507 #ifdef XKB_BUTTON_HINT
509 int bsize
= theight
- 7;
510 if (fwin
->flags
.hide_left_button
|| !fwin
->left_button
511 || fwin
->flags
.lbutton_dont_fit
) {
512 if(fwin
->language_button
)
513 wCoreConfigure(fwin
->language_button
, 3, (theight
-bsize
)/2,
514 fwin
->language_button
->width
,
515 fwin
->language_button
->width
);
518 if(fwin
->language_button
)
519 wCoreConfigure(fwin
->language_button
,
520 6 + fwin
->left_button
->width
, (theight
-bsize
)/2,
521 fwin
->language_button
->width
,
522 fwin
->language_button
->width
);
527 if (wPreferences
.new_style
) {
528 if (!fwin
->flags
.hide_right_button
&& fwin
->right_button
529 && !fwin
->flags
.rbutton_dont_fit
) {
530 w
-= fwin
->right_button
->width
;
534 if (wPreferences
.new_style
|| fwin
->titlebar
->width
!=w
)
535 fwin
->flags
.need_texture_remake
= 1;
537 wCoreConfigure(fwin
->titlebar
, x
, 0, w
, theight
);
542 wFrameWindowHideButton(WFrameWindow
*fwin
, int flags
)
544 if ((flags
& WFF_RIGHT_BUTTON
) && fwin
->right_button
) {
545 XUnmapWindow(dpy
, fwin
->right_button
->window
);
546 fwin
->flags
.hide_right_button
= 1;
549 if ((flags
& WFF_LEFT_BUTTON
) && fwin
->left_button
) {
550 XUnmapWindow(dpy
, fwin
->left_button
->window
);
551 fwin
->flags
.hide_left_button
= 1;
554 #ifdef XKB_BUTTON_HINT
555 if ((flags
& WFF_LANGUAGE_BUTTON
) && fwin
->language_button
) {
556 XUnmapWindow(dpy
, fwin
->language_button
->window
);
557 fwin
->flags
.hide_language_button
= 1;
561 if (fwin
->titlebar
) {
562 if (wPreferences
.new_style
) {
563 updateTitlebar(fwin
);
565 #ifdef XKB_BUTTON_HINT
566 updateTitlebar(fwin
);
568 XClearWindow(dpy
, fwin
->titlebar
->window
);
569 wFrameWindowPaint(fwin
);
572 checkTitleSize(fwin
);
578 wFrameWindowShowButton(WFrameWindow
*fwin
, int flags
)
580 if ((flags
& WFF_RIGHT_BUTTON
) && fwin
->right_button
581 && fwin
->flags
.hide_right_button
) {
583 if (!fwin
->flags
.rbutton_dont_fit
)
584 XMapWindow(dpy
, fwin
->right_button
->window
);
586 fwin
->flags
.hide_right_button
= 0;
589 #ifdef XKB_BUTTON_HINT
590 if ((flags
& WFF_LANGUAGE_BUTTON
) && fwin
->language_button
591 && fwin
->flags
.hide_language_button
) {
593 if (!fwin
->flags
.languagebutton_dont_fit
)
594 XMapWindow(dpy
, fwin
->language_button
->window
);
596 fwin
->flags
.hide_language_button
= 0;
600 if ((flags
& WFF_LEFT_BUTTON
) && fwin
->left_button
601 && fwin
->flags
.hide_left_button
) {
603 if (!fwin
->flags
.lbutton_dont_fit
)
604 XMapWindow(dpy
, fwin
->left_button
->window
);
606 fwin
->flags
.hide_left_button
= 0;
610 if (fwin
->titlebar
) {
611 if (wPreferences
.new_style
) {
612 updateTitlebar(fwin
);
614 XClearWindow(dpy
, fwin
->titlebar
->window
);
615 wFrameWindowPaint(fwin
);
617 checkTitleSize(fwin
);
623 #ifdef XKB_BUTTON_HINT
624 renderTexture(WScreen
*scr
, WTexture
*texture
, int width
, int height
,
625 int bwidth
, int bheight
, int left
, int language
, int right
,
626 Pixmap
*title
, Pixmap
*lbutton
, Pixmap
*languagebutton
, Pixmap
*rbutton
)
628 renderTexture(WScreen
*scr
, WTexture
*texture
, int width
, int height
,
629 int bwidth
, int bheight
, int left
, int right
,
630 Pixmap
*title
, Pixmap
*lbutton
, Pixmap
*rbutton
)
634 RImage
*limg
, *rimg
, *mimg
;
635 #ifdef XKB_BUTTON_HINT
643 #ifdef XKB_BUTTON_HINT
644 *languagebutton
= None
;
647 img
= wTextureRenderImage(texture
, width
, height
, WREL_FLAT
);
649 wwarning(_("could not render texture: %s"), RMessageForError(RErrorCode
));
653 if (wPreferences
.new_style
) {
655 limg
= RGetSubImage(img
, 0, 0, bwidth
, bheight
);
662 #ifdef XKB_BUTTON_HINT
664 timg
= RGetSubImage(img
, bwidth
* left
, 0, bwidth
, bheight
);
670 RBevelImage(limg
, RBEV_RAISED2
);
671 if (!RConvertImage(scr
->rcontext
, limg
, lbutton
)) {
672 wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode
));
679 #ifdef XKB_BUTTON_HINT
681 RBevelImage(timg
, RBEV_RAISED2
);
682 if (!RConvertImage(scr
->rcontext
, timg
, languagebutton
)) {
683 wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode
));
692 rimg
= RGetSubImage(img
, width
- bwidth
, 0, bwidth
, bheight
);
697 RBevelImage(rimg
, RBEV_RAISED2
);
698 if (!RConvertImage(scr
->rcontext
, rimg
, rbutton
)) {
699 wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode
));
706 mimg
= RGetSubImage(img
, x
, 0, w
, img
->height
);
707 RBevelImage(mimg
, RBEV_RAISED2
);
709 if (!RConvertImage(scr
->rcontext
, mimg
, title
)) {
710 wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode
));
714 RBevelImage(img
, RBEV_RAISED2
);
716 if (!RConvertImage(scr
->rcontext
, img
, title
)) {
717 wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode
));
721 RBevelImage(img
, RBEV_RAISED2
);
723 if (!RConvertImage(scr
->rcontext
, img
, title
)) {
724 wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode
));
733 renderResizebarTexture(WScreen
*scr
, WTexture
*texture
, int width
, int height
,
734 int cwidth
, Pixmap
*pmap
)
742 img
= wTextureRenderImage(texture
, width
, height
, WREL_FLAT
);
744 wwarning(_("could not render texture: %s"),
745 RMessageForError(RErrorCode
));
750 light
.red
= light
.green
= light
.blue
= 80;
753 dark
.red
= dark
.green
= dark
.blue
= 40;
755 ROperateLine(img
, RSubtractOperation
, 0, 0, width
-1, 0, &dark
);
756 ROperateLine(img
, RAddOperation
, 0, 1, width
-1, 1, &light
);
758 ROperateLine(img
, RSubtractOperation
, cwidth
, 2, cwidth
, height
-1, &dark
);
759 ROperateLine(img
, RAddOperation
, cwidth
+1, 2, cwidth
+1, height
-1, &light
);
762 ROperateLine(img
, RSubtractOperation
, width
-cwidth
-2, 2,
763 width
-cwidth
-2, height
-1, &dark
);
764 ROperateLine(img
, RAddOperation
, width
-cwidth
-1, 2, width
-cwidth
-1,
767 #ifdef SHADOW_RESIZEBAR
768 ROperateLine(img
, RAddOperation
, 0, 1, 0, height
-1, &light
);
769 ROperateLine(img
, RSubtractOperation
, width
-1, 1, width
-1, height
-1,
771 ROperateLine(img
, RSubtractOperation
, 0, height
-1, width
-1, height
-1,
773 #endif /* SHADOW_RESIZEBAR */
776 if (!RConvertImage(scr
->rcontext
, img
, pmap
)) {
777 wwarning(_("error rendering image: %s"), RMessageForError(RErrorCode
));
786 updateTexture(WFrameWindow
*fwin
)
791 i
= fwin
->flags
.state
;
792 if (fwin
->titlebar
) {
793 if (fwin
->title_texture
[i
]->any
.type
!=WTEX_SOLID
) {
794 XSetWindowBackgroundPixmap(dpy
, fwin
->titlebar
->window
,
795 fwin
->title_back
[i
]);
796 if (wPreferences
.new_style
) {
797 if (fwin
->left_button
&& fwin
->lbutton_back
[i
])
798 XSetWindowBackgroundPixmap(dpy
, fwin
->left_button
->window
,
799 fwin
->lbutton_back
[i
]);
801 #ifdef XKB_BUTTON_HINT
802 if (fwin
->language_button
&& fwin
->languagebutton_back
[i
]) {
803 XSetWindowBackgroundPixmap(dpy
, fwin
->language_button
->window
,
804 fwin
->languagebutton_back
[i
]);
808 if (fwin
->right_button
&& fwin
->rbutton_back
[i
])
809 XSetWindowBackgroundPixmap(dpy
, fwin
->right_button
->window
,
810 fwin
->rbutton_back
[i
]);
813 pixel
= fwin
->title_texture
[i
]->solid
.normal
.pixel
;
814 XSetWindowBackground(dpy
, fwin
->titlebar
->window
, pixel
);
815 if (wPreferences
.new_style
) {
816 if (fwin
->left_button
)
817 XSetWindowBackground(dpy
, fwin
->left_button
->window
,
819 #ifdef XKB_BUTTON_HINT
820 if (fwin
->language_button
)
821 XSetWindowBackground(dpy
, fwin
->language_button
->window
,
824 if (fwin
->right_button
)
825 XSetWindowBackground(dpy
, fwin
->right_button
->window
,
829 XClearWindow(dpy
, fwin
->titlebar
->window
);
831 if (fwin
->left_button
) {
832 XClearWindow(dpy
, fwin
->left_button
->window
);
833 handleButtonExpose(&fwin
->left_button
->descriptor
, NULL
);
835 #ifdef XKB_BUTTON_HINT
836 if (fwin
->language_button
) {
837 XClearWindow(dpy
, fwin
->language_button
->window
);
838 handleButtonExpose(&fwin
->language_button
->descriptor
, NULL
);
841 if (fwin
->right_button
) {
842 XClearWindow(dpy
, fwin
->right_button
->window
);
843 handleButtonExpose(&fwin
->right_button
->descriptor
, NULL
);
851 remakeTexture(WFrameWindow
*fwin
, int state
)
853 Pixmap pmap
, lpmap
, rpmap
;
854 #ifdef XKB_BUTTON_HINT
858 if (fwin
->title_texture
[state
] && fwin
->titlebar
) {
859 FREE_PIXMAP(fwin
->title_back
[state
]);
860 if (wPreferences
.new_style
) {
861 FREE_PIXMAP(fwin
->lbutton_back
[state
]);
862 FREE_PIXMAP(fwin
->rbutton_back
[state
]);
863 #ifdef XKB_BUTTON_HINT
864 FREE_PIXMAP(fwin
->languagebutton_back
[state
]);
868 if (fwin
->title_texture
[state
]->any
.type
!=WTEX_SOLID
) {
871 #ifdef XKB_BUTTON_HINT
875 /* eventually surrounded by if new_style */
876 left
= fwin
->left_button
&& !fwin
->flags
.hide_left_button
877 && !fwin
->flags
.lbutton_dont_fit
;
878 #ifdef XKB_BUTTON_HINT
879 language
= fwin
->language_button
&& !fwin
->flags
.hide_language_button
880 && !fwin
->flags
.languagebutton_dont_fit
;
882 right
= fwin
->right_button
&& !fwin
->flags
.hide_right_button
883 && !fwin
->flags
.rbutton_dont_fit
;
885 width
= fwin
->core
->width
+1;
887 #ifdef XKB_BUTTON_HINT
888 renderTexture(fwin
->screen_ptr
, fwin
->title_texture
[state
],
889 width
, fwin
->titlebar
->height
,
890 fwin
->titlebar
->height
, fwin
->titlebar
->height
,
891 left
, language
, right
, &pmap
, &lpmap
, &tpmap
, &rpmap
);
893 renderTexture(fwin
->screen_ptr
, fwin
->title_texture
[state
],
894 width
, fwin
->titlebar
->height
,
895 fwin
->titlebar
->height
, fwin
->titlebar
->height
,
896 left
, right
, &pmap
, &lpmap
, &rpmap
);
899 fwin
->title_back
[state
] = pmap
;
900 if (wPreferences
.new_style
) {
901 fwin
->lbutton_back
[state
] = lpmap
;
902 fwin
->rbutton_back
[state
] = rpmap
;
903 #ifdef XKB_BUTTON_HINT
904 fwin
->languagebutton_back
[state
] = tpmap
;
909 if (fwin
->resizebar_texture
&& fwin
->resizebar_texture
[0]
910 && fwin
->resizebar
&& state
== 0) {
912 FREE_PIXMAP(fwin
->resizebar_back
[0]);
914 if (fwin
->resizebar_texture
[0]->any
.type
!=WTEX_SOLID
) {
916 renderResizebarTexture(fwin
->screen_ptr
,
917 fwin
->resizebar_texture
[0],
918 fwin
->resizebar
->width
,
919 fwin
->resizebar
->height
,
920 fwin
->resizebar_corner_width
,
923 fwin
->resizebar_back
[0] = pmap
;
926 /* this part should be in updateTexture() */
927 if (fwin
->resizebar_texture
[0]->any
.type
!=WTEX_SOLID
) {
928 XSetWindowBackgroundPixmap(dpy
, fwin
->resizebar
->window
,
929 fwin
->resizebar_back
[0]);
931 XSetWindowBackground(dpy
, fwin
->resizebar
->window
,
932 fwin
->resizebar_texture
[0]->solid
.normal
.pixel
);
934 XClearWindow(dpy
, fwin
->resizebar
->window
);
940 wFrameWindowPaint(WFrameWindow
*fwin
)
942 WScreen
*scr
= fwin
->screen_ptr
;
945 state
= fwin
->flags
.state
;
947 if (fwin
->flags
.is_client_window_frame
)
948 fwin
->flags
.justification
= wPreferences
.title_justification
;
950 if (fwin
->flags
.need_texture_remake
) {
953 fwin
->flags
.need_texture_remake
= 0;
954 fwin
->flags
.need_texture_change
= 0;
956 if (fwin
->flags
.single_texture
) {
957 remakeTexture(fwin
, 0);
960 /* first render the texture for the current state... */
961 remakeTexture(fwin
, state
);
962 /* ... and paint it */
965 for (i
=0; i
< 3; i
++) {
967 remakeTexture(fwin
, i
);
973 if (fwin
->flags
.need_texture_change
) {
974 fwin
->flags
.need_texture_change
= 0;
979 if (fwin
->titlebar
&& !fwin
->flags
.repaint_only_resizebar
980 && fwin
->title_texture
[state
]->any
.type
==WTEX_SOLID
) {
981 wDrawBevel(fwin
->titlebar
->window
, fwin
->titlebar
->width
,
982 fwin
->titlebar
->height
,
983 (WTexSolid
*)fwin
->title_texture
[state
],
987 if (fwin
->resizebar
&& !fwin
->flags
.repaint_only_titlebar
988 && fwin
->resizebar_texture
[0]->any
.type
== WTEX_SOLID
) {
993 WTexSolid
*texture
= (WTexSolid
*)fwin
->resizebar_texture
[0];
995 w
= fwin
->resizebar
->width
;
996 h
= fwin
->resizebar
->height
;
997 cw
= fwin
->resizebar_corner_width
;
998 light_gc
= texture
->light_gc
;
999 dim_gc
= texture
->dim_gc
;
1000 win
= fwin
->resizebar
->window
;
1002 XDrawLine(dpy
, win
, dim_gc
, 0, 0, w
, 0);
1003 XDrawLine(dpy
, win
, light_gc
, 0, 1, w
, 1);
1005 XDrawLine(dpy
, win
, dim_gc
, cw
, 2, cw
, h
);
1006 XDrawLine(dpy
, win
, light_gc
, cw
+1, 2, cw
+1, h
);
1008 XDrawLine(dpy
, win
, dim_gc
, w
-cw
-2, 2, w
-cw
-2, h
);
1009 XDrawLine(dpy
, win
, light_gc
, w
-cw
-1, 2, w
-cw
-1, h
);
1011 #ifdef SHADOW_RESIZEBAR
1012 XDrawLine(dpy
, win
, light_gc
, 0, 1, 0, h
-1);
1013 XDrawLine(dpy
, win
, dim_gc
, w
-1, 2, w
-1, h
-1);
1014 XDrawLine(dpy
, win
, dim_gc
, 1, h
-1, cw
, h
-1);
1015 XDrawLine(dpy
, win
, dim_gc
, cw
+2, h
-1, w
-cw
-2, h
-1);
1016 XDrawLine(dpy
, win
, dim_gc
, w
-cw
, h
-1, w
-1, h
-1);
1017 #endif /* SHADOW_RESIZEBAR */
1021 if (fwin
->titlebar
&& !fwin
->flags
.repaint_only_resizebar
) {
1023 int lofs
= 6, rofs
= 6;
1028 if (!wPreferences
.new_style
) {
1029 if (fwin
->left_button
&& !fwin
->flags
.hide_left_button
1030 && !fwin
->flags
.lbutton_dont_fit
)
1031 lofs
+= fwin
->left_button
->width
+ 3;
1035 #ifdef XKB_BUTTON_HINT
1036 if (fwin
->language_button
&& !fwin
->flags
.hide_language_button
1037 && !fwin
->flags
.languagebutton_dont_fit
)
1038 lofs
+= fwin
->language_button
->width
;
1043 if (fwin
->right_button
&& !fwin
->flags
.hide_right_button
1044 && !fwin
->flags
.rbutton_dont_fit
)
1045 rofs
+= fwin
->right_button
->width
+ 3;
1050 #ifdef XKB_BUTTON_HINT
1051 fwin
->languagebutton_image
=
1052 scr
->b_pixmaps
[WBUT_XKBGROUP1
+ fwin
->languagemode
];
1059 title
= ShrinkString(*fwin
->font
, fwin
->title
,
1060 fwin
->titlebar
->width
- lofs
- rofs
);
1061 titlelen
= strlen(title
);
1062 w
= WMWidthOfString(*fwin
->font
, title
, titlelen
);
1064 switch (fwin
->flags
.justification
) {
1070 x
= fwin
->titlebar
->width
- w
- rofs
;
1075 x
= lofs
+ (fwin
->titlebar
->width
- w
- lofs
- rofs
) / 2;
1077 x
= (fwin
->titlebar
->width
- w
) / 2;
1081 y
= *fwin
->title_clearance
+ TITLEBAR_EXTEND_SPACE
;
1082 h
= WMFontHeight(*fwin
->font
);
1084 buf
= XCreatePixmap(dpy
, fwin
->titlebar
->window
, w
, h
,
1087 XSetClipMask(dpy
, scr
->copy_gc
, None
);
1089 if (fwin
->title_texture
[state
]->any
.type
!=WTEX_SOLID
) {
1090 XCopyArea(dpy
, fwin
->title_back
[state
], buf
, scr
->copy_gc
,
1093 XSetForeground(dpy
, scr
->copy_gc
,
1094 fwin
->title_texture
[state
]->solid
.normal
.pixel
);
1095 XFillRectangle(dpy
, buf
, scr
->copy_gc
, 0, 0, w
, h
);
1098 WMDrawString(scr
->wmscreen
, buf
, fwin
->title_color
[state
],
1099 *fwin
->font
, 0, 0, title
, titlelen
);
1101 XCopyArea(dpy
, buf
, fwin
->titlebar
->window
, scr
->copy_gc
,
1104 XFreePixmap(dpy
, buf
);
1109 if (fwin
->left_button
)
1110 handleButtonExpose(&fwin
->left_button
->descriptor
, NULL
);
1111 if (fwin
->right_button
)
1112 handleButtonExpose(&fwin
->right_button
->descriptor
, NULL
);
1113 #ifdef XKB_BUTTON_HINT
1114 if (fwin
->language_button
)
1115 handleButtonExpose(&fwin
->language_button
->descriptor
, NULL
);
1122 reconfigure(WFrameWindow
*fwin
, int x
, int y
, int width
, int height
,
1125 int k
= (wPreferences
.new_style
? 4 : 3);
1126 int resizedHorizontally
= 0;
1129 XResizeWindow(dpy
, fwin
->core
->window
, width
, height
);
1131 XMoveResizeWindow(dpy
, fwin
->core
->window
, x
, y
, width
, height
);
1134 if (fwin->core->height != height && fwin->resizebar)
1135 XMoveWindow(dpy, fwin->resizebar->window, 0,
1136 height - fwin->resizebar->height);
1138 if (fwin
->core
->width
!= width
) {
1139 fwin
->flags
.need_texture_remake
= 1;
1140 resizedHorizontally
= 1;
1143 fwin
->core
->width
= width
;
1144 fwin
->core
->height
= height
;
1146 if (fwin
->titlebar
&& resizedHorizontally
) {
1147 /* Check if the titlebar is wide enough to hold the buttons.
1148 * Temporarily remove them if can't
1150 if (fwin
->left_button
) {
1151 if (width
< fwin
->top_width
*k
&& !fwin
->flags
.lbutton_dont_fit
) {
1153 if (!fwin
->flags
.hide_left_button
) {
1154 XUnmapWindow(dpy
, fwin
->left_button
->window
);
1156 fwin
->flags
.lbutton_dont_fit
= 1;
1157 } else if (width
>= fwin
->top_width
*k
&& fwin
->flags
.lbutton_dont_fit
) {
1159 if (!fwin
->flags
.hide_left_button
) {
1160 XMapWindow(dpy
, fwin
->left_button
->window
);
1162 fwin
->flags
.lbutton_dont_fit
= 0;
1166 #ifdef XKB_BUTTON_HINT
1167 if (fwin
->language_button
) {
1168 if (width
< fwin
->top_width
*k
&& !fwin
->flags
.languagebutton_dont_fit
) {
1170 if (!fwin
->flags
.hide_language_button
) {
1171 XUnmapWindow(dpy
, fwin
->language_button
->window
);
1173 fwin
->flags
.languagebutton_dont_fit
= 1;
1174 } else if (width
>= fwin
->top_width
*k
&& fwin
->flags
.languagebutton_dont_fit
) {
1176 if (!fwin
->flags
.hide_language_button
) {
1177 XMapWindow(dpy
, fwin
->language_button
->window
);
1179 fwin
->flags
.languagebutton_dont_fit
= 0;
1184 if (fwin
->right_button
) {
1185 if (width
< fwin
->top_width
*2 && !fwin
->flags
.rbutton_dont_fit
) {
1187 if (!fwin
->flags
.hide_right_button
) {
1188 XUnmapWindow(dpy
, fwin
->right_button
->window
);
1190 fwin
->flags
.rbutton_dont_fit
= 1;
1191 } else if (width
>= fwin
->top_width
*2 && fwin
->flags
.rbutton_dont_fit
) {
1193 if (!fwin
->flags
.hide_right_button
) {
1194 XMapWindow(dpy
, fwin
->right_button
->window
);
1196 fwin
->flags
.rbutton_dont_fit
= 0;
1200 if (wPreferences
.new_style
) {
1201 if (fwin
->right_button
)
1202 XMoveWindow(dpy
, fwin
->right_button
->window
,
1203 width
- fwin
->right_button
->width
+ 1, 0);
1205 if (fwin
->right_button
)
1206 XMoveWindow(dpy
, fwin
->right_button
->window
,
1207 width
- fwin
->right_button
->width
- 3,
1208 (fwin
->titlebar
->height
- fwin
->right_button
->height
)/2);
1210 updateTitlebar(fwin
);
1211 checkTitleSize(fwin
);
1214 if (fwin
->resizebar
) {
1215 wCoreConfigure(fwin
->resizebar
, 0,
1216 fwin
->core
->height
- fwin
->resizebar
->height
,
1217 fwin
->core
->width
, fwin
->resizebar
->height
);
1219 fwin
->resizebar_corner_width
= RESIZEBAR_CORNER_WIDTH
;
1220 if (fwin
->core
->width
< RESIZEBAR_CORNER_WIDTH
*2 + RESIZEBAR_MIN_WIDTH
) {
1221 fwin
->resizebar_corner_width
= fwin
->core
->width
/2;
1227 wFrameWindowConfigure(WFrameWindow
*fwin
, int x
, int y
, int width
, int height
)
1229 reconfigure(fwin
, x
, y
, width
, height
, False
);
1233 wFrameWindowResize(WFrameWindow
*fwin
, int width
, int height
)
1235 reconfigure(fwin
, 0, 0, width
, height
, True
);
1241 wFrameWindowChangeTitle(WFrameWindow
*fwin
, char *new_title
)
1243 /* check if the title is the same as before */
1245 if (new_title
&& (strcmp(fwin
->title
, new_title
) == 0)) {
1256 fwin
->title
= wstrdup(new_title
);
1258 if (fwin
->titlebar
) {
1259 XClearWindow(dpy
, fwin
->titlebar
->window
);
1261 wFrameWindowPaint(fwin
);
1263 checkTitleSize(fwin
);
1271 wFrameWindowUpdatePushButton(WFrameWindow
*fwin
, Bool pushed
)
1273 fwin
->flags
.right_button_pushed_in
= pushed
;
1275 paintButton(fwin
->right_button
, fwin
->title_texture
[fwin
->flags
.state
],
1276 WMColorPixel(fwin
->title_color
[fwin
->flags
.state
]),
1277 fwin
->rbutton_image
, pushed
);
1279 #endif /* OLWM_HINTS */
1282 #ifdef XKB_BUTTON_HINT
1284 wFrameWindowUpdateLanguageButton(WFrameWindow
*fwin
)
1286 paintButton(fwin
->language_button
, fwin
->title_texture
[fwin
->flags
.state
],
1287 WMColorPixel(fwin
->title_color
[fwin
->flags
.state
]),
1288 fwin
->languagebutton_image
, True
);
1290 #endif /* XKB_BUTTON_HINT */
1293 /*********************************************************************/
1296 handleExpose(WObjDescriptor
*desc
, XEvent
*event
)
1298 WFrameWindow
*fwin
= (WFrameWindow
*)desc
->parent
;
1301 if (fwin
->titlebar
&& fwin
->titlebar
->window
== event
->xexpose
.window
)
1302 fwin
->flags
.repaint_only_titlebar
= 1;
1303 if (fwin
->resizebar
&& fwin
->resizebar
->window
== event
->xexpose
.window
)
1304 fwin
->flags
.repaint_only_resizebar
= 1;
1305 wFrameWindowPaint(fwin
);
1306 fwin
->flags
.repaint_only_titlebar
= 0;
1307 fwin
->flags
.repaint_only_resizebar
= 0;
1312 checkTitleSize(WFrameWindow
*fwin
)
1317 fwin
->flags
.incomplete_title
= 0;
1321 if (!fwin
->titlebar
) {
1322 fwin
->flags
.incomplete_title
= 1;
1325 width
= fwin
->titlebar
->width
- 6 - 6;
1328 if (!wPreferences
.new_style
) {
1329 if (fwin
->left_button
&& !fwin
->flags
.hide_left_button
1330 && !fwin
->flags
.lbutton_dont_fit
)
1331 width
-= fwin
->left_button
->width
+ 3;
1333 #ifdef XKB_BUTTON_HINT
1334 if (fwin
->language_button
&& !fwin
->flags
.hide_language_button
1335 && !fwin
->flags
.languagebutton_dont_fit
)
1336 width
-= fwin
->language_button
->width
+ 3;
1339 if (fwin
->right_button
&& !fwin
->flags
.hide_right_button
1340 && !fwin
->flags
.rbutton_dont_fit
)
1341 width
-= fwin
->right_button
->width
+ 3;
1343 if (WMWidthOfString(*fwin
->font
, fwin
->title
, strlen(fwin
->title
)) > width
) {
1344 fwin
->flags
.incomplete_title
= 1;
1346 fwin
->flags
.incomplete_title
= 0;
1352 paintButton(WCoreWindow
*button
, WTexture
*texture
, unsigned long color
,
1353 WPixmap
*image
, int pushed
)
1355 WScreen
*scr
= button
->screen_ptr
;
1356 GC copy_gc
= scr
->copy_gc
;
1358 int left
=0, width
=0;
1360 /* setup stuff according to the state */
1363 if (image
->width
>=image
->height
*2) {
1364 /* the image contains 2 pictures: the second is for the
1366 width
= image
->width
/2;
1367 left
= image
->width
/2;
1369 width
= image
->width
;
1372 XSetClipMask(dpy
, copy_gc
, None
);
1373 XSetForeground(dpy
, copy_gc
, scr
->white_pixel
);
1375 if (wPreferences
.new_style
) {
1376 XFillRectangle(dpy
, button
->window
, copy_gc
, 0, 0,
1377 button
->width
-1, button
->height
-1);
1378 XSetForeground(dpy
, copy_gc
, scr
->black_pixel
);
1379 XDrawRectangle(dpy
, button
->window
, copy_gc
, 0, 0,
1380 button
->width
-1, button
->height
-1);
1382 XFillRectangle(dpy
, button
->window
, copy_gc
, 0, 0,
1383 button
->width
, button
->height
);
1384 XSetForeground(dpy
, copy_gc
, scr
->black_pixel
);
1385 XDrawRectangle(dpy
, button
->window
, copy_gc
, 0, 0,
1386 button
->width
, button
->height
);
1389 XClearWindow(dpy
, button
->window
);
1392 if (image
->width
>=image
->height
*2)
1393 width
= image
->width
/2;
1395 width
= image
->width
;
1399 if (wPreferences
.new_style
) {
1400 if (texture
->any
.type
==WTEX_SOLID
|| pushed
) {
1401 wDrawBevel(button
->window
, button
->width
, button
->height
,
1402 (WTexSolid
*)texture
, WREL_RAISED
);
1405 wDrawBevel(button
->window
, button
->width
, button
->height
,
1406 scr
->widget_texture
, WREL_RAISED
);
1412 XSetClipMask(dpy
, copy_gc
, image
->mask
);
1413 x
= (button
->width
- width
)/2 + d
;
1414 y
= (button
->height
- image
->height
)/2 + d
;
1415 XSetClipOrigin(dpy
, copy_gc
, x
-left
, y
);
1416 if (!wPreferences
.new_style
) {
1417 XSetForeground(dpy
, copy_gc
, scr
->black_pixel
);
1419 if (image
->depth
==1)
1420 XCopyPlane(dpy
, image
->image
, button
->window
, copy_gc
,
1421 left
, 0, width
, image
->height
, x
, y
, 1);
1423 XCopyArea(dpy
, image
->image
, button
->window
, copy_gc
,
1424 left
, 0, width
, image
->height
, x
, y
);
1426 XSetForeground(dpy
, copy_gc
, scr
->dark_pixel
);
1427 XFillRectangle(dpy
, button
->window
, copy_gc
, 0, 0,
1428 button
->width
, button
->height
);
1432 XSetForeground(dpy
, copy_gc
, scr
->black_pixel
);
1434 XSetForeground(dpy
, copy_gc
, color
);
1435 XSetBackground(dpy
, copy_gc
, texture
->any
.color
.pixel
);
1437 XFillRectangle(dpy
, button
->window
, copy_gc
, 0, 0,
1438 button
->width
, button
->height
);
1445 handleButtonExpose(WObjDescriptor
*desc
, XEvent
*event
)
1447 WFrameWindow
*fwin
= (WFrameWindow
*)desc
->parent
;
1448 WCoreWindow
*button
= (WCoreWindow
*)desc
->self
;
1450 #ifdef XKB_BUTTON_HINT
1451 if (button
== fwin
->language_button
) {
1452 if (wPreferences
.modelock
){
1453 paintButton(button
, fwin
->title_texture
[fwin
->flags
.state
],
1454 WMColorPixel(fwin
->title_color
[fwin
->flags
.state
]),
1455 fwin
->languagebutton_image
, False
);
1459 if (button
== fwin
->left_button
) {
1460 paintButton(button
, fwin
->title_texture
[fwin
->flags
.state
],
1461 WMColorPixel(fwin
->title_color
[fwin
->flags
.state
]),
1462 fwin
->lbutton_image
, False
);
1464 Bool pushed
= False
;
1467 if (fwin
->flags
.right_button_pushed_in
)
1470 /* emulate the olwm pushpin in the "out" state */
1471 paintButton(button
, fwin
->title_texture
[fwin
->flags
.state
],
1472 WMColorPixel(fwin
->title_color
[fwin
->flags
.state
]),
1473 fwin
->rbutton_image
, pushed
);
1479 titlebarMouseDown(WObjDescriptor
*desc
, XEvent
*event
)
1481 WFrameWindow
*fwin
= desc
->parent
;
1482 WCoreWindow
*titlebar
= desc
->self
;
1484 if (IsDoubleClick(fwin
->core
->screen_ptr
, event
)) {
1485 if (fwin
->on_dblclick_titlebar
)
1486 (*fwin
->on_dblclick_titlebar
)(titlebar
, fwin
->child
, event
);
1488 if (fwin
->on_mousedown_titlebar
)
1489 (*fwin
->on_mousedown_titlebar
)(titlebar
, fwin
->child
, event
);
1495 resizebarMouseDown(WObjDescriptor
*desc
, XEvent
*event
)
1497 WFrameWindow
*fwin
= desc
->parent
;
1498 WCoreWindow
*resizebar
= desc
->self
;
1500 if (fwin
->on_mousedown_resizebar
)
1501 (*fwin
->on_mousedown_resizebar
)(resizebar
, fwin
->child
, event
);
1506 buttonMouseDown(WObjDescriptor
*desc
, XEvent
*event
)
1508 WFrameWindow
*fwin
= desc
->parent
;
1509 WCoreWindow
*button
= desc
->self
;
1512 int done
=0, execute
=1;
1514 unsigned long pixel
;
1515 int clickButton
= event
->xbutton
.button
;
1517 if (IsDoubleClick(fwin
->core
->screen_ptr
, event
)) {
1518 if (button
== fwin
->right_button
&& fwin
->on_dblclick_right
) {
1519 (*fwin
->on_dblclick_right
)(button
, fwin
->child
, event
);
1524 if (button
== fwin
->left_button
) {
1525 image
= fwin
->lbutton_image
;
1527 image
= fwin
->rbutton_image
;
1529 #ifdef XKB_BUTTON_HINT
1530 if (button
== fwin
->language_button
) {
1531 if (!wPreferences
.modelock
) return;
1532 image
= fwin
->languagebutton_image
;
1536 pixel
= WMColorPixel(fwin
->title_color
[fwin
->flags
.state
]);
1537 texture
= fwin
->title_texture
[fwin
->flags
.state
];
1538 paintButton(button
, texture
, pixel
, image
, True
);
1541 WMMaskEvent(dpy
, LeaveWindowMask
|EnterWindowMask
|ButtonReleaseMask
1542 |ButtonPressMask
|ExposureMask
, &ev
);
1546 paintButton(button
, texture
, pixel
, image
, False
);
1551 paintButton(button
, texture
, pixel
, image
, True
);
1558 if (ev
.xbutton
.button
== clickButton
)
1566 paintButton(button
, texture
, pixel
, image
, False
);
1569 if (button
== fwin
->left_button
) {
1570 if (fwin
->on_click_left
)
1571 (*fwin
->on_click_left
)(button
, fwin
->child
, &ev
);
1572 } else if (button
== fwin
->right_button
) {
1573 if (fwin
->on_click_right
)
1574 (*fwin
->on_click_right
)(button
, fwin
->child
, &ev
);
1576 #ifdef XKB_BUTTON_HINT
1577 else if (button
== fwin
->language_button
) {
1578 if (fwin
->on_click_language
)
1579 (*fwin
->on_click_language
)(button
, fwin
->child
, &ev
);