43#include "magick/studio.h"
44#include "magick/color.h"
45#include "magick/color-private.h"
46#include "magick/exception.h"
47#include "magick/exception-private.h"
48#include "magick/image.h"
49#include "magick/magick.h"
50#include "magick/memory_.h"
51#include "magick/string_.h"
52#include "magick/timer-private.h"
53#include "magick/token.h"
54#include "magick/utility.h"
55#include "magick/xwindow-private.h"
56#include "magick/widget.h"
58#if defined(MAGICKCORE_X11_DELEGATE)
59DisableMSCWarning(4389)
60DisableMSCWarning(4701)
65#define AreaIsActive(matte_info,position) ( \
66 ((position.y >= (int) (matte_info.y-matte_info.bevel_width)) && \
67 (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
68 ? MagickTrue : MagickFalse)
69#define Extent(s) ((int) strlen(s))
70#define MatteIsActive(matte_info,position) ( \
71 ((position.x >= (int) (matte_info.x-matte_info.bevel_width)) && \
72 (position.y >= (int) (matte_info.y-matte_info.bevel_width)) && \
73 (position.x < (int) (matte_info.x+matte_info.width+matte_info.bevel_width)) && \
74 (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
75 ? MagickTrue : MagickFalse)
76#define MaxTextWidth ((unsigned int) (255*XTextWidth(font_info,"_",1)))
77#define MinTextWidth (26*XTextWidth(font_info,"_",1))
78#define QuantumMargin MagickMax(font_info->max_bounds.width,12)
79#define WidgetTextWidth(font_info,text) \
80 ((unsigned int) XTextWidth(font_info,text,Extent(text)))
81#define WindowIsActive(window_info,position) ( \
82 ((position.x >= 0) && (position.y >= 0) && \
83 (position.x < (int) window_info.width) && \
84 (position.y < (int) window_info.height)) ? MagickTrue : MagickFalse)
91 ControlState = 0x0001,
92 InactiveWidgetState = 0x0004,
93 JumpListState = 0x0008,
94 RedrawActionState = 0x0010,
95 RedrawListState = 0x0020,
96 RedrawWidgetState = 0x0040,
97 UpdateListState = 0x0100
103typedef struct _XWidgetInfo
138 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
139 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
143 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
144 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
146 *selection_info = (XWidgetInfo *) NULL,
149 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
150 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
164 XDrawMatte(Display *,
const XWindowInfo *,
const XWidgetInfo *),
165 XSetBevelColor(Display *,
const XWindowInfo *,
const MagickStatusType),
166 XSetMatteColor(Display *,
const XWindowInfo *,
const MagickStatusType),
167 XSetTextColor(Display *,
const XWindowInfo *,
const MagickStatusType);
189MagickExport
void DestroyXWidget(
void)
191 if (selection_info != (XWidgetInfo *) NULL)
192 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
225static void XDrawBevel(Display *display,
const XWindowInfo *window_info,
226 const XWidgetInfo *bevel_info)
244 y1=bevel_info->y+bevel_info->height;
245 x2=bevel_info->x+bevel_info->width;
247 bevel_width=bevel_info->bevel_width;
254 points[3].x=x2+bevel_width;
255 points[3].y=y2-bevel_width;
256 points[4].x=x1-bevel_width;
257 points[4].y=y2-bevel_width;
258 points[5].x=x1-bevel_width;
259 points[5].y=y1+bevel_width;
260 XSetBevelColor(display,window_info,bevel_info->raised);
261 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
262 points,6,Complex,CoordModeOrigin);
272 points[3].x=x2+bevel_width;
273 points[3].y=y2-bevel_width;
274 points[4].x=x2+bevel_width;
275 points[4].y=y1+bevel_width;
276 points[5].x=x1-bevel_width;
277 points[5].y=y1+bevel_width;
278 XSetBevelColor(display,window_info,!bevel_info->raised);
279 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
280 points,6,Complex,CoordModeOrigin);
281 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
314static void XDrawBeveledButton(Display *display,
const XWindowInfo *window_info,
315 const XWidgetInfo *button_info)
333 XDrawBevel(display,window_info,button_info);
334 XSetMatteColor(display,window_info,button_info->raised);
335 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
336 button_info->x,button_info->y,button_info->width,button_info->height);
337 x=button_info->x-button_info->bevel_width-1;
338 y=button_info->y-button_info->bevel_width-1;
339 (void) XSetForeground(display,window_info->widget_context,
340 window_info->pixel_info->trough_color.pixel);
341 if (button_info->raised || (window_info->depth == 1))
342 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
343 x,y,button_info->width+(button_info->bevel_width << 1)+1,
344 button_info->height+(button_info->bevel_width << 1)+1);
345 if (button_info->text == (
char *) NULL)
350 crop_info.width=(
unsigned short) button_info->width;
351 crop_info.height=(
unsigned short) button_info->height;
352 crop_info.x=button_info->x;
353 crop_info.y=button_info->y;
357 font_info=window_info->font_info;
358 width=WidgetTextWidth(font_info,button_info->text);
359 x=button_info->x+(QuantumMargin >> 1);
360 if (button_info->center)
361 x=button_info->x+(button_info->width >> 1)-(width >> 1);
362 y=button_info->y+((button_info->height-
363 (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
364 if ((
int) button_info->width == (QuantumMargin >> 1))
369 XSetTextColor(display,window_info,MagickTrue);
370 x=button_info->x+button_info->width+button_info->bevel_width+
371 (QuantumMargin >> 1);
372 (void) XDrawString(display,window_info->id,window_info->widget_context,
373 x,y,button_info->text,Extent(button_info->text));
376 (void) XSetClipRectangles(display,window_info->widget_context,0,0,&crop_info,
378 XSetTextColor(display,window_info,button_info->raised);
379 (void) XDrawString(display,window_info->id,window_info->widget_context,x,y,
380 button_info->text,Extent(button_info->text));
381 (void) XSetClipMask(display,window_info->widget_context,None);
382 if (button_info->raised == MagickFalse)
383 XDelay(display,SuspendTime << 2);
416static void XDrawBeveledMatte(Display *display,
const XWindowInfo *window_info,
417 const XWidgetInfo *matte_info)
422 XDrawBevel(display,window_info,matte_info);
423 XDrawMatte(display,window_info,matte_info);
454static void XDrawMatte(Display *display,
const XWindowInfo *window_info,
455 const XWidgetInfo *matte_info)
460 if ((matte_info->trough == MagickFalse) || (window_info->depth == 1))
461 (void) XFillRectangle(display,window_info->id,
462 window_info->highlight_context,matte_info->x,matte_info->y,
463 matte_info->width,matte_info->height);
466 (void) XSetForeground(display,window_info->widget_context,
467 window_info->pixel_info->trough_color.pixel);
468 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
469 matte_info->x,matte_info->y,matte_info->width,matte_info->height);
502static void XDrawMatteText(Display *display,
const XWindowInfo *window_info,
503 XWidgetInfo *text_info)
529 XSetMatteColor(display,window_info,MagickFalse);
530 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
531 text_info->x,text_info->y,text_info->width,text_info->height);
532 if (text_info->text == (
char *) NULL)
534 XSetTextColor(display,window_info,text_info->highlight);
535 font_info=window_info->font_info;
536 x=text_info->x+(QuantumMargin >> 2);
537 y=text_info->y+font_info->ascent+(text_info->height >> 2);
538 width=text_info->width-(QuantumMargin >> 1);
539 height=(
unsigned int) (font_info->ascent+font_info->descent);
540 if (*text_info->text ==
'\0')
545 (void) XDrawLine(display,window_info->id,window_info->annotate_context,
552 crop_info.width=(
unsigned short) text_info->width;
553 crop_info.height=(
unsigned short) text_info->height;
554 crop_info.x=text_info->x;
555 crop_info.y=text_info->y;
559 if (text_info->cursor < text_info->marker)
560 text_info->marker=text_info->cursor;
563 text=text_info->marker;
564 if (XTextWidth(font_info,(
char *) text,(
int) (text_info->cursor-text)) >
567 text=text_info->text;
568 for (i=0; i < Extent(text); i++)
570 n=XTextWidth(font_info,(
char *) text+i,(
int)
571 (text_info->cursor-text-i));
572 if (n <= (
int) width)
575 text_info->marker=(
char *) text+i;
581 if (text_info->highlight == MagickFalse)
583 (void) XSetClipRectangles(display,window_info->widget_context,0,0,
584 &crop_info,1,Unsorted);
585 (void) XDrawString(display,window_info->id,window_info->widget_context,
586 x,y,text_info->marker,Extent(text_info->marker));
587 (void) XSetClipMask(display,window_info->widget_context,None);
591 (void) XSetClipRectangles(display,window_info->annotate_context,0,0,
592 &crop_info,1,Unsorted);
593 width=WidgetTextWidth(font_info,text_info->marker);
594 (void) XFillRectangle(display,window_info->id,
595 window_info->annotate_context,x,y-font_info->ascent,width,height);
596 (void) XSetClipMask(display,window_info->annotate_context,None);
597 (void) XSetClipRectangles(display,window_info->highlight_context,0,0,
598 &crop_info,1,Unsorted);
599 (void) XDrawString(display,window_info->id,
600 window_info->highlight_context,x,y,text_info->marker,
601 Extent(text_info->marker));
602 (void) XSetClipMask(display,window_info->highlight_context,None);
604 x+=XTextWidth(font_info,text_info->marker,(
int)
605 (text_info->cursor-text_info->marker));
606 (void) XDrawLine(display,window_info->id,window_info->annotate_context,x,y+3,
640static void XDrawTriangleEast(Display *display,
const XWindowInfo *window_info,
641 const XWidgetInfo *triangle_info)
665 x2=triangle_info->x+triangle_info->width;
666 y2=triangle_info->y+(triangle_info->height >> 1);
668 y3=triangle_info->y+triangle_info->height;
669 bevel_width=triangle_info->bevel_width;
676 XSetMatteColor(display,window_info,triangle_info->raised);
677 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
678 points,3,Complex,CoordModeOrigin);
686 points[2].x=x3-bevel_width;
687 points[2].y=y3+bevel_width;
688 points[3].x=x2+bevel_width;
690 XSetBevelColor(display,window_info,!triangle_info->raised);
691 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
692 points,4,Complex,CoordModeOrigin);
700 points[2].x=x1-bevel_width+1;
701 points[2].y=y1-bevel_width;
702 points[3].x=x3-bevel_width+1;
703 points[3].y=y3+bevel_width;
704 XSetBevelColor(display,window_info,triangle_info->raised);
705 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
706 points,4,Complex,CoordModeOrigin);
714 points[2].x=x2+bevel_width;
716 points[3].x=x1-bevel_width;
717 points[3].y=y1-bevel_width;
718 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
719 points,4,Complex,CoordModeOrigin);
720 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
721 if (triangle_info->text == (
char *) NULL)
726 font_info=window_info->font_info;
727 XSetTextColor(display,window_info,MagickTrue);
728 x1=triangle_info->x+triangle_info->width+triangle_info->bevel_width+
729 (QuantumMargin >> 1);
730 y1=triangle_info->y+((triangle_info->height-
731 (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
732 (void) XDrawString(display,window_info->id,window_info->widget_context,x1,y1,
733 triangle_info->text,Extent(triangle_info->text));
766static void XDrawTriangleNorth(Display *display,
const XWindowInfo *window_info,
767 const XWidgetInfo *triangle_info)
787 y1=triangle_info->y+triangle_info->height;
788 x2=triangle_info->x+(triangle_info->width >> 1);
790 x3=triangle_info->x+triangle_info->width;
791 y3=triangle_info->y+triangle_info->height;
792 bevel_width=triangle_info->bevel_width;
799 XSetMatteColor(display,window_info,triangle_info->raised);
800 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
801 points,3,Complex,CoordModeOrigin);
810 points[2].y=y2-bevel_width-2;
811 points[3].x=x1-bevel_width-1;
812 points[3].y=y1+bevel_width;
813 XSetBevelColor(display,window_info,triangle_info->raised);
814 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
815 points,4,Complex,CoordModeOrigin);
823 points[2].x=x3+bevel_width;
824 points[2].y=y3+bevel_width;
826 points[3].y=y2-bevel_width;
827 XSetBevelColor(display,window_info,!triangle_info->raised);
828 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
829 points,4,Complex,CoordModeOrigin);
837 points[2].x=x1-bevel_width;
838 points[2].y=y1+bevel_width;
839 points[3].x=x3+bevel_width;
840 points[3].y=y3+bevel_width;
841 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
842 points,4,Complex,CoordModeOrigin);
843 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
876static void XDrawTriangleSouth(Display *display,
const XWindowInfo *window_info,
877 const XWidgetInfo *triangle_info)
898 x2=triangle_info->x+(triangle_info->width >> 1);
899 y2=triangle_info->y+triangle_info->height;
900 x3=triangle_info->x+triangle_info->width;
902 bevel_width=triangle_info->bevel_width;
909 XSetMatteColor(display,window_info,triangle_info->raised);
910 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
911 points,3,Complex,CoordModeOrigin);
919 points[2].x=x1-bevel_width;
920 points[2].y=y1-bevel_width;
921 points[3].x=x3+bevel_width;
922 points[3].y=y3-bevel_width;
923 XSetBevelColor(display,window_info,triangle_info->raised);
924 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
925 points,4,Complex,CoordModeOrigin);
932 points[1].y=y3-bevel_width;
933 points[2].x=x3+bevel_width;
934 points[2].y=y3-bevel_width;
936 points[3].y=y2+bevel_width;
937 XSetBevelColor(display,window_info,!triangle_info->raised);
938 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
939 points,4,Complex,CoordModeOrigin);
948 points[2].y=y2+bevel_width;
949 points[3].x=x1-bevel_width;
950 points[3].y=y1-bevel_width;
951 XSetBevelColor(display,window_info,triangle_info->raised);
952 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
953 points,4,Complex,CoordModeOrigin);
954 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
985static void XDrawWidgetText(Display *display,
const XWindowInfo *window_info,
986 XWidgetInfo *text_info)
1008 widget_context=window_info->annotate_context;
1009 if (text_info->raised)
1010 (void) XClearArea(display,window_info->id,text_info->x,text_info->y,
1011 text_info->width,text_info->height,MagickFalse);
1014 (void) XFillRectangle(display,window_info->id,widget_context,text_info->x,
1015 text_info->y,text_info->width,text_info->height);
1016 widget_context=window_info->highlight_context;
1018 if (text_info->text == (
char *) NULL)
1020 if (*text_info->text ==
'\0')
1025 font_info=window_info->font_info;
1026 crop_info.width=(
unsigned short) text_info->width;
1027 crop_info.height=(
unsigned short) text_info->height;
1028 crop_info.x=text_info->x;
1029 crop_info.y=text_info->y;
1033 width=WidgetTextWidth(font_info,text_info->text);
1034 x=text_info->x+(QuantumMargin >> 1);
1035 if (text_info->center)
1036 x=text_info->x+(text_info->width >> 1)-(width >> 1);
1037 if (text_info->raised)
1038 if (width > (text_info->width-QuantumMargin))
1039 x+=(text_info->width-QuantumMargin-width);
1040 height=(
unsigned int) (font_info->ascent+font_info->descent);
1041 y=text_info->y+((text_info->height-height) >> 1)+font_info->ascent;
1042 (void) XSetClipRectangles(display,widget_context,0,0,&crop_info,1,Unsorted);
1043 (void) XDrawString(display,window_info->id,widget_context,x,y,text_info->text,
1044 Extent(text_info->text));
1045 (void) XSetClipMask(display,widget_context,None);
1046 if (x < text_info->x)
1047 (void) XDrawLine(display,window_info->id,window_info->annotate_context,
1048 text_info->x,text_info->y,text_info->x,text_info->y+text_info->height-1);
1085static void XEditText(Display *display,XWidgetInfo *text_info,
1086 const KeySym key_symbol,
char *text,
const size_t state)
1088 switch ((
int) key_symbol)
1093 if (text_info->highlight)
1098 *text_info->text=
'\0';
1099 text_info->cursor=text_info->text;
1100 text_info->marker=text_info->text;
1101 text_info->highlight=MagickFalse;
1106 if (text_info->cursor != text_info->text)
1108 text_info->cursor--;
1109 (void) memmove(text_info->cursor,text_info->cursor+1,
1110 strlen(text_info->cursor+1)+1);
1111 text_info->highlight=MagickFalse;
1122 if (text_info->cursor == text_info->text)
1124 text_info->cursor--;
1133 if (text_info->cursor == (text_info->text+Extent(text_info->text)))
1135 text_info->cursor++;
1147 if (state & ControlState)
1151 if ((Extent(text_info->text)+1) >= (
int) MaxTextExtent)
1152 (void) XBell(display,0);
1155 if (text_info->highlight)
1160 *text_info->text=
'\0';
1161 text_info->cursor=text_info->text;
1162 text_info->marker=text_info->text;
1163 text_info->highlight=MagickFalse;
1168 q=text_info->text+Extent(text_info->text)+strlen(text);
1169 for (i=0; i <= Extent(text_info->cursor); i++)
1171 if ((q-Extent(text)) > text_info->text)
1172 *q=(*(q-Extent(text)));
1176 for (i=0; i < Extent(text); i++)
1177 *text_info->cursor++=(*p++);
1208static void XGetWidgetInfo(
const char *text,XWidgetInfo *widget_info)
1213 widget_info->id=(~0);
1214 widget_info->bevel_width=3;
1215 widget_info->width=1;
1216 widget_info->height=1;
1219 widget_info->min_y=0;
1220 widget_info->max_y=0;
1221 widget_info->raised=MagickTrue;
1222 widget_info->active=MagickFalse;
1223 widget_info->center=MagickTrue;
1224 widget_info->trough=MagickFalse;
1225 widget_info->highlight=MagickFalse;
1226 widget_info->text=(
char *) text;
1227 widget_info->cursor=(
char *) text;
1228 if (text != (
char *) NULL)
1229 widget_info->cursor+=Extent(text);
1230 widget_info->marker=(
char *) text;
1264static void XHighlightWidget(Display *display,
const XWindowInfo *window_info,
1265 const int x,
const int y)
1270 XSetBevelColor(display,window_info,MagickTrue);
1271 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,x,y,
1272 window_info->width-(x << 1),window_info->height-(y << 1));
1273 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
1274 x-1,y-1,window_info->width-(x << 1)+1,window_info->height-(y << 1)+1);
1275 XSetBevelColor(display,window_info,MagickFalse);
1276 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
1277 x-1,y-1,window_info->width-(x << 1),window_info->height-(y << 1));
1278 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
1310#if defined(__cplusplus) || defined(c_plusplus)
1314static int XScreenEvent(Display *display,XEvent *event,
char *data)
1319 windows=(XWindows *) data;
1320 if (event->xany.window == windows->popup.id)
1322 if (event->type == MapNotify)
1323 windows->popup.mapped=MagickTrue;
1324 if (event->type == UnmapNotify)
1325 windows->popup.mapped=MagickFalse;
1328 if (event->xany.window == windows->widget.id)
1330 if (event->type == MapNotify)
1331 windows->widget.mapped=MagickTrue;
1332 if (event->type == UnmapNotify)
1333 windows->widget.mapped=MagickFalse;
1336 switch (event->type)
1340 if ((event->xbutton.button == Button3) &&
1341 (event->xbutton.state & Mod1Mask))
1346 event->xbutton.button=Button2;
1347 event->xbutton.state&=(~Mod1Mask);
1353 if (event->xexpose.window == windows->image.id)
1355 XRefreshWindow(display,&windows->image,event);
1358 if (event->xexpose.window == windows->magnify.id)
1359 if (event->xexpose.count == 0)
1360 if (windows->magnify.mapped)
1362 XMakeMagnifyImage(display,windows);
1365 if (event->xexpose.window == windows->command.id)
1366 if (event->xexpose.count == 0)
1368 (void) XCommandWidget(display,windows,(
const char *
const *) NULL,
1379 if (event->xfocus.window == windows->image.id)
1380 (void) XSetInputFocus(display,windows->image.id,RevertToNone,
1388 case SelectionNotify:
1393 return(MagickFalse);
1396#if defined(__cplusplus) || defined(c_plusplus)
1428static void XSetBevelColor(Display *display,
const XWindowInfo *window_info,
1429 const MagickStatusType raised)
1431 if (window_info->depth == 1)
1439 (void) XSetBackground(display,window_info->widget_context,
1440 XBlackPixel(display,window_info->screen));
1441 (void) XSetForeground(display,window_info->widget_context,
1442 XWhitePixel(display,window_info->screen));
1443 (void) XSetFillStyle(display,window_info->widget_context,
1444 FillOpaqueStippled);
1445 stipple=window_info->highlight_stipple;
1446 if (raised == MagickFalse)
1447 stipple=window_info->shadow_stipple;
1448 (void) XSetStipple(display,window_info->widget_context,stipple);
1452 (void) XSetForeground(display,window_info->widget_context,
1453 window_info->pixel_info->highlight_color.pixel);
1455 (
void) XSetForeground(display,window_info->widget_context,
1456 window_info->pixel_info->shadow_color.pixel);
1486static void XSetMatteColor(Display *display,
const XWindowInfo *window_info,
1487 const MagickStatusType raised)
1489 if (window_info->depth == 1)
1495 (void) XSetForeground(display,window_info->widget_context,
1496 XWhitePixel(display,window_info->screen));
1498 (
void) XSetForeground(display,window_info->widget_context,
1499 XBlackPixel(display,window_info->screen));
1503 (void) XSetForeground(display,window_info->widget_context,
1504 window_info->pixel_info->matte_color.pixel);
1506 (
void) XSetForeground(display,window_info->widget_context,
1507 window_info->pixel_info->depth_color.pixel);
1538static void XSetTextColor(Display *display,
const XWindowInfo *window_info,
1539 const MagickStatusType raised)
1545 if (window_info->depth == 1)
1551 (void) XSetForeground(display,window_info->widget_context,
1552 XBlackPixel(display,window_info->screen));
1554 (
void) XSetForeground(display,window_info->widget_context,
1555 XWhitePixel(display,window_info->screen));
1558 foreground=(ssize_t) XPixelIntensity(
1559 &window_info->pixel_info->foreground_color);
1560 matte=(ssize_t) XPixelIntensity(&window_info->pixel_info->matte_color);
1561 if (MagickAbsoluteValue((
int) (foreground-matte)) > (65535L >> 3))
1562 (void) XSetForeground(display,window_info->widget_context,
1563 window_info->pixel_info->foreground_color.pixel);
1565 (
void) XSetForeground(display,window_info->widget_context,
1566 window_info->pixel_info->background_color.pixel);
1601MagickExport
void XColorBrowserWidget(Display *display,XWindows *windows,
1602 const char *action,
char *reply)
1604#define CancelButtonText "Cancel"
1605#define ColornameText "Name:"
1606#define ColorPatternText "Pattern:"
1607#define GrabButtonText "Grab"
1608#define ResetButtonText "Reset"
1612 primary_selection[MaxTextExtent] =
"",
1613 reset_pattern[MaxTextExtent],
1614 text[MaxTextExtent];
1627 glob_pattern[MaxTextExtent] =
"*";
1629 static MagickStatusType
1630 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
1680 assert(display != (Display *) NULL);
1681 assert(windows != (XWindows *) NULL);
1682 assert(action != (
char *) NULL);
1683 assert(reply != (
char *) NULL);
1684 if (IsEventLogging() != MagickFalse)
1685 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
1686 XSetCursorState(display,windows,MagickTrue);
1687 XCheckRefreshWindows(display,windows);
1688 (void) CopyMagickString(reset_pattern,
"*",MaxTextExtent);
1689 exception=AcquireExceptionInfo();
1690 colorlist=GetColorList(glob_pattern,&colors,exception);
1691 if (colorlist == (
char **) NULL)
1696 (void) CopyMagickString(glob_pattern,
"*",MaxTextExtent);
1697 colorlist=GetColorList(glob_pattern,&colors,exception);
1698 if (colorlist == (
char **) NULL)
1700 XNoticeWidget(display,windows,
"Unable to obtain colors names:",
1702 (void) XDialogWidget(display,windows,action,
"Enter color name:",
1710 font_info=windows->widget.font_info;
1712 for (i=0; i < (int) colors; i++)
1713 if (WidgetTextWidth(font_info,colorlist[i]) > text_width)
1714 text_width=WidgetTextWidth(font_info,colorlist[i]);
1715 width=WidgetTextWidth(font_info,(
char *) action);
1716 if (WidgetTextWidth(font_info,CancelButtonText) > width)
1717 width=WidgetTextWidth(font_info,CancelButtonText);
1718 if (WidgetTextWidth(font_info,ResetButtonText) > width)
1719 width=WidgetTextWidth(font_info,ResetButtonText);
1720 if (WidgetTextWidth(font_info,GrabButtonText) > width)
1721 width=WidgetTextWidth(font_info,GrabButtonText);
1722 width+=QuantumMargin;
1723 if (WidgetTextWidth(font_info,ColorPatternText) > width)
1724 width=WidgetTextWidth(font_info,ColorPatternText);
1725 if (WidgetTextWidth(font_info,ColornameText) > width)
1726 width=WidgetTextWidth(font_info,ColornameText);
1727 height=(
unsigned int) (font_info->ascent+font_info->descent);
1731 windows->widget.width=(
unsigned int)
1732 (width+MagickMin((
int) text_width,(
int) MaxTextWidth)+6*QuantumMargin);
1733 windows->widget.min_width=(
unsigned int)
1734 (width+MinTextWidth+4*QuantumMargin);
1735 if (windows->widget.width < windows->widget.min_width)
1736 windows->widget.width=windows->widget.min_width;
1737 windows->widget.height=(
unsigned int)
1738 ((81*height) >> 2)+((13*QuantumMargin) >> 1)+4;
1739 windows->widget.min_height=(
unsigned int)
1740 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
1741 if (windows->widget.height < windows->widget.min_height)
1742 windows->widget.height=windows->widget.min_height;
1743 XConstrainWindowPosition(display,&windows->widget);
1747 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Color",
1749 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
1750 if (status != False)
1752 XSetWMName(display,windows->widget.id,&window_name);
1753 XSetWMIconName(display,windows->widget.id,&window_name);
1754 (void) XFree((
void *) window_name.value);
1756 window_changes.width=(int) windows->widget.width;
1757 window_changes.height=(int) windows->widget.height;
1758 window_changes.x=windows->widget.x;
1759 window_changes.y=windows->widget.y;
1760 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
1761 mask,&window_changes);
1762 (void) XMapRaised(display,windows->widget.id);
1763 windows->widget.mapped=MagickFalse;
1767 XGetWidgetInfo((
char *) NULL,&mode_info);
1768 XGetWidgetInfo((
char *) NULL,&slider_info);
1769 XGetWidgetInfo((
char *) NULL,&north_info);
1770 XGetWidgetInfo((
char *) NULL,&south_info);
1771 XGetWidgetInfo((
char *) NULL,&expose_info);
1772 XGetWidgetInfo((
char *) NULL,&selection_info);
1774 delay=SuspendTime << 2;
1775 state=UpdateConfigurationState;
1778 if (state & UpdateConfigurationState)
1786 XGetWidgetInfo(CancelButtonText,&cancel_info);
1787 cancel_info.width=width;
1788 cancel_info.height=(
unsigned int) ((3*height) >> 1);
1790 (windows->widget.width-cancel_info.width-QuantumMargin-2);
1792 (windows->widget.height-cancel_info.height-QuantumMargin);
1793 XGetWidgetInfo(action,&action_info);
1794 action_info.width=width;
1795 action_info.height=(
unsigned int) ((3*height) >> 1);
1796 action_info.x=(int) windows->widget.width-(
int) action_info.width-
1797 (int) cancel_info.width-2*QuantumMargin-2;
1798 action_info.y=cancel_info.y;
1799 XGetWidgetInfo(GrabButtonText,&grab_info);
1800 grab_info.width=width;
1801 grab_info.height=(
unsigned int) ((3*height) >> 1);
1802 grab_info.x=QuantumMargin;
1803 grab_info.y=((5*QuantumMargin) >> 1)+height;
1804 XGetWidgetInfo(ResetButtonText,&reset_info);
1805 reset_info.width=width;
1806 reset_info.height=(
unsigned int) ((3*height) >> 1);
1807 reset_info.x=QuantumMargin;
1808 reset_info.y=grab_info.y+grab_info.height+QuantumMargin;
1812 XGetWidgetInfo(reply,&reply_info);
1813 reply_info.raised=MagickFalse;
1814 reply_info.bevel_width--;
1815 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
1816 reply_info.height=height << 1;
1817 reply_info.x=(int) (width+(QuantumMargin << 1));
1818 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
1822 XGetWidgetInfo((
char *) NULL,&mode_info);
1823 mode_info.active=MagickTrue;
1824 mode_info.bevel_width=0;
1825 mode_info.width=(
unsigned int) (action_info.x-(QuantumMargin << 1));
1826 mode_info.height=action_info.height;
1827 mode_info.x=QuantumMargin;
1828 mode_info.y=action_info.y;
1832 XGetWidgetInfo((
char *) NULL,&scroll_info);
1833 scroll_info.bevel_width--;
1834 scroll_info.width=height;
1835 scroll_info.height=(
unsigned int) (reply_info.y-grab_info.y-
1836 (QuantumMargin >> 1));
1837 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
1838 scroll_info.y=grab_info.y-reply_info.bevel_width;
1839 scroll_info.raised=MagickFalse;
1840 scroll_info.trough=MagickTrue;
1841 north_info=scroll_info;
1842 north_info.raised=MagickTrue;
1843 north_info.width-=(north_info.bevel_width << 1);
1844 north_info.height=north_info.width-1;
1845 north_info.x+=north_info.bevel_width;
1846 north_info.y+=north_info.bevel_width;
1847 south_info=north_info;
1848 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
1851 slider_info=north_info;
1853 slider_info.width-=2;
1854 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
1855 slider_info.bevel_width+2;
1856 slider_info.height=scroll_info.height-((slider_info.min_y-
1857 scroll_info.y+1) << 1)+4;
1858 visible_colors=(
unsigned int) (scroll_info.height*
1859 MagickSafeReciprocal((
double) height+(height >> 3)));
1860 if (colors > visible_colors)
1861 slider_info.height=(
unsigned int) ((visible_colors*
1862 slider_info.height)/colors);
1863 slider_info.max_y=south_info.y-south_info.bevel_width-
1864 slider_info.bevel_width-2;
1865 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
1866 slider_info.y=slider_info.min_y;
1867 expose_info=scroll_info;
1868 expose_info.y=slider_info.y;
1872 XGetWidgetInfo((
char *) NULL,&list_info);
1873 list_info.raised=MagickFalse;
1874 list_info.bevel_width--;
1875 list_info.width=(
unsigned int)
1876 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
1877 list_info.height=scroll_info.height;
1878 list_info.x=reply_info.x;
1879 list_info.y=scroll_info.y;
1880 if (windows->widget.mapped == MagickFalse)
1881 state|=JumpListState;
1886 XGetWidgetInfo(text,&text_info);
1887 text_info.center=MagickFalse;
1888 text_info.width=reply_info.width;
1889 text_info.height=height;
1890 text_info.x=list_info.x-(QuantumMargin >> 1);
1891 text_info.y=QuantumMargin;
1895 XGetWidgetInfo((
char *) NULL,&selection_info);
1896 selection_info.center=MagickFalse;
1897 selection_info.width=list_info.width;
1898 selection_info.height=(
unsigned int) ((9*height) >> 3);
1899 selection_info.x=list_info.x;
1900 state&=(~UpdateConfigurationState);
1902 if (state & RedrawWidgetState)
1908 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
1909 (void) XDrawString(display,windows->widget.id,
1910 windows->widget.annotate_context,x,y,ColorPatternText,
1911 Extent(ColorPatternText));
1912 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
1913 XDrawWidgetText(display,&windows->widget,&text_info);
1914 XDrawBeveledButton(display,&windows->widget,&grab_info);
1915 XDrawBeveledButton(display,&windows->widget,&reset_info);
1916 XDrawBeveledMatte(display,&windows->widget,&list_info);
1917 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
1918 XDrawTriangleNorth(display,&windows->widget,&north_info);
1919 XDrawBeveledButton(display,&windows->widget,&slider_info);
1920 XDrawTriangleSouth(display,&windows->widget,&south_info);
1922 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
1923 (void) XDrawString(display,windows->widget.id,
1924 windows->widget.annotate_context,x,y,ColornameText,
1925 Extent(ColornameText));
1926 XDrawBeveledMatte(display,&windows->widget,&reply_info);
1927 XDrawMatteText(display,&windows->widget,&reply_info);
1928 XDrawBeveledButton(display,&windows->widget,&action_info);
1929 XDrawBeveledButton(display,&windows->widget,&cancel_info);
1930 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
1931 selection_info.id=(~0);
1932 state|=RedrawActionState;
1933 state|=RedrawListState;
1934 state&=(~RedrawWidgetState);
1936 if (state & UpdateListState)
1944 status=XParseColor(display,windows->widget.map_info->colormap,
1945 glob_pattern,&color);
1946 if ((status != False) || (strchr(glob_pattern,
'-') != (
char *) NULL))
1951 (void) CopyMagickString(reply,glob_pattern,MaxTextExtent);
1952 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
1953 action_info.raised=MagickFalse;
1954 XDrawBeveledButton(display,&windows->widget,&action_info);
1960 checklist=GetColorList(glob_pattern,&number_colors,exception);
1961 if (number_colors == 0)
1963 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
1964 (void) XBell(display,0);
1968 for (i=0; i < (int) colors; i++)
1969 colorlist[i]=DestroyString(colorlist[i]);
1970 if (colorlist != (
char **) NULL)
1971 colorlist=(
char **) RelinquishMagickMemory(colorlist);
1972 colorlist=checklist;
1973 colors=number_colors;
1979 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
1980 if (colors > visible_colors)
1981 slider_info.height=(
unsigned int)
1982 ((visible_colors*slider_info.height)/colors);
1983 slider_info.max_y=south_info.y-south_info.bevel_width-
1984 slider_info.bevel_width-2;
1986 slider_info.y=slider_info.min_y;
1987 expose_info.y=slider_info.y;
1988 selection_info.id=(~0);
1990 state|=RedrawListState;
1994 *reply_info.text=
'\0';
1995 reply_info.cursor=reply_info.text;
1996 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
1997 XDrawWidgetText(display,&windows->widget,&text_info);
1998 XDrawMatteText(display,&windows->widget,&reply_info);
1999 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
2000 XDrawTriangleNorth(display,&windows->widget,&north_info);
2001 XDrawBeveledButton(display,&windows->widget,&slider_info);
2002 XDrawTriangleSouth(display,&windows->widget,&south_info);
2003 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
2004 state&=(~UpdateListState);
2006 if (state & JumpListState)
2012 for (i=0; i < (int) colors; i++)
2013 if (LocaleCompare(colorlist[i],reply) >= 0)
2015 list_info.id=LocaleCompare(colorlist[i],reply) == 0 ? i : ~0;
2018 if ((i < slider_info.id) ||
2019 (i >= (
int) (slider_info.id+visible_colors)))
2020 slider_info.id=i-(visible_colors >> 1);
2021 selection_info.id=(~0);
2022 state|=RedrawListState;
2023 state&=(~JumpListState);
2025 if (state & RedrawListState)
2030 if (slider_info.id >= (
int) (colors-visible_colors))
2031 slider_info.id=(int) (colors-visible_colors);
2032 if ((slider_info.id < 0) || (colors <= visible_colors))
2034 slider_info.y=slider_info.min_y;
2036 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
2037 slider_info.min_y+1)/colors);
2038 if (slider_info.id != selection_info.id)
2043 selection_info.id=slider_info.id;
2044 selection_info.y=list_info.y+(height >> 3)+2;
2045 for (i=0; i < (int) visible_colors; i++)
2047 selection_info.raised=(slider_info.id+i) != list_info.id ?
2048 MagickTrue : MagickFalse;
2049 selection_info.text=(
char *) NULL;
2050 if ((slider_info.id+i) < (
int) colors)
2051 selection_info.text=colorlist[slider_info.id+i];
2052 XDrawWidgetText(display,&windows->widget,&selection_info);
2053 selection_info.y+=(int) selection_info.height;
2058 if (slider_info.y > expose_info.y)
2060 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
2061 expose_info.y=slider_info.y-expose_info.height-
2062 slider_info.bevel_width-1;
2066 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
2067 expose_info.y=slider_info.y+slider_info.height+
2068 slider_info.bevel_width+1;
2070 XDrawTriangleNorth(display,&windows->widget,&north_info);
2071 XDrawMatte(display,&windows->widget,&expose_info);
2072 XDrawBeveledButton(display,&windows->widget,&slider_info);
2073 XDrawTriangleSouth(display,&windows->widget,&south_info);
2074 expose_info.y=slider_info.y;
2076 state&=(~RedrawListState);
2078 if (state & RedrawActionState)
2081 colorname[MaxTextExtent];
2086 color=windows->widget.pixel_info->matte_color;
2087 (void) XParseColor(display,windows->widget.map_info->colormap,
2088 reply_info.text,&windows->widget.pixel_info->matte_color);
2089 XBestPixel(display,windows->widget.map_info->colormap,(XColor *) NULL,
2090 (
unsigned int) windows->widget.visual_info->colormap_size,
2091 &windows->widget.pixel_info->matte_color);
2092 mode_info.text=colorname;
2093 (void) FormatLocaleString(mode_info.text,MaxTextExtent,
"#%02x%02x%02x",
2094 windows->widget.pixel_info->matte_color.red,
2095 windows->widget.pixel_info->matte_color.green,
2096 windows->widget.pixel_info->matte_color.blue);
2097 XDrawBeveledButton(display,&windows->widget,&mode_info);
2098 windows->widget.pixel_info->matte_color=color;
2099 state&=(~RedrawActionState);
2104 if (north_info.raised && south_info.raised)
2105 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
2111 XDelay(display,delay);
2113 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
2114 if (north_info.raised == MagickFalse)
2115 if (slider_info.id > 0)
2121 state|=RedrawListState;
2123 if (south_info.raised == MagickFalse)
2124 if (slider_info.id < (
int) colors)
2130 state|=RedrawListState;
2132 if (event.type != ButtonRelease)
2139 if (MatteIsActive(slider_info,event.xbutton))
2144 slider_info.active=MagickTrue;
2147 if (MatteIsActive(north_info,event.xbutton))
2148 if (slider_info.id > 0)
2153 north_info.raised=MagickFalse;
2155 state|=RedrawListState;
2158 if (MatteIsActive(south_info,event.xbutton))
2159 if (slider_info.id < (
int) colors)
2164 south_info.raised=MagickFalse;
2166 state|=RedrawListState;
2169 if (MatteIsActive(scroll_info,event.xbutton))
2174 if (event.xbutton.y < slider_info.y)
2175 slider_info.id-=(visible_colors-1);
2177 slider_info.id+=(visible_colors-1);
2178 state|=RedrawListState;
2181 if (MatteIsActive(list_info,event.xbutton))
2189 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
2190 selection_info.height;
2191 if (
id >= (
int) colors)
2193 (void) CopyMagickString(reply_info.text,colorlist[
id],
2195 reply_info.highlight=MagickFalse;
2196 reply_info.marker=reply_info.text;
2197 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2198 XDrawMatteText(display,&windows->widget,&reply_info);
2199 state|=RedrawActionState;
2200 if (
id == list_info.id)
2202 (void) CopyMagickString(glob_pattern,reply_info.text,
2204 state|=UpdateListState;
2206 selection_info.id=(~0);
2208 state|=RedrawListState;
2211 if (MatteIsActive(grab_info,event.xbutton))
2216 grab_info.raised=MagickFalse;
2217 XDrawBeveledButton(display,&windows->widget,&grab_info);
2220 if (MatteIsActive(reset_info,event.xbutton))
2225 reset_info.raised=MagickFalse;
2226 XDrawBeveledButton(display,&windows->widget,&reset_info);
2229 if (MatteIsActive(mode_info,event.xbutton))
2234 if (mode_info.text != (
char *) NULL)
2235 (void) CopyMagickString(reply_info.text,mode_info.text,
2237 (void) CopyMagickString(primary_selection,reply_info.text,
2239 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2240 event.xbutton.time);
2241 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2242 windows->widget.id ? MagickTrue : MagickFalse;
2243 reply_info.marker=reply_info.text;
2244 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2245 XDrawMatteText(display,&windows->widget,&reply_info);
2248 if (MatteIsActive(action_info,event.xbutton))
2253 action_info.raised=MagickFalse;
2254 XDrawBeveledButton(display,&windows->widget,&action_info);
2257 if (MatteIsActive(cancel_info,event.xbutton))
2262 cancel_info.raised=MagickFalse;
2263 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2266 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2268 if (event.xbutton.button != Button2)
2276 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
2277 if (font_info != (XFontStruct *) NULL)
2278 for (i=1; i <= Extent(reply_info.marker); i++)
2279 if (XTextWidth(font_info,reply_info.marker,i) > x)
2281 reply_info.cursor=reply_info.marker+i-1;
2282 if (event.xbutton.time > (click_time+DoubleClick))
2283 reply_info.highlight=MagickFalse;
2289 (void) CopyMagickString(primary_selection,reply_info.text,
2291 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2292 event.xbutton.time);
2293 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2294 windows->widget.id ? MagickTrue : MagickFalse;
2296 XDrawMatteText(display,&windows->widget,&reply_info);
2297 click_time=
event.xbutton.time;
2303 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
2304 windows->widget.id,event.xbutton.time);
2309 if (windows->widget.mapped == MagickFalse)
2311 if (north_info.raised == MagickFalse)
2316 delay=SuspendTime << 2;
2317 north_info.raised=MagickTrue;
2318 XDrawTriangleNorth(display,&windows->widget,&north_info);
2320 if (south_info.raised == MagickFalse)
2325 delay=SuspendTime << 2;
2326 south_info.raised=MagickTrue;
2327 XDrawTriangleSouth(display,&windows->widget,&south_info);
2329 if (slider_info.active)
2334 slider_info.active=MagickFalse;
2337 if (grab_info.raised == MagickFalse)
2339 if (event.xbutton.window == windows->widget.id)
2340 if (MatteIsActive(grab_info,event.xbutton))
2345 (void) XGetWindowColor(display,windows,reply_info.text);
2346 reply_info.marker=reply_info.text;
2347 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2348 XDrawMatteText(display,&windows->widget,&reply_info);
2349 state|=RedrawActionState;
2351 grab_info.raised=MagickTrue;
2352 XDrawBeveledButton(display,&windows->widget,&grab_info);
2354 if (reset_info.raised == MagickFalse)
2356 if (event.xbutton.window == windows->widget.id)
2357 if (MatteIsActive(reset_info,event.xbutton))
2359 (void) CopyMagickString(glob_pattern,reset_pattern,
2361 state|=UpdateListState;
2363 reset_info.raised=MagickTrue;
2364 XDrawBeveledButton(display,&windows->widget,&reset_info);
2366 if (action_info.raised == MagickFalse)
2368 if (event.xbutton.window == windows->widget.id)
2370 if (MatteIsActive(action_info,event.xbutton))
2372 if (*reply_info.text ==
'\0')
2373 (void) XBell(display,0);
2378 action_info.raised=MagickTrue;
2379 XDrawBeveledButton(display,&windows->widget,&action_info);
2381 if (cancel_info.raised == MagickFalse)
2383 if (event.xbutton.window == windows->widget.id)
2384 if (MatteIsActive(cancel_info,event.xbutton))
2386 *reply_info.text=
'\0';
2389 cancel_info.raised=MagickTrue;
2390 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2392 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2401 if (event.xclient.message_type != windows->wm_protocols)
2403 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
2405 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
2406 (Time) event.xclient.data.l[1]);
2409 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
2411 if (event.xclient.window == windows->widget.id)
2413 *reply_info.text=
'\0';
2419 case ConfigureNotify:
2424 if (event.xconfigure.window != windows->widget.id)
2426 if ((event.xconfigure.width == (
int) windows->widget.width) &&
2427 (event.xconfigure.height == (
int) windows->widget.height))
2429 windows->widget.width=(
unsigned int)
2430 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
2431 windows->widget.height=(
unsigned int)
2432 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
2433 state|=UpdateConfigurationState;
2438 if (event.xcrossing.window != windows->widget.id)
2440 state&=(~InactiveWidgetState);
2445 if (event.xexpose.window != windows->widget.id)
2447 if (event.xexpose.count != 0)
2449 state|=RedrawWidgetState;
2455 command[MaxTextExtent];
2466 if (event.xkey.window != windows->widget.id)
2468 length=XLookupString((XKeyEvent *) &event.xkey,command,
2469 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2470 *(command+length)=
'\0';
2471 if (AreaIsActive(scroll_info,event.xkey))
2476 switch ((
int) key_symbol)
2499 slider_info.id-=visible_colors;
2505 slider_info.id+=visible_colors;
2511 slider_info.id=(int) colors;
2515 state|=RedrawListState;
2518 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
2523 if (*reply_info.text ==
'\0')
2525 (void) CopyMagickString(glob_pattern,reply_info.text,MaxTextExtent);
2526 state|=UpdateListState;
2529 if (key_symbol == XK_Control_L)
2531 state|=ControlState;
2534 if (state & ControlState)
2535 switch ((
int) key_symbol)
2543 *reply_info.text=
'\0';
2544 reply_info.cursor=reply_info.text;
2545 reply_info.marker=reply_info.text;
2546 reply_info.highlight=MagickFalse;
2552 XEditText(display,&reply_info,key_symbol,command,state);
2553 XDrawMatteText(display,&windows->widget,&reply_info);
2554 state|=JumpListState;
2555 status=XParseColor(display,windows->widget.map_info->colormap,
2556 reply_info.text,&color);
2557 if (status != False)
2558 state|=RedrawActionState;
2564 command[MaxTextExtent];
2572 if (event.xkey.window != windows->widget.id)
2574 (void) XLookupString((XKeyEvent *) &event.xkey,command,
2575 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2576 if (key_symbol == XK_Control_L)
2577 state&=(~ControlState);
2582 if (event.xcrossing.window != windows->widget.id)
2584 state|=InactiveWidgetState;
2598 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
2599 if (slider_info.active)
2604 slider_info.y=
event.xmotion.y-
2605 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
2606 if (slider_info.y < slider_info.min_y)
2607 slider_info.y=slider_info.min_y;
2608 if (slider_info.y > slider_info.max_y)
2609 slider_info.y=slider_info.max_y;
2611 if (slider_info.y != slider_info.min_y)
2612 slider_info.id=(int) ((colors*(slider_info.y-
2613 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
2614 state|=RedrawListState;
2617 if (state & InactiveWidgetState)
2619 if (grab_info.raised == MatteIsActive(grab_info,event.xmotion))
2624 grab_info.raised=!grab_info.raised;
2625 XDrawBeveledButton(display,&windows->widget,&grab_info);
2628 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
2633 reset_info.raised=!reset_info.raised;
2634 XDrawBeveledButton(display,&windows->widget,&reset_info);
2637 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
2642 action_info.raised=action_info.raised == MagickFalse ?
2643 MagickTrue : MagickFalse;
2644 XDrawBeveledButton(display,&windows->widget,&action_info);
2647 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
2652 cancel_info.raised=cancel_info.raised == MagickFalse ?
2653 MagickTrue : MagickFalse;
2654 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2659 case SelectionClear:
2661 reply_info.highlight=MagickFalse;
2662 XDrawMatteText(display,&windows->widget,&reply_info);
2665 case SelectionNotify:
2683 if (event.xselection.property == (Atom) None)
2685 status=XGetWindowProperty(display,event.xselection.requestor,
2686 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
2687 &format,&length,&after,&data);
2688 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
2691 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
2692 (void) XBell(display,0);
2698 *(data+length)=
'\0';
2699 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
2701 XDrawMatteText(display,&windows->widget,&reply_info);
2702 state|=JumpListState;
2703 state|=RedrawActionState;
2705 (void) XFree((
void *) data);
2708 case SelectionRequest:
2713 XSelectionRequestEvent
2716 if (reply_info.highlight == MagickFalse)
2721 request=(&(
event.xselectionrequest));
2722 (void) XChangeProperty(request->display,request->requestor,
2723 request->property,request->target,8,PropModeReplace,
2724 (
unsigned char *) primary_selection,Extent(primary_selection));
2725 notify.type=SelectionNotify;
2726 notify.send_event=MagickTrue;
2727 notify.display=request->display;
2728 notify.requestor=request->requestor;
2729 notify.selection=request->selection;
2730 notify.target=request->target;
2731 notify.time=request->time;
2732 if (request->property == None)
2733 notify.property=request->target;
2735 notify.property=request->property;
2736 (void) XSendEvent(request->display,request->requestor,False,
2737 NoEventMask,(XEvent *) ¬ify);
2742 }
while ((state & ExitState) == 0);
2743 XSetCursorState(display,windows,MagickFalse);
2744 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
2745 XCheckRefreshWindows(display,windows);
2749 for (i=0; i < (int) colors; i++)
2750 colorlist[i]=DestroyString(colorlist[i]);
2751 if (colorlist != (
char **) NULL)
2752 colorlist=(
char **) RelinquishMagickMemory(colorlist);
2753 exception=DestroyExceptionInfo(exception);
2754 if ((*reply ==
'\0') || (strchr(reply,
'-') != (
char *) NULL))
2756 status=XParseColor(display,windows->widget.map_info->colormap,reply,&color);
2757 if (status != False)
2759 XNoticeWidget(display,windows,
"Color is unknown to X server:",reply);
2760 (void) CopyMagickString(reply,
"gray",MaxTextExtent);
2798MagickExport
int XCommandWidget(Display *display,XWindows *windows,
2799 const char *
const *selections,XEvent *event)
2801#define tile_width 112
2802#define tile_height 70
2804 static const unsigned char
2807 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2808 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2809 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
2811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
2813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2814 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2815 0x00, 0x00, 0x1e, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2816 0x00, 0x00, 0x00, 0x00, 0x1e, 0xbc, 0x9f, 0x03, 0x00, 0x3e, 0x00, 0xc0,
2817 0x1f, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x0f, 0x80, 0x3f,
2818 0x00, 0xf0, 0x1f, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x1f,
2819 0xe0, 0x3f, 0x00, 0xfc, 0x1f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc,
2820 0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xfe, 0x1f, 0xf8, 0x0f, 0x00, 0x00, 0x00,
2821 0x1e, 0xfc, 0xfc, 0x3f, 0xf8, 0x3f, 0x00, 0xff, 0x1e, 0xfc, 0x0f, 0x00,
2822 0x00, 0x00, 0x1e, 0x7c, 0xfc, 0x3e, 0xf8, 0x3c, 0x80, 0x1f, 0x1e, 0x7c,
2823 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c, 0xc0, 0x0f,
2824 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c,
2825 0xc0, 0x07, 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c,
2826 0x7c, 0x7c, 0xc0, 0x0f, 0x1e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78,
2827 0x78, 0x3c, 0xfc, 0x7c, 0x80, 0x7f, 0x1e, 0x7c, 0x00, 0x00, 0x00, 0x00,
2828 0x1e, 0xf8, 0x78, 0x7c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0xf8, 0xff, 0x00,
2829 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xfe, 0x1f, 0xf8,
2830 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xf8,
2831 0x1f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xc0, 0xef,
2832 0x07, 0xe0, 0x1f, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0x70, 0x40, 0x78,
2833 0x00, 0xc7, 0x07, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x00,
2834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
2835 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
2837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2838 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2839 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2840 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2841 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
2842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00,
2843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
2844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
2845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2846 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00,
2847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07,
2848 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2849 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2850 0x60, 0x00, 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2851 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
2852 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00,
2853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x9f, 0x7f, 0x00,
2854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0xdf,
2855 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x00,
2856 0xe0, 0xdf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0c,
2857 0x78, 0x30, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
2858 0x00, 0x0f, 0xf8, 0x70, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x1f, 0x00, 0xe0,
2859 0x0f, 0x1e, 0x80, 0x0f, 0xf8, 0x78, 0xf0, 0xfd, 0xf9, 0x00, 0xc0, 0x1f,
2860 0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x1f, 0xf8, 0x7c, 0xf0, 0xfc, 0xf9, 0x00,
2861 0xf0, 0x1f, 0x00, 0xfe, 0x0f, 0x00, 0xf0, 0x07, 0xf8, 0x3e, 0xf8, 0xfc,
2862 0xf0, 0x01, 0xf8, 0x1f, 0x00, 0xff, 0x0f, 0x1e, 0xf0, 0x03, 0xf8, 0x3f,
2863 0xf8, 0xf8, 0xf0, 0x01, 0xfc, 0x1f, 0x80, 0x7f, 0x0f, 0x1e, 0xf8, 0x00,
2864 0xf8, 0x1f, 0x78, 0x18, 0xf0, 0x01, 0x7c, 0x1e, 0xc0, 0x0f, 0x0f, 0x1e,
2865 0x7c, 0x00, 0xf0, 0x0f, 0x78, 0x00, 0xf0, 0x01, 0x3e, 0x1e, 0xe0, 0x07,
2866 0x0f, 0x1e, 0x7c, 0x00, 0xf0, 0x07, 0x7c, 0x00, 0xe0, 0x01, 0x3e, 0x1e,
2867 0xe0, 0x03, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x0f, 0x7c, 0x00, 0xe0, 0x03,
2868 0x3e, 0x3e, 0xe0, 0x07, 0x0f, 0x1e, 0x1e, 0x00, 0xf0, 0x1f, 0x3c, 0x00,
2869 0xe0, 0x03, 0x7e, 0x3e, 0xc0, 0x3f, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x1f,
2870 0x3e, 0x00, 0xe0, 0x03, 0xfc, 0x7f, 0x80, 0xff, 0x0f, 0x1e, 0xfc, 0x00,
2871 0xf0, 0x3e, 0x3e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xff, 0x0f, 0x1e,
2872 0xfc, 0x07, 0xf0, 0x7c, 0x1e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xfc,
2873 0x0f, 0x1e, 0xf8, 0x1f, 0xf0, 0xf8, 0x1e, 0x00, 0xc0, 0x03, 0xe0, 0xf7,
2874 0x03, 0xf0, 0x0f, 0x1e, 0xe0, 0x3f, 0xf0, 0x78, 0x1c, 0x00, 0x80, 0x03,
2875 0x80, 0xe3, 0x03, 0x00, 0x0f, 0x1e, 0xc0, 0x3f, 0xf0, 0x30, 0x00, 0x00,
2876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x3e, 0x00, 0x00,
2877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x10,
2878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00,
2879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2880 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2881 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2882 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2883 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
2885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
2886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
2887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2888 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2910 assert(display != (Display *) NULL);
2911 assert(windows != (XWindows *) NULL);
2912 if (IsEventLogging() != MagickFalse)
2913 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2914 font_info=windows->command.font_info;
2915 height=(
unsigned int) (font_info->ascent+font_info->descent);
2918 if (event == (XEvent *) NULL)
2932 assert(selections != (
const char **) NULL);
2933 windows->command.width=0;
2934 for (i=0; selections[i] != (
char *) NULL; i++)
2936 width=WidgetTextWidth(font_info,(
char *) selections[i]);
2937 if (width > windows->command.width)
2938 windows->command.width=width;
2940 number_selections=(
unsigned int) i;
2941 windows->command.width+=3*QuantumMargin+10;
2942 if ((
int) windows->command.width < (tile_width+QuantumMargin+10))
2943 windows->command.width=(
unsigned int) (tile_width+QuantumMargin+10);
2944 windows->command.height=(
unsigned int) (number_selections*
2945 (((3*height) >> 1)+10)+tile_height+20);
2946 windows->command.min_width=windows->command.width;
2947 windows->command.min_height=windows->command.height;
2948 XConstrainWindowPosition(display,&windows->command);
2949 if (windows->command.id != (Window) NULL)
2957 status=XStringListToTextProperty(&windows->command.name,1,
2959 if (status != False)
2961 XSetWMName(display,windows->command.id,&window_name);
2962 XSetWMIconName(display,windows->command.id,&window_name);
2963 (void) XFree((
void *) window_name.value);
2965 window_changes.width=(int) windows->command.width;
2966 window_changes.height=(int) windows->command.height;
2967 (void) XReconfigureWMWindow(display,windows->command.id,
2968 windows->command.screen,(
unsigned int) (CWWidth | CWHeight),
2974 if (selection_info != (XWidgetInfo *) NULL)
2975 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
2976 selection_info=(XWidgetInfo *) AcquireQuantumMemory(number_selections,
2977 sizeof(*selection_info));
2978 if (selection_info == (XWidgetInfo *) NULL)
2979 ThrowXWindowFatalException(ResourceLimitFatalError,
2980 "MemoryAllocationFailed",
"...");
2981 state|=UpdateConfigurationState | RedrawWidgetState;
2986 if (event != (XEvent *) NULL)
2987 switch (event->type)
2991 for (i=0; i < (int) number_selections; i++)
2993 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
2995 if (i >= (
int) windows->command.data)
2997 selection_info[i].raised=MagickFalse;
2998 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
3001 submenu_info=selection_info[i];
3002 submenu_info.active=MagickTrue;
3003 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3004 (toggle_info.height >> 1);
3006 (void) XCheckWindowEvent(display,windows->widget.id,LeaveWindowMask,
3014 for (i=0; i < (int) number_selections; i++)
3016 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
3019 if (
id >= (
int) windows->command.data)
3021 selection_info[id].raised=MagickTrue;
3022 XDrawBeveledButton(display,&windows->command,&selection_info[
id]);
3034 if (event->xclient.message_type != windows->wm_protocols)
3036 if (*event->xclient.data.l != (
int) windows->wm_delete_window)
3038 (void) XWithdrawWindow(display,windows->command.id,
3039 windows->command.screen);
3042 case ConfigureNotify:
3047 if (event->xconfigure.window != windows->command.id)
3049 if (event->xconfigure.send_event != 0)
3051 windows->command.x=
event->xconfigure.x;
3052 windows->command.y=
event->xconfigure.y;
3054 if ((event->xconfigure.width == (
int) windows->command.width) &&
3055 (event->xconfigure.height == (
int) windows->command.height))
3057 windows->command.width=(
unsigned int)
3058 MagickMax(event->xconfigure.width,(
int) windows->command.min_width);
3059 windows->command.height=(
unsigned int)
3060 MagickMax(event->xconfigure.height,(
int) windows->command.min_height);
3061 state|=UpdateConfigurationState;
3066 if (event->xexpose.window != windows->command.id)
3068 if (event->xexpose.count != 0)
3070 state|=RedrawWidgetState;
3080 for (i=0; i < (int) number_selections; i++)
3082 if (i >= (
int) windows->command.data)
3084 if (selection_info[i].raised ==
3085 MatteIsActive(selection_info[i],event->xmotion))
3090 selection_info[i].raised=!selection_info[i].raised;
3091 XDrawBeveledButton(display,&windows->command,
3092 &selection_info[i]);
3096 if (MatteIsActive(selection_info[i],event->xmotion) == MagickFalse)
3098 submenu_info=selection_info[i];
3099 submenu_info.active=MagickTrue;
3100 toggle_info.raised=MagickTrue;
3101 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3102 (toggle_info.height >> 1);
3103 XDrawTriangleEast(display,&windows->command,&toggle_info);
3106 XDelay(display,SuspendTime);
3107 if (XCheckMaskEvent(display,ButtonMotionMask,event) == MagickFalse)
3109 while (XCheckMaskEvent(display,ButtonMotionMask,event)) ;
3110 toggle_info.raised=MagickFalse;
3111 if (windows->command.data != 0)
3112 XDrawTriangleEast(display,&windows->command,&toggle_info);
3118 windows->command.mapped=MagickTrue;
3123 windows->command.mapped=MagickFalse;
3129 if (state & UpdateConfigurationState)
3134 assert(selections != (
const char **) NULL);
3136 for (i=0; i < (int) number_selections; i++)
3138 XGetWidgetInfo(selections[i],&selection_info[i]);
3139 selection_info[i].center=MagickFalse;
3140 selection_info[i].bevel_width--;
3141 selection_info[i].height=(
unsigned int) ((3*height) >> 1);
3142 selection_info[i].x=(QuantumMargin >> 1)+4;
3143 selection_info[i].width=(
unsigned int) (windows->command.width-
3144 (selection_info[i].x << 1));
3145 selection_info[i].y=y;
3146 y+=selection_info[i].height+(selection_info[i].bevel_width << 1)+6;
3148 XGetWidgetInfo((
char *) NULL,&toggle_info);
3149 toggle_info.bevel_width--;
3150 toggle_info.width=(
unsigned int) (((5*height) >> 3)-
3151 (toggle_info.bevel_width << 1));
3152 toggle_info.height=toggle_info.width;
3153 toggle_info.x=selection_info[0].x+selection_info[0].width-
3154 toggle_info.width-(QuantumMargin >> 1);
3155 if (windows->command.mapped)
3156 (void) XClearWindow(display,windows->command.id);
3158 if (state & RedrawWidgetState)
3166 tile_pixmap=XCreatePixmapFromBitmapData(display,windows->command.id,
3167 (
char *) tile_bits,tile_width,tile_height,1L,0L,1);
3168 if (tile_pixmap != (Pixmap) NULL)
3170 (void) XCopyPlane(display,tile_pixmap,windows->command.id,
3171 windows->command.annotate_context,0,0,tile_width,tile_height,
3172 (
int) ((windows->command.width-tile_width) >> 1),10,1L);
3173 (void) XFreePixmap(display,tile_pixmap);
3175 for (i=0; i < (int) number_selections; i++)
3177 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
3178 if (i >= (
int) windows->command.data)
3180 toggle_info.raised=MagickFalse;
3181 toggle_info.y=selection_info[i].y+(selection_info[i].height >> 1)-
3182 (toggle_info.height >> 1);
3183 XDrawTriangleEast(display,&windows->command,&toggle_info);
3185 XHighlightWidget(display,&windows->command,BorderOffset,BorderOffset);
3222MagickExport
int XConfirmWidget(Display *display,XWindows *windows,
3223 const char *reason,
const char *description)
3225#define CancelButtonText "Cancel"
3226#define DismissButtonText "Dismiss"
3227#define YesButtonText "Yes"
3264 assert(display != (Display *) NULL);
3265 assert(windows != (XWindows *) NULL);
3266 assert(reason != (
char *) NULL);
3267 assert(description != (
char *) NULL);
3268 if (IsEventLogging() != MagickFalse)
3269 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
3270 XCheckRefreshWindows(display,windows);
3271 font_info=windows->widget.font_info;
3272 width=WidgetTextWidth(font_info,CancelButtonText);
3273 if (WidgetTextWidth(font_info,DismissButtonText) > width)
3274 width=WidgetTextWidth(font_info,DismissButtonText);
3275 if (WidgetTextWidth(font_info,YesButtonText) > width)
3276 width=WidgetTextWidth(font_info,YesButtonText);
3278 if (description != (
char *) NULL)
3279 if (WidgetTextWidth(font_info,(
char *) description) > width)
3280 width=WidgetTextWidth(font_info,(
char *) description);
3281 height=(
unsigned int) (font_info->ascent+font_info->descent);
3285 windows->widget.width=(
unsigned int) (width+9*QuantumMargin);
3286 windows->widget.min_width=(
unsigned int) (9*QuantumMargin+
3287 WidgetTextWidth(font_info,CancelButtonText)+
3288 WidgetTextWidth(font_info,DismissButtonText)+
3289 WidgetTextWidth(font_info,YesButtonText));
3290 if (windows->widget.width < windows->widget.min_width)
3291 windows->widget.width=windows->widget.min_width;
3292 windows->widget.height=(
unsigned int) (12*height);
3293 windows->widget.min_height=(
unsigned int) (7*height);
3294 if (windows->widget.height < windows->widget.min_height)
3295 windows->widget.height=windows->widget.min_height;
3296 XConstrainWindowPosition(display,&windows->widget);
3300 (void) CopyMagickString(windows->widget.name,
"Confirm",MaxTextExtent);
3301 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3302 if (status != False)
3304 XSetWMName(display,windows->widget.id,&window_name);
3305 XSetWMIconName(display,windows->widget.id,&window_name);
3306 (void) XFree((
void *) window_name.value);
3308 window_changes.width=(int) windows->widget.width;
3309 window_changes.height=(int) windows->widget.height;
3310 window_changes.x=windows->widget.x;
3311 window_changes.y=windows->widget.y;
3312 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3313 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3314 (void) XMapRaised(display,windows->widget.id);
3315 windows->widget.mapped=MagickFalse;
3320 state=UpdateConfigurationState;
3321 XSetCursorState(display,windows,MagickTrue);
3324 if (state & UpdateConfigurationState)
3329 XGetWidgetInfo(CancelButtonText,&cancel_info);
3330 cancel_info.width=(
unsigned int) QuantumMargin+
3331 WidgetTextWidth(font_info,CancelButtonText);
3332 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3333 cancel_info.x=(int) (windows->widget.width-cancel_info.width-
3335 cancel_info.y=(int) (windows->widget.height-(cancel_info.height << 1));
3336 dismiss_info=cancel_info;
3337 dismiss_info.text=(
char *) DismissButtonText;
3338 if (LocaleCompare(description,
"Do you want to save it") == 0)
3339 dismiss_info.text=(
char *)
"Don't Save";
3340 dismiss_info.width=(
unsigned int) QuantumMargin+
3341 WidgetTextWidth(font_info,dismiss_info.text);
3342 dismiss_info.x=(int)
3343 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
3344 yes_info=cancel_info;
3345 yes_info.text=(
char *) YesButtonText;
3346 if (LocaleCompare(description,
"Do you want to save it") == 0)
3347 yes_info.text=(
char *)
"Save";
3348 yes_info.width=(
unsigned int) QuantumMargin+
3349 WidgetTextWidth(font_info,yes_info.text);
3350 if (yes_info.width < cancel_info.width)
3351 yes_info.width=cancel_info.width;
3352 yes_info.x=QuantumMargin;
3353 state&=(~UpdateConfigurationState);
3355 if (state & RedrawWidgetState)
3360 width=WidgetTextWidth(font_info,(
char *) reason);
3361 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3362 y=(int) ((windows->widget.height >> 1)-(height << 1));
3363 (void) XDrawString(display,windows->widget.id,
3364 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
3365 if (description != (
char *) NULL)
3368 question[MaxTextExtent];
3370 (void) CopyMagickString(question,description,MaxTextExtent);
3371 (void) ConcatenateMagickString(question,
"?",MaxTextExtent);
3372 width=WidgetTextWidth(font_info,question);
3373 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3375 (void) XDrawString(display,windows->widget.id,
3376 windows->widget.annotate_context,x,y,question,Extent(question));
3378 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3379 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3380 XDrawBeveledButton(display,&windows->widget,&yes_info);
3381 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3382 state&=(~RedrawWidgetState);
3387 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3392 if (MatteIsActive(cancel_info,event.xbutton))
3397 cancel_info.raised=MagickFalse;
3398 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3401 if (MatteIsActive(dismiss_info,event.xbutton))
3406 dismiss_info.raised=MagickFalse;
3407 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3410 if (MatteIsActive(yes_info,event.xbutton))
3415 yes_info.raised=MagickFalse;
3416 XDrawBeveledButton(display,&windows->widget,&yes_info);
3423 if (windows->widget.mapped == MagickFalse)
3425 if (cancel_info.raised == MagickFalse)
3427 if (event.xbutton.window == windows->widget.id)
3428 if (MatteIsActive(cancel_info,event.xbutton))
3433 cancel_info.raised=MagickTrue;
3434 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3436 if (dismiss_info.raised == MagickFalse)
3438 if (event.xbutton.window == windows->widget.id)
3439 if (MatteIsActive(dismiss_info,event.xbutton))
3444 dismiss_info.raised=MagickTrue;
3445 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3447 if (yes_info.raised == MagickFalse)
3449 if (event.xbutton.window == windows->widget.id)
3450 if (MatteIsActive(yes_info,event.xbutton))
3455 yes_info.raised=MagickTrue;
3456 XDrawBeveledButton(display,&windows->widget,&yes_info);
3465 if (event.xclient.message_type != windows->wm_protocols)
3467 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3469 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3470 (Time) event.xclient.data.l[1]);
3473 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3475 if (event.xclient.window == windows->widget.id)
3482 case ConfigureNotify:
3487 if (event.xconfigure.window != windows->widget.id)
3489 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3490 (event.xconfigure.height == (
int) windows->widget.height))
3492 windows->widget.width=(
unsigned int)
3493 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3494 windows->widget.height=(
unsigned int)
3495 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3496 state|=UpdateConfigurationState;
3501 if (event.xcrossing.window != windows->widget.id)
3503 state&=(~InactiveWidgetState);
3508 if (event.xexpose.window != windows->widget.id)
3510 if (event.xexpose.count != 0)
3512 state|=RedrawWidgetState;
3518 command[MaxTextExtent];
3526 if (event.xkey.window != windows->widget.id)
3528 (void) XLookupString((XKeyEvent *) &event.xkey,command,
3529 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3530 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3532 yes_info.raised=MagickFalse;
3533 XDrawBeveledButton(display,&windows->widget,&yes_info);
3542 if (event.xcrossing.window != windows->widget.id)
3544 state|=InactiveWidgetState;
3552 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
3553 if (state & InactiveWidgetState)
3555 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
3560 cancel_info.raised=cancel_info.raised == MagickFalse ?
3561 MagickTrue : MagickFalse;
3562 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3565 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
3570 dismiss_info.raised=dismiss_info.raised == MagickFalse ?
3571 MagickTrue : MagickFalse;
3572 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3575 if (yes_info.raised == MatteIsActive(yes_info,event.xmotion))
3580 yes_info.raised=yes_info.raised == MagickFalse ?
3581 MagickTrue : MagickFalse;
3582 XDrawBeveledButton(display,&windows->widget,&yes_info);
3590 }
while ((state & ExitState) == 0);
3591 XSetCursorState(display,windows,MagickFalse);
3592 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
3593 XCheckRefreshWindows(display,windows);
3631MagickExport
int XDialogWidget(Display *display,XWindows *windows,
3632 const char *action,
const char *query,
char *reply)
3634#define CancelButtonText "Cancel"
3637 primary_selection[MaxTextExtent];
3645 static MagickBooleanType
3646 raised = MagickFalse;
3681 assert(display != (Display *) NULL);
3682 assert(windows != (XWindows *) NULL);
3683 assert(action != (
char *) NULL);
3684 assert(query != (
char *) NULL);
3685 assert(reply != (
char *) NULL);
3686 if (IsEventLogging() != MagickFalse)
3687 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
3688 XCheckRefreshWindows(display,windows);
3689 font_info=windows->widget.font_info;
3690 width=WidgetTextWidth(font_info,(
char *) action);
3691 if (WidgetTextWidth(font_info,CancelButtonText) > width)
3692 width=WidgetTextWidth(font_info,CancelButtonText);
3693 width+=(3*QuantumMargin) >> 1;
3694 height=(
unsigned int) (font_info->ascent+font_info->descent);
3698 windows->widget.width=(
unsigned int) MagickMax((
int) (2*width),(
int)
3699 WidgetTextWidth(font_info,(
char *) query));
3700 if (windows->widget.width < WidgetTextWidth(font_info,reply))
3701 windows->widget.width=WidgetTextWidth(font_info,reply);
3702 windows->widget.width+=6*QuantumMargin;
3703 windows->widget.min_width=(
unsigned int)
3704 (width+28*XTextWidth(font_info,
"#",1)+4*QuantumMargin);
3705 if (windows->widget.width < windows->widget.min_width)
3706 windows->widget.width=windows->widget.min_width;
3707 windows->widget.height=(
unsigned int) (7*height+(QuantumMargin << 1));
3708 windows->widget.min_height=windows->widget.height;
3709 if (windows->widget.height < windows->widget.min_height)
3710 windows->widget.height=windows->widget.min_height;
3711 XConstrainWindowPosition(display,&windows->widget);
3715 (void) CopyMagickString(windows->widget.name,
"Dialog",MaxTextExtent);
3716 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3717 if (status != False)
3719 XSetWMName(display,windows->widget.id,&window_name);
3720 XSetWMIconName(display,windows->widget.id,&window_name);
3721 (void) XFree((
void *) window_name.value);
3723 window_changes.width=(int) windows->widget.width;
3724 window_changes.height=(int) windows->widget.height;
3725 window_changes.x=windows->widget.x;
3726 window_changes.y=windows->widget.y;
3727 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3728 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3729 (void) XMapRaised(display,windows->widget.id);
3730 windows->widget.mapped=MagickFalse;
3734 anomaly=(LocaleCompare(action,
"Background") == 0) ||
3735 (LocaleCompare(action,
"New") == 0) ||
3736 (LocaleCompare(action,
"Quantize") == 0) ||
3737 (LocaleCompare(action,
"Resize") == 0) ||
3738 (LocaleCompare(action,
"Save") == 0) ||
3739 (LocaleCompare(action,
"Shade") == 0);
3740 state=UpdateConfigurationState;
3741 XSetCursorState(display,windows,MagickTrue);
3744 if (state & UpdateConfigurationState)
3749 XGetWidgetInfo(CancelButtonText,&cancel_info);
3750 cancel_info.width=width;
3751 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3753 (windows->widget.width-cancel_info.width-((3*QuantumMargin) >> 1));
3755 (windows->widget.height-cancel_info.height-((3*QuantumMargin) >> 1));
3756 XGetWidgetInfo(action,&action_info);
3757 action_info.width=width;
3758 action_info.height=(
unsigned int) ((3*height) >> 1);
3759 action_info.x=cancel_info.x-(cancel_info.width+QuantumMargin+
3760 (action_info.bevel_width << 1));
3761 action_info.y=cancel_info.y;
3765 XGetWidgetInfo(reply,&reply_info);
3766 reply_info.raised=MagickFalse;
3767 reply_info.bevel_width--;
3768 reply_info.width=windows->widget.width-(3*QuantumMargin);
3769 reply_info.height=height << 1;
3770 reply_info.x=(3*QuantumMargin) >> 1;
3771 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
3775 XGetWidgetInfo(
"Dither",&special_info);
3776 special_info.raised=raised;
3777 special_info.bevel_width--;
3778 special_info.width=(
unsigned int) QuantumMargin >> 1;
3779 special_info.height=(
unsigned int) QuantumMargin >> 1;
3780 special_info.x=reply_info.x;
3781 special_info.y=action_info.y+action_info.height-special_info.height;
3782 if (LocaleCompare(action,
"Background") == 0)
3783 special_info.text=(
char *)
"Backdrop";
3784 if (LocaleCompare(action,
"New") == 0)
3785 special_info.text=(
char *)
"Gradation";
3786 if (LocaleCompare(action,
"Resize") == 0)
3787 special_info.text=(
char *)
"Constrain ratio";
3788 if (LocaleCompare(action,
"Save") == 0)
3789 special_info.text=(
char *)
"Non-progressive";
3790 if (LocaleCompare(action,
"Shade") == 0)
3791 special_info.text=(
char *)
"Color shading";
3795 XGetWidgetInfo(query,&text_info);
3796 text_info.width=reply_info.width;
3797 text_info.height=height;
3798 text_info.x=reply_info.x-(QuantumMargin >> 1);
3799 text_info.y=QuantumMargin;
3800 text_info.center=MagickFalse;
3801 state&=(~UpdateConfigurationState);
3803 if (state & RedrawWidgetState)
3808 XDrawWidgetText(display,&windows->widget,&text_info);
3809 XDrawBeveledMatte(display,&windows->widget,&reply_info);
3810 XDrawMatteText(display,&windows->widget,&reply_info);
3812 XDrawBeveledButton(display,&windows->widget,&special_info);
3813 XDrawBeveledButton(display,&windows->widget,&action_info);
3814 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3815 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3816 state&=(~RedrawWidgetState);
3821 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3827 if (MatteIsActive(special_info,event.xbutton))
3832 special_info.raised=!special_info.raised;
3833 XDrawBeveledButton(display,&windows->widget,&special_info);
3836 if (MatteIsActive(action_info,event.xbutton))
3841 action_info.raised=MagickFalse;
3842 XDrawBeveledButton(display,&windows->widget,&action_info);
3845 if (MatteIsActive(cancel_info,event.xbutton))
3850 cancel_info.raised=MagickFalse;
3851 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3854 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
3856 if (event.xbutton.button != Button2)
3864 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
3865 for (i=1; i <= Extent(reply_info.marker); i++)
3866 if (XTextWidth(font_info,reply_info.marker,i) > x)
3868 reply_info.cursor=reply_info.marker+i-1;
3869 if (event.xbutton.time > (click_time+DoubleClick))
3870 reply_info.highlight=MagickFalse;
3876 (void) CopyMagickString(primary_selection,reply_info.text,
3878 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
3879 event.xbutton.time);
3880 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
3881 windows->widget.id ? MagickTrue : MagickFalse;
3883 XDrawMatteText(display,&windows->widget,&reply_info);
3884 click_time=
event.xbutton.time;
3890 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
3891 windows->widget.id,event.xbutton.time);
3896 if (windows->widget.mapped == MagickFalse)
3898 if (action_info.raised == MagickFalse)
3900 if (event.xbutton.window == windows->widget.id)
3901 if (MatteIsActive(action_info,event.xbutton))
3903 action_info.raised=MagickTrue;
3904 XDrawBeveledButton(display,&windows->widget,&action_info);
3906 if (cancel_info.raised == MagickFalse)
3908 if (event.xbutton.window == windows->widget.id)
3909 if (MatteIsActive(cancel_info,event.xbutton))
3911 *reply_info.text=
'\0';
3914 cancel_info.raised=MagickTrue;
3915 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3924 if (event.xclient.message_type != windows->wm_protocols)
3926 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3928 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3929 (Time) event.xclient.data.l[1]);
3932 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3934 if (event.xclient.window == windows->widget.id)
3936 *reply_info.text=
'\0';
3942 case ConfigureNotify:
3947 if (event.xconfigure.window != windows->widget.id)
3949 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3950 (event.xconfigure.height == (
int) windows->widget.height))
3952 windows->widget.width=(
unsigned int)
3953 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3954 windows->widget.height=(
unsigned int)
3955 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3956 state|=UpdateConfigurationState;
3961 if (event.xcrossing.window != windows->widget.id)
3963 state&=(~InactiveWidgetState);
3968 if (event.xexpose.window != windows->widget.id)
3970 if (event.xexpose.count != 0)
3972 state|=RedrawWidgetState;
3978 command[MaxTextExtent];
3989 if (event.xkey.window != windows->widget.id)
3991 length=XLookupString((XKeyEvent *) &event.xkey,command,
3992 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3993 *(command+length)=
'\0';
3994 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3996 action_info.raised=MagickFalse;
3997 XDrawBeveledButton(display,&windows->widget,&action_info);
4001 if (key_symbol == XK_Control_L)
4003 state|=ControlState;
4006 if (state & ControlState)
4007 switch ((
int) key_symbol)
4015 *reply_info.text=
'\0';
4016 reply_info.cursor=reply_info.text;
4017 reply_info.marker=reply_info.text;
4018 reply_info.highlight=MagickFalse;
4024 XEditText(display,&reply_info,key_symbol,command,state);
4025 XDrawMatteText(display,&windows->widget,&reply_info);
4031 command[MaxTextExtent];
4039 if (event.xkey.window != windows->widget.id)
4041 (void) XLookupString((XKeyEvent *) &event.xkey,command,
4042 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
4043 if (key_symbol == XK_Control_L)
4044 state&=(~ControlState);
4049 if (event.xcrossing.window != windows->widget.id)
4051 state|=InactiveWidgetState;
4059 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
4060 if (state & InactiveWidgetState)
4062 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
4067 action_info.raised=action_info.raised == MagickFalse ?
4068 MagickTrue : MagickFalse;
4069 XDrawBeveledButton(display,&windows->widget,&action_info);
4072 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
4077 cancel_info.raised=cancel_info.raised == MagickFalse ?
4078 MagickTrue : MagickFalse;
4079 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4084 case SelectionClear:
4086 reply_info.highlight=MagickFalse;
4087 XDrawMatteText(display,&windows->widget,&reply_info);
4090 case SelectionNotify:
4108 if (event.xselection.property == (Atom) None)
4110 status=XGetWindowProperty(display,event.xselection.requestor,
4111 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
4112 &format,&length,&after,&data);
4113 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
4116 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
4117 (void) XBell(display,0);
4123 *(data+length)=
'\0';
4124 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
4126 XDrawMatteText(display,&windows->widget,&reply_info);
4128 (void) XFree((
void *) data);
4131 case SelectionRequest:
4136 XSelectionRequestEvent
4139 if (reply_info.highlight == MagickFalse)
4144 request=(&(
event.xselectionrequest));
4145 (void) XChangeProperty(request->display,request->requestor,
4146 request->property,request->target,8,PropModeReplace,
4147 (
unsigned char *) primary_selection,Extent(primary_selection));
4148 notify.type=SelectionNotify;
4149 notify.display=request->display;
4150 notify.requestor=request->requestor;
4151 notify.selection=request->selection;
4152 notify.target=request->target;
4153 notify.time=request->time;
4154 if (request->property == None)
4155 notify.property=request->target;
4157 notify.property=request->property;
4158 (void) XSendEvent(request->display,request->requestor,False,0,
4159 (XEvent *) ¬ify);
4164 }
while ((state & ExitState) == 0);
4165 XSetCursorState(display,windows,MagickFalse);
4166 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
4167 XCheckRefreshWindows(display,windows);
4169 if (special_info.raised)
4172 return(raised == MagickFalse);
4207MagickExport
void XFileBrowserWidget(Display *display,XWindows *windows,
4208 const char *action,
char *reply)
4210#define CancelButtonText "Cancel"
4211#define DirectoryText "Directory:"
4212#define FilenameText "File name:"
4213#define GrabButtonText "Grab"
4214#define FormatButtonText "Format"
4215#define HomeButtonText "Home"
4216#define UpButtonText "Up"
4221 home_directory[MaxTextExtent],
4222 primary_selection[MaxTextExtent],
4223 text[MaxTextExtent],
4224 working_path[MaxTextExtent];
4234 glob_pattern[MaxTextExtent] =
"*",
4235 format[MaxTextExtent] =
"miff";
4237 static MagickStatusType
4238 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
4286 assert(display != (Display *) NULL);
4287 assert(windows != (XWindows *) NULL);
4288 assert(action != (
char *) NULL);
4289 assert(reply != (
char *) NULL);
4290 if (IsEventLogging() != MagickFalse)
4291 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
4292 XSetCursorState(display,windows,MagickTrue);
4293 XCheckRefreshWindows(display,windows);
4294 directory=getcwd(home_directory,MaxTextExtent);
4296 (void) CopyMagickString(working_path,home_directory,MaxTextExtent);
4297 filelist=ListFiles(working_path,glob_pattern,&files);
4298 if (filelist == (
char **) NULL)
4303 XNoticeWidget(display,windows,
"Unable to read directory:",working_path);
4304 (void) XDialogWidget(display,windows,action,
"Enter filename:",reply);
4310 font_info=windows->widget.font_info;
4312 for (i=0; i < (ssize_t) files; i++)
4313 if (WidgetTextWidth(font_info,filelist[i]) > text_width)
4314 text_width=WidgetTextWidth(font_info,filelist[i]);
4315 width=WidgetTextWidth(font_info,(
char *) action);
4316 if (WidgetTextWidth(font_info,GrabButtonText) > width)
4317 width=WidgetTextWidth(font_info,GrabButtonText);
4318 if (WidgetTextWidth(font_info,FormatButtonText) > width)
4319 width=WidgetTextWidth(font_info,FormatButtonText);
4320 if (WidgetTextWidth(font_info,CancelButtonText) > width)
4321 width=WidgetTextWidth(font_info,CancelButtonText);
4322 if (WidgetTextWidth(font_info,HomeButtonText) > width)
4323 width=WidgetTextWidth(font_info,HomeButtonText);
4324 if (WidgetTextWidth(font_info,UpButtonText) > width)
4325 width=WidgetTextWidth(font_info,UpButtonText);
4326 width+=QuantumMargin;
4327 if (WidgetTextWidth(font_info,DirectoryText) > width)
4328 width=WidgetTextWidth(font_info,DirectoryText);
4329 if (WidgetTextWidth(font_info,FilenameText) > width)
4330 width=WidgetTextWidth(font_info,FilenameText);
4331 height=(
unsigned int) (font_info->ascent+font_info->descent);
4335 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
4337 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
4338 if (windows->widget.width < windows->widget.min_width)
4339 windows->widget.width=windows->widget.min_width;
4340 windows->widget.height=(
unsigned int)
4341 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
4342 windows->widget.min_height=(
unsigned int)
4343 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
4344 if (windows->widget.height < windows->widget.min_height)
4345 windows->widget.height=windows->widget.min_height;
4346 XConstrainWindowPosition(display,&windows->widget);
4350 (void) CopyMagickString(windows->widget.name,
"Browse and Select a File",
4352 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
4353 if (status != False)
4355 XSetWMName(display,windows->widget.id,&window_name);
4356 XSetWMIconName(display,windows->widget.id,&window_name);
4357 (void) XFree((
void *) window_name.value);
4359 window_changes.width=(int) windows->widget.width;
4360 window_changes.height=(int) windows->widget.height;
4361 window_changes.x=windows->widget.x;
4362 window_changes.y=windows->widget.y;
4363 (void) XReconfigureWMWindow(display,windows->widget.id,
4364 windows->widget.screen,mask,&window_changes);
4365 (void) XMapRaised(display,windows->widget.id);
4366 windows->widget.mapped=MagickFalse;
4370 XGetWidgetInfo((
char *) NULL,&slider_info);
4371 XGetWidgetInfo((
char *) NULL,&north_info);
4372 XGetWidgetInfo((
char *) NULL,&south_info);
4373 XGetWidgetInfo((
char *) NULL,&expose_info);
4375 anomaly=(LocaleCompare(action,
"Composite") == 0) ||
4376 (LocaleCompare(action,
"Open") == 0) || (LocaleCompare(action,
"Map") == 0);
4377 delay=SuspendTime << 2;
4378 state=UpdateConfigurationState;
4381 if (state & UpdateConfigurationState)
4389 XGetWidgetInfo(CancelButtonText,&cancel_info);
4390 cancel_info.width=width;
4391 cancel_info.height=(
unsigned int) ((3*height) >> 1);
4393 (windows->widget.width-cancel_info.width-QuantumMargin-2);
4395 (windows->widget.height-cancel_info.height-QuantumMargin);
4396 XGetWidgetInfo(action,&action_info);
4397 action_info.width=width;
4398 action_info.height=(
unsigned int) ((3*height) >> 1);
4399 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
4400 (action_info.bevel_width << 1));
4401 action_info.y=cancel_info.y;
4402 XGetWidgetInfo(GrabButtonText,&special_info);
4403 special_info.width=width;
4404 special_info.height=(
unsigned int) ((3*height) >> 1);
4405 special_info.x=action_info.x-(action_info.width+(QuantumMargin >> 1)+
4406 (special_info.bevel_width << 1));
4407 special_info.y=action_info.y;
4408 if (anomaly == MagickFalse)
4413 special_info.text=(
char *) FormatButtonText;
4414 p=reply+Extent(reply)-1;
4415 while ((p > (reply+1)) && (*(p-1) !=
'.'))
4417 if ((p > (reply+1)) && (*(p-1) ==
'.'))
4418 (void) CopyMagickString(format,p,MaxTextExtent);
4420 XGetWidgetInfo(UpButtonText,&up_info);
4421 up_info.width=width;
4422 up_info.height=(
unsigned int) ((3*height) >> 1);
4423 up_info.x=QuantumMargin;
4424 up_info.y=((5*QuantumMargin) >> 1)+height;
4425 XGetWidgetInfo(HomeButtonText,&home_info);
4426 home_info.width=width;
4427 home_info.height=(
unsigned int) ((3*height) >> 1);
4428 home_info.x=QuantumMargin;
4429 home_info.y=up_info.y+up_info.height+QuantumMargin;
4433 XGetWidgetInfo(reply,&reply_info);
4434 reply_info.raised=MagickFalse;
4435 reply_info.bevel_width--;
4436 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
4437 reply_info.height=height << 1;
4438 reply_info.x=(int) (width+(QuantumMargin << 1));
4439 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
4443 XGetWidgetInfo((
char *) NULL,&scroll_info);
4444 scroll_info.bevel_width--;
4445 scroll_info.width=height;
4446 scroll_info.height=(
unsigned int)
4447 (reply_info.y-up_info.y-(QuantumMargin >> 1));
4448 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
4449 scroll_info.y=up_info.y-reply_info.bevel_width;
4450 scroll_info.raised=MagickFalse;
4451 scroll_info.trough=MagickTrue;
4452 north_info=scroll_info;
4453 north_info.raised=MagickTrue;
4454 north_info.width-=(north_info.bevel_width << 1);
4455 north_info.height=north_info.width-1;
4456 north_info.x+=north_info.bevel_width;
4457 north_info.y+=north_info.bevel_width;
4458 south_info=north_info;
4459 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
4462 slider_info=north_info;
4464 slider_info.width-=2;
4465 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
4466 slider_info.bevel_width+2;
4467 slider_info.height=scroll_info.height-((slider_info.min_y-
4468 scroll_info.y+1) << 1)+4;
4469 visible_files=(
unsigned int) (scroll_info.height*
4470 MagickSafeReciprocal((
double) height+(height >> 3)));
4471 if (files > visible_files)
4472 slider_info.height=(
unsigned int) ((visible_files*
4473 slider_info.height)/files);
4474 slider_info.max_y=south_info.y-south_info.bevel_width-
4475 slider_info.bevel_width-2;
4476 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
4477 slider_info.y=slider_info.min_y;
4478 expose_info=scroll_info;
4479 expose_info.y=slider_info.y;
4483 XGetWidgetInfo((
char *) NULL,&list_info);
4484 list_info.raised=MagickFalse;
4485 list_info.bevel_width--;
4486 list_info.width=(
unsigned int)
4487 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
4488 list_info.height=scroll_info.height;
4489 list_info.x=reply_info.x;
4490 list_info.y=scroll_info.y;
4491 if (windows->widget.mapped == MagickFalse)
4492 state|=JumpListState;
4497 XGetWidgetInfo(text,&text_info);
4498 text_info.center=MagickFalse;
4499 text_info.width=reply_info.width;
4500 text_info.height=height;
4501 text_info.x=list_info.x-(QuantumMargin >> 1);
4502 text_info.y=QuantumMargin;
4506 XGetWidgetInfo((
char *) NULL,&selection_info);
4507 selection_info.center=MagickFalse;
4508 selection_info.width=list_info.width;
4509 selection_info.height=(
unsigned int) ((9*height) >> 3);
4510 selection_info.x=list_info.x;
4511 state&=(~UpdateConfigurationState);
4513 if (state & RedrawWidgetState)
4519 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
4520 (void) XDrawString(display,windows->widget.id,
4521 windows->widget.annotate_context,x,y,DirectoryText,
4522 Extent(DirectoryText));
4523 (void) CopyMagickString(text_info.text,working_path,MaxTextExtent);
4524 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4526 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4528 XDrawWidgetText(display,&windows->widget,&text_info);
4529 XDrawBeveledButton(display,&windows->widget,&up_info);
4530 XDrawBeveledButton(display,&windows->widget,&home_info);
4531 XDrawBeveledMatte(display,&windows->widget,&list_info);
4532 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4533 XDrawTriangleNorth(display,&windows->widget,&north_info);
4534 XDrawBeveledButton(display,&windows->widget,&slider_info);
4535 XDrawTriangleSouth(display,&windows->widget,&south_info);
4537 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
4538 (void) XDrawString(display,windows->widget.id,
4539 windows->widget.annotate_context,x,y,FilenameText,
4540 Extent(FilenameText));
4541 XDrawBeveledMatte(display,&windows->widget,&reply_info);
4542 XDrawMatteText(display,&windows->widget,&reply_info);
4543 XDrawBeveledButton(display,&windows->widget,&special_info);
4544 XDrawBeveledButton(display,&windows->widget,&action_info);
4545 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4546 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4547 selection_info.id=(~0);
4548 state|=RedrawListState;
4549 state&=(~RedrawWidgetState);
4551 if (state & UpdateListState)
4562 checklist=ListFiles(working_path,glob_pattern,&number_files);
4563 if (checklist == (
char **) NULL)
4568 action_info.raised=MagickFalse;
4569 XDrawBeveledButton(display,&windows->widget,&action_info);
4572 for (i=0; i < (ssize_t) files; i++)
4573 filelist[i]=DestroyString(filelist[i]);
4574 if (filelist != (
char **) NULL)
4575 filelist=(
char **) RelinquishMagickMemory(filelist);
4582 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
4583 if (files > visible_files)
4584 slider_info.height=(
unsigned int)
4585 ((visible_files*slider_info.height)/files);
4586 slider_info.max_y=south_info.y-south_info.bevel_width-
4587 slider_info.bevel_width-2;
4589 slider_info.y=slider_info.min_y;
4590 expose_info.y=slider_info.y;
4591 selection_info.id=(~0);
4593 state|=RedrawListState;
4597 if (IsGlob(reply_info.text) == MagickFalse)
4599 *reply_info.text=
'\0';
4600 reply_info.cursor=reply_info.text;
4602 (void) CopyMagickString(text_info.text,working_path,MaxTextExtent);
4603 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4605 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4607 XDrawWidgetText(display,&windows->widget,&text_info);
4608 XDrawMatteText(display,&windows->widget,&reply_info);
4609 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4610 XDrawTriangleNorth(display,&windows->widget,&north_info);
4611 XDrawBeveledButton(display,&windows->widget,&slider_info);
4612 XDrawTriangleSouth(display,&windows->widget,&south_info);
4613 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4614 state&=(~UpdateListState);
4616 if (state & JumpListState)
4622 for (i=0; i < (ssize_t) files; i++)
4623 if (LocaleCompare(filelist[i],reply) >= 0)
4626 (LocaleCompare(filelist[i],reply) == 0 ? i : ~0);
4629 if ((i < (ssize_t) slider_info.id) ||
4630 (i >= (ssize_t) (slider_info.id+visible_files)))
4631 slider_info.id=(int) i-(visible_files >> 1);
4632 selection_info.id=(~0);
4633 state|=RedrawListState;
4634 state&=(~JumpListState);
4636 if (state & RedrawListState)
4641 if (slider_info.id >= (
int) (files-visible_files))
4642 slider_info.id=(int) (files-visible_files);
4643 if ((slider_info.id < 0) || (files <= visible_files))
4645 slider_info.y=slider_info.min_y;
4647 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
4648 slider_info.min_y+1)/files);
4649 if (slider_info.id != selection_info.id)
4654 selection_info.id=slider_info.id;
4655 selection_info.y=list_info.y+(height >> 3)+2;
4656 for (i=0; i < (ssize_t) visible_files; i++)
4658 selection_info.raised=(int) (slider_info.id+i) != list_info.id ?
4659 MagickTrue : MagickFalse;
4660 selection_info.text=(
char *) NULL;
4661 if ((slider_info.id+i) < (ssize_t) files)
4662 selection_info.text=filelist[slider_info.id+i];
4663 XDrawWidgetText(display,&windows->widget,&selection_info);
4664 selection_info.y+=(int) selection_info.height;
4669 if (slider_info.y > expose_info.y)
4671 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
4672 expose_info.y=slider_info.y-expose_info.height-
4673 slider_info.bevel_width-1;
4677 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
4678 expose_info.y=slider_info.y+slider_info.height+
4679 slider_info.bevel_width+1;
4681 XDrawTriangleNorth(display,&windows->widget,&north_info);
4682 XDrawMatte(display,&windows->widget,&expose_info);
4683 XDrawBeveledButton(display,&windows->widget,&slider_info);
4684 XDrawTriangleSouth(display,&windows->widget,&south_info);
4685 expose_info.y=slider_info.y;
4687 state&=(~RedrawListState);
4692 if (north_info.raised && south_info.raised)
4693 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
4699 XDelay(display,delay);
4701 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
4702 if (north_info.raised == MagickFalse)
4703 if (slider_info.id > 0)
4709 state|=RedrawListState;
4711 if (south_info.raised == MagickFalse)
4712 if (slider_info.id < (
int) files)
4718 state|=RedrawListState;
4720 if (event.type != ButtonRelease)
4727 if (MatteIsActive(slider_info,event.xbutton))
4732 slider_info.active=MagickTrue;
4735 if (MatteIsActive(north_info,event.xbutton))
4736 if (slider_info.id > 0)
4741 north_info.raised=MagickFalse;
4743 state|=RedrawListState;
4746 if (MatteIsActive(south_info,event.xbutton))
4747 if (slider_info.id < (
int) files)
4752 south_info.raised=MagickFalse;
4754 state|=RedrawListState;
4757 if (MatteIsActive(scroll_info,event.xbutton))
4762 if (event.xbutton.y < slider_info.y)
4763 slider_info.id-=(visible_files-1);
4765 slider_info.id+=(visible_files-1);
4766 state|=RedrawListState;
4769 if (MatteIsActive(list_info,event.xbutton))
4777 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
4778 selection_info.height;
4779 if (
id >= (
int) files)
4781 (void) CopyMagickString(reply_info.text,filelist[
id],MaxTextExtent);
4782 reply_info.highlight=MagickFalse;
4783 reply_info.marker=reply_info.text;
4784 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4785 XDrawMatteText(display,&windows->widget,&reply_info);
4786 if (
id == list_info.id)
4791 p=reply_info.text+strlen(reply_info.text)-1;
4792 if (*p == *DirectorySeparator)
4793 ChopPathComponents(reply_info.text,1);
4794 (void) ConcatenateMagickString(working_path,DirectorySeparator,
4796 (void) ConcatenateMagickString(working_path,reply_info.text,
4799 state|=UpdateListState;
4801 selection_info.id=(~0);
4803 state|=RedrawListState;
4806 if (MatteIsActive(up_info,event.xbutton))
4811 up_info.raised=MagickFalse;
4812 XDrawBeveledButton(display,&windows->widget,&up_info);
4815 if (MatteIsActive(home_info,event.xbutton))
4820 home_info.raised=MagickFalse;
4821 XDrawBeveledButton(display,&windows->widget,&home_info);
4824 if (MatteIsActive(special_info,event.xbutton))
4829 special_info.raised=MagickFalse;
4830 XDrawBeveledButton(display,&windows->widget,&special_info);
4833 if (MatteIsActive(action_info,event.xbutton))
4838 action_info.raised=MagickFalse;
4839 XDrawBeveledButton(display,&windows->widget,&action_info);
4842 if (MatteIsActive(cancel_info,event.xbutton))
4847 cancel_info.raised=MagickFalse;
4848 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4851 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
4853 if (event.xbutton.button != Button2)
4861 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
4862 for (i=1; i <= (ssize_t) Extent(reply_info.marker); i++)
4863 if (XTextWidth(font_info,reply_info.marker,(
int) i) > x)
4865 reply_info.cursor=reply_info.marker+i-1;
4866 if (event.xbutton.time > (click_time+DoubleClick))
4867 reply_info.highlight=MagickFalse;
4873 (void) CopyMagickString(primary_selection,reply_info.text,
4875 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
4876 event.xbutton.time);
4877 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
4878 windows->widget.id ? MagickTrue : MagickFalse;
4880 XDrawMatteText(display,&windows->widget,&reply_info);
4881 click_time=
event.xbutton.time;
4887 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
4888 windows->widget.id,event.xbutton.time);
4893 if (windows->widget.mapped == MagickFalse)
4895 if (north_info.raised == MagickFalse)
4900 delay=SuspendTime << 2;
4901 north_info.raised=MagickTrue;
4902 XDrawTriangleNorth(display,&windows->widget,&north_info);
4904 if (south_info.raised == MagickFalse)
4909 delay=SuspendTime << 2;
4910 south_info.raised=MagickTrue;
4911 XDrawTriangleSouth(display,&windows->widget,&south_info);
4913 if (slider_info.active)
4918 slider_info.active=MagickFalse;
4921 if (up_info.raised == MagickFalse)
4923 if (event.xbutton.window == windows->widget.id)
4924 if (MatteIsActive(up_info,event.xbutton))
4926 ChopPathComponents(working_path,1);
4927 if (*working_path ==
'\0')
4928 (void) CopyMagickString(working_path,DirectorySeparator,
4930 state|=UpdateListState;
4932 up_info.raised=MagickTrue;
4933 XDrawBeveledButton(display,&windows->widget,&up_info);
4935 if (home_info.raised == MagickFalse)
4937 if (event.xbutton.window == windows->widget.id)
4938 if (MatteIsActive(home_info,event.xbutton))
4940 (void) CopyMagickString(working_path,home_directory,
4942 state|=UpdateListState;
4944 home_info.raised=MagickTrue;
4945 XDrawBeveledButton(display,&windows->widget,&home_info);
4947 if (special_info.raised == MagickFalse)
4949 if (anomaly == MagickFalse)
4963 exception=AcquireExceptionInfo();
4964 formats=GetMagickList(
"*",&number_formats,exception);
4965 exception=DestroyExceptionInfo(exception);
4966 if (formats == (
char **) NULL)
4968 (void) XCheckDefineCursor(display,windows->widget.id,
4969 windows->widget.busy_cursor);
4970 windows->popup.x=windows->widget.x+60;
4971 windows->popup.y=windows->widget.y+60;
4972 XListBrowserWidget(display,windows,&windows->popup,
4973 (
const char **) formats,
"Select",
"Select image format type:",
4975 XSetCursorState(display,windows,MagickTrue);
4976 (void) XCheckDefineCursor(display,windows->widget.id,
4977 windows->widget.cursor);
4978 LocaleLower(format);
4979 AppendImageFormat(format,reply_info.text);
4980 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4981 XDrawMatteText(display,&windows->widget,&reply_info);
4982 special_info.raised=MagickTrue;
4983 XDrawBeveledButton(display,&windows->widget,&special_info);
4984 for (i=0; i < (ssize_t) number_formats; i++)
4985 formats[i]=DestroyString(formats[i]);
4986 formats=(
char **) RelinquishMagickMemory(formats);
4989 if (event.xbutton.window == windows->widget.id)
4990 if (MatteIsActive(special_info,event.xbutton))
4992 (void) CopyMagickString(working_path,
"x:",MaxTextExtent);
4995 special_info.raised=MagickTrue;
4996 XDrawBeveledButton(display,&windows->widget,&special_info);
4998 if (action_info.raised == MagickFalse)
5000 if (event.xbutton.window == windows->widget.id)
5002 if (MatteIsActive(action_info,event.xbutton))
5004 if (*reply_info.text ==
'\0')
5005 (void) XBell(display,0);
5010 action_info.raised=MagickTrue;
5011 XDrawBeveledButton(display,&windows->widget,&action_info);
5013 if (cancel_info.raised == MagickFalse)
5015 if (event.xbutton.window == windows->widget.id)
5016 if (MatteIsActive(cancel_info,event.xbutton))
5018 *reply_info.text=
'\0';
5022 cancel_info.raised=MagickTrue;
5023 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5032 if (event.xclient.message_type != windows->wm_protocols)
5034 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
5036 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
5037 (Time) event.xclient.data.l[1]);
5040 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
5042 if (event.xclient.window == windows->widget.id)
5044 *reply_info.text=
'\0';
5050 case ConfigureNotify:
5055 if (event.xconfigure.window != windows->widget.id)
5057 if ((event.xconfigure.width == (
int) windows->widget.width) &&
5058 (event.xconfigure.height == (
int) windows->widget.height))
5060 windows->widget.width=(
unsigned int)
5061 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
5062 windows->widget.height=(
unsigned int)
5063 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
5064 state|=UpdateConfigurationState;
5069 if (event.xcrossing.window != windows->widget.id)
5071 state&=(~InactiveWidgetState);
5076 if (event.xexpose.window != windows->widget.id)
5078 if (event.xexpose.count != 0)
5080 state|=RedrawWidgetState;
5086 command[MaxTextExtent];
5097 if (event.xkey.window != windows->widget.id)
5099 length=XLookupString((XKeyEvent *) &event.xkey,command,
5100 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5101 *(command+length)=
'\0';
5102 if (AreaIsActive(scroll_info,event.xkey))
5107 switch ((
int) key_symbol)
5130 slider_info.id-=visible_files;
5136 slider_info.id+=visible_files;
5142 slider_info.id=(int) files;
5146 state|=RedrawListState;
5149 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
5154 if (*reply_info.text ==
'\0')
5156 if (IsGlob(reply_info.text))
5157 (void) CopyMagickString(glob_pattern,reply_info.text,
5161 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5163 (void) ConcatenateMagickString(working_path,reply_info.text,
5165 if (*working_path ==
'~')
5166 ExpandFilename(working_path);
5169 state|=UpdateListState;
5172 if (key_symbol == XK_Control_L)
5174 state|=ControlState;
5177 if (state & ControlState)
5178 switch ((
int) key_symbol)
5186 *reply_info.text=
'\0';
5187 reply_info.cursor=reply_info.text;
5188 reply_info.marker=reply_info.text;
5189 reply_info.highlight=MagickFalse;
5195 XEditText(display,&reply_info,key_symbol,command,state);
5196 XDrawMatteText(display,&windows->widget,&reply_info);
5197 state|=JumpListState;
5203 command[MaxTextExtent];
5211 if (event.xkey.window != windows->widget.id)
5213 (void) XLookupString((XKeyEvent *) &event.xkey,command,
5214 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5215 if (key_symbol == XK_Control_L)
5216 state&=(~ControlState);
5221 if (event.xcrossing.window != windows->widget.id)
5223 state|=InactiveWidgetState;
5237 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
5238 if (slider_info.active)
5243 slider_info.y=
event.xmotion.y-
5244 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
5245 if (slider_info.y < slider_info.min_y)
5246 slider_info.y=slider_info.min_y;
5247 if (slider_info.y > slider_info.max_y)
5248 slider_info.y=slider_info.max_y;
5250 if (slider_info.y != slider_info.min_y)
5251 slider_info.id=(int) ((files*(slider_info.y-slider_info.min_y+1))/
5252 (slider_info.max_y-slider_info.min_y+1));
5253 state|=RedrawListState;
5256 if (state & InactiveWidgetState)
5258 if (up_info.raised == MatteIsActive(up_info,event.xmotion))
5263 up_info.raised=!up_info.raised;
5264 XDrawBeveledButton(display,&windows->widget,&up_info);
5267 if (home_info.raised == MatteIsActive(home_info,event.xmotion))
5272 home_info.raised=!home_info.raised;
5273 XDrawBeveledButton(display,&windows->widget,&home_info);
5276 if (special_info.raised == MatteIsActive(special_info,event.xmotion))
5281 special_info.raised=!special_info.raised;
5282 XDrawBeveledButton(display,&windows->widget,&special_info);
5285 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
5290 action_info.raised=action_info.raised == MagickFalse ?
5291 MagickTrue : MagickFalse;
5292 XDrawBeveledButton(display,&windows->widget,&action_info);
5295 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
5300 cancel_info.raised=cancel_info.raised == MagickFalse ?
5301 MagickTrue : MagickFalse;
5302 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5307 case SelectionClear:
5309 reply_info.highlight=MagickFalse;
5310 XDrawMatteText(display,&windows->widget,&reply_info);
5313 case SelectionNotify:
5331 if (event.xselection.property == (Atom) None)
5333 status=XGetWindowProperty(display,event.xselection.requestor,
5334 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
5335 &format,&length,&after,&data);
5336 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
5339 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
5340 (void) XBell(display,0);
5346 *(data+length)=
'\0';
5347 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
5349 XDrawMatteText(display,&windows->widget,&reply_info);
5350 state|=JumpListState;
5351 state|=RedrawActionState;
5353 (void) XFree((
void *) data);
5356 case SelectionRequest:
5361 XSelectionRequestEvent
5364 if (reply_info.highlight == MagickFalse)
5369 request=(&(
event.xselectionrequest));
5370 (void) XChangeProperty(request->display,request->requestor,
5371 request->property,request->target,8,PropModeReplace,
5372 (
unsigned char *) primary_selection,Extent(primary_selection));
5373 notify.type=SelectionNotify;
5374 notify.display=request->display;
5375 notify.requestor=request->requestor;
5376 notify.selection=request->selection;
5377 notify.target=request->target;
5378 notify.time=request->time;
5379 if (request->property == None)
5380 notify.property=request->target;
5382 notify.property=request->property;
5383 (void) XSendEvent(request->display,request->requestor,False,0,
5384 (XEvent *) ¬ify);
5389 }
while ((state & ExitState) == 0);
5390 XSetCursorState(display,windows,MagickFalse);
5391 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
5392 XCheckRefreshWindows(display,windows);
5396 for (i=0; i < (ssize_t) files; i++)
5397 filelist[i]=DestroyString(filelist[i]);
5398 if (filelist != (
char **) NULL)
5399 filelist=(
char **) RelinquishMagickMemory(filelist);
5402 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5404 (void) ConcatenateMagickString(working_path,reply,MaxTextExtent);
5406 (void) CopyMagickString(reply,working_path,MaxTextExtent);
5408 ExpandFilename(reply);
5445#if defined(__cplusplus) || defined(c_plusplus)
5449static int FontCompare(
const void *x,
const void *y)
5455 p=(
char *) *((
char **) x);
5456 q=(
char *) *((
char **) y);
5457 while ((*p !=
'\0') && (*q !=
'\0') && (*p == *q))
5465#if defined(__cplusplus) || defined(c_plusplus)
5469MagickExport
void XFontBrowserWidget(Display *display,XWindows *windows,
5470 const char *action,
char *reply)
5472#define BackButtonText "Back"
5473#define CancelButtonText "Cancel"
5474#define FontnameText "Name:"
5475#define FontPatternText "Pattern:"
5476#define ResetButtonText "Reset"
5479 back_pattern[MaxTextExtent] =
"",
5482 primary_selection[MaxTextExtent] =
"",
5483 reset_pattern[MaxTextExtent] =
"",
5484 text[MaxTextExtent] =
"";
5495 glob_pattern[MaxTextExtent] =
"*";
5497 static MagickStatusType
5498 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
5544 assert(display != (Display *) NULL);
5545 assert(windows != (XWindows *) NULL);
5546 assert(action != (
char *) NULL);
5547 assert(reply != (
char *) NULL);
5548 if (IsEventLogging() != MagickFalse)
5549 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
5550 XSetCursorState(display,windows,MagickTrue);
5551 XCheckRefreshWindows(display,windows);
5552 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
5553 (void) CopyMagickString(reset_pattern,
"*",MaxTextExtent);
5554 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5560 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5562 (void) CopyMagickString(glob_pattern,
"*",MaxTextExtent);
5563 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5564 if (fontlist == (
char **) NULL)
5566 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5575 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
sizeof(*fontlist));
5576 if (fontlist == (
char **) NULL)
5578 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5579 "UnableToViewFonts");
5582 for (i=0; i < fonts; i++)
5583 fontlist[i]=listhead[i];
5584 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5588 font_info=windows->widget.font_info;
5590 for (i=0; i < fonts; i++)
5591 if (WidgetTextWidth(font_info,fontlist[i]) > text_width)
5592 text_width=WidgetTextWidth(font_info,fontlist[i]);
5593 width=WidgetTextWidth(font_info,(
char *) action);
5594 if (WidgetTextWidth(font_info,CancelButtonText) > width)
5595 width=WidgetTextWidth(font_info,CancelButtonText);
5596 if (WidgetTextWidth(font_info,ResetButtonText) > width)
5597 width=WidgetTextWidth(font_info,ResetButtonText);
5598 if (WidgetTextWidth(font_info,BackButtonText) > width)
5599 width=WidgetTextWidth(font_info,BackButtonText);
5600 width+=QuantumMargin;
5601 if (WidgetTextWidth(font_info,FontPatternText) > width)
5602 width=WidgetTextWidth(font_info,FontPatternText);
5603 if (WidgetTextWidth(font_info,FontnameText) > width)
5604 width=WidgetTextWidth(font_info,FontnameText);
5605 height=(
unsigned int) (font_info->ascent+font_info->descent);
5609 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
5611 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
5612 if (windows->widget.width < windows->widget.min_width)
5613 windows->widget.width=windows->widget.min_width;
5614 windows->widget.height=(
unsigned int)
5615 (((85*height) >> 2)+((13*QuantumMargin) >> 1)+4);
5616 windows->widget.min_height=(
unsigned int)
5617 (((27*height) >> 1)+((13*QuantumMargin) >> 1)+4);
5618 if (windows->widget.height < windows->widget.min_height)
5619 windows->widget.height=windows->widget.min_height;
5620 XConstrainWindowPosition(display,&windows->widget);
5624 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Font",
5626 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
5627 if (status != False)
5629 XSetWMName(display,windows->widget.id,&window_name);
5630 XSetWMIconName(display,windows->widget.id,&window_name);
5631 (void) XFree((
void *) window_name.value);
5633 window_changes.width=(int) windows->widget.width;
5634 window_changes.height=(int) windows->widget.height;
5635 window_changes.x=windows->widget.x;
5636 window_changes.y=windows->widget.y;
5637 (void) XReconfigureWMWindow(display,windows->widget.id,
5638 windows->widget.screen,mask,&window_changes);
5639 (void) XMapRaised(display,windows->widget.id);
5640 windows->widget.mapped=MagickFalse;
5644 XGetWidgetInfo((
char *) NULL,&slider_info);
5645 XGetWidgetInfo((
char *) NULL,&north_info);
5646 XGetWidgetInfo((
char *) NULL,&south_info);
5647 XGetWidgetInfo((
char *) NULL,&expose_info);
5648 XGetWidgetInfo((
char *) NULL,&selection_info);
5650 delay=SuspendTime << 2;
5651 state=UpdateConfigurationState;
5654 if (state & UpdateConfigurationState)
5662 XGetWidgetInfo(CancelButtonText,&cancel_info);
5663 cancel_info.width=width;
5664 cancel_info.height=(
unsigned int) ((3*height) >> 1);
5666 (windows->widget.width-cancel_info.width-QuantumMargin-2);
5668 (windows->widget.height-cancel_info.height-QuantumMargin);
5669 XGetWidgetInfo(action,&action_info);
5670 action_info.width=width;
5671 action_info.height=(
unsigned int) ((3*height) >> 1);
5672 action_info.x=(int) windows->widget.width-(
int) action_info.width-
5673 (int) cancel_info.width-2*QuantumMargin-2;
5674 action_info.y=cancel_info.y;
5675 XGetWidgetInfo(BackButtonText,&back_info);
5676 back_info.width=width;
5677 back_info.height=(
unsigned int) ((3*height) >> 1);
5678 back_info.x=QuantumMargin;
5679 back_info.y=((5*QuantumMargin) >> 1)+height;
5680 XGetWidgetInfo(ResetButtonText,&reset_info);
5681 reset_info.width=width;
5682 reset_info.height=(
unsigned int) ((3*height) >> 1);
5683 reset_info.x=QuantumMargin;
5684 reset_info.y=back_info.y+back_info.height+QuantumMargin;
5688 XGetWidgetInfo(reply,&reply_info);
5689 reply_info.raised=MagickFalse;
5690 reply_info.bevel_width--;
5691 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
5692 reply_info.height=height << 1;
5693 reply_info.x=(int) (width+(QuantumMargin << 1));
5694 reply_info.y=action_info.y-(action_info.height << 1)-QuantumMargin;
5698 XGetWidgetInfo(reply,&mode_info);
5699 mode_info.bevel_width=0;
5700 mode_info.width=(
unsigned int)
5701 (action_info.x-reply_info.x-QuantumMargin);
5702 mode_info.height=action_info.height << 1;
5703 mode_info.x=reply_info.x;
5704 mode_info.y=action_info.y-action_info.height+action_info.bevel_width;
5708 XGetWidgetInfo((
char *) NULL,&scroll_info);
5709 scroll_info.bevel_width--;
5710 scroll_info.width=height;
5711 scroll_info.height=(
unsigned int)
5712 (reply_info.y-back_info.y-(QuantumMargin >> 1));
5713 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
5714 scroll_info.y=back_info.y-reply_info.bevel_width;
5715 scroll_info.raised=MagickFalse;
5716 scroll_info.trough=MagickTrue;
5717 north_info=scroll_info;
5718 north_info.raised=MagickTrue;
5719 north_info.width-=(north_info.bevel_width << 1);
5720 north_info.height=north_info.width-1;
5721 north_info.x+=north_info.bevel_width;
5722 north_info.y+=north_info.bevel_width;
5723 south_info=north_info;
5724 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
5727 slider_info=north_info;
5729 slider_info.width-=2;
5730 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
5731 slider_info.bevel_width+2;
5732 slider_info.height=scroll_info.height-((slider_info.min_y-
5733 scroll_info.y+1) << 1)+4;
5734 visible_fonts=(
unsigned int) (scroll_info.height*
5735 MagickSafeReciprocal((
double) height+(height >> 3)));
5736 if (fonts > (
int) visible_fonts)
5737 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5738 slider_info.max_y=south_info.y-south_info.bevel_width-
5739 slider_info.bevel_width-2;
5740 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
5741 slider_info.y=slider_info.min_y;
5742 expose_info=scroll_info;
5743 expose_info.y=slider_info.y;
5747 XGetWidgetInfo((
char *) NULL,&list_info);
5748 list_info.raised=MagickFalse;
5749 list_info.bevel_width--;
5750 list_info.width=(
unsigned int)
5751 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
5752 list_info.height=scroll_info.height;
5753 list_info.x=reply_info.x;
5754 list_info.y=scroll_info.y;
5755 if (windows->widget.mapped == MagickFalse)
5756 state|=JumpListState;
5761 XGetWidgetInfo(text,&text_info);
5762 text_info.center=MagickFalse;
5763 text_info.width=reply_info.width;
5764 text_info.height=height;
5765 text_info.x=list_info.x-(QuantumMargin >> 1);
5766 text_info.y=QuantumMargin;
5770 XGetWidgetInfo((
char *) NULL,&selection_info);
5771 selection_info.center=MagickFalse;
5772 selection_info.width=list_info.width;
5773 selection_info.height=(
unsigned int) ((9*height) >> 3);
5774 selection_info.x=list_info.x;
5775 state&=(~UpdateConfigurationState);
5777 if (state & RedrawWidgetState)
5783 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
5784 (void) XDrawString(display,windows->widget.id,
5785 windows->widget.annotate_context,x,y,FontPatternText,
5786 Extent(FontPatternText));
5787 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
5788 XDrawWidgetText(display,&windows->widget,&text_info);
5789 XDrawBeveledButton(display,&windows->widget,&back_info);
5790 XDrawBeveledButton(display,&windows->widget,&reset_info);
5791 XDrawBeveledMatte(display,&windows->widget,&list_info);
5792 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5793 XDrawTriangleNorth(display,&windows->widget,&north_info);
5794 XDrawBeveledButton(display,&windows->widget,&slider_info);
5795 XDrawTriangleSouth(display,&windows->widget,&south_info);
5797 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
5798 (void) XDrawString(display,windows->widget.id,
5799 windows->widget.annotate_context,x,y,FontnameText,
5800 Extent(FontnameText));
5801 XDrawBeveledMatte(display,&windows->widget,&reply_info);
5802 XDrawMatteText(display,&windows->widget,&reply_info);
5803 XDrawBeveledButton(display,&windows->widget,&action_info);
5804 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5805 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5806 selection_info.id=(~0);
5807 state|=RedrawActionState;
5808 state|=RedrawListState;
5809 state&=(~RedrawWidgetState);
5811 if (state & UpdateListState)
5822 checklist=XListFonts(display,glob_pattern,32767,&number_fonts);
5823 if (checklist == (
char **) NULL)
5825 if ((strchr(glob_pattern,
'*') == (
char *) NULL) &&
5826 (strchr(glob_pattern,
'?') == (
char *) NULL))
5831 (void) CopyMagickString(reply,glob_pattern,MaxTextExtent);
5832 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5833 action_info.raised=MagickFalse;
5834 XDrawBeveledButton(display,&windows->widget,&action_info);
5837 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5838 (void) XBell(display,0);
5841 if (number_fonts == 1)
5846 (void) CopyMagickString(reply,checklist[0],MaxTextExtent);
5847 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5848 (void) XFreeFontNames(checklist);
5849 action_info.raised=MagickFalse;
5850 XDrawBeveledButton(display,&windows->widget,&action_info);
5855 (void) XFreeFontNames(listhead);
5856 fontlist=(
char **) RelinquishMagickMemory(fontlist);
5864 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
5866 if (fontlist == (
char **) NULL)
5868 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5869 "UnableToViewFonts");
5872 for (i=0; i < fonts; i++)
5873 fontlist[i]=listhead[i];
5874 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5876 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
5877 if (fonts > (
int) visible_fonts)
5878 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5879 slider_info.max_y=south_info.y-south_info.bevel_width-
5880 slider_info.bevel_width-2;
5882 slider_info.y=slider_info.min_y;
5883 expose_info.y=slider_info.y;
5884 selection_info.id=(~0);
5886 state|=RedrawListState;
5890 *reply_info.text=
'\0';
5891 reply_info.cursor=reply_info.text;
5892 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
5893 XDrawWidgetText(display,&windows->widget,&text_info);
5894 XDrawMatteText(display,&windows->widget,&reply_info);
5895 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5896 XDrawTriangleNorth(display,&windows->widget,&north_info);
5897 XDrawBeveledButton(display,&windows->widget,&slider_info);
5898 XDrawTriangleSouth(display,&windows->widget,&south_info);
5899 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5900 state&=(~UpdateListState);
5902 if (state & JumpListState)
5908 for (i=0; i < fonts; i++)
5909 if (LocaleCompare(fontlist[i],reply) >= 0)
5911 list_info.id=LocaleCompare(fontlist[i],reply) == 0 ? i : ~0;
5914 if ((i < slider_info.id) || (i >= (
int) (slider_info.id+visible_fonts)))
5915 slider_info.id=i-(visible_fonts >> 1);
5916 selection_info.id=(~0);
5917 state|=RedrawListState;
5918 state&=(~JumpListState);
5920 if (state & RedrawListState)
5925 if (slider_info.id >= (
int) (fonts-visible_fonts))
5926 slider_info.id=fonts-visible_fonts;
5927 if ((slider_info.id < 0) || (fonts <= (
int) visible_fonts))
5929 slider_info.y=slider_info.min_y;
5932 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/fonts;
5933 if (slider_info.id != selection_info.id)
5938 selection_info.id=slider_info.id;
5939 selection_info.y=list_info.y+(height >> 3)+2;
5940 for (i=0; i < (int) visible_fonts; i++)
5942 selection_info.raised=(slider_info.id+i) != list_info.id ?
5943 MagickTrue : MagickFalse;
5944 selection_info.text=(
char *) NULL;
5945 if ((slider_info.id+i) < fonts)
5946 selection_info.text=fontlist[slider_info.id+i];
5947 XDrawWidgetText(display,&windows->widget,&selection_info);
5948 selection_info.y+=(int) selection_info.height;
5953 if (slider_info.y > expose_info.y)
5955 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
5956 expose_info.y=slider_info.y-expose_info.height-
5957 slider_info.bevel_width-1;
5961 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
5962 expose_info.y=slider_info.y+slider_info.height+
5963 slider_info.bevel_width+1;
5965 XDrawTriangleNorth(display,&windows->widget,&north_info);
5966 XDrawMatte(display,&windows->widget,&expose_info);
5967 XDrawBeveledButton(display,&windows->widget,&slider_info);
5968 XDrawTriangleSouth(display,&windows->widget,&south_info);
5969 expose_info.y=slider_info.y;
5971 state&=(~RedrawListState);
5973 if (state & RedrawActionState)
5981 save_info=windows->widget.font_info;
5982 font_info=XLoadQueryFont(display,reply_info.text);
5983 if (font_info != (XFontStruct *) NULL)
5985 windows->widget.font_info=font_info;
5986 (void) XSetFont(display,windows->widget.widget_context,
5989 XDrawBeveledButton(display,&windows->widget,&mode_info);
5990 windows->widget.font_info=save_info;
5991 if (font_info != (XFontStruct *) NULL)
5993 (void) XSetFont(display,windows->widget.widget_context,
5994 windows->widget.font_info->fid);
5995 (void) XFreeFont(display,font_info);
5997 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5998 XDrawMatteText(display,&windows->widget,&reply_info);
5999 state&=(~RedrawActionState);
6004 if (north_info.raised && south_info.raised)
6005 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
6011 XDelay(display,delay);
6013 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
6014 if (north_info.raised == MagickFalse)
6015 if (slider_info.id > 0)
6021 state|=RedrawListState;
6023 if (south_info.raised == MagickFalse)
6024 if (slider_info.id < fonts)
6030 state|=RedrawListState;
6032 if (event.type != ButtonRelease)
6039 if (MatteIsActive(slider_info,event.xbutton))
6044 slider_info.active=MagickTrue;
6047 if (MatteIsActive(north_info,event.xbutton))
6048 if (slider_info.id > 0)
6053 north_info.raised=MagickFalse;
6055 state|=RedrawListState;
6058 if (MatteIsActive(south_info,event.xbutton))
6059 if (slider_info.id < fonts)
6064 south_info.raised=MagickFalse;
6066 state|=RedrawListState;
6069 if (MatteIsActive(scroll_info,event.xbutton))
6074 if (event.xbutton.y < slider_info.y)
6075 slider_info.id-=(visible_fonts-1);
6077 slider_info.id+=(visible_fonts-1);
6078 state|=RedrawListState;
6081 if (MatteIsActive(list_info,event.xbutton))
6089 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
6090 selection_info.height;
6091 if (
id >= (
int) fonts)
6093 (void) CopyMagickString(reply_info.text,fontlist[
id],MaxTextExtent);
6094 reply_info.highlight=MagickFalse;
6095 reply_info.marker=reply_info.text;
6096 reply_info.cursor=reply_info.text+Extent(reply_info.text);
6097 XDrawMatteText(display,&windows->widget,&reply_info);
6098 state|=RedrawActionState;
6099 if (
id == list_info.id)
6101 (void) CopyMagickString(glob_pattern,reply_info.text,
6103 state|=UpdateListState;
6105 selection_info.id=(~0);
6107 state|=RedrawListState;
6110 if (MatteIsActive(back_info,event.xbutton))
6115 back_info.raised=MagickFalse;
6116 XDrawBeveledButton(display,&windows->widget,&back_info);
6119 if (MatteIsActive(reset_info,event.xbutton))
6124 reset_info.raised=MagickFalse;
6125 XDrawBeveledButton(display,&windows->widget,&reset_info);
6128 if (MatteIsActive(action_info,event.xbutton))
6133 action_info.raised=MagickFalse;
6134 XDrawBeveledButton(display,&windows->widget,&action_info);
6137 if (MatteIsActive(cancel_info,event.xbutton))
6142 cancel_info.raised=MagickFalse;
6143 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6146 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
6148 if (event.xbutton.button != Button2)
6156 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
6157 for (i=1; i <= Extent(reply_info.marker); i++)
6158 if (XTextWidth(font_info,reply_info.marker,i) > x)
6160 reply_info.cursor=reply_info.marker+i-1;
6161 if (event.xbutton.time > (click_time+DoubleClick))
6162 reply_info.highlight=MagickFalse;
6168 (void) CopyMagickString(primary_selection,reply_info.text,
6170 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
6171 event.xbutton.time);
6172 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
6173 windows->widget.id ? MagickTrue : MagickFalse;
6175 XDrawMatteText(display,&windows->widget,&reply_info);
6176 click_time=
event.xbutton.time;
6182 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
6183 windows->widget.id,event.xbutton.time);
6188 if (windows->widget.mapped == MagickFalse)
6190 if (north_info.raised == MagickFalse)
6195 delay=SuspendTime << 2;
6196 north_info.raised=MagickTrue;
6197 XDrawTriangleNorth(display,&windows->widget,&north_info);
6199 if (south_info.raised == MagickFalse)
6204 delay=SuspendTime << 2;
6205 south_info.raised=MagickTrue;
6206 XDrawTriangleSouth(display,&windows->widget,&south_info);
6208 if (slider_info.active)
6213 slider_info.active=MagickFalse;
6216 if (back_info.raised == MagickFalse)
6218 if (event.xbutton.window == windows->widget.id)
6219 if (MatteIsActive(back_info,event.xbutton))
6221 (void) CopyMagickString(glob_pattern,back_pattern,
6223 state|=UpdateListState;
6225 back_info.raised=MagickTrue;
6226 XDrawBeveledButton(display,&windows->widget,&back_info);
6228 if (reset_info.raised == MagickFalse)
6230 if (event.xbutton.window == windows->widget.id)
6231 if (MatteIsActive(reset_info,event.xbutton))
6233 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
6234 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
6235 state|=UpdateListState;
6237 reset_info.raised=MagickTrue;
6238 XDrawBeveledButton(display,&windows->widget,&reset_info);
6240 if (action_info.raised == MagickFalse)
6242 if (event.xbutton.window == windows->widget.id)
6244 if (MatteIsActive(action_info,event.xbutton))
6246 if (*reply_info.text ==
'\0')
6247 (void) XBell(display,0);
6252 action_info.raised=MagickTrue;
6253 XDrawBeveledButton(display,&windows->widget,&action_info);
6255 if (cancel_info.raised == MagickFalse)
6257 if (event.xbutton.window == windows->widget.id)
6258 if (MatteIsActive(cancel_info,event.xbutton))
6260 *reply_info.text=
'\0';
6263 cancel_info.raised=MagickTrue;
6264 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6273 if (event.xclient.message_type != windows->wm_protocols)
6275 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
6277 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
6278 (Time) event.xclient.data.l[1]);
6281 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
6283 if (event.xclient.window == windows->widget.id)
6285 *reply_info.text=
'\0';
6291 case ConfigureNotify:
6296 if (event.xconfigure.window != windows->widget.id)
6298 if ((event.xconfigure.width == (
int) windows->widget.width) &&
6299 (event.xconfigure.height == (
int) windows->widget.height))
6301 windows->widget.width=(
unsigned int)
6302 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
6303 windows->widget.height=(
unsigned int)
6304 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
6305 state|=UpdateConfigurationState;
6310 if (event.xcrossing.window != windows->widget.id)
6312 state&=(~InactiveWidgetState);
6317 if (event.xexpose.window != windows->widget.id)
6319 if (event.xexpose.count != 0)
6321 state|=RedrawWidgetState;
6327 command[MaxTextExtent];
6338 if (event.xkey.window != windows->widget.id)
6340 length=XLookupString((XKeyEvent *) &event.xkey,command,
6341 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6342 *(command+length)=
'\0';
6343 if (AreaIsActive(scroll_info,event.xkey))
6348 switch ((
int) key_symbol)
6371 slider_info.id-=visible_fonts;
6377 slider_info.id+=visible_fonts;
6383 slider_info.id=fonts;
6387 state|=RedrawListState;
6390 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
6395 if (*reply_info.text ==
'\0')
6397 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
6398 (void) CopyMagickString(glob_pattern,reply_info.text,MaxTextExtent);
6399 state|=UpdateListState;
6402 if (key_symbol == XK_Control_L)
6404 state|=ControlState;
6407 if (state & ControlState)
6408 switch ((
int) key_symbol)
6416 *reply_info.text=
'\0';
6417 reply_info.cursor=reply_info.text;
6418 reply_info.marker=reply_info.text;
6419 reply_info.highlight=MagickFalse;
6425 XEditText(display,&reply_info,key_symbol,command,state);
6426 XDrawMatteText(display,&windows->widget,&reply_info);
6427 state|=JumpListState;
6433 command[MaxTextExtent];
6441 if (event.xkey.window != windows->widget.id)
6443 (void) XLookupString((XKeyEvent *) &event.xkey,command,
6444 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6445 if (key_symbol == XK_Control_L)
6446 state&=(~ControlState);
6451 if (event.xcrossing.window != windows->widget.id)
6453 state|=InactiveWidgetState;
6467 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
6468 if (slider_info.active)
6473 slider_info.y=
event.xmotion.y-
6474 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
6475 if (slider_info.y < slider_info.min_y)
6476 slider_info.y=slider_info.min_y;
6477 if (slider_info.y > slider_info.max_y)
6478 slider_info.y=slider_info.max_y;
6480 if (slider_info.y != slider_info.min_y)
6481 slider_info.id=(fonts*(slider_info.y-slider_info.min_y+1))/
6482 (slider_info.max_y-slider_info.min_y+1);
6483 state|=RedrawListState;
6486 if (state & InactiveWidgetState)
6488 if (back_info.raised == MatteIsActive(back_info,event.xmotion))
6493 back_info.raised=!back_info.raised;
6494 XDrawBeveledButton(display,&windows->widget,&back_info);
6497 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
6502 reset_info.raised=!reset_info.raised;
6503 XDrawBeveledButton(display,&windows->widget,&reset_info);
6506 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
6511 action_info.raised=action_info.raised == MagickFalse ?
6512 MagickTrue : MagickFalse;
6513 XDrawBeveledButton(display,&windows->widget,&action_info);
6516 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
6521 cancel_info.raised=cancel_info.raised == MagickFalse ?
6522 MagickTrue : MagickFalse;
6523 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6528 case SelectionClear:
6530 reply_info.highlight=MagickFalse;
6531 XDrawMatteText(display,&windows->widget,&reply_info);
6534 case SelectionNotify:
6552 if (event.xselection.property == (Atom) None)
6554 status=XGetWindowProperty(display,event.xselection.requestor,
6555 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
6556 &format,&length,&after,&data);
6557 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
6560 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
6561 (void) XBell(display,0);
6567 *(data+length)=
'\0';
6568 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
6570 XDrawMatteText(display,&windows->widget,&reply_info);
6571 state|=JumpListState;
6572 state|=RedrawActionState;
6574 (void) XFree((
void *) data);
6577 case SelectionRequest:
6582 XSelectionRequestEvent
6588 request=(&(
event.xselectionrequest));
6589 (void) XChangeProperty(request->display,request->requestor,
6590 request->property,request->target,8,PropModeReplace,
6591 (
unsigned char *) primary_selection,Extent(primary_selection));
6592 notify.type=SelectionNotify;
6593 notify.display=request->display;
6594 notify.requestor=request->requestor;
6595 notify.selection=request->selection;
6596 notify.target=request->target;
6597 notify.time=request->time;
6598 if (request->property == None)
6599 notify.property=request->target;
6601 notify.property=request->property;
6602 (void) XSendEvent(request->display,request->requestor,False,0,
6603 (XEvent *) ¬ify);
6608 }
while ((state & ExitState) == 0);
6609 XSetCursorState(display,windows,MagickFalse);
6610 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
6611 XCheckRefreshWindows(display,windows);
6615 (void) XFreeFontNames(listhead);
6616 fontlist=(
char **) RelinquishMagickMemory(fontlist);
6649MagickExport
void XInfoWidget(Display *display,XWindows *windows,
6650 const char *activity)
6666 assert(display != (Display *) NULL);
6667 assert(windows != (XWindows *) NULL);
6668 assert(activity != (
char *) NULL);
6669 if (IsEventLogging() != MagickFalse)
6670 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
6671 font_info=windows->info.font_info;
6672 width=WidgetTextWidth(font_info,(
char *) activity)+((3*QuantumMargin) >> 1)+4;
6673 height=(
unsigned int) (((6*(font_info->ascent+font_info->descent)) >> 2)+4);
6674 if ((windows->info.width != width) || (windows->info.height != height))
6679 windows->info.width=width;
6680 windows->info.height=height;
6681 window_changes.width=(int) width;
6682 window_changes.height=(int) height;
6683 (void) XReconfigureWMWindow(display,windows->info.id,windows->info.screen,
6684 (
unsigned int) (CWWidth | CWHeight),&window_changes);
6686 if (windows->info.mapped == MagickFalse)
6688 (void) XMapRaised(display,windows->info.id);
6689 windows->info.mapped=MagickTrue;
6694 height=(
unsigned int) (font_info->ascent+font_info->descent);
6695 XGetWidgetInfo(activity,&monitor_info);
6696 monitor_info.bevel_width--;
6697 margin=monitor_info.bevel_width+((windows->info.height-height) >> 1)-2;
6698 monitor_info.center=MagickFalse;
6699 monitor_info.x=(int) margin;
6700 monitor_info.y=(int) margin;
6701 monitor_info.width=windows->info.width-(margin << 1);
6702 monitor_info.height=windows->info.height-(margin << 1)+1;
6706 monitor_info.raised=MagickFalse;
6707 XDrawBeveledMatte(display,&windows->info,&monitor_info);
6708 monitor_info.raised=MagickTrue;
6709 XDrawWidgetText(display,&windows->info,&monitor_info);
6751MagickExport
void XListBrowserWidget(Display *display,XWindows *windows,
6752 XWindowInfo *window_info,
const char *
const *list,
const char *action,
6753 const char *query,
char *reply)
6755#define CancelButtonText "Cancel"
6758 primary_selection[MaxTextExtent];
6766 static MagickStatusType
6767 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
6811 assert(display != (Display *) NULL);
6812 assert(windows != (XWindows *) NULL);
6813 assert(window_info != (XWindowInfo *) NULL);
6814 assert(list != (
const char **) NULL);
6815 assert(action != (
char *) NULL);
6816 assert(query != (
char *) NULL);
6817 assert(reply != (
char *) NULL);
6818 if (IsEventLogging() != MagickFalse)
6819 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
6820 XSetCursorState(display,windows,MagickTrue);
6821 XCheckRefreshWindows(display,windows);
6822 if (list == (
const char **) NULL)
6824 XNoticeWidget(display,windows,
"No text to browse:",(
char *) NULL);
6827 for (entries=0; ; entries++)
6828 if (list[entries] == (
char *) NULL)
6833 font_info=window_info->font_info;
6834 text_width=WidgetTextWidth(font_info,(
char *) query);
6835 for (i=0; i < (int) entries; i++)
6836 if (WidgetTextWidth(font_info,(
char *) list[i]) > text_width)
6837 text_width=WidgetTextWidth(font_info,(
char *) list[i]);
6838 width=WidgetTextWidth(font_info,(
char *) action);
6839 if (WidgetTextWidth(font_info,CancelButtonText) > width)
6840 width=WidgetTextWidth(font_info,CancelButtonText);
6841 width+=QuantumMargin;
6842 height=(
unsigned int) (font_info->ascent+font_info->descent);
6846 window_info->width=(
unsigned int) MagickMin((
int) text_width,(
int)
6847 MaxTextWidth)+((9*QuantumMargin) >> 1);
6848 window_info->min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
6849 if (window_info->width < window_info->min_width)
6850 window_info->width=window_info->min_width;
6851 window_info->height=(
unsigned int)
6852 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
6853 window_info->min_height=(
unsigned int)
6854 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
6855 if (window_info->height < window_info->min_height)
6856 window_info->height=window_info->min_height;
6857 XConstrainWindowPosition(display,window_info);
6861 (void) CopyMagickString(window_info->name,
"Browse",MaxTextExtent);
6862 status=XStringListToTextProperty(&window_info->name,1,&window_name);
6863 if (status != False)
6865 XSetWMName(display,window_info->id,&window_name);
6866 XSetWMIconName(display,windows->widget.id,&window_name);
6867 (void) XFree((
void *) window_name.value);
6869 window_changes.width=(int) window_info->width;
6870 window_changes.height=(int) window_info->height;
6871 window_changes.x=window_info->x;
6872 window_changes.y=window_info->y;
6873 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,mask,
6875 (void) XMapRaised(display,window_info->id);
6876 window_info->mapped=MagickFalse;
6880 XGetWidgetInfo((
char *) NULL,&slider_info);
6881 XGetWidgetInfo((
char *) NULL,&north_info);
6882 XGetWidgetInfo((
char *) NULL,&south_info);
6883 XGetWidgetInfo((
char *) NULL,&expose_info);
6884 XGetWidgetInfo((
char *) NULL,&selection_info);
6886 delay=SuspendTime << 2;
6887 state=UpdateConfigurationState;
6890 if (state & UpdateConfigurationState)
6898 XGetWidgetInfo(CancelButtonText,&cancel_info);
6899 cancel_info.width=width;
6900 cancel_info.height=(
unsigned int) ((3*height) >> 1);
6902 (window_info->width-cancel_info.width-QuantumMargin-2);
6904 (window_info->height-cancel_info.height-QuantumMargin);
6905 XGetWidgetInfo(action,&action_info);
6906 action_info.width=width;
6907 action_info.height=(
unsigned int) ((3*height) >> 1);
6908 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
6909 (action_info.bevel_width << 1));
6910 action_info.y=cancel_info.y;
6914 XGetWidgetInfo(reply,&reply_info);
6915 reply_info.raised=MagickFalse;
6916 reply_info.bevel_width--;
6917 reply_info.width=window_info->width-((4*QuantumMargin) >> 1);
6918 reply_info.height=height << 1;
6919 reply_info.x=QuantumMargin;
6920 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
6924 XGetWidgetInfo((
char *) NULL,&scroll_info);
6925 scroll_info.bevel_width--;
6926 scroll_info.width=height;
6927 scroll_info.height=(
unsigned int)
6928 (reply_info.y-((6*QuantumMargin) >> 1)-height);
6929 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
6930 scroll_info.y=((5*QuantumMargin) >> 1)+height-reply_info.bevel_width;
6931 scroll_info.raised=MagickFalse;
6932 scroll_info.trough=MagickTrue;
6933 north_info=scroll_info;
6934 north_info.raised=MagickTrue;
6935 north_info.width-=(north_info.bevel_width << 1);
6936 north_info.height=north_info.width-1;
6937 north_info.x+=north_info.bevel_width;
6938 north_info.y+=north_info.bevel_width;
6939 south_info=north_info;
6940 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
6943 slider_info=north_info;
6945 slider_info.width-=2;
6946 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
6947 slider_info.bevel_width+2;
6948 slider_info.height=scroll_info.height-((slider_info.min_y-
6949 scroll_info.y+1) << 1)+4;
6950 visible_entries=(
unsigned int) (scroll_info.height*
6951 MagickSafeReciprocal((
double) height+(height >> 3)));
6952 if (entries > visible_entries)
6953 slider_info.height=(visible_entries*slider_info.height)/entries;
6954 slider_info.max_y=south_info.y-south_info.bevel_width-
6955 slider_info.bevel_width-2;
6956 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
6957 slider_info.y=slider_info.min_y;
6958 expose_info=scroll_info;
6959 expose_info.y=slider_info.y;
6963 XGetWidgetInfo((
char *) NULL,&list_info);
6964 list_info.raised=MagickFalse;
6965 list_info.bevel_width--;
6966 list_info.width=(
unsigned int)
6967 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
6968 list_info.height=scroll_info.height;
6969 list_info.x=reply_info.x;
6970 list_info.y=scroll_info.y;
6971 if (window_info->mapped == MagickFalse)
6972 for (i=0; i < (int) entries; i++)
6973 if (LocaleCompare(list[i],reply) == 0)
6976 slider_info.id=i-(visible_entries >> 1);
6977 if (slider_info.id < 0)
6983 XGetWidgetInfo(query,&text_info);
6984 text_info.width=reply_info.width;
6985 text_info.height=height;
6986 text_info.x=list_info.x-(QuantumMargin >> 1);
6987 text_info.y=QuantumMargin;
6991 XGetWidgetInfo((
char *) NULL,&selection_info);
6992 selection_info.center=MagickFalse;
6993 selection_info.width=list_info.width;
6994 selection_info.height=(
unsigned int) ((9*height) >> 3);
6995 selection_info.x=list_info.x;
6996 state&=(~UpdateConfigurationState);
6998 if (state & RedrawWidgetState)
7003 XDrawWidgetText(display,window_info,&text_info);
7004 XDrawBeveledMatte(display,window_info,&list_info);
7005 XDrawBeveledMatte(display,window_info,&scroll_info);
7006 XDrawTriangleNorth(display,window_info,&north_info);
7007 XDrawBeveledButton(display,window_info,&slider_info);
7008 XDrawTriangleSouth(display,window_info,&south_info);
7009 XDrawBeveledMatte(display,window_info,&reply_info);
7010 XDrawMatteText(display,window_info,&reply_info);
7011 XDrawBeveledButton(display,window_info,&action_info);
7012 XDrawBeveledButton(display,window_info,&cancel_info);
7013 XHighlightWidget(display,window_info,BorderOffset,BorderOffset);
7014 selection_info.id=(~0);
7015 state|=RedrawActionState;
7016 state|=RedrawListState;
7017 state&=(~RedrawWidgetState);
7019 if (state & RedrawListState)
7024 if (slider_info.id >= (
int) (entries-visible_entries))
7025 slider_info.id=(int) (entries-visible_entries);
7026 if ((slider_info.id < 0) || (entries <= visible_entries))
7028 slider_info.y=slider_info.min_y;
7031 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/entries;
7032 if (slider_info.id != selection_info.id)
7037 selection_info.id=slider_info.id;
7038 selection_info.y=list_info.y+(height >> 3)+2;
7039 for (i=0; i < (int) visible_entries; i++)
7041 selection_info.raised=(slider_info.id+i) != list_info.id ?
7042 MagickTrue : MagickFalse;
7043 selection_info.text=(
char *) NULL;
7044 if ((slider_info.id+i) < (
int) entries)
7045 selection_info.text=(
char *) list[slider_info.id+i];
7046 XDrawWidgetText(display,window_info,&selection_info);
7047 selection_info.y+=(int) selection_info.height;
7052 if (slider_info.y > expose_info.y)
7054 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
7055 expose_info.y=slider_info.y-expose_info.height-
7056 slider_info.bevel_width-1;
7060 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
7061 expose_info.y=slider_info.y+slider_info.height+
7062 slider_info.bevel_width+1;
7064 XDrawTriangleNorth(display,window_info,&north_info);
7065 XDrawMatte(display,window_info,&expose_info);
7066 XDrawBeveledButton(display,window_info,&slider_info);
7067 XDrawTriangleSouth(display,window_info,&south_info);
7068 expose_info.y=slider_info.y;
7070 state&=(~RedrawListState);
7075 if (north_info.raised && south_info.raised)
7076 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7082 XDelay(display,delay);
7084 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
7085 if (north_info.raised == MagickFalse)
7086 if (slider_info.id > 0)
7092 state|=RedrawListState;
7094 if (south_info.raised == MagickFalse)
7095 if (slider_info.id < (
int) entries)
7101 state|=RedrawListState;
7103 if (event.type != ButtonRelease)
7110 if (MatteIsActive(slider_info,event.xbutton))
7115 slider_info.active=MagickTrue;
7118 if (MatteIsActive(north_info,event.xbutton))
7119 if (slider_info.id > 0)
7124 north_info.raised=MagickFalse;
7126 state|=RedrawListState;
7129 if (MatteIsActive(south_info,event.xbutton))
7130 if (slider_info.id < (
int) entries)
7135 south_info.raised=MagickFalse;
7137 state|=RedrawListState;
7140 if (MatteIsActive(scroll_info,event.xbutton))
7145 if (event.xbutton.y < slider_info.y)
7146 slider_info.id-=(visible_entries-1);
7148 slider_info.id+=(visible_entries-1);
7149 state|=RedrawListState;
7152 if (MatteIsActive(list_info,event.xbutton))
7160 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
7161 selection_info.height;
7162 if (
id >= (
int) entries)
7164 (void) CopyMagickString(reply_info.text,list[
id],MaxTextExtent);
7165 reply_info.highlight=MagickFalse;
7166 reply_info.marker=reply_info.text;
7167 reply_info.cursor=reply_info.text+Extent(reply_info.text);
7168 XDrawMatteText(display,window_info,&reply_info);
7169 selection_info.id=(~0);
7170 if (
id == list_info.id)
7172 action_info.raised=MagickFalse;
7173 XDrawBeveledButton(display,window_info,&action_info);
7177 state|=RedrawListState;
7180 if (MatteIsActive(action_info,event.xbutton))
7185 action_info.raised=MagickFalse;
7186 XDrawBeveledButton(display,window_info,&action_info);
7189 if (MatteIsActive(cancel_info,event.xbutton))
7194 cancel_info.raised=MagickFalse;
7195 XDrawBeveledButton(display,window_info,&cancel_info);
7198 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7200 if (event.xbutton.button != Button2)
7208 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
7209 for (i=1; i <= Extent(reply_info.marker); i++)
7210 if (XTextWidth(font_info,reply_info.marker,i) > x)
7212 reply_info.cursor=reply_info.marker+i-1;
7213 if (event.xbutton.time > (click_time+DoubleClick))
7214 reply_info.highlight=MagickFalse;
7220 (void) CopyMagickString(primary_selection,reply_info.text,
7222 (void) XSetSelectionOwner(display,XA_PRIMARY,window_info->id,
7223 event.xbutton.time);
7224 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
7225 window_info->id ? MagickTrue : MagickFalse;
7227 XDrawMatteText(display,window_info,&reply_info);
7228 click_time=
event.xbutton.time;
7234 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
7235 window_info->id,event.xbutton.time);
7240 if (window_info->mapped == MagickFalse)
7242 if (north_info.raised == MagickFalse)
7247 delay=SuspendTime << 2;
7248 north_info.raised=MagickTrue;
7249 XDrawTriangleNorth(display,window_info,&north_info);
7251 if (south_info.raised == MagickFalse)
7256 delay=SuspendTime << 2;
7257 south_info.raised=MagickTrue;
7258 XDrawTriangleSouth(display,window_info,&south_info);
7260 if (slider_info.active)
7265 slider_info.active=MagickFalse;
7268 if (action_info.raised == MagickFalse)
7270 if (event.xbutton.window == window_info->id)
7272 if (MatteIsActive(action_info,event.xbutton))
7274 if (*reply_info.text ==
'\0')
7275 (void) XBell(display,0);
7280 action_info.raised=MagickTrue;
7281 XDrawBeveledButton(display,window_info,&action_info);
7283 if (cancel_info.raised == MagickFalse)
7285 if (event.xbutton.window == window_info->id)
7286 if (MatteIsActive(cancel_info,event.xbutton))
7288 *reply_info.text=
'\0';
7291 cancel_info.raised=MagickTrue;
7292 XDrawBeveledButton(display,window_info,&cancel_info);
7294 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7303 if (event.xclient.message_type != windows->wm_protocols)
7305 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
7307 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
7308 (Time) event.xclient.data.l[1]);
7311 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
7313 if (event.xclient.window == window_info->id)
7315 *reply_info.text=
'\0';
7321 case ConfigureNotify:
7326 if (event.xconfigure.window != window_info->id)
7328 if ((event.xconfigure.width == (
int) window_info->width) &&
7329 (event.xconfigure.height == (
int) window_info->height))
7331 window_info->width=(
unsigned int)
7332 MagickMax(event.xconfigure.width,(
int) window_info->min_width);
7333 window_info->height=(
unsigned int)
7334 MagickMax(event.xconfigure.height,(
int) window_info->min_height);
7335 state|=UpdateConfigurationState;
7340 if (event.xcrossing.window != window_info->id)
7342 state&=(~InactiveWidgetState);
7347 if (event.xexpose.window != window_info->id)
7349 if (event.xexpose.count != 0)
7351 state|=RedrawWidgetState;
7357 command[MaxTextExtent];
7368 if (event.xkey.window != window_info->id)
7370 length=XLookupString((XKeyEvent *) &event.xkey,command,
7371 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7372 *(command+length)=
'\0';
7373 if (AreaIsActive(scroll_info,event.xkey))
7378 switch ((
int) key_symbol)
7401 slider_info.id-=visible_entries;
7407 slider_info.id+=visible_entries;
7413 slider_info.id=(int) entries;
7417 state|=RedrawListState;
7420 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
7425 if (*reply_info.text ==
'\0')
7427 action_info.raised=MagickFalse;
7428 XDrawBeveledButton(display,window_info,&action_info);
7432 if (key_symbol == XK_Control_L)
7434 state|=ControlState;
7437 if (state & ControlState)
7438 switch ((
int) key_symbol)
7446 *reply_info.text=
'\0';
7447 reply_info.cursor=reply_info.text;
7448 reply_info.marker=reply_info.text;
7449 reply_info.highlight=MagickFalse;
7455 XEditText(display,&reply_info,key_symbol,command,state);
7456 XDrawMatteText(display,window_info,&reply_info);
7462 command[MaxTextExtent];
7470 if (event.xkey.window != window_info->id)
7472 (void) XLookupString((XKeyEvent *) &event.xkey,command,
7473 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7474 if (key_symbol == XK_Control_L)
7475 state&=(~ControlState);
7480 if (event.xcrossing.window != window_info->id)
7482 state|=InactiveWidgetState;
7496 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7497 if (slider_info.active)
7502 slider_info.y=
event.xmotion.y-
7503 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
7504 if (slider_info.y < slider_info.min_y)
7505 slider_info.y=slider_info.min_y;
7506 if (slider_info.y > slider_info.max_y)
7507 slider_info.y=slider_info.max_y;
7509 if (slider_info.y != slider_info.min_y)
7510 slider_info.id=(int) ((entries*(slider_info.y-
7511 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
7512 state|=RedrawListState;
7515 if (state & InactiveWidgetState)
7517 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
7522 action_info.raised=action_info.raised == MagickFalse ?
7523 MagickTrue : MagickFalse;
7524 XDrawBeveledButton(display,window_info,&action_info);
7527 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
7532 cancel_info.raised=cancel_info.raised == MagickFalse ?
7533 MagickTrue : MagickFalse;
7534 XDrawBeveledButton(display,window_info,&cancel_info);
7539 case SelectionClear:
7541 reply_info.highlight=MagickFalse;
7542 XDrawMatteText(display,window_info,&reply_info);
7545 case SelectionNotify:
7563 if (event.xselection.property == (Atom) None)
7565 status=XGetWindowProperty(display,
7566 event.xselection.requestor,event.xselection.property,0L,2047L,
7567 MagickTrue,XA_STRING,&type,&format,&length,&after,&data);
7568 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
7571 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
7572 (void) XBell(display,0);
7578 *(data+length)=
'\0';
7579 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
7581 XDrawMatteText(display,window_info,&reply_info);
7582 state|=RedrawActionState;
7584 (void) XFree((
void *) data);
7587 case SelectionRequest:
7592 XSelectionRequestEvent
7595 if (reply_info.highlight == MagickFalse)
7600 request=(&(
event.xselectionrequest));
7601 (void) XChangeProperty(request->display,request->requestor,
7602 request->property,request->target,8,PropModeReplace,
7603 (
unsigned char *) primary_selection,Extent(primary_selection));
7604 notify.type=SelectionNotify;
7605 notify.send_event=MagickTrue;
7606 notify.display=request->display;
7607 notify.requestor=request->requestor;
7608 notify.selection=request->selection;
7609 notify.target=request->target;
7610 notify.time=request->time;
7611 if (request->property == None)
7612 notify.property=request->target;
7614 notify.property=request->property;
7615 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
7616 (XEvent *) ¬ify);
7621 }
while ((state & ExitState) == 0);
7622 XSetCursorState(display,windows,MagickFalse);
7623 (void) XWithdrawWindow(display,window_info->id,window_info->screen);
7624 XCheckRefreshWindows(display,windows);
7665MagickExport
int XMenuWidget(Display *display,XWindows *windows,
7666 const char *title,
const char *
const *selections,
char *item)
7692 XSetWindowAttributes
7706 assert(display != (Display *) NULL);
7707 assert(windows != (XWindows *) NULL);
7708 assert(title != (
char *) NULL);
7709 assert(selections != (
const char **) NULL);
7710 assert(item != (
char *) NULL);
7711 if (IsEventLogging() != MagickFalse)
7712 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",title);
7713 font_info=windows->widget.font_info;
7714 windows->widget.width=submenu_info.active == 0 ?
7715 WidgetTextWidth(font_info,(
char *) title) : 0;
7716 for (
id=0; selections[id] != (
char *) NULL;
id++)
7718 width=WidgetTextWidth(font_info,(
char *) selections[
id]);
7719 if (width > windows->widget.width)
7720 windows->widget.width=width;
7722 number_selections=(
unsigned int)
id;
7723 XGetWidgetInfo((
char *) NULL,&menu_info);
7724 title_height=(
unsigned int) (submenu_info.active == 0 ?
7725 (3*(font_info->descent+font_info->ascent) >> 1)+5 : 2);
7726 width=WidgetTextWidth(font_info,(
char *) title);
7727 height=(
unsigned int) ((3*(font_info->ascent+font_info->descent)) >> 1);
7731 windows->widget.width+=QuantumMargin+(menu_info.bevel_width << 1);
7732 top_offset=title_height+menu_info.bevel_width-1;
7733 windows->widget.height=top_offset+number_selections*height+4;
7734 windows->widget.min_width=windows->widget.width;
7735 windows->widget.min_height=windows->widget.height;
7736 XQueryPosition(display,windows->widget.root,&x,&y);
7737 windows->widget.x=x-(QuantumMargin >> 1);
7738 if (submenu_info.active != 0)
7741 windows->command.x+windows->command.width-QuantumMargin;
7742 toggle_info.raised=MagickTrue;
7743 XDrawTriangleEast(display,&windows->command,&toggle_info);
7745 windows->widget.y=submenu_info.active == 0 ? y-(int) (title_height >> 2) : y;
7746 if (submenu_info.active != 0)
7747 windows->widget.y=windows->command.y+submenu_info.y;
7748 XConstrainWindowPosition(display,&windows->widget);
7752 window_attributes.override_redirect=MagickTrue;
7753 (void) XChangeWindowAttributes(display,windows->widget.id,
7754 (
size_t) CWOverrideRedirect,&window_attributes);
7755 window_changes.width=(int) windows->widget.width;
7756 window_changes.height=(int) windows->widget.height;
7757 window_changes.x=windows->widget.x;
7758 window_changes.y=windows->widget.y;
7759 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
7760 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
7761 (void) XMapRaised(display,windows->widget.id);
7762 windows->widget.mapped=MagickFalse;
7766 selection_info.height=height;
7767 cursor=XCreateFontCursor(display,XC_right_ptr);
7768 (void) XCheckDefineCursor(display,windows->image.id,cursor);
7769 (void) XCheckDefineCursor(display,windows->command.id,cursor);
7770 (void) XCheckDefineCursor(display,windows->widget.id,cursor);
7771 state=UpdateConfigurationState;
7774 if (state & UpdateConfigurationState)
7779 XGetWidgetInfo((
char *) NULL,&menu_info);
7780 menu_info.bevel_width--;
7781 menu_info.width=windows->widget.width-((menu_info.bevel_width) << 1);
7782 menu_info.height=windows->widget.height-((menu_info.bevel_width) << 1);
7783 menu_info.x=(int) menu_info.bevel_width;
7784 menu_info.y=(int) menu_info.bevel_width;
7785 XGetWidgetInfo((
char *) NULL,&selection_info);
7786 selection_info.center=MagickFalse;
7787 selection_info.width=menu_info.width;
7788 selection_info.height=height;
7789 selection_info.x=menu_info.x;
7790 highlight_info=selection_info;
7791 highlight_info.bevel_width--;
7792 highlight_info.width-=(highlight_info.bevel_width << 1);
7793 highlight_info.height-=(highlight_info.bevel_width << 1);
7794 highlight_info.x+=highlight_info.bevel_width;
7795 state&=(~UpdateConfigurationState);
7797 if (state & RedrawWidgetState)
7802 if (submenu_info.active == 0)
7804 y=(int) title_height;
7805 XSetBevelColor(display,&windows->widget,MagickFalse);
7806 (void) XDrawLine(display,windows->widget.id,
7807 windows->widget.widget_context,selection_info.x,y-1,
7808 (
int) selection_info.width,y-1);
7809 XSetBevelColor(display,&windows->widget,MagickTrue);
7810 (void) XDrawLine(display,windows->widget.id,
7811 windows->widget.widget_context,selection_info.x,y,
7812 (
int) selection_info.width,y);
7813 (void) XSetFillStyle(display,windows->widget.widget_context,
7819 selection_info.center=MagickTrue;
7820 selection_info.y=(int) menu_info.bevel_width;
7821 selection_info.text=(
char *) title;
7822 if (submenu_info.active == 0)
7823 XDrawWidgetText(display,&windows->widget,&selection_info);
7824 selection_info.center=MagickFalse;
7825 selection_info.y=(int) top_offset;
7826 for (
id=0;
id < (int) number_selections;
id++)
7828 selection_info.text=(
char *) selections[
id];
7829 XDrawWidgetText(display,&windows->widget,&selection_info);
7830 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7831 if (
id == selection_info.id)
7832 XDrawBevel(display,&windows->widget,&highlight_info);
7833 selection_info.y+=(int) selection_info.height;
7835 XDrawBevel(display,&windows->widget,&menu_info);
7836 state&=(~RedrawWidgetState);
7838 if (number_selections > 2)
7843 y=(int) (top_offset+selection_info.height*(number_selections-1));
7844 XSetBevelColor(display,&windows->widget,MagickFalse);
7845 (void) XDrawLine(display,windows->widget.id,
7846 windows->widget.widget_context,selection_info.x,y-1,
7847 (
int) selection_info.width,y-1);
7848 XSetBevelColor(display,&windows->widget,MagickTrue);
7849 (void) XDrawLine(display,windows->widget.id,
7850 windows->widget.widget_context,selection_info.x,y,
7851 (
int) selection_info.width,y);
7852 (void) XSetFillStyle(display,windows->widget.widget_context,FillSolid);
7857 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7862 if (event.xbutton.window != windows->widget.id)
7867 if (event.xbutton.window == windows->command.id)
7868 (void) XPutBackEvent(display,&event);
7869 selection_info.id=(~0);
7874 state&=(~InactiveWidgetState);
7875 if (selection_info.height == 0)
7877 id=(
event.xbutton.y-top_offset)/(
int) selection_info.height;
7878 selection_info.id=id;
7879 if ((
id < 0) || (
id >= (
int) number_selections))
7884 selection_info.y=(int) (top_offset+
id*selection_info.height);
7885 selection_info.text=(
char *) selections[
id];
7886 XDrawWidgetText(display,&windows->widget,&selection_info);
7887 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7888 XDrawBevel(display,&windows->widget,&highlight_info);
7893 if (windows->widget.mapped == MagickFalse)
7895 if (event.xbutton.window == windows->command.id)
7896 if ((state & InactiveWidgetState) == 0)
7901 XSetCursorState(display,windows,MagickFalse);
7906 case ConfigureNotify:
7911 if (event.xconfigure.window != windows->widget.id)
7913 if ((event.xconfigure.width == (
int) windows->widget.width) &&
7914 (event.xconfigure.height == (
int) windows->widget.height))
7916 windows->widget.width=(
unsigned int)
7917 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
7918 windows->widget.height=(
unsigned int)
7919 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
7920 state|=UpdateConfigurationState;
7925 if (event.xcrossing.window != windows->widget.id)
7927 if (event.xcrossing.state == 0)
7929 state&=(~InactiveWidgetState);
7930 if (selection_info.height == 0)
7932 id=((
event.xcrossing.y-top_offset)/(int) selection_info.height);
7933 if ((selection_info.id >= 0) &&
7934 (selection_info.id < (
int) number_selections))
7939 if (
id == selection_info.id)
7941 selection_info.y=(int)
7942 (top_offset+selection_info.id*selection_info.height);
7943 selection_info.text=(
char *) selections[selection_info.id];
7944 XDrawWidgetText(display,&windows->widget,&selection_info);
7946 if ((
id < 0) || (
id >= (
int) number_selections))
7951 selection_info.id=id;
7952 selection_info.y=(int)
7953 (top_offset+selection_info.id*selection_info.height);
7954 selection_info.text=(
char *) selections[selection_info.id];
7955 XDrawWidgetText(display,&windows->widget,&selection_info);
7956 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7957 XDrawBevel(display,&windows->widget,&highlight_info);
7962 if (event.xexpose.window != windows->widget.id)
7964 if (event.xexpose.count != 0)
7966 state|=RedrawWidgetState;
7971 if (event.xcrossing.window != windows->widget.id)
7973 state|=InactiveWidgetState;
7974 id=selection_info.id;
7975 if ((
id < 0) || (
id >= (
int) number_selections))
7980 selection_info.y=(int) (top_offset+
id*selection_info.height);
7981 selection_info.id=(~0);
7982 selection_info.text=(
char *) selections[
id];
7983 XDrawWidgetText(display,&windows->widget,&selection_info);
7991 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7992 if (submenu_info.active != 0)
7993 if (event.xmotion.window == windows->command.id)
7995 if ((state & InactiveWidgetState) == 0)
7997 if (MatteIsActive(submenu_info,event.xmotion) == MagickFalse)
7999 selection_info.id=(~0);
8006 if (WindowIsActive(windows->command,event.xmotion))
8008 selection_info.id=(~0);
8014 if (event.xmotion.window != windows->widget.id)
8016 if (state & InactiveWidgetState)
8018 if (selection_info.height == 0)
8020 id=(
event.xmotion.y-top_offset)/(
int) selection_info.height;
8021 if ((selection_info.id >= 0) &&
8022 (selection_info.id < (
int) number_selections))
8027 if (
id == selection_info.id)
8029 selection_info.y=(int)
8030 (top_offset+selection_info.id*selection_info.height);
8031 selection_info.text=(
char *) selections[selection_info.id];
8032 XDrawWidgetText(display,&windows->widget,&selection_info);
8034 selection_info.id=id;
8035 if ((
id < 0) || (
id >= (
int) number_selections))
8040 selection_info.y=(int) (top_offset+
id*selection_info.height);
8041 selection_info.text=(
char *) selections[
id];
8042 XDrawWidgetText(display,&windows->widget,&selection_info);
8043 highlight_info.y=selection_info.y+highlight_info.bevel_width;
8044 XDrawBevel(display,&windows->widget,&highlight_info);
8050 }
while ((state & ExitState) == 0);
8051 (void) XFreeCursor(display,cursor);
8052 window_attributes.override_redirect=MagickFalse;
8053 (void) XChangeWindowAttributes(display,windows->widget.id,
8054 (
size_t) CWOverrideRedirect,&window_attributes);
8055 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8056 XCheckRefreshWindows(display,windows);
8057 if (submenu_info.active != 0)
8059 submenu_info.active=MagickFalse;
8060 toggle_info.raised=MagickFalse;
8061 XDrawTriangleEast(display,&windows->command,&toggle_info);
8063 if ((selection_info.id < 0) || (selection_info.id >= (
int) number_selections))
8065 (void) CopyMagickString(item,selections[selection_info.id],MaxTextExtent);
8066 return(selection_info.id);
8101MagickExport
void XNoticeWidget(Display *display,XWindows *windows,
8102 const char *reason,
const char *description)
8104#define DismissButtonText "Dismiss"
8145 assert(display != (Display *) NULL);
8146 assert(windows != (XWindows *) NULL);
8147 assert(reason != (
char *) NULL);
8148 if (IsEventLogging() != MagickFalse)
8149 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
8150 XDelay(display,SuspendTime << 3);
8151 XSetCursorState(display,windows,MagickTrue);
8152 XCheckRefreshWindows(display,windows);
8153 font_info=windows->widget.font_info;
8154 width=WidgetTextWidth(font_info,DismissButtonText);
8155 text=GetLocaleExceptionMessage(XServerError,reason);
8156 if (text != (
char *) NULL)
8157 if (WidgetTextWidth(font_info,(
char *) text) > width)
8158 width=WidgetTextWidth(font_info,(
char *) text);
8159 if (description != (
char *) NULL)
8161 text=GetLocaleExceptionMessage(XServerError,description);
8162 if (text != (
char *) NULL)
8163 if (WidgetTextWidth(font_info,(
char *) text) > width)
8164 width=WidgetTextWidth(font_info,(
char *) text);
8166 height=(
unsigned int) (font_info->ascent+font_info->descent);
8170 windows->widget.width=width+4*QuantumMargin;
8171 windows->widget.min_width=width+QuantumMargin;
8172 if (windows->widget.width < windows->widget.min_width)
8173 windows->widget.width=windows->widget.min_width;
8174 windows->widget.height=(
unsigned int) (12*height);
8175 windows->widget.min_height=(
unsigned int) (7*height);
8176 if (windows->widget.height < windows->widget.min_height)
8177 windows->widget.height=windows->widget.min_height;
8178 XConstrainWindowPosition(display,&windows->widget);
8182 (void) CopyMagickString(windows->widget.name,
"Notice",MaxTextExtent);
8183 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
8184 if (status != False)
8186 XSetWMName(display,windows->widget.id,&window_name);
8187 XSetWMIconName(display,windows->widget.id,&window_name);
8188 (void) XFree((
void *) window_name.value);
8190 window_changes.width=(int) windows->widget.width;
8191 window_changes.height=(int) windows->widget.height;
8192 window_changes.x=windows->widget.x;
8193 window_changes.y=windows->widget.y;
8194 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
8195 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
8196 (void) XMapRaised(display,windows->widget.id);
8197 windows->widget.mapped=MagickFalse;
8198 (void) XBell(display,0);
8202 timer=GetMagickTime()+Timeout;
8203 state=UpdateConfigurationState;
8206 if (GetMagickTime() > timer)
8208 if (state & UpdateConfigurationState)
8213 XGetWidgetInfo(DismissButtonText,&dismiss_info);
8214 dismiss_info.width=(
unsigned int) QuantumMargin+
8215 WidgetTextWidth(font_info,DismissButtonText);
8216 dismiss_info.height=(
unsigned int) ((3*height) >> 1);
8217 dismiss_info.x=(int)
8218 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
8219 dismiss_info.y=(int)
8220 (windows->widget.height-(dismiss_info.height << 1));
8221 state&=(~UpdateConfigurationState);
8223 if (state & RedrawWidgetState)
8228 width=WidgetTextWidth(font_info,(
char *) reason);
8229 x=(int) ((windows->widget.width >> 1)-(width >> 1));
8230 y=(int) ((windows->widget.height >> 1)-(height << 1));
8231 (void) XDrawString(display,windows->widget.id,
8232 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
8233 if (description != (
char *) NULL)
8235 width=WidgetTextWidth(font_info,(
char *) description);
8236 x=(int) ((windows->widget.width >> 1)-(width >> 1));
8238 (void) XDrawString(display,windows->widget.id,
8239 windows->widget.annotate_context,x,y,(
char *) description,
8240 Extent(description));
8242 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8243 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
8244 state&=(~RedrawWidgetState);
8249 if (XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows) == MagickFalse)
8254 XDelay(display,SuspendTime << 2);
8261 if (MatteIsActive(dismiss_info,event.xbutton))
8266 dismiss_info.raised=MagickFalse;
8267 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8274 if (windows->widget.mapped == MagickFalse)
8276 if (dismiss_info.raised == MagickFalse)
8278 if (event.xbutton.window == windows->widget.id)
8279 if (MatteIsActive(dismiss_info,event.xbutton))
8281 dismiss_info.raised=MagickTrue;
8282 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8291 if (event.xclient.message_type != windows->wm_protocols)
8293 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
8295 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
8296 (Time) event.xclient.data.l[1]);
8299 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
8301 if (event.xclient.window == windows->widget.id)
8308 case ConfigureNotify:
8313 if (event.xconfigure.window != windows->widget.id)
8315 if ((event.xconfigure.width == (
int) windows->widget.width) &&
8316 (event.xconfigure.height == (
int) windows->widget.height))
8318 windows->widget.width=(
unsigned int)
8319 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
8320 windows->widget.height=(
unsigned int)
8321 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
8322 state|=UpdateConfigurationState;
8327 if (event.xcrossing.window != windows->widget.id)
8329 state&=(~InactiveWidgetState);
8334 if (event.xexpose.window != windows->widget.id)
8336 if (event.xexpose.count != 0)
8338 state|=RedrawWidgetState;
8344 command[MaxTextExtent];
8352 if (event.xkey.window != windows->widget.id)
8354 (void) XLookupString((XKeyEvent *) &event.xkey,command,
8355 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
8356 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
8358 dismiss_info.raised=MagickFalse;
8359 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8367 if (event.xcrossing.window != windows->widget.id)
8369 state|=InactiveWidgetState;
8377 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
8378 if (state & InactiveWidgetState)
8380 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
8385 dismiss_info.raised=
8386 dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8387 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8395 }
while ((state & ExitState) == 0);
8396 XSetCursorState(display,windows,MagickFalse);
8397 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8398 XCheckRefreshWindows(display,windows);
8431MagickExport MagickBooleanType XPreferencesWidget(Display *display,
8432 XResourceInfo *resource_info,XWindows *windows)
8434#define ApplyButtonText "Apply"
8435#define CacheButtonText "%lu mega-bytes of memory in the undo edit cache "
8436#define CancelButtonText "Cancel"
8437#define NumberPreferences 8
8442 "display image centered on a backdrop",
8443 "confirm on program exit",
8444 "confirm on image edits",
8445 "correct image for display gamma",
8446 "display warning messages",
8447 "apply Floyd/Steinberg error diffusion to image",
8448 "use a shared colormap for colormapped X visuals",
8449 "display images as an X server pixmap"
8453 cache[MaxTextExtent];
8486 preferences_info[NumberPreferences];
8494 assert(display != (Display *) NULL);
8495 assert(resource_info != (XResourceInfo *) NULL);
8496 assert(windows != (XWindows *) NULL);
8497 if (IsEventLogging() != MagickFalse)
8498 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8499 XCheckRefreshWindows(display,windows);
8500 font_info=windows->widget.font_info;
8501 text_width=WidgetTextWidth(font_info,CacheButtonText);
8502 for (i=0; i < NumberPreferences; i++)
8503 if (WidgetTextWidth(font_info,(
char *) Preferences[i]) > text_width)
8504 text_width=WidgetTextWidth(font_info,(
char *) Preferences[i]);
8505 width=WidgetTextWidth(font_info,ApplyButtonText);
8506 if (WidgetTextWidth(font_info,CancelButtonText) > width)
8507 width=WidgetTextWidth(font_info,CancelButtonText);
8508 width+=(
unsigned int) QuantumMargin;
8509 height=(
unsigned int) (font_info->ascent+font_info->descent);
8513 windows->widget.width=(
unsigned int) (MagickMax((
int) (width << 1),
8514 (
int) text_width)+6*QuantumMargin);
8515 windows->widget.min_width=(width << 1)+QuantumMargin;
8516 if (windows->widget.width < windows->widget.min_width)
8517 windows->widget.width=windows->widget.min_width;
8518 windows->widget.height=(
unsigned int)
8519 (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
8520 windows->widget.min_height=(
unsigned int)
8521 (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
8522 if (windows->widget.height < windows->widget.min_height)
8523 windows->widget.height=windows->widget.min_height;
8524 XConstrainWindowPosition(display,&windows->widget);
8528 (void) CopyMagickString(windows->widget.name,
"Preferences",MaxTextExtent);
8529 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
8530 if (status != False)
8532 XSetWMName(display,windows->widget.id,&window_name);
8533 XSetWMIconName(display,windows->widget.id,&window_name);
8534 (void) XFree((
void *) window_name.value);
8536 window_changes.width=(int) windows->widget.width;
8537 window_changes.height=(int) windows->widget.height;
8538 window_changes.x=windows->widget.x;
8539 window_changes.y=windows->widget.y;
8540 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
8541 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
8542 (void) XMapRaised(display,windows->widget.id);
8543 windows->widget.mapped=MagickFalse;
8547 state=UpdateConfigurationState;
8548 XSetCursorState(display,windows,MagickTrue);
8551 if (state & UpdateConfigurationState)
8556 XGetWidgetInfo(CancelButtonText,&cancel_info);
8557 cancel_info.width=width;
8558 cancel_info.height=(
unsigned int) (3*height) >> 1;
8559 cancel_info.x=(int) windows->widget.width-cancel_info.width-
8560 (QuantumMargin << 1);
8561 cancel_info.y=(int) windows->widget.height-
8562 cancel_info.height-QuantumMargin;
8563 XGetWidgetInfo(ApplyButtonText,&apply_info);
8564 apply_info.width=width;
8565 apply_info.height=(
unsigned int) (3*height) >> 1;
8566 apply_info.x=QuantumMargin << 1;
8567 apply_info.y=cancel_info.y;
8568 y=(int) (height << 1);
8569 for (i=0; i < NumberPreferences; i++)
8571 XGetWidgetInfo(Preferences[i],&preferences_info[i]);
8572 preferences_info[i].bevel_width--;
8573 preferences_info[i].width=(
unsigned int) QuantumMargin >> 1;
8574 preferences_info[i].height=(
unsigned int) QuantumMargin >> 1;
8575 preferences_info[i].x=QuantumMargin << 1;
8576 preferences_info[i].y=y;
8577 y+=height+(QuantumMargin >> 1);
8579 preferences_info[0].raised=resource_info->backdrop ==
8580 MagickFalse ? MagickTrue : MagickFalse;
8581 preferences_info[1].raised=resource_info->confirm_exit ==
8582 MagickFalse ? MagickTrue : MagickFalse;
8583 preferences_info[2].raised=resource_info->confirm_edit ==
8584 MagickFalse ? MagickTrue : MagickFalse;
8585 preferences_info[3].raised=resource_info->gamma_correct ==
8586 MagickFalse ? MagickTrue : MagickFalse;
8587 preferences_info[4].raised=resource_info->display_warnings ==
8588 MagickFalse ? MagickTrue : MagickFalse;
8589 preferences_info[5].raised=resource_info->quantize_info->dither ==
8590 MagickFalse ? MagickTrue : MagickFalse;
8591 preferences_info[6].raised=resource_info->colormap !=
8592 SharedColormap ? MagickTrue : MagickFalse;
8593 preferences_info[7].raised=resource_info->use_pixmap ==
8594 MagickFalse ? MagickTrue : MagickFalse;
8595 (void) FormatLocaleString(cache,MaxTextExtent,CacheButtonText,
8596 (
unsigned long) resource_info->undo_cache);
8597 XGetWidgetInfo(cache,&cache_info);
8598 cache_info.bevel_width--;
8599 cache_info.width=(
unsigned int) QuantumMargin >> 1;
8600 cache_info.height=(
unsigned int) QuantumMargin >> 1;
8601 cache_info.x=QuantumMargin << 1;
8603 state&=(~UpdateConfigurationState);
8605 if (state & RedrawWidgetState)
8610 XDrawBeveledButton(display,&windows->widget,&apply_info);
8611 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8612 for (i=0; i < NumberPreferences; i++)
8613 XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
8614 XDrawTriangleEast(display,&windows->widget,&cache_info);
8615 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
8616 state&=(~RedrawWidgetState);
8621 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
8626 if (MatteIsActive(apply_info,event.xbutton))
8631 apply_info.raised=MagickFalse;
8632 XDrawBeveledButton(display,&windows->widget,&apply_info);
8635 if (MatteIsActive(cancel_info,event.xbutton))
8640 cancel_info.raised=MagickFalse;
8641 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8644 for (i=0; i < NumberPreferences; i++)
8645 if (MatteIsActive(preferences_info[i],event.xbutton))
8650 preferences_info[i].raised=preferences_info[i].raised ==
8651 MagickFalse ? MagickTrue : MagickFalse;
8652 XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
8655 if (MatteIsActive(cache_info,event.xbutton))
8660 x=cache_info.x+cache_info.width+cache_info.bevel_width+
8661 (QuantumMargin >> 1);
8662 y=cache_info.y+((cache_info.height-height) >> 1);
8663 width=WidgetTextWidth(font_info,cache);
8664 (void) XClearArea(display,windows->widget.id,x,y,width,height,
8666 resource_info->undo_cache<<=1;
8667 if (resource_info->undo_cache > 256)
8668 resource_info->undo_cache=1;
8669 (void) FormatLocaleString(cache,MaxTextExtent,CacheButtonText,
8670 (
unsigned long) resource_info->undo_cache);
8671 cache_info.raised=MagickFalse;
8672 XDrawTriangleEast(display,&windows->widget,&cache_info);
8679 if (windows->widget.mapped == MagickFalse)
8681 if (apply_info.raised == MagickFalse)
8683 if (event.xbutton.window == windows->widget.id)
8684 if (MatteIsActive(apply_info,event.xbutton))
8686 apply_info.raised=MagickTrue;
8687 XDrawBeveledButton(display,&windows->widget,&apply_info);
8688 apply_info.raised=MagickFalse;
8690 if (cancel_info.raised == MagickFalse)
8692 if (event.xbutton.window == windows->widget.id)
8693 if (MatteIsActive(cancel_info,event.xbutton))
8695 cancel_info.raised=MagickTrue;
8696 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8698 if (cache_info.raised == MagickFalse)
8700 cache_info.raised=MagickTrue;
8701 XDrawTriangleEast(display,&windows->widget,&cache_info);
8710 if (event.xclient.message_type != windows->wm_protocols)
8712 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
8714 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
8715 (Time) event.xclient.data.l[1]);
8718 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
8720 if (event.xclient.window == windows->widget.id)
8727 case ConfigureNotify:
8732 if (event.xconfigure.window != windows->widget.id)
8734 if ((event.xconfigure.width == (
int) windows->widget.width) &&
8735 (event.xconfigure.height == (
int) windows->widget.height))
8737 windows->widget.width=(
unsigned int)
8738 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
8739 windows->widget.height=(
unsigned int)
8740 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
8741 state|=UpdateConfigurationState;
8746 if (event.xcrossing.window != windows->widget.id)
8748 state&=(~InactiveWidgetState);
8753 if (event.xexpose.window != windows->widget.id)
8755 if (event.xexpose.count != 0)
8757 state|=RedrawWidgetState;
8763 command[MaxTextExtent];
8771 if (event.xkey.window != windows->widget.id)
8773 (void) XLookupString((XKeyEvent *) &event.xkey,command,
8774 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
8775 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
8777 apply_info.raised=MagickFalse;
8778 XDrawBeveledButton(display,&windows->widget,&apply_info);
8786 if (event.xcrossing.window != windows->widget.id)
8788 state|=InactiveWidgetState;
8796 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
8797 if (state & InactiveWidgetState)
8799 if (apply_info.raised == MatteIsActive(apply_info,event.xmotion))
8805 apply_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8806 XDrawBeveledButton(display,&windows->widget,&apply_info);
8809 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
8815 cancel_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8816 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8824 }
while ((state & ExitState) == 0);
8825 XSetCursorState(display,windows,MagickFalse);
8826 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8827 XCheckRefreshWindows(display,windows);
8828 if (apply_info.raised)
8829 return(MagickFalse);
8833 resource_info->backdrop=
8834 preferences_info[0].raised == MagickFalse ? MagickTrue : MagickFalse;
8835 resource_info->confirm_exit=
8836 preferences_info[1].raised == MagickFalse ? MagickTrue : MagickFalse;
8837 resource_info->confirm_edit=
8838 preferences_info[2].raised == MagickFalse ? MagickTrue : MagickFalse;
8839 resource_info->gamma_correct=
8840 preferences_info[3].raised == MagickFalse ? MagickTrue : MagickFalse;
8841 resource_info->display_warnings=
8842 preferences_info[4].raised == MagickFalse ? MagickTrue : MagickFalse;
8843 resource_info->quantize_info->dither=
8844 preferences_info[5].raised == MagickFalse ? MagickTrue : MagickFalse;
8845 resource_info->colormap=SharedColormap;
8846 if (preferences_info[6].raised)
8847 resource_info->colormap=PrivateColormap;
8848 resource_info->use_pixmap=
8849 preferences_info[7].raised == MagickFalse ? MagickTrue : MagickFalse;
8850 XUserPreferences(resource_info);
8890MagickExport
void XProgressMonitorWidget(Display *display,XWindows *windows,
8891 const char *task,
const MagickOffsetType offset,
const MagickSizeType span)
8899 assert(display != (Display *) NULL);
8900 assert(windows != (XWindows *) NULL);
8901 assert(task != (
const char *) NULL);
8902 if (IsEventLogging() != MagickFalse)
8903 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",task);
8909 while (XCheckTypedWindowEvent(display,windows->command.id,Expose,&event))
8910 (void) XCommandWidget(display,windows,(
const char *
const *) NULL,&event);
8911 while (XCheckTypedWindowEvent(display,windows->image.id,Expose,&event))
8912 XRefreshWindow(display,&windows->image,&event);
8913 while (XCheckTypedWindowEvent(display,windows->info.id,Expose,&event))
8914 if (monitor_info.text != (
char *) NULL)
8915 XInfoWidget(display,windows,monitor_info.text);
8919 if ((windows->info.mapped == MagickFalse) || (task != monitor_info.text))
8920 XInfoWidget(display,windows,task);
8921 width=(
unsigned int) (((offset+1)*(windows->info.width-
8922 (2*monitor_info.x)))/span);
8923 if (width < monitor_info.width)
8925 monitor_info.raised=MagickTrue;
8926 XDrawWidgetText(display,&windows->info,&monitor_info);
8927 monitor_info.raised=MagickFalse;
8929 monitor_info.width=width;
8930 XDrawWidgetText(display,&windows->info,&monitor_info);
8931 (void) XFlush(display);
8970MagickExport
void XTextViewWidget(Display *display,
8971 const XResourceInfo *resource_info,XWindows *windows,
8972 const MagickBooleanType mono,
const char *title,
const char **textlist)
8974#define DismissButtonText "Dismiss"
8977 primary_selection[MaxTextExtent];
8982 static MagickStatusType
8983 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
9025 assert(display != (Display *) NULL);
9026 assert(resource_info != (XResourceInfo *) NULL);
9027 assert(windows != (XWindows *) NULL);
9028 assert(title != (
const char *) NULL);
9029 assert(textlist != (
const char **) NULL);
9030 if (IsEventLogging() != MagickFalse)
9031 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",title);
9032 XSetCursorState(display,windows,MagickTrue);
9033 XCheckRefreshWindows(display,windows);
9034 if (textlist == (
const char **) NULL)
9036 XNoticeWidget(display,windows,
"No text to view:",(
char *) NULL);
9042 font_info=windows->widget.font_info;
9043 text_info=(XFontStruct *) NULL;
9044 if (mono != MagickFalse)
9045 text_info=XBestFont(display,resource_info,MagickTrue);
9046 if (text_info == (XFontStruct *) NULL)
9047 text_info=windows->widget.font_info;
9049 for (i=0; textlist[i] != (
char *) NULL; i++)
9050 if (WidgetTextWidth(text_info,(
char *) textlist[i]) > text_width)
9051 text_width=(
unsigned int) XTextWidth(text_info,(
char *) textlist[i],
9052 MagickMin(Extent(textlist[i]),160));
9053 lines=(
unsigned int) i;
9054 width=WidgetTextWidth(font_info,DismissButtonText);
9055 width+=QuantumMargin;
9056 height=(
unsigned int) (text_info->ascent+text_info->descent);
9060 windows->widget.width=(
unsigned int) (MagickMin((
int) text_width,
9061 (
int) MaxTextWidth)+5*QuantumMargin);
9062 windows->widget.min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
9063 if (windows->widget.width < windows->widget.min_width)
9064 windows->widget.width=windows->widget.min_width;
9065 windows->widget.height=(
unsigned int) (MagickMin(MagickMax((
int) lines,3),32)*
9066 height+((13*height) >> 1)+((9*QuantumMargin) >> 1));
9067 windows->widget.min_height=(
unsigned int) (3*height+((13*height) >> 1)+((9*
9068 QuantumMargin) >> 1));
9069 if (windows->widget.height < windows->widget.min_height)
9070 windows->widget.height=windows->widget.min_height;
9071 XConstrainWindowPosition(display,&windows->widget);
9075 (void) CopyMagickString(windows->widget.name,title,MaxTextExtent);
9076 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
9077 if (status != False)
9079 XSetWMName(display,windows->widget.id,&window_name);
9080 XSetWMIconName(display,windows->widget.id,&window_name);
9081 (void) XFree((
void *) window_name.value);
9083 window_changes.width=(int) windows->widget.width;
9084 window_changes.height=(int) windows->widget.height;
9085 window_changes.x=windows->widget.x;
9086 window_changes.y=windows->widget.y;
9087 (void) XReconfigureWMWindow(display,windows->widget.id,
9088 windows->widget.screen,(
unsigned int) mask,&window_changes);
9089 (void) XMapRaised(display,windows->widget.id);
9090 windows->widget.mapped=MagickFalse;
9094 XGetWidgetInfo((
char *) NULL,&slider_info);
9095 XGetWidgetInfo((
char *) NULL,&north_info);
9096 XGetWidgetInfo((
char *) NULL,&south_info);
9097 XGetWidgetInfo((
char *) NULL,&expose_info);
9098 XGetWidgetInfo((
char *) NULL,&selection_info);
9100 delay=SuspendTime << 2;
9101 height=(
unsigned int) (font_info->ascent+font_info->descent);
9102 state=UpdateConfigurationState;
9105 if (state & UpdateConfigurationState)
9113 XGetWidgetInfo(DismissButtonText,&dismiss_info);
9114 dismiss_info.width=width;
9115 dismiss_info.height=(
unsigned int) ((3*height) >> 1);
9116 dismiss_info.x=(int) windows->widget.width-dismiss_info.width-
9118 dismiss_info.y=(int) windows->widget.height-dismiss_info.height-
9123 XGetWidgetInfo((
char *) NULL,&scroll_info);
9124 scroll_info.bevel_width--;
9125 scroll_info.width=height;
9126 scroll_info.height=(
unsigned int) (dismiss_info.y-((5*QuantumMargin) >>
9128 scroll_info.x=(int) windows->widget.width-QuantumMargin-
9130 scroll_info.y=(3*QuantumMargin) >> 1;
9131 scroll_info.raised=MagickFalse;
9132 scroll_info.trough=MagickTrue;
9133 north_info=scroll_info;
9134 north_info.raised=MagickTrue;
9135 north_info.width-=(north_info.bevel_width << 1);
9136 north_info.height=north_info.width-1;
9137 north_info.x+=north_info.bevel_width;
9138 north_info.y+=north_info.bevel_width;
9139 south_info=north_info;
9140 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
9143 slider_info=north_info;
9145 slider_info.width-=2;
9146 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
9147 slider_info.bevel_width+2;
9148 slider_info.height=scroll_info.height-((slider_info.min_y-
9149 scroll_info.y+1) << 1)+4;
9150 visible_lines=(
unsigned int) (scroll_info.height*MagickSafeReciprocal(
9151 (
double) text_info->ascent+text_info->descent+((text_info->ascent+
9152 text_info->descent) >> 3)));
9153 if (lines > visible_lines)
9154 slider_info.height=(
unsigned int) (visible_lines*slider_info.height)/
9156 slider_info.max_y=south_info.y-south_info.bevel_width-
9157 slider_info.bevel_width-2;
9158 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
9159 slider_info.y=slider_info.min_y;
9160 expose_info=scroll_info;
9161 expose_info.y=slider_info.y;
9165 XGetWidgetInfo((
char *) NULL,&list_info);
9166 list_info.raised=MagickFalse;
9167 list_info.bevel_width--;
9168 list_info.width=(
unsigned int) scroll_info.x-((3*QuantumMargin) >> 1);
9169 list_info.height=scroll_info.height;
9170 list_info.x=QuantumMargin;
9171 list_info.y=scroll_info.y;
9175 XGetWidgetInfo((
char *) NULL,&selection_info);
9176 selection_info.center=MagickFalse;
9177 selection_info.width=list_info.width;
9178 selection_info.height=(
unsigned int)
9179 (9*(text_info->ascent+text_info->descent)) >> 3;
9180 selection_info.x=list_info.x;
9181 state&=(~UpdateConfigurationState);
9183 if (state & RedrawWidgetState)
9188 XDrawBeveledMatte(display,&windows->widget,&list_info);
9189 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
9190 XDrawTriangleNorth(display,&windows->widget,&north_info);
9191 XDrawBeveledButton(display,&windows->widget,&slider_info);
9192 XDrawTriangleSouth(display,&windows->widget,&south_info);
9193 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9194 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
9195 selection_info.id=(~0);
9196 state|=RedrawListState;
9197 state&=(~RedrawWidgetState);
9199 if (state & RedrawListState)
9204 if (slider_info.id >= (
int) (lines-visible_lines))
9205 slider_info.id=(int) lines-visible_lines;
9206 if ((slider_info.id < 0) || (lines <= visible_lines))
9208 slider_info.y=slider_info.min_y;
9211 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/lines;
9212 if (slider_info.id != selection_info.id)
9217 windows->widget.font_info=text_info;
9218 (void) XSetFont(display,windows->widget.annotate_context,
9220 (void) XSetFont(display,windows->widget.highlight_context,
9222 selection_info.id=slider_info.id;
9223 selection_info.y=list_info.y+(height >> 3)+2;
9224 for (i=0; i < (int) visible_lines; i++)
9226 selection_info.raised=
9227 (slider_info.id+i) != list_info.id ? MagickTrue : MagickFalse;
9228 selection_info.text=(
char *) NULL;
9229 if ((slider_info.id+i) < (
int) lines)
9230 selection_info.text=(
char *) textlist[slider_info.id+i];
9231 XDrawWidgetText(display,&windows->widget,&selection_info);
9232 selection_info.y+=(int) selection_info.height;
9234 windows->widget.font_info=font_info;
9235 (void) XSetFont(display,windows->widget.annotate_context,
9237 (void) XSetFont(display,windows->widget.highlight_context,
9242 if (slider_info.y > expose_info.y)
9244 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
9245 expose_info.y=slider_info.y-expose_info.height-
9246 slider_info.bevel_width-1;
9250 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
9251 expose_info.y=slider_info.y+slider_info.height+
9252 slider_info.bevel_width+1;
9254 XDrawTriangleNorth(display,&windows->widget,&north_info);
9255 XDrawMatte(display,&windows->widget,&expose_info);
9256 XDrawBeveledButton(display,&windows->widget,&slider_info);
9257 XDrawTriangleSouth(display,&windows->widget,&south_info);
9258 expose_info.y=slider_info.y;
9260 state&=(~RedrawListState);
9265 if (north_info.raised && south_info.raised)
9266 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
9272 XDelay(display,delay);
9274 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
9275 if (north_info.raised == MagickFalse)
9276 if (slider_info.id > 0)
9282 state|=RedrawListState;
9284 if (south_info.raised == MagickFalse)
9285 if (slider_info.id < (
int) lines)
9291 state|=RedrawListState;
9293 if (event.type != ButtonRelease)
9300 if (MatteIsActive(slider_info,event.xbutton))
9305 slider_info.active=MagickTrue;
9308 if (MatteIsActive(north_info,event.xbutton))
9309 if (slider_info.id > 0)
9314 north_info.raised=MagickFalse;
9316 state|=RedrawListState;
9319 if (MatteIsActive(south_info,event.xbutton))
9320 if (slider_info.id < (
int) lines)
9325 south_info.raised=MagickFalse;
9327 state|=RedrawListState;
9330 if (MatteIsActive(scroll_info,event.xbutton))
9335 if (event.xbutton.y < slider_info.y)
9336 slider_info.id-=(visible_lines-1);
9338 slider_info.id+=(visible_lines-1);
9339 state|=RedrawListState;
9342 if (MatteIsActive(dismiss_info,event.xbutton))
9347 dismiss_info.raised=MagickFalse;
9348 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9351 if (MatteIsActive(list_info,event.xbutton))
9362 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
9363 selection_info.height;
9364 if (
id >= (
int) lines)
9366 if (
id != list_info.id)
9369 click_time=
event.xbutton.time;
9373 if (event.xbutton.time >= (click_time+DoubleClick))
9375 click_time=
event.xbutton.time;
9378 click_time=
event.xbutton.time;
9382 (void) CopyMagickString(primary_selection,textlist[list_info.id],
9384 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
9385 event.xbutton.time);
9386 if (XGetSelectionOwner(display,XA_PRIMARY) != windows->widget.id)
9388 selection_info.id=(~0);
9390 state|=RedrawListState;
9397 if (windows->widget.mapped == MagickFalse)
9399 if (north_info.raised == MagickFalse)
9404 delay=SuspendTime << 2;
9405 north_info.raised=MagickTrue;
9406 XDrawTriangleNorth(display,&windows->widget,&north_info);
9408 if (south_info.raised == MagickFalse)
9413 delay=SuspendTime << 2;
9414 south_info.raised=MagickTrue;
9415 XDrawTriangleSouth(display,&windows->widget,&south_info);
9417 if (slider_info.active)
9422 slider_info.active=MagickFalse;
9425 if (dismiss_info.raised == MagickFalse)
9427 if (event.xbutton.window == windows->widget.id)
9428 if (MatteIsActive(dismiss_info,event.xbutton))
9430 dismiss_info.raised=MagickTrue;
9431 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9440 if (event.xclient.message_type != windows->wm_protocols)
9442 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
9444 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
9445 (Time) event.xclient.data.l[1]);
9448 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
9450 if (event.xclient.window == windows->widget.id)
9457 case ConfigureNotify:
9462 if (event.xconfigure.window != windows->widget.id)
9464 if ((event.xconfigure.width == (
int) windows->widget.width) &&
9465 (event.xconfigure.height == (
int) windows->widget.height))
9467 windows->widget.width=(
unsigned int)
9468 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
9469 windows->widget.height=(
unsigned int)
9470 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
9471 state|=UpdateConfigurationState;
9476 if (event.xcrossing.window != windows->widget.id)
9478 state&=(~InactiveWidgetState);
9483 if (event.xexpose.window != windows->widget.id)
9485 if (event.xexpose.count != 0)
9487 state|=RedrawWidgetState;
9493 command[MaxTextExtent];
9504 if (event.xkey.window != windows->widget.id)
9506 length=XLookupString((XKeyEvent *) &event.xkey,command,
9507 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
9508 *(command+length)=
'\0';
9509 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
9511 dismiss_info.raised=MagickFalse;
9512 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9516 if (AreaIsActive(scroll_info,event.xkey))
9521 switch ((
int) key_symbol)
9544 slider_info.id-=visible_lines;
9550 slider_info.id+=visible_lines;
9556 slider_info.id=(int) lines;
9560 state|=RedrawListState;
9569 if (event.xcrossing.window != windows->widget.id)
9571 state|=InactiveWidgetState;
9585 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9586 if (slider_info.active)
9591 slider_info.y=
event.xmotion.y-
9592 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
9593 if (slider_info.y < slider_info.min_y)
9594 slider_info.y=slider_info.min_y;
9595 if (slider_info.y > slider_info.max_y)
9596 slider_info.y=slider_info.max_y;
9598 if (slider_info.y != slider_info.min_y)
9599 slider_info.id=(int) (lines*(slider_info.y-slider_info.min_y+1))/
9600 (slider_info.max_y-slider_info.min_y+1);
9601 state|=RedrawListState;
9604 if (state & InactiveWidgetState)
9606 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
9611 dismiss_info.raised=
9612 dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
9613 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9618 case SelectionClear:
9621 selection_info.id=(~0);
9622 state|=RedrawListState;
9625 case SelectionRequest:
9630 XSelectionRequestEvent
9633 if (list_info.id == (~0))
9638 request=(&(
event.xselectionrequest));
9639 (void) XChangeProperty(request->display,request->requestor,
9640 request->property,request->target,8,PropModeReplace,
9641 (
unsigned char *) primary_selection,Extent(primary_selection));
9642 notify.type=SelectionNotify;
9643 notify.send_event=MagickTrue;
9644 notify.display=request->display;
9645 notify.requestor=request->requestor;
9646 notify.selection=request->selection;
9647 notify.target=request->target;
9648 notify.time=request->time;
9649 if (request->property == None)
9650 notify.property=request->target;
9652 notify.property=request->property;
9653 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
9654 (XEvent *) ¬ify);
9659 }
while ((state & ExitState) == 0);
9660 if (text_info != windows->widget.font_info)
9661 (void) XFreeFont(display,text_info);
9662 XSetCursorState(display,windows,MagickFalse);
9663 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
9664 XCheckRefreshWindows(display,windows);