wmaker: Fix compiler warnings about pointer <--> integer conversion
[wmaker-crm.git] / WINGs / wpanel.c
blob1f28067749c1954d5a617588f0c45325cad9d1f5
3 #include "WINGsP.h"
5 #include <X11/keysym.h>
6 #include <stdint.h>
10 static void
11 alertPanelOnClick(WMWidget *self, void *clientData)
13 WMAlertPanel *panel = clientData;
15 WMBreakModalLoop(WMWidgetScreen(self));
16 if (self == panel->defBtn) {
17 panel->result = WAPRDefault;
18 } else if (self == panel->othBtn) {
19 panel->result = WAPROther;
20 } else if (self == panel->altBtn) {
21 panel->result = WAPRAlternate;
26 static void
27 handleKeyPress(XEvent *event, void *clientData)
29 WMAlertPanel *panel = (WMAlertPanel*)clientData;
30 KeySym ksym;
32 XLookupString(&event->xkey, NULL, 0, &ksym, NULL);
34 if (ksym == XK_Return && panel->defBtn) {
35 WMPerformButtonClick(panel->defBtn);
36 } else if (ksym == XK_Escape) {
37 if (panel->altBtn || panel->othBtn) {
38 WMPerformButtonClick(panel->othBtn ? panel->othBtn : panel->altBtn);
39 } else {
40 panel->result = WAPRDefault;
41 WMBreakModalLoop(WMWidgetScreen(panel->win));
47 int
48 WMRunAlertPanel(WMScreen *scrPtr, WMWindow *owner,
49 char *title, char *msg, char *defaultButton,
50 char *alternateButton, char *otherButton)
52 WMAlertPanel *panel;
53 int tmp;
55 panel = WMCreateAlertPanel(scrPtr, owner, title, msg, defaultButton,
56 alternateButton, otherButton);
59 int px, py;
60 WMView *view = WMWidgetView(panel->win);
62 if (owner) {
63 WMView *oview = WMWidgetView(owner);
64 WMPoint pt = WMGetViewScreenPosition(oview);
66 px = (W_VIEW_WIDTH(oview)-W_VIEW_WIDTH(view))/2;
67 py = (W_VIEW_HEIGHT(oview)-W_VIEW_HEIGHT(view))/2;
69 px += pt.x;
70 py += pt.y;
71 } else {
72 px = (W_VIEW_WIDTH(scrPtr->rootView)-W_VIEW_WIDTH(view))/2;
73 py = (W_VIEW_HEIGHT(scrPtr->rootView)-W_VIEW_HEIGHT(view))/2;
75 WMSetWindowInitialPosition(panel->win, px, py);
78 WMMapWidget(panel->win);
80 WMRunModalLoop(scrPtr, W_VIEW(panel->win));
82 tmp = panel->result;
84 WMDestroyAlertPanel(panel);
86 return tmp;
90 void
91 WMDestroyAlertPanel(WMAlertPanel *panel)
93 WMUnmapWidget(panel->win);
94 WMDestroyWidget(panel->win);
95 wfree(panel);
99 WMAlertPanel*
100 WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner,
101 char *title, char *msg, char *defaultButton,
102 char *alternateButton, char *otherButton)
104 WMAlertPanel *panel;
105 int dw=0, aw=0, ow=0, w;
106 WMBox *hbox;
107 WMPixmap *icon;
110 panel = wmalloc(sizeof(WMAlertPanel));
111 memset(panel, 0, sizeof(WMAlertPanel));
113 if (owner) {
114 panel->win = WMCreatePanelWithStyleForWindow(owner, "alertPanel",
115 WMTitledWindowMask);
116 } else {
117 panel->win = WMCreateWindowWithStyle(scrPtr, "alertPanel",
118 WMTitledWindowMask);
121 WMSetWindowInitialPosition(panel->win,
122 (scrPtr->rootView->size.width - WMWidgetWidth(panel->win))/2,
123 (scrPtr->rootView->size.height - WMWidgetHeight(panel->win))/2);
125 WMSetWindowTitle(panel->win, "");
127 panel->vbox = WMCreateBox(panel->win);
128 WMSetViewExpandsToParent(WMWidgetView(panel->vbox), 0, 0, 0, 0);
129 WMSetBoxHorizontal(panel->vbox, False);
130 WMMapWidget(panel->vbox);
132 hbox = WMCreateBox(panel->vbox);
133 WMSetBoxBorderWidth(hbox, 5);
134 WMSetBoxHorizontal(hbox, True);
135 WMMapWidget(hbox);
136 WMAddBoxSubview(panel->vbox, WMWidgetView(hbox), False, True, 74, 0, 5);
138 panel->iLbl = WMCreateLabel(hbox);
139 WMSetLabelImagePosition(panel->iLbl, WIPImageOnly);
140 WMMapWidget(panel->iLbl);
141 WMAddBoxSubview(hbox, WMWidgetView(panel->iLbl), False, True, 64, 0, 10);
142 icon = WMCreateApplicationIconBlendedPixmap(scrPtr, (RColor*)NULL);
143 if (icon) {
144 WMSetLabelImage(panel->iLbl, icon);
145 WMReleasePixmap(icon);
146 } else {
147 WMSetLabelImage(panel->iLbl, scrPtr->applicationIconPixmap);
150 if (title) {
151 WMFont *largeFont;
153 largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
155 panel->tLbl = WMCreateLabel(hbox);
156 WMMapWidget(panel->tLbl);
157 WMAddBoxSubview(hbox, WMWidgetView(panel->tLbl), True, True,
158 64, 0, 0);
159 WMSetLabelText(panel->tLbl, title);
160 WMSetLabelTextAlignment(panel->tLbl, WALeft);
161 WMSetLabelFont(panel->tLbl, largeFont);
163 WMReleaseFont(largeFont);
166 /* create divider line */
168 panel->line = WMCreateFrame(panel->win);
169 WMMapWidget(panel->line);
170 WMAddBoxSubview(panel->vbox, WMWidgetView(panel->line), False, True,
171 2, 2, 5);
172 WMSetFrameRelief(panel->line, WRGroove);
175 if (msg) {
176 panel->mLbl = WMCreateLabel(panel->vbox);
177 WMSetLabelWraps(panel->mLbl, True);
178 WMMapWidget(panel->mLbl);
179 WMAddBoxSubview(panel->vbox, WMWidgetView(panel->mLbl), True, True,
180 WMFontHeight(scrPtr->normalFont)*4, 0, 5);
181 WMSetLabelText(panel->mLbl, msg);
182 WMSetLabelTextAlignment(panel->mLbl, WACenter);
185 panel->hbox = WMCreateBox(panel->vbox);
186 WMSetBoxBorderWidth(panel->hbox, 10);
187 WMSetBoxHorizontal(panel->hbox, True);
188 WMMapWidget(panel->hbox);
189 WMAddBoxSubview(panel->vbox, WMWidgetView(panel->hbox), False, True, 44, 0, 0);
191 /* create buttons */
192 if (otherButton)
193 ow = WMWidthOfString(scrPtr->normalFont, otherButton,
194 strlen(otherButton));
196 if (alternateButton)
197 aw = WMWidthOfString(scrPtr->normalFont, alternateButton,
198 strlen(alternateButton));
200 if (defaultButton)
201 dw = WMWidthOfString(scrPtr->normalFont, defaultButton,
202 strlen(defaultButton));
204 dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
206 aw += 30;
207 ow += 30;
208 dw += 30;
210 w = WMAX(dw, WMAX(aw, ow));
211 if ((w+10)*3 < 400) {
212 aw = w;
213 ow = w;
214 dw = w;
215 } else {
216 int t;
218 t = 400 - 40 - aw - ow - dw;
219 aw += t/3;
220 ow += t/3;
221 dw += t/3;
224 if (defaultButton) {
225 panel->defBtn = WMCreateCommandButton(panel->hbox);
226 WMSetButtonAction(panel->defBtn, alertPanelOnClick, panel);
227 WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->defBtn),
228 False, True, dw, 0, 0);
229 WMSetButtonText(panel->defBtn, defaultButton);
230 WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
231 WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
232 WMSetButtonImagePosition(panel->defBtn, WIPRight);
234 if (alternateButton) {
235 panel->altBtn = WMCreateCommandButton(panel->hbox);
236 WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->altBtn),
237 False, True, aw, 0, 5);
238 WMSetButtonAction(panel->altBtn, alertPanelOnClick, panel);
239 WMSetButtonText(panel->altBtn, alternateButton);
241 if (otherButton) {
242 panel->othBtn = WMCreateCommandButton(panel->hbox);
243 WMSetButtonAction(panel->othBtn, alertPanelOnClick, panel);
244 WMAddBoxSubviewAtEnd(panel->hbox, WMWidgetView(panel->othBtn),
245 False, True, ow, 0, 5);
246 WMSetButtonText(panel->othBtn, otherButton);
249 WMMapSubwidgets(panel->hbox);
251 WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask,
252 handleKeyPress, panel);
254 WMRealizeWidget(panel->win);
255 WMMapSubwidgets(panel->win);
257 return panel;
264 static void
265 inputBoxOnClick(WMWidget *self, void *clientData)
267 WMInputPanel *panel = clientData;
269 WMBreakModalLoop(WMWidgetScreen(self));
270 if (self == panel->defBtn) {
271 panel->result = WAPRDefault;
272 } else if (self == panel->altBtn) {
273 panel->result = WAPRAlternate;
279 static void
280 handleKeyPress2(XEvent *event, void *clientData)
282 WMInputPanel *panel = (WMInputPanel*)clientData;
283 KeySym ksym;
285 XLookupString(&event->xkey, NULL, 0, &ksym, NULL);
287 if (ksym == XK_Return && panel->defBtn) {
288 WMPerformButtonClick(panel->defBtn);
289 } else if (ksym == XK_Escape) {
290 if (panel->altBtn) {
291 WMPerformButtonClick(panel->altBtn);
292 } else {
293 /* printf("got esc\n");*/
294 WMBreakModalLoop(WMWidgetScreen(panel->win));
295 panel->result = WAPRDefault;
301 char*
302 WMRunInputPanel(WMScreen *scrPtr, WMWindow *owner, char *title,
303 char *msg, char *defaultText,
304 char *okButton, char *cancelButton)
306 WMInputPanel *panel;
307 char *tmp;
309 panel = WMCreateInputPanel(scrPtr, owner, title, msg, defaultText,
310 okButton, cancelButton);
314 int px, py;
315 WMView *view = WMWidgetView(panel->win);
317 if (owner) {
318 WMView *oview = WMWidgetView(owner);
319 WMPoint pt = WMGetViewScreenPosition(oview);
321 px = (W_VIEW_WIDTH(oview)-W_VIEW_WIDTH(view))/2;
322 py = (W_VIEW_HEIGHT(oview)-W_VIEW_HEIGHT(view))/2;
324 px += pt.x;
325 py += pt.y;
326 } else {
327 px = (W_VIEW_WIDTH(scrPtr->rootView)-W_VIEW_WIDTH(view))/2;
328 py = (W_VIEW_HEIGHT(scrPtr->rootView)-W_VIEW_HEIGHT(view))/2;
330 WMSetWindowInitialPosition(panel->win, px, py);
333 WMMapWidget(panel->win);
335 WMRunModalLoop(scrPtr, W_VIEW(panel->win));
337 if (panel->result == WAPRDefault)
338 tmp = WMGetTextFieldText(panel->text);
339 else
340 tmp = NULL;
342 WMDestroyInputPanel(panel);
344 return tmp;
348 void
349 WMDestroyInputPanel(WMInputPanel *panel)
351 WMRemoveNotificationObserver(panel);
352 WMUnmapWidget(panel->win);
353 WMDestroyWidget(panel->win);
354 wfree(panel);
359 static void
360 endedEditingObserver(void *observerData, WMNotification *notification)
362 WMInputPanel *panel = (WMInputPanel*)observerData;
364 switch ((int)(uintptr_t)WMGetNotificationClientData(notification)) {
365 case WMReturnTextMovement:
366 if (panel->defBtn)
367 WMPerformButtonClick(panel->defBtn);
368 break;
369 case WMEscapeTextMovement:
370 if (panel->altBtn)
371 WMPerformButtonClick(panel->altBtn);
372 else {
373 WMBreakModalLoop(WMWidgetScreen(panel->win));
374 panel->result = WAPRDefault;
376 break;
377 default:
378 break;
383 WMInputPanel*
384 WMCreateInputPanel(WMScreen *scrPtr, WMWindow *owner, char *title, char *msg,
385 char *defaultText, char *okButton, char *cancelButton)
387 WMInputPanel *panel;
388 int x, dw=0, aw=0, w;
391 panel = wmalloc(sizeof(WMInputPanel));
392 memset(panel, 0, sizeof(WMInputPanel));
394 if (owner)
395 panel->win = WMCreatePanelWithStyleForWindow(owner, "inputPanel",
396 WMTitledWindowMask);
397 else
398 panel->win = WMCreateWindowWithStyle(scrPtr, "inputPanel",
399 WMTitledWindowMask);
400 WMSetWindowTitle(panel->win, "");
402 WMResizeWidget(panel->win, 320, 160);
404 if (title) {
405 WMFont *largeFont;
407 largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
409 panel->tLbl = WMCreateLabel(panel->win);
410 WMMoveWidget(panel->tLbl, 20, 16);
411 WMResizeWidget(panel->tLbl, 320 - 40, WMFontHeight(largeFont)+4);
412 WMSetLabelText(panel->tLbl, title);
413 WMSetLabelTextAlignment(panel->tLbl, WALeft);
414 WMSetLabelFont(panel->tLbl, largeFont);
416 WMReleaseFont(largeFont);
420 if (msg) {
421 panel->mLbl = WMCreateLabel(panel->win);
422 WMMoveWidget(panel->mLbl, 20, 50);
423 WMResizeWidget(panel->mLbl, 320 - 40,
424 WMFontHeight(scrPtr->normalFont)*2);
425 WMSetLabelText(panel->mLbl, msg);
426 WMSetLabelTextAlignment(panel->mLbl, WALeft);
429 panel->text = WMCreateTextField(panel->win);
430 WMMoveWidget(panel->text, 20, 85);
431 WMResizeWidget(panel->text, 320 - 40, WMWidgetHeight(panel->text));
432 WMSetTextFieldText(panel->text, defaultText);
434 WMAddNotificationObserver(endedEditingObserver, panel,
435 WMTextDidEndEditingNotification, panel->text);
437 /* create buttons */
438 if (cancelButton)
439 aw = WMWidthOfString(scrPtr->normalFont, cancelButton,
440 strlen(cancelButton));
442 if (okButton)
443 dw = WMWidthOfString(scrPtr->normalFont, okButton,
444 strlen(okButton));
446 w = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
447 if (aw > w)
448 w = aw;
450 w += 30;
451 x = 310;
453 if (okButton) {
454 x -= w + 10;
456 panel->defBtn = WMCreateCustomButton(panel->win, WBBPushInMask
457 |WBBPushChangeMask
458 |WBBPushLightMask);
459 WMSetButtonAction(panel->defBtn, inputBoxOnClick, panel);
460 WMMoveWidget(panel->defBtn, x, 124);
461 WMResizeWidget(panel->defBtn, w, 24);
462 WMSetButtonText(panel->defBtn, okButton);
463 WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
464 WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
465 WMSetButtonImagePosition(panel->defBtn, WIPRight);
467 if (cancelButton) {
468 x -= w + 10;
470 panel->altBtn = WMCreateCommandButton(panel->win);
471 WMSetButtonAction(panel->altBtn, inputBoxOnClick, panel);
472 WMMoveWidget(panel->altBtn, x, 124);
473 WMResizeWidget(panel->altBtn, w, 24);
474 WMSetButtonText(panel->altBtn, cancelButton);
477 WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask,
478 handleKeyPress2, panel);
480 WMRealizeWidget(panel->win);
481 WMMapSubwidgets(panel->win);
483 WMSetFocusToWidget(panel->text);
485 return panel;
491 static void
492 handleKeyPress3(XEvent *event, void *clientData)
494 WMGenericPanel *panel = (WMGenericPanel*)clientData;
495 KeySym ksym;
497 XLookupString(&event->xkey, NULL, 0, &ksym, NULL);
499 if (ksym == XK_Return && panel->defBtn) {
500 WMPerformButtonClick(panel->defBtn);
501 } else if (ksym == XK_Escape) {
502 if (panel->altBtn) {
503 WMPerformButtonClick(panel->altBtn);
504 } else {
505 panel->result = WAPRDefault;
506 WMBreakModalLoop(WMWidgetScreen(panel->win));
512 void
513 WMDestroyGenericPanel(WMGenericPanel *panel)
515 WMUnmapWidget(panel->win);
516 WMDestroyWidget(panel->win);
517 wfree(panel);
521 WMGenericPanel*
522 WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner,
523 char *title, char *defaultButton,
524 char *alternateButton)
526 WMGenericPanel *panel;
527 int dw=0, aw=0, w;
528 WMBox *hbox;
529 WMPixmap *icon;
532 panel = wmalloc(sizeof(WMGenericPanel));
533 memset(panel, 0, sizeof(WMGenericPanel));
535 if (owner) {
536 panel->win = WMCreatePanelWithStyleForWindow(owner, "genericPanel",
537 WMTitledWindowMask);
538 } else {
539 panel->win = WMCreateWindowWithStyle(scrPtr, "genericPanel",
540 WMTitledWindowMask);
543 WMSetWindowInitialPosition(panel->win,
544 (scrPtr->rootView->size.width - WMWidgetWidth(panel->win))/2,
545 (scrPtr->rootView->size.height - WMWidgetHeight(panel->win))/2);
547 WMSetWindowTitle(panel->win, "");
549 panel->vbox = WMCreateBox(panel->win);
550 WMSetViewExpandsToParent(WMWidgetView(panel->vbox), 0, 0, 0, 0);
551 WMSetBoxHorizontal(panel->vbox, False);
552 WMMapWidget(panel->vbox);
554 hbox = WMCreateBox(panel->vbox);
555 WMSetBoxBorderWidth(hbox, 5);
556 WMSetBoxHorizontal(hbox, True);
557 WMMapWidget(hbox);
558 WMAddBoxSubview(panel->vbox, WMWidgetView(hbox), False, True, 74, 0, 5);
560 panel->iLbl = WMCreateLabel(hbox);
561 WMSetLabelImagePosition(panel->iLbl, WIPImageOnly);
562 WMMapWidget(panel->iLbl);
563 WMAddBoxSubview(hbox, WMWidgetView(panel->iLbl), False, True, 64, 0, 10);
564 icon = WMCreateApplicationIconBlendedPixmap(scrPtr, (RColor*)NULL);
565 if (icon) {
566 WMSetLabelImage(panel->iLbl, icon);
567 WMReleasePixmap(icon);
568 } else {
569 WMSetLabelImage(panel->iLbl, scrPtr->applicationIconPixmap);
572 if (title) {
573 WMFont *largeFont;
575 largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
577 panel->tLbl = WMCreateLabel(hbox);
578 WMMapWidget(panel->tLbl);
579 WMAddBoxSubview(hbox, WMWidgetView(panel->tLbl), True, True,
580 64, 0, 0);
581 WMSetLabelText(panel->tLbl, title);
582 WMSetLabelTextAlignment(panel->tLbl, WALeft);
583 WMSetLabelFont(panel->tLbl, largeFont);
585 WMReleaseFont(largeFont);
588 /* create divider line */
590 panel->line = WMCreateFrame(panel->vbox);
591 WMMapWidget(panel->line);
592 WMAddBoxSubview(panel->vbox, WMWidgetView(panel->line), False, True,
593 2, 2, 5);
594 WMSetFrameRelief(panel->line, WRGroove);
597 panel->content = WMCreateFrame(panel->vbox);
598 WMMapWidget(panel->content);
599 WMAddBoxSubview(panel->vbox, WMWidgetView(panel->content), True, True,
600 50, 0, 5);
601 WMSetFrameRelief(panel->content, WRFlat);
603 hbox = WMCreateBox(panel->vbox);
604 WMSetBoxBorderWidth(hbox, 10);
605 WMSetBoxHorizontal(hbox, True);
606 WMMapWidget(hbox);
607 WMAddBoxSubview(panel->vbox, WMWidgetView(hbox), False, True, 44, 0, 0);
609 /* create buttons */
610 if (defaultButton)
611 dw = WMWidthOfString(scrPtr->normalFont, defaultButton,
612 strlen(defaultButton));
614 if (alternateButton)
615 aw = WMWidthOfString(scrPtr->normalFont, alternateButton,
616 strlen(alternateButton));
619 dw = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
621 aw += 30;
622 dw += 30;
624 w = WMAX(dw, aw);
625 if ((w+10)*2 < 400) {
626 aw = w;
627 dw = w;
628 } else {
629 int t;
631 t = 400 - 40 - aw - dw;
632 aw += t/2;
633 dw += t/2;
636 if (defaultButton) {
637 panel->defBtn = WMCreateCommandButton(hbox);
638 WMSetButtonAction(panel->defBtn, alertPanelOnClick, panel);
639 WMAddBoxSubviewAtEnd(hbox, WMWidgetView(panel->defBtn),
640 False, True, dw, 0, 0);
641 WMSetButtonText(panel->defBtn, defaultButton);
642 WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
643 WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
644 WMSetButtonImagePosition(panel->defBtn, WIPRight);
647 WMMapSubwidgets(hbox);
649 WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask,
650 handleKeyPress3, panel);
652 WMRealizeWidget(panel->win);
653 WMMapSubwidgets(panel->win);
655 return panel;