1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-18 20:10:29 +01:00
Files
wmaker/WINGs/wpanel.c
kojima dbdb44a4db added patch with bugfixes for wings/textfield/panel exit with escape/bag etc
changed iconchooser to center icons/text
updated po files
1999-10-02 20:24:41 +00:00

437 lines
10 KiB
C

#include "WINGsP.h"
#include <X11/keysym.h>
static void
alertPanelOnClick(WMWidget *self, void *clientData)
{
WMAlertPanel *panel = clientData;
panel->done = 1;
if (self == panel->defBtn) {
panel->result = WAPRDefault;
} else if (self == panel->othBtn) {
panel->result = WAPROther;
} else if (self == panel->altBtn) {
panel->result = WAPRAlternate;
}
}
static void
handleKeyPress(XEvent *event, void *clientData)
{
WMAlertPanel *panel = (WMAlertPanel*)clientData;
if (event->xkey.keycode == panel->retKey && panel->defBtn) {
WMPerformButtonClick(panel->defBtn);
}
if (event->xkey.keycode == panel->escKey) {
if (panel->altBtn || panel->othBtn) {
WMPerformButtonClick(panel->othBtn ? panel->othBtn : panel->altBtn);
} else {
panel->result = WAPRDefault;
panel->done=1;
}
}
}
int
WMRunAlertPanel(WMScreen *scrPtr, WMWindow *owner,
char *title, char *msg, char *defaultButton,
char *alternateButton, char *otherButton)
{
WMAlertPanel *panel;
int tmp;
panel = WMCreateAlertPanel(scrPtr, owner, title, msg, defaultButton,
alternateButton, otherButton);
scrPtr->modalView = W_VIEW(panel->win);
WMMapWidget(panel->win);
scrPtr->modal = 1;
while (!panel->done || WMScreenPending(scrPtr)) {
XEvent event;
WMNextEvent(scrPtr->display, &event);
WMHandleEvent(&event);
}
scrPtr->modal = 0;
tmp = panel->result;
WMDestroyAlertPanel(panel);
return tmp;
}
void
WMDestroyAlertPanel(WMAlertPanel *panel)
{
WMUnmapWidget(panel->win);
WMDestroyWidget(panel->win);
free(panel);
}
WMAlertPanel*
WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner,
char *title, char *msg, char *defaultButton,
char *alternateButton, char *otherButton)
{
WMAlertPanel *panel;
int x, dw=0, aw=0, ow=0, w;
panel = wmalloc(sizeof(WMAlertPanel));
memset(panel, 0, sizeof(WMAlertPanel));
panel->retKey = XKeysymToKeycode(scrPtr->display, XK_Return);
panel->escKey = XKeysymToKeycode(scrPtr->display, XK_Escape);
if (owner)
panel->win = WMCreatePanelWithStyleForWindow(owner, "alertPanel",
WMTitledWindowMask);
else
panel->win = WMCreateWindowWithStyle(scrPtr, "alertPanel",
WMTitledWindowMask);
WMSetWindowInitialPosition(panel->win,
(scrPtr->rootView->size.width - WMWidgetWidth(panel->win))/2,
(scrPtr->rootView->size.height - WMWidgetHeight(panel->win))/2);
WMSetWindowTitle(panel->win, "");
if (scrPtr->applicationIcon) {
panel->iLbl = WMCreateLabel(panel->win);
WMResizeWidget(panel->iLbl, scrPtr->applicationIcon->width,
scrPtr->applicationIcon->height);
WMMoveWidget(panel->iLbl, 8 + (64 - scrPtr->applicationIcon->width)/2,
(75 - scrPtr->applicationIcon->height)/2);
WMSetLabelImage(panel->iLbl, scrPtr->applicationIcon);
WMSetLabelImagePosition(panel->iLbl, WIPImageOnly);
}
if (title) {
WMFont *largeFont;
largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
panel->tLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->tLbl, 80, (80 - WMFontHeight(largeFont))/2);
WMResizeWidget(panel->tLbl, 400 - 70, WMFontHeight(largeFont)+4);
WMSetLabelText(panel->tLbl, title);
WMSetLabelTextAlignment(panel->tLbl, WALeft);
WMSetLabelFont(panel->tLbl, largeFont);
WMReleaseFont(largeFont);
}
if (msg) {
panel->mLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->mLbl, 10, 83);
WMResizeWidget(panel->mLbl, 380, WMFontHeight(scrPtr->normalFont)*4);
WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WACenter);
}
/* create divider line */
panel->line = WMCreateFrame(panel->win);
WMMoveWidget(panel->line, 0, 80);
WMResizeWidget(panel->line, 400, 2);
WMSetFrameRelief(panel->line, WRGroove);
/* create buttons */
if (otherButton)
ow = WMWidthOfString(scrPtr->normalFont, otherButton,
strlen(otherButton));
if (alternateButton)
aw = WMWidthOfString(scrPtr->normalFont, alternateButton,
strlen(alternateButton));
if (defaultButton)
dw = WMWidthOfString(scrPtr->normalFont, defaultButton,
strlen(defaultButton));
w = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
if (aw > w)
w = aw;
if (ow > w)
w = ow;
w += 30;
x = 400;
if (defaultButton) {
x -= w + 10;
panel->defBtn = WMCreateCommandButton(panel->win);
WMSetButtonAction(panel->defBtn, alertPanelOnClick, panel);
WMMoveWidget(panel->defBtn, x, 144);
WMResizeWidget(panel->defBtn, w, 24);
WMSetButtonText(panel->defBtn, defaultButton);
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight);
}
if (alternateButton) {
x -= w + 10;
panel->altBtn = WMCreateCommandButton(panel->win);
WMMoveWidget(panel->altBtn, x, 144);
WMResizeWidget(panel->altBtn, w, 24);
WMSetButtonAction(panel->altBtn, alertPanelOnClick, panel);
WMSetButtonText(panel->altBtn, alternateButton);
}
if (otherButton) {
x -= w + 10;
panel->othBtn = WMCreateCommandButton(panel->win);
WMSetButtonAction(panel->othBtn, alertPanelOnClick, panel);
WMMoveWidget(panel->othBtn, x, 144);
WMResizeWidget(panel->othBtn, w, 24);
WMSetButtonText(panel->othBtn, otherButton);
}
panel->done = 0;
WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask,
handleKeyPress, panel);
WMRealizeWidget(panel->win);
WMMapSubwidgets(panel->win);
return panel;
}
static void
inputBoxOnClick(WMWidget *self, void *clientData)
{
WMInputPanel *panel = clientData;
panel->done = 1;
if (self == panel->defBtn) {
panel->result = WAPRDefault;
} else if (self == panel->altBtn) {
panel->result = WAPRAlternate;
}
}
static void
handleKeyPress2(XEvent *event, void *clientData)
{
WMInputPanel *panel = (WMInputPanel*)clientData;
if (event->xkey.keycode == panel->retKey && panel->defBtn) {
WMPerformButtonClick(panel->defBtn);
}
if (event->xkey.keycode == panel->escKey) {
if (panel->altBtn) {
WMPerformButtonClick(panel->altBtn);
} else {
/* printf("got esc\n");*/
panel->done = 1;
panel->result = WAPRDefault;
}
}
}
char*
WMRunInputPanel(WMScreen *scrPtr, WMWindow *owner, char *title,
char *msg, char *defaultText,
char *okButton, char *cancelButton)
{
WMInputPanel *panel;
char *tmp;
panel = WMCreateInputPanel(scrPtr, owner, title, msg, defaultText,
okButton, cancelButton);
WMMapWidget(panel->win);
while (!panel->done || WMScreenPending(scrPtr)) {
XEvent event;
WMNextEvent(scrPtr->display, &event);
WMHandleEvent(&event);
}
if (panel->result == WAPRDefault)
tmp = WMGetTextFieldText(panel->text);
else
tmp = NULL;
WMDestroyInputPanel(panel);
return tmp;
}
void
WMDestroyInputPanel(WMInputPanel *panel)
{
WMRemoveNotificationObserver(panel);
WMUnmapWidget(panel->win);
WMDestroyWidget(panel->win);
free(panel);
}
static void
endedEditingObserver(void *observerData, WMNotification *notification)
{
WMInputPanel *panel = (WMInputPanel*)observerData;
switch ((int)WMGetNotificationClientData(notification)) {
case WMReturnTextMovement:
if (panel->defBtn)
WMPerformButtonClick(panel->defBtn);
break;
case WMEscapeTextMovement:
if (panel->altBtn)
WMPerformButtonClick(panel->altBtn);
else {
panel->done = 1;
panel->result = WAPRDefault;
}
break;
default:
break;
}
}
WMInputPanel*
WMCreateInputPanel(WMScreen *scrPtr, WMWindow *owner, char *title, char *msg,
char *defaultText, char *okButton, char *cancelButton)
{
WMInputPanel *panel;
int x, dw=0, aw=0, w;
panel = wmalloc(sizeof(WMInputPanel));
memset(panel, 0, sizeof(WMInputPanel));
panel->retKey = XKeysymToKeycode(scrPtr->display, XK_Return);
panel->escKey = XKeysymToKeycode(scrPtr->display, XK_Escape);
if (owner)
panel->win = WMCreatePanelWithStyleForWindow(owner, "inputPanel",
WMTitledWindowMask);
else
panel->win = WMCreateWindowWithStyle(scrPtr, "inputPanel",
WMTitledWindowMask);
WMSetWindowTitle(panel->win, "");
WMResizeWidget(panel->win, 320, 160);
if (title) {
WMFont *largeFont;
largeFont = WMBoldSystemFontOfSize(scrPtr, 24);
panel->tLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->tLbl, 20, 16);
WMResizeWidget(panel->tLbl, 320 - 40, WMFontHeight(largeFont)+4);
WMSetLabelText(panel->tLbl, title);
WMSetLabelTextAlignment(panel->tLbl, WALeft);
WMSetLabelFont(panel->tLbl, largeFont);
WMReleaseFont(largeFont);
}
if (msg) {
panel->mLbl = WMCreateLabel(panel->win);
WMMoveWidget(panel->mLbl, 20, 50);
WMResizeWidget(panel->mLbl, 320 - 40,
WMFontHeight(scrPtr->normalFont)*2);
WMSetLabelText(panel->mLbl, msg);
WMSetLabelTextAlignment(panel->mLbl, WALeft);
}
panel->text = WMCreateTextField(panel->win);
WMMoveWidget(panel->text, 20, 85);
WMResizeWidget(panel->text, 320 - 40, WMWidgetHeight(panel->text));
WMSetTextFieldText(panel->text, defaultText);
WMAddNotificationObserver(endedEditingObserver, panel,
WMTextDidEndEditingNotification, panel->text);
/* create buttons */
if (cancelButton)
aw = WMWidthOfString(scrPtr->normalFont, cancelButton,
strlen(cancelButton));
if (okButton)
dw = WMWidthOfString(scrPtr->normalFont, okButton,
strlen(okButton));
w = dw + (scrPtr->buttonArrow ? scrPtr->buttonArrow->width : 0);
if (aw > w)
w = aw;
w += 30;
x = 310;
if (okButton) {
x -= w + 10;
panel->defBtn = WMCreateCustomButton(panel->win, WBBPushInMask
|WBBPushChangeMask
|WBBPushLightMask);
WMSetButtonAction(panel->defBtn, inputBoxOnClick, panel);
WMMoveWidget(panel->defBtn, x, 124);
WMResizeWidget(panel->defBtn, w, 24);
WMSetButtonText(panel->defBtn, okButton);
WMSetButtonImage(panel->defBtn, scrPtr->buttonArrow);
WMSetButtonAltImage(panel->defBtn, scrPtr->pushedButtonArrow);
WMSetButtonImagePosition(panel->defBtn, WIPRight);
}
if (cancelButton) {
x -= w + 10;
panel->altBtn = WMCreateCommandButton(panel->win);
WMSetButtonAction(panel->altBtn, inputBoxOnClick, panel);
WMMoveWidget(panel->altBtn, x, 124);
WMResizeWidget(panel->altBtn, w, 24);
WMSetButtonText(panel->altBtn, cancelButton);
}
panel->done = 0;
WMCreateEventHandler(W_VIEW(panel->win), KeyPressMask,
handleKeyPress2, panel);
WMRealizeWidget(panel->win);
WMMapSubwidgets(panel->win);
WMSetFocusToWidget(panel->text);
return panel;
}