43 #include "MagickCore/studio.h"
44 #include "MagickCore/color.h"
45 #include "MagickCore/color-private.h"
46 #include "MagickCore/exception.h"
47 #include "MagickCore/exception-private.h"
48 #include "MagickCore/image.h"
49 #include "MagickCore/magick.h"
50 #include "MagickCore/memory_.h"
51 #include "MagickCore/string_.h"
52 #include "MagickCore/timer-private.h"
53 #include "MagickCore/token.h"
54 #include "MagickCore/token-private.h"
55 #include "MagickCore/utility.h"
56 #include "MagickCore/utility-private.h"
57 #include "MagickCore/xwindow-private.h"
58 #include "MagickCore/widget.h"
59 #include "MagickCore/widget-private.h"
61 #if defined(MAGICKCORE_X11_DELEGATE)
66 #define AreaIsActive(matte_info,position) ( \
67 ((position.y >= (int) (matte_info.y-matte_info.bevel_width)) && \
68 (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
69 ? MagickTrue : MagickFalse)
70 #define Extent(s) ((int) strlen(s))
71 #define MatteIsActive(matte_info,position) ( \
72 ((position.x >= (int) (matte_info.x-matte_info.bevel_width)) && \
73 (position.y >= (int) (matte_info.y-matte_info.bevel_width)) && \
74 (position.x < (int) (matte_info.x+matte_info.width+matte_info.bevel_width)) && \
75 (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
76 ? MagickTrue : MagickFalse)
77 #define MaxTextWidth ((unsigned int) (255*XTextWidth(font_info,"_",1)))
78 #define MinTextWidth (26*XTextWidth(font_info,"_",1))
79 #define QuantumMargin MagickMax(font_info->max_bounds.width,12)
80 #define WidgetTextWidth(font_info,text) \
81 ((unsigned int) XTextWidth(font_info,text,Extent(text)))
82 #define WindowIsActive(window_info,position) ( \
83 ((position.x >= 0) && (position.y >= 0) && \
84 (position.x < (int) window_info.width) && \
85 (position.y < (int) window_info.height)) ? MagickTrue : MagickFalse)
92 ControlState = 0x0001,
93 InactiveWidgetState = 0x0004,
94 JumpListState = 0x0008,
95 RedrawActionState = 0x0010,
96 RedrawListState = 0x0020,
97 RedrawWidgetState = 0x0040,
98 UpdateListState = 0x0100
104 typedef struct _XWidgetInfo
139 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
140 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
144 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
145 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
147 *selection_info = (XWidgetInfo *) NULL,
150 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
151 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
165 XDrawMatte(Display *,
const XWindowInfo *,
const XWidgetInfo *),
166 XSetBevelColor(Display *,
const XWindowInfo *,
const MagickStatusType),
167 XSetMatteColor(Display *,
const XWindowInfo *,
const MagickStatusType),
168 XSetTextColor(Display *,
const XWindowInfo *,
const MagickStatusType);
190 MagickPrivate
void DestroyXWidget(
void)
192 if (selection_info != (XWidgetInfo *) NULL)
193 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
226 static void XDrawBevel(Display *display,
const XWindowInfo *window_info,
227 const XWidgetInfo *bevel_info)
245 y1=bevel_info->y+bevel_info->height;
246 x2=bevel_info->x+bevel_info->width;
248 bevel_width=bevel_info->bevel_width;
255 points[3].x=x2+bevel_width;
256 points[3].y=y2-bevel_width;
257 points[4].x=x1-bevel_width;
258 points[4].y=y2-bevel_width;
259 points[5].x=x1-bevel_width;
260 points[5].y=y1+bevel_width;
261 XSetBevelColor(display,window_info,bevel_info->raised);
262 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
263 points,6,Complex,CoordModeOrigin);
273 points[3].x=x2+bevel_width;
274 points[3].y=y2-bevel_width;
275 points[4].x=x2+bevel_width;
276 points[4].y=y1+bevel_width;
277 points[5].x=x1-bevel_width;
278 points[5].y=y1+bevel_width;
279 XSetBevelColor(display,window_info,!bevel_info->raised);
280 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
281 points,6,Complex,CoordModeOrigin);
282 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
316 static void XDrawBeveledButton(Display *display,
const XWindowInfo *window_info,
317 const XWidgetInfo *button_info)
335 XDrawBevel(display,window_info,button_info);
336 XSetMatteColor(display,window_info,button_info->raised);
337 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
338 button_info->x,button_info->y,button_info->width,button_info->height);
339 x=button_info->x-button_info->bevel_width-1;
340 y=button_info->y-button_info->bevel_width-1;
341 (void) XSetForeground(display,window_info->widget_context,
342 window_info->pixel_info->trough_color.pixel);
343 if (button_info->raised || (window_info->depth == 1))
344 (
void) XDrawRectangle(display,window_info->id,window_info->widget_context,
345 x,y,button_info->width+(button_info->bevel_width << 1)+1,
346 button_info->height+(button_info->bevel_width << 1)+1);
347 if (button_info->text == (
char *) NULL)
352 crop_info.width=(
unsigned short) button_info->width;
353 crop_info.height=(
unsigned short) button_info->height;
354 crop_info.x=button_info->x;
355 crop_info.y=button_info->y;
359 font_info=window_info->font_info;
360 width=WidgetTextWidth(font_info,button_info->text);
361 x=button_info->x+(QuantumMargin >> 1);
362 if (button_info->center)
363 x=button_info->x+(button_info->width >> 1)-(width >> 1);
364 y=button_info->y+((button_info->height-
365 (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
366 if ((
int) button_info->width == (QuantumMargin >> 1))
371 XSetTextColor(display,window_info,MagickTrue);
372 x=button_info->x+button_info->width+button_info->bevel_width+
373 (QuantumMargin >> 1);
374 (void) XDrawString(display,window_info->id,window_info->widget_context,
375 x,y,button_info->text,Extent(button_info->text));
378 (void) XSetClipRectangles(display,window_info->widget_context,0,0,&crop_info,
380 XSetTextColor(display,window_info,button_info->raised);
381 (void) XDrawString(display,window_info->id,window_info->widget_context,x,y,
382 button_info->text,Extent(button_info->text));
383 (void) XSetClipMask(display,window_info->widget_context,None);
384 if (button_info->raised == MagickFalse)
385 XDelay(display,SuspendTime << 2);
418 static void XDrawBeveledMatte(Display *display,
const XWindowInfo *window_info,
419 const XWidgetInfo *matte_info)
424 XDrawBevel(display,window_info,matte_info);
425 XDrawMatte(display,window_info,matte_info);
456 static void XDrawMatte(Display *display,
const XWindowInfo *window_info,
457 const XWidgetInfo *matte_info)
462 if ((matte_info->trough == MagickFalse) || (window_info->depth == 1))
463 (void) XFillRectangle(display,window_info->id,
464 window_info->highlight_context,matte_info->x,matte_info->y,
465 matte_info->width,matte_info->height);
468 (void) XSetForeground(display,window_info->widget_context,
469 window_info->pixel_info->trough_color.pixel);
470 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
471 matte_info->x,matte_info->y,matte_info->width,matte_info->height);
504 static void XDrawMatteText(Display *display,
const XWindowInfo *window_info,
505 XWidgetInfo *text_info)
531 XSetMatteColor(display,window_info,MagickFalse);
532 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
533 text_info->x,text_info->y,text_info->width,text_info->height);
534 if (text_info->text == (
char *) NULL)
536 XSetTextColor(display,window_info,text_info->highlight);
537 font_info=window_info->font_info;
538 x=text_info->x+(QuantumMargin >> 2);
539 y=text_info->y+font_info->ascent+(text_info->height >> 2);
540 width=text_info->width-(QuantumMargin >> 1);
541 height=(
unsigned int) (font_info->ascent+font_info->descent);
542 if (*text_info->text ==
'\0')
547 (void) XDrawLine(display,window_info->id,window_info->annotate_context,
554 crop_info.width=(
unsigned short) text_info->width;
555 crop_info.height=(
unsigned short) text_info->height;
556 crop_info.x=text_info->x;
557 crop_info.y=text_info->y;
561 if (text_info->cursor < text_info->marker)
562 text_info->marker=text_info->cursor;
565 text=text_info->marker;
566 if (XTextWidth(font_info,(
char *) text,(int) (text_info->cursor-text)) >
569 text=text_info->text;
570 for (i=0; i < Extent(text); i++)
572 n=XTextWidth(font_info,(
char *) text+i,(
int)
573 (text_info->cursor-text-i));
574 if (n <= (
int) width)
577 text_info->marker=(
char *) text+i;
583 if (text_info->highlight == MagickFalse)
585 (void) XSetClipRectangles(display,window_info->widget_context,0,0,
586 &crop_info,1,Unsorted);
587 (void) XDrawString(display,window_info->id,window_info->widget_context,
588 x,y,text_info->marker,Extent(text_info->marker));
589 (void) XSetClipMask(display,window_info->widget_context,None);
593 (void) XSetClipRectangles(display,window_info->annotate_context,0,0,
594 &crop_info,1,Unsorted);
595 width=WidgetTextWidth(font_info,text_info->marker);
596 (void) XFillRectangle(display,window_info->id,
597 window_info->annotate_context,x,y-font_info->ascent,width,height);
598 (void) XSetClipMask(display,window_info->annotate_context,None);
599 (void) XSetClipRectangles(display,window_info->highlight_context,0,0,
600 &crop_info,1,Unsorted);
601 (void) XDrawString(display,window_info->id,
602 window_info->highlight_context,x,y,text_info->marker,
603 Extent(text_info->marker));
604 (void) XSetClipMask(display,window_info->highlight_context,None);
606 x+=XTextWidth(font_info,text_info->marker,(
int)
607 (text_info->cursor-text_info->marker));
608 (void) XDrawLine(display,window_info->id,window_info->annotate_context,x,y+3,
642 static void XDrawTriangleEast(Display *display,
const XWindowInfo *window_info,
643 const XWidgetInfo *triangle_info)
667 x2=triangle_info->x+triangle_info->width;
668 y2=triangle_info->y+(triangle_info->height >> 1);
670 y3=triangle_info->y+triangle_info->height;
671 bevel_width=triangle_info->bevel_width;
678 XSetMatteColor(display,window_info,triangle_info->raised);
679 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
680 points,3,Complex,CoordModeOrigin);
688 points[2].x=x3-bevel_width;
689 points[2].y=y3+bevel_width;
690 points[3].x=x2+bevel_width;
692 XSetBevelColor(display,window_info,!triangle_info->raised);
693 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
694 points,4,Complex,CoordModeOrigin);
702 points[2].x=x1-bevel_width+1;
703 points[2].y=y1-bevel_width;
704 points[3].x=x3-bevel_width+1;
705 points[3].y=y3+bevel_width;
706 XSetBevelColor(display,window_info,triangle_info->raised);
707 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
708 points,4,Complex,CoordModeOrigin);
716 points[2].x=x2+bevel_width;
718 points[3].x=x1-bevel_width;
719 points[3].y=y1-bevel_width;
720 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
721 points,4,Complex,CoordModeOrigin);
722 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
723 if (triangle_info->text == (
char *) NULL)
728 font_info=window_info->font_info;
729 XSetTextColor(display,window_info,MagickTrue);
730 x1=triangle_info->x+triangle_info->width+triangle_info->bevel_width+
731 (QuantumMargin >> 1);
732 y1=triangle_info->y+((triangle_info->height-
733 (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
734 (
void) XDrawString(display,window_info->id,window_info->widget_context,x1,y1,
735 triangle_info->text,Extent(triangle_info->text));
768 static void XDrawTriangleNorth(Display *display,
const XWindowInfo *window_info,
769 const XWidgetInfo *triangle_info)
789 y1=triangle_info->y+triangle_info->height;
790 x2=triangle_info->x+(triangle_info->width >> 1);
792 x3=triangle_info->x+triangle_info->width;
793 y3=triangle_info->y+triangle_info->height;
794 bevel_width=triangle_info->bevel_width;
801 XSetMatteColor(display,window_info,triangle_info->raised);
802 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
803 points,3,Complex,CoordModeOrigin);
812 points[2].y=y2-bevel_width-2;
813 points[3].x=x1-bevel_width-1;
814 points[3].y=y1+bevel_width;
815 XSetBevelColor(display,window_info,triangle_info->raised);
816 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
817 points,4,Complex,CoordModeOrigin);
825 points[2].x=x3+bevel_width;
826 points[2].y=y3+bevel_width;
828 points[3].y=y2-bevel_width;
829 XSetBevelColor(display,window_info,!triangle_info->raised);
830 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
831 points,4,Complex,CoordModeOrigin);
839 points[2].x=x1-bevel_width;
840 points[2].y=y1+bevel_width;
841 points[3].x=x3+bevel_width;
842 points[3].y=y3+bevel_width;
843 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
844 points,4,Complex,CoordModeOrigin);
845 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
878 static void XDrawTriangleSouth(Display *display,
const XWindowInfo *window_info,
879 const XWidgetInfo *triangle_info)
900 x2=triangle_info->x+(triangle_info->width >> 1);
901 y2=triangle_info->y+triangle_info->height;
902 x3=triangle_info->x+triangle_info->width;
904 bevel_width=triangle_info->bevel_width;
911 XSetMatteColor(display,window_info,triangle_info->raised);
912 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
913 points,3,Complex,CoordModeOrigin);
921 points[2].x=x1-bevel_width;
922 points[2].y=y1-bevel_width;
923 points[3].x=x3+bevel_width;
924 points[3].y=y3-bevel_width;
925 XSetBevelColor(display,window_info,triangle_info->raised);
926 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
927 points,4,Complex,CoordModeOrigin);
934 points[1].y=y3-bevel_width;
935 points[2].x=x3+bevel_width;
936 points[2].y=y3-bevel_width;
938 points[3].y=y2+bevel_width;
939 XSetBevelColor(display,window_info,!triangle_info->raised);
940 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
941 points,4,Complex,CoordModeOrigin);
950 points[2].y=y2+bevel_width;
951 points[3].x=x1-bevel_width;
952 points[3].y=y1-bevel_width;
953 XSetBevelColor(display,window_info,triangle_info->raised);
954 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
955 points,4,Complex,CoordModeOrigin);
956 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
987 static void XDrawWidgetText(Display *display,
const XWindowInfo *window_info,
988 XWidgetInfo *text_info)
1010 widget_context=window_info->annotate_context;
1011 if (text_info->raised)
1012 (void) XClearArea(display,window_info->id,text_info->x,text_info->y,
1013 text_info->width,text_info->height,MagickFalse);
1016 (void) XFillRectangle(display,window_info->id,widget_context,text_info->x,
1017 text_info->y,text_info->width,text_info->height);
1018 widget_context=window_info->highlight_context;
1020 if (text_info->text == (
char *) NULL)
1022 if (*text_info->text ==
'\0')
1027 font_info=window_info->font_info;
1028 crop_info.width=(
unsigned short) text_info->width;
1029 crop_info.height=(
unsigned short) text_info->height;
1030 crop_info.x=text_info->x;
1031 crop_info.y=text_info->y;
1035 width=WidgetTextWidth(font_info,text_info->text);
1036 x=text_info->x+(QuantumMargin >> 1);
1037 if (text_info->center)
1038 x=text_info->x+(text_info->width >> 1)-(width >> 1);
1039 if (text_info->raised)
1040 if (width > (text_info->width-QuantumMargin))
1041 x+=(text_info->width-QuantumMargin-width);
1042 height=(
unsigned int) (font_info->ascent+font_info->descent);
1043 y=text_info->y+((text_info->height-height) >> 1)+font_info->ascent;
1044 (void) XSetClipRectangles(display,widget_context,0,0,&crop_info,1,Unsorted);
1045 (void) XDrawString(display,window_info->id,widget_context,x,y,text_info->text,
1046 Extent(text_info->text));
1047 (void) XSetClipMask(display,widget_context,None);
1048 if (x < text_info->x)
1049 (void) XDrawLine(display,window_info->id,window_info->annotate_context,
1050 text_info->x,text_info->y,text_info->x,text_info->y+text_info->height-1);
1087 static void XEditText(Display *display,XWidgetInfo *text_info,
1088 const KeySym key_symbol,
char *text,
const size_t state)
1090 switch ((
int) key_symbol)
1095 if (text_info->highlight)
1100 *text_info->text=
'\0';
1101 text_info->cursor=text_info->text;
1102 text_info->marker=text_info->text;
1103 text_info->highlight=MagickFalse;
1108 if (text_info->cursor != text_info->text)
1110 text_info->cursor--;
1111 (void) memmove(text_info->cursor,text_info->cursor+1,
1112 strlen(text_info->cursor+1)+1);
1113 text_info->highlight=MagickFalse;
1123 if (text_info->cursor == text_info->text)
1125 text_info->cursor--;
1134 if (text_info->cursor == (text_info->text+Extent(text_info->text)))
1136 text_info->cursor++;
1148 if (state & ControlState)
1152 if ((Extent(text_info->text)+1) >= (int) MagickPathExtent)
1153 (void) XBell(display,0);
1156 if (text_info->highlight)
1161 *text_info->text=
'\0';
1162 text_info->cursor=text_info->text;
1163 text_info->marker=text_info->text;
1164 text_info->highlight=MagickFalse;
1169 q=text_info->text+Extent(text_info->text)+strlen(text);
1170 for (i=0; i <= Extent(text_info->cursor); i++)
1172 *q=(*(q-Extent(text)));
1176 for (i=0; i < Extent(text); i++)
1177 *text_info->cursor++=(*p++);
1208 static 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;
1264 static 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)
1314 static 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)
1365 exception=AcquireExceptionInfo();
1366 XMakeMagnifyImage(display,windows,exception);
1367 exception=DestroyExceptionInfo(exception);
1370 if (event->xexpose.window == windows->command.id)
1371 if (event->xexpose.count == 0)
1373 (void) XCommandWidget(display,windows,(
const char *
const *) NULL,
1384 if (event->xfocus.window == windows->image.id)
1385 (void) XSetInputFocus(display,windows->image.id,RevertToNone,
1393 case SelectionNotify:
1398 return(MagickFalse);
1401 #if defined(__cplusplus) || defined(c_plusplus)
1433 static void XSetBevelColor(Display *display,
const XWindowInfo *window_info,
1434 const MagickStatusType raised)
1436 if (window_info->depth == 1)
1444 (void) XSetBackground(display,window_info->widget_context,
1445 XBlackPixel(display,window_info->screen));
1446 (void) XSetForeground(display,window_info->widget_context,
1447 XWhitePixel(display,window_info->screen));
1448 (void) XSetFillStyle(display,window_info->widget_context,
1449 FillOpaqueStippled);
1450 stipple=window_info->highlight_stipple;
1451 if (raised == MagickFalse)
1452 stipple=window_info->shadow_stipple;
1453 (void) XSetStipple(display,window_info->widget_context,stipple);
1457 (void) XSetForeground(display,window_info->widget_context,
1458 window_info->pixel_info->highlight_color.pixel);
1460 (
void) XSetForeground(display,window_info->widget_context,
1461 window_info->pixel_info->shadow_color.pixel);
1491 static void XSetMatteColor(Display *display,
const XWindowInfo *window_info,
1492 const MagickStatusType raised)
1494 if (window_info->depth == 1)
1500 (void) XSetForeground(display,window_info->widget_context,
1501 XWhitePixel(display,window_info->screen));
1503 (
void) XSetForeground(display,window_info->widget_context,
1504 XBlackPixel(display,window_info->screen));
1508 (void) XSetForeground(display,window_info->widget_context,
1509 window_info->pixel_info->matte_color.pixel);
1511 (
void) XSetForeground(display,window_info->widget_context,
1512 window_info->pixel_info->depth_color.pixel);
1543 static void XSetTextColor(Display *display,
const XWindowInfo *window_info,
1544 const MagickStatusType raised)
1550 if (window_info->depth == 1)
1556 (void) XSetForeground(display,window_info->widget_context,
1557 XBlackPixel(display,window_info->screen));
1559 (
void) XSetForeground(display,window_info->widget_context,
1560 XWhitePixel(display,window_info->screen));
1563 foreground=(ssize_t) XPixelIntensity(
1564 &window_info->pixel_info->foreground_color);
1565 matte=(ssize_t) XPixelIntensity(&window_info->pixel_info->matte_color);
1566 if (MagickAbsoluteValue((
int) (foreground-matte)) > (65535L >> 3))
1567 (void) XSetForeground(display,window_info->widget_context,
1568 window_info->pixel_info->foreground_color.pixel);
1570 (
void) XSetForeground(display,window_info->widget_context,
1571 window_info->pixel_info->background_color.pixel);
1606 MagickPrivate
void XColorBrowserWidget(Display *display,XWindows *windows,
1607 const char *action,
char *reply)
1609 #define CancelButtonText "Cancel"
1610 #define ColornameText "Name:"
1611 #define ColorPatternText "Pattern:"
1612 #define GrabButtonText "Grab"
1613 #define ResetButtonText "Reset"
1617 primary_selection[MagickPathExtent],
1618 reset_pattern[MagickPathExtent],
1619 text[MagickPathExtent];
1632 glob_pattern[MagickPathExtent] =
"*";
1634 static MagickStatusType
1635 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
1685 assert(display != (Display *) NULL);
1686 assert(windows != (XWindows *) NULL);
1687 assert(action != (
char *) NULL);
1688 assert(reply != (
char *) NULL);
1689 if (IsEventLogging() != MagickFalse)
1690 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
1691 XSetCursorState(display,windows,MagickTrue);
1692 XCheckRefreshWindows(display,windows);
1693 (void) CopyMagickString(reset_pattern,
"*",MagickPathExtent);
1694 exception=AcquireExceptionInfo();
1695 colorlist=GetColorList(glob_pattern,&colors,exception);
1696 if (colorlist == (
char **) NULL)
1701 (void) CopyMagickString(glob_pattern,
"*",MagickPathExtent);
1702 colorlist=GetColorList(glob_pattern,&colors,exception);
1703 if (colorlist == (
char **) NULL)
1705 XNoticeWidget(display,windows,
"Unable to obtain colors names:",
1707 (void) XDialogWidget(display,windows,action,
"Enter color name:",
1715 font_info=windows->widget.font_info;
1717 for (i=0; i < (int) colors; i++)
1718 if (WidgetTextWidth(font_info,colorlist[i]) > text_width)
1719 text_width=WidgetTextWidth(font_info,colorlist[i]);
1720 width=WidgetTextWidth(font_info,(
char *) action);
1721 if (WidgetTextWidth(font_info,CancelButtonText) > width)
1722 width=WidgetTextWidth(font_info,CancelButtonText);
1723 if (WidgetTextWidth(font_info,ResetButtonText) > width)
1724 width=WidgetTextWidth(font_info,ResetButtonText);
1725 if (WidgetTextWidth(font_info,GrabButtonText) > width)
1726 width=WidgetTextWidth(font_info,GrabButtonText);
1727 width+=QuantumMargin;
1728 if (WidgetTextWidth(font_info,ColorPatternText) > width)
1729 width=WidgetTextWidth(font_info,ColorPatternText);
1730 if (WidgetTextWidth(font_info,ColornameText) > width)
1731 width=WidgetTextWidth(font_info,ColornameText);
1732 height=(
unsigned int) (font_info->ascent+font_info->descent);
1736 windows->widget.width=(
unsigned int)
1737 (width+MagickMin((
int) text_width,(int) MaxTextWidth)+6*QuantumMargin);
1738 windows->widget.min_width=(
unsigned int)
1739 (width+MinTextWidth+4*QuantumMargin);
1740 if (windows->widget.width < windows->widget.min_width)
1741 windows->widget.width=windows->widget.min_width;
1742 windows->widget.height=(
unsigned int)
1743 ((81*height) >> 2)+((13*QuantumMargin) >> 1)+4;
1744 windows->widget.min_height=(
unsigned int)
1745 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
1746 if (windows->widget.height < windows->widget.min_height)
1747 windows->widget.height=windows->widget.min_height;
1748 XConstrainWindowPosition(display,&windows->widget);
1752 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Color",
1754 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
1755 if (status != False)
1757 XSetWMName(display,windows->widget.id,&window_name);
1758 XSetWMIconName(display,windows->widget.id,&window_name);
1759 (void) XFree((
void *) window_name.value);
1761 window_changes.width=(int) windows->widget.width;
1762 window_changes.height=(
int) windows->widget.height;
1763 window_changes.x=windows->widget.x;
1764 window_changes.y=windows->widget.y;
1765 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
1766 mask,&window_changes);
1767 (void) XMapRaised(display,windows->widget.id);
1768 windows->widget.mapped=MagickFalse;
1772 XGetWidgetInfo((
char *) NULL,&mode_info);
1773 XGetWidgetInfo((
char *) NULL,&slider_info);
1774 XGetWidgetInfo((
char *) NULL,&north_info);
1775 XGetWidgetInfo((
char *) NULL,&south_info);
1776 XGetWidgetInfo((
char *) NULL,&expose_info);
1777 XGetWidgetInfo((
char *) NULL,&selection_info);
1779 delay=SuspendTime << 2;
1780 state=UpdateConfigurationState;
1783 if (state & UpdateConfigurationState)
1791 XGetWidgetInfo(CancelButtonText,&cancel_info);
1792 cancel_info.width=width;
1793 cancel_info.height=(
unsigned int) ((3*height) >> 1);
1795 (windows->widget.width-cancel_info.width-QuantumMargin-2);
1797 (windows->widget.height-cancel_info.height-QuantumMargin);
1798 XGetWidgetInfo(action,&action_info);
1799 action_info.width=width;
1800 action_info.height=(
unsigned int) ((3*height) >> 1);
1801 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
1802 (action_info.bevel_width << 1));
1803 action_info.y=cancel_info.y;
1804 XGetWidgetInfo(GrabButtonText,&grab_info);
1805 grab_info.width=width;
1806 grab_info.height=(
unsigned int) ((3*height) >> 1);
1807 grab_info.x=QuantumMargin;
1808 grab_info.y=((5*QuantumMargin) >> 1)+height;
1809 XGetWidgetInfo(ResetButtonText,&reset_info);
1810 reset_info.width=width;
1811 reset_info.height=(
unsigned int) ((3*height) >> 1);
1812 reset_info.x=QuantumMargin;
1813 reset_info.y=grab_info.y+grab_info.height+QuantumMargin;
1817 XGetWidgetInfo(reply,&reply_info);
1818 reply_info.raised=MagickFalse;
1819 reply_info.bevel_width--;
1820 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
1821 reply_info.height=height << 1;
1822 reply_info.x=(int) (width+(QuantumMargin << 1));
1823 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
1827 XGetWidgetInfo((
char *) NULL,&mode_info);
1828 mode_info.active=MagickTrue;
1829 mode_info.bevel_width=0;
1830 mode_info.width=(
unsigned int) (action_info.x-(QuantumMargin << 1));
1831 mode_info.height=action_info.height;
1832 mode_info.x=QuantumMargin;
1833 mode_info.y=action_info.y;
1837 XGetWidgetInfo((
char *) NULL,&scroll_info);
1838 scroll_info.bevel_width--;
1839 scroll_info.width=height;
1840 scroll_info.height=(
unsigned int) (reply_info.y-grab_info.y-
1841 (QuantumMargin >> 1));
1842 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
1843 scroll_info.y=grab_info.y-reply_info.bevel_width;
1844 scroll_info.raised=MagickFalse;
1845 scroll_info.trough=MagickTrue;
1846 north_info=scroll_info;
1847 north_info.raised=MagickTrue;
1848 north_info.width-=(north_info.bevel_width << 1);
1849 north_info.height=north_info.width-1;
1850 north_info.x+=north_info.bevel_width;
1851 north_info.y+=north_info.bevel_width;
1852 south_info=north_info;
1853 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
1856 slider_info=north_info;
1858 slider_info.width-=2;
1859 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
1860 slider_info.bevel_width+2;
1861 slider_info.height=scroll_info.height-((slider_info.min_y-
1862 scroll_info.y+1) << 1)+4;
1863 visible_colors=(
unsigned int) (scroll_info.height*
1864 PerceptibleReciprocal((
double) height+(height >> 3)));
1865 if (colors > visible_colors)
1866 slider_info.height=(
unsigned int) ((visible_colors*
1867 slider_info.height)/colors);
1868 slider_info.max_y=south_info.y-south_info.bevel_width-
1869 slider_info.bevel_width-2;
1870 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
1871 slider_info.y=slider_info.min_y;
1872 expose_info=scroll_info;
1873 expose_info.y=slider_info.y;
1877 XGetWidgetInfo((
char *) NULL,&list_info);
1878 list_info.raised=MagickFalse;
1879 list_info.bevel_width--;
1880 list_info.width=(
unsigned int)
1881 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
1882 list_info.height=scroll_info.height;
1883 list_info.x=reply_info.x;
1884 list_info.y=scroll_info.y;
1885 if (windows->widget.mapped == MagickFalse)
1886 state|=JumpListState;
1891 XGetWidgetInfo(text,&text_info);
1892 text_info.center=MagickFalse;
1893 text_info.width=reply_info.width;
1894 text_info.height=height;
1895 text_info.x=list_info.x-(QuantumMargin >> 1);
1896 text_info.y=QuantumMargin;
1900 XGetWidgetInfo((
char *) NULL,&selection_info);
1901 selection_info.center=MagickFalse;
1902 selection_info.width=list_info.width;
1903 selection_info.height=(
unsigned int) ((9*height) >> 3);
1904 selection_info.x=list_info.x;
1905 state&=(~UpdateConfigurationState);
1907 if (state & RedrawWidgetState)
1913 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
1914 (void) XDrawString(display,windows->widget.id,
1915 windows->widget.annotate_context,x,y,ColorPatternText,
1916 Extent(ColorPatternText));
1917 (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
1918 XDrawWidgetText(display,&windows->widget,&text_info);
1919 XDrawBeveledButton(display,&windows->widget,&grab_info);
1920 XDrawBeveledButton(display,&windows->widget,&reset_info);
1921 XDrawBeveledMatte(display,&windows->widget,&list_info);
1922 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
1923 XDrawTriangleNorth(display,&windows->widget,&north_info);
1924 XDrawBeveledButton(display,&windows->widget,&slider_info);
1925 XDrawTriangleSouth(display,&windows->widget,&south_info);
1927 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
1928 (void) XDrawString(display,windows->widget.id,
1929 windows->widget.annotate_context,x,y,ColornameText,
1930 Extent(ColornameText));
1931 XDrawBeveledMatte(display,&windows->widget,&reply_info);
1932 XDrawMatteText(display,&windows->widget,&reply_info);
1933 XDrawBeveledButton(display,&windows->widget,&action_info);
1934 XDrawBeveledButton(display,&windows->widget,&cancel_info);
1935 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
1936 selection_info.id=(~0);
1937 state|=RedrawActionState;
1938 state|=RedrawListState;
1939 state&=(~RedrawWidgetState);
1941 if (state & UpdateListState)
1949 status=XParseColor(display,windows->widget.map_info->colormap,
1950 glob_pattern,&color);
1951 if ((status != False) || (strchr(glob_pattern,
'-') != (
char *) NULL))
1956 (void) CopyMagickString(reply,glob_pattern,MagickPathExtent);
1957 (void) CopyMagickString(glob_pattern,reset_pattern,MagickPathExtent);
1958 action_info.raised=MagickFalse;
1959 XDrawBeveledButton(display,&windows->widget,&action_info);
1965 checklist=GetColorList(glob_pattern,&number_colors,exception);
1966 if (number_colors == 0)
1968 (void) CopyMagickString(glob_pattern,reset_pattern,MagickPathExtent);
1969 (void) XBell(display,0);
1973 for (i=0; i < (int) colors; i++)
1974 colorlist[i]=DestroyString(colorlist[i]);
1975 if (colorlist != (
char **) NULL)
1976 colorlist=(
char **) RelinquishMagickMemory(colorlist);
1977 colorlist=checklist;
1978 colors=number_colors;
1983 slider_info.height=scroll_info.height-((slider_info.min_y-
1984 scroll_info.y+1) << 1)+1;
1985 if (colors > visible_colors)
1986 slider_info.height=(
unsigned int) ((visible_colors*
1987 slider_info.height)/colors);
1988 slider_info.max_y=south_info.y-south_info.bevel_width-
1989 slider_info.bevel_width-2;
1991 slider_info.y=slider_info.min_y;
1992 expose_info.y=slider_info.y;
1993 selection_info.id=(~0);
1995 state|=RedrawListState;
1999 *reply_info.text=
'\0';
2000 reply_info.cursor=reply_info.text;
2001 (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
2002 XDrawWidgetText(display,&windows->widget,&text_info);
2003 XDrawMatteText(display,&windows->widget,&reply_info);
2004 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
2005 XDrawTriangleNorth(display,&windows->widget,&north_info);
2006 XDrawBeveledButton(display,&windows->widget,&slider_info);
2007 XDrawTriangleSouth(display,&windows->widget,&south_info);
2008 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
2009 state&=(~UpdateListState);
2011 if (state & JumpListState)
2017 for (i=0; i < (int) colors; i++)
2018 if (LocaleCompare(colorlist[i],reply) >= 0)
2020 list_info.id=LocaleCompare(colorlist[i],reply) == 0 ? i : ~0;
2023 if ((i < slider_info.id) ||
2024 (i >= (
int) (slider_info.id+visible_colors)))
2025 slider_info.id=i-(visible_colors >> 1);
2026 selection_info.id=(~0);
2027 state|=RedrawListState;
2028 state&=(~JumpListState);
2030 if (state & RedrawListState)
2035 if (slider_info.id >= (
int) (colors-visible_colors))
2036 slider_info.id=(int) (colors-visible_colors);
2037 if ((slider_info.id < 0) || (colors <= visible_colors))
2039 slider_info.y=slider_info.min_y;
2041 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
2042 slider_info.min_y+1)/colors);
2043 if (slider_info.id != selection_info.id)
2048 selection_info.id=slider_info.id;
2049 selection_info.y=list_info.y+(height >> 3)+2;
2050 for (i=0; i < (int) visible_colors; i++)
2052 selection_info.raised=(slider_info.id+i) != list_info.id ?
2053 MagickTrue : MagickFalse;
2054 selection_info.text=(
char *) NULL;
2055 if ((slider_info.id+i) < (int) colors)
2056 selection_info.text=colorlist[slider_info.id+i];
2057 XDrawWidgetText(display,&windows->widget,&selection_info);
2058 selection_info.y+=(int) selection_info.height;
2063 if (slider_info.y > expose_info.y)
2065 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
2066 expose_info.y=slider_info.y-expose_info.height-
2067 slider_info.bevel_width-1;
2071 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
2072 expose_info.y=slider_info.y+slider_info.height+
2073 slider_info.bevel_width+1;
2075 XDrawTriangleNorth(display,&windows->widget,&north_info);
2076 XDrawMatte(display,&windows->widget,&expose_info);
2077 XDrawBeveledButton(display,&windows->widget,&slider_info);
2078 XDrawTriangleSouth(display,&windows->widget,&south_info);
2079 expose_info.y=slider_info.y;
2081 state&=(~RedrawListState);
2083 if (state & RedrawActionState)
2086 colorname[MagickPathExtent];
2091 color=windows->widget.pixel_info->matte_color;
2092 (void) XParseColor(display,windows->widget.map_info->colormap,
2093 reply_info.text,&windows->widget.pixel_info->matte_color);
2094 XBestPixel(display,windows->widget.map_info->colormap,(XColor *) NULL,
2095 (
unsigned int) windows->widget.visual_info->colormap_size,
2096 &windows->widget.pixel_info->matte_color);
2097 mode_info.text=colorname;
2098 (void) FormatLocaleString(mode_info.text,MagickPathExtent,
2099 "#%02x%02x%02x",windows->widget.pixel_info->matte_color.red,
2100 windows->widget.pixel_info->matte_color.green,
2101 windows->widget.pixel_info->matte_color.blue);
2102 XDrawBeveledButton(display,&windows->widget,&mode_info);
2103 windows->widget.pixel_info->matte_color=color;
2104 state&=(~RedrawActionState);
2109 if (north_info.raised && south_info.raised)
2110 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
2116 XDelay(display,delay);
2118 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
2119 if (north_info.raised == MagickFalse)
2120 if (slider_info.id > 0)
2126 state|=RedrawListState;
2128 if (south_info.raised == MagickFalse)
2129 if (slider_info.id < (
int) colors)
2135 state|=RedrawListState;
2137 if (event.type != ButtonRelease)
2144 if (MatteIsActive(slider_info,event.xbutton))
2149 slider_info.active=MagickTrue;
2152 if (MatteIsActive(north_info,event.xbutton))
2153 if (slider_info.id > 0)
2158 north_info.raised=MagickFalse;
2160 state|=RedrawListState;
2163 if (MatteIsActive(south_info,event.xbutton))
2164 if (slider_info.id < (
int) colors)
2169 south_info.raised=MagickFalse;
2171 state|=RedrawListState;
2174 if (MatteIsActive(scroll_info,event.xbutton))
2179 if (event.xbutton.y < slider_info.y)
2180 slider_info.id-=(visible_colors-1);
2182 slider_info.id+=(visible_colors-1);
2183 state|=RedrawListState;
2186 if (MatteIsActive(list_info,event.xbutton))
2194 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
2195 selection_info.height;
2196 if (
id >= (
int) colors)
2198 (void) CopyMagickString(reply_info.text,colorlist[
id],
2200 reply_info.highlight=MagickFalse;
2201 reply_info.marker=reply_info.text;
2202 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2203 XDrawMatteText(display,&windows->widget,&reply_info);
2204 state|=RedrawActionState;
2205 if (
id == list_info.id)
2207 (void) CopyMagickString(glob_pattern,reply_info.text,
2209 state|=UpdateListState;
2211 selection_info.id=(~0);
2213 state|=RedrawListState;
2216 if (MatteIsActive(grab_info,event.xbutton))
2221 grab_info.raised=MagickFalse;
2222 XDrawBeveledButton(display,&windows->widget,&grab_info);
2225 if (MatteIsActive(reset_info,event.xbutton))
2230 reset_info.raised=MagickFalse;
2231 XDrawBeveledButton(display,&windows->widget,&reset_info);
2234 if (MatteIsActive(mode_info,event.xbutton))
2239 if (mode_info.text != (
char *) NULL)
2240 (void) CopyMagickString(reply_info.text,mode_info.text,
2242 (void) CopyMagickString(primary_selection,reply_info.text,
2244 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2245 event.xbutton.time);
2246 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2247 windows->widget.id ? MagickTrue : MagickFalse;
2248 reply_info.marker=reply_info.text;
2249 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2250 XDrawMatteText(display,&windows->widget,&reply_info);
2253 if (MatteIsActive(action_info,event.xbutton))
2258 action_info.raised=MagickFalse;
2259 XDrawBeveledButton(display,&windows->widget,&action_info);
2262 if (MatteIsActive(cancel_info,event.xbutton))
2267 cancel_info.raised=MagickFalse;
2268 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2271 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2273 if (event.xbutton.button != Button2)
2281 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
2282 for (i=1; i <= Extent(reply_info.marker); i++)
2283 if (XTextWidth(font_info,reply_info.marker,i) > x)
2285 reply_info.cursor=reply_info.marker+i-1;
2286 if (event.xbutton.time > (click_time+DoubleClick))
2287 reply_info.highlight=MagickFalse;
2293 (
void) CopyMagickString(primary_selection,reply_info.text,
2295 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2296 event.xbutton.time);
2297 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2298 windows->widget.id ? MagickTrue : MagickFalse;
2300 XDrawMatteText(display,&windows->widget,&reply_info);
2301 click_time=
event.xbutton.time;
2307 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
2308 windows->widget.id,event.xbutton.time);
2313 if (windows->widget.mapped == MagickFalse)
2315 if (north_info.raised == MagickFalse)
2320 delay=SuspendTime << 2;
2321 north_info.raised=MagickTrue;
2322 XDrawTriangleNorth(display,&windows->widget,&north_info);
2324 if (south_info.raised == MagickFalse)
2329 delay=SuspendTime << 2;
2330 south_info.raised=MagickTrue;
2331 XDrawTriangleSouth(display,&windows->widget,&south_info);
2333 if (slider_info.active)
2338 slider_info.active=MagickFalse;
2341 if (grab_info.raised == MagickFalse)
2343 if (event.xbutton.window == windows->widget.id)
2344 if (MatteIsActive(grab_info,event.xbutton))
2349 (void) XGetWindowColor(display,windows,reply_info.text,
2351 reply_info.marker=reply_info.text;
2352 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2353 XDrawMatteText(display,&windows->widget,&reply_info);
2354 state|=RedrawActionState;
2356 grab_info.raised=MagickTrue;
2357 XDrawBeveledButton(display,&windows->widget,&grab_info);
2359 if (reset_info.raised == MagickFalse)
2361 if (event.xbutton.window == windows->widget.id)
2362 if (MatteIsActive(reset_info,event.xbutton))
2364 (void) CopyMagickString(glob_pattern,reset_pattern,
2366 state|=UpdateListState;
2368 reset_info.raised=MagickTrue;
2369 XDrawBeveledButton(display,&windows->widget,&reset_info);
2371 if (action_info.raised == MagickFalse)
2373 if (event.xbutton.window == windows->widget.id)
2375 if (MatteIsActive(action_info,event.xbutton))
2377 if (*reply_info.text ==
'\0')
2378 (void) XBell(display,0);
2383 action_info.raised=MagickTrue;
2384 XDrawBeveledButton(display,&windows->widget,&action_info);
2386 if (cancel_info.raised == MagickFalse)
2388 if (event.xbutton.window == windows->widget.id)
2389 if (MatteIsActive(cancel_info,event.xbutton))
2391 *reply_info.text=
'\0';
2394 cancel_info.raised=MagickTrue;
2395 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2397 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2406 if (event.xclient.message_type != windows->wm_protocols)
2408 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
2410 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
2411 (Time)
event.xclient.data.l[1]);
2414 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
2416 if (event.xclient.window == windows->widget.id)
2418 *reply_info.text=
'\0';
2424 case ConfigureNotify:
2429 if (event.xconfigure.window != windows->widget.id)
2431 if ((event.xconfigure.width == (
int) windows->widget.width) &&
2432 (
event.xconfigure.height == (int) windows->widget.height))
2434 windows->widget.width=(
unsigned int)
2435 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
2436 windows->widget.height=(
unsigned int)
2437 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
2438 state|=UpdateConfigurationState;
2443 if (event.xcrossing.window != windows->widget.id)
2445 state&=(~InactiveWidgetState);
2450 if (event.xexpose.window != windows->widget.id)
2452 if (event.xexpose.count != 0)
2454 state|=RedrawWidgetState;
2460 command[MagickPathExtent];
2471 if (event.xkey.window != windows->widget.id)
2473 length=XLookupString((XKeyEvent *) &event.xkey,command,
2474 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2475 *(command+length)=
'\0';
2476 if (AreaIsActive(scroll_info,event.xkey))
2481 switch ((
int) key_symbol)
2504 slider_info.id-=visible_colors;
2510 slider_info.id+=visible_colors;
2516 slider_info.id=(int) colors;
2520 state|=RedrawListState;
2523 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
2528 if (*reply_info.text ==
'\0')
2530 (void) CopyMagickString(glob_pattern,reply_info.text,MagickPathExtent);
2531 state|=UpdateListState;
2534 if (key_symbol == XK_Control_L)
2536 state|=ControlState;
2539 if (state & ControlState)
2540 switch ((
int) key_symbol)
2548 *reply_info.text=
'\0';
2549 reply_info.cursor=reply_info.text;
2550 reply_info.marker=reply_info.text;
2551 reply_info.highlight=MagickFalse;
2557 XEditText(display,&reply_info,key_symbol,command,state);
2558 XDrawMatteText(display,&windows->widget,&reply_info);
2559 state|=JumpListState;
2560 status=XParseColor(display,windows->widget.map_info->colormap,
2561 reply_info.text,&color);
2562 if (status != False)
2563 state|=RedrawActionState;
2569 command[MagickPathExtent];
2577 if (event.xkey.window != windows->widget.id)
2579 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
2580 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2581 if (key_symbol == XK_Control_L)
2582 state&=(~ControlState);
2587 if (event.xcrossing.window != windows->widget.id)
2589 state|=InactiveWidgetState;
2603 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
2604 if (slider_info.active)
2609 slider_info.y=
event.xmotion.y-
2610 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
2611 if (slider_info.y < slider_info.min_y)
2612 slider_info.y=slider_info.min_y;
2613 if (slider_info.y > slider_info.max_y)
2614 slider_info.y=slider_info.max_y;
2616 if (slider_info.y != slider_info.min_y)
2617 slider_info.id=(int) ((colors*(slider_info.y-
2618 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
2619 state|=RedrawListState;
2622 if (state & InactiveWidgetState)
2624 if (grab_info.raised == MatteIsActive(grab_info,event.xmotion))
2629 grab_info.raised=!grab_info.raised;
2630 XDrawBeveledButton(display,&windows->widget,&grab_info);
2633 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
2638 reset_info.raised=!reset_info.raised;
2639 XDrawBeveledButton(display,&windows->widget,&reset_info);
2642 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
2647 action_info.raised=action_info.raised == MagickFalse ?
2648 MagickTrue : MagickFalse;
2649 XDrawBeveledButton(display,&windows->widget,&action_info);
2652 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
2657 cancel_info.raised=cancel_info.raised == MagickFalse ?
2658 MagickTrue : MagickFalse;
2659 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2664 case SelectionClear:
2666 reply_info.highlight=MagickFalse;
2667 XDrawMatteText(display,&windows->widget,&reply_info);
2670 case SelectionNotify:
2688 if (event.xselection.property == (Atom) None)
2690 status=XGetWindowProperty(display,event.xselection.requestor,
2691 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
2692 &format,&length,&after,&data);
2693 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
2696 if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
2697 (void) XBell(display,0);
2703 *(data+length)=
'\0';
2704 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
2706 XDrawMatteText(display,&windows->widget,&reply_info);
2707 state|=JumpListState;
2708 state|=RedrawActionState;
2710 (void) XFree((
void *) data);
2713 case SelectionRequest:
2718 XSelectionRequestEvent
2721 if (reply_info.highlight == MagickFalse)
2726 request=(&(
event.xselectionrequest));
2727 (void) XChangeProperty(request->display,request->requestor,
2728 request->property,request->target,8,PropModeReplace,
2729 (
unsigned char *) primary_selection,Extent(primary_selection));
2730 notify.type=SelectionNotify;
2731 notify.send_event=MagickTrue;
2732 notify.display=request->display;
2733 notify.requestor=request->requestor;
2734 notify.selection=request->selection;
2735 notify.target=request->target;
2736 notify.time=request->time;
2737 if (request->property == None)
2738 notify.property=request->target;
2740 notify.property=request->property;
2741 (void) XSendEvent(request->display,request->requestor,False,
2742 NoEventMask,(XEvent *) ¬ify);
2747 }
while ((state & ExitState) == 0);
2748 XSetCursorState(display,windows,MagickFalse);
2749 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
2750 XCheckRefreshWindows(display,windows);
2754 for (i=0; i < (int) colors; i++)
2755 colorlist[i]=DestroyString(colorlist[i]);
2756 if (colorlist != (
char **) NULL)
2757 colorlist=(
char **) RelinquishMagickMemory(colorlist);
2758 exception=DestroyExceptionInfo(exception);
2759 if ((*reply ==
'\0') || (strchr(reply,
'-') != (
char *) NULL))
2761 status=XParseColor(display,windows->widget.map_info->colormap,reply,&color);
2762 if (status != False)
2764 XNoticeWidget(display,windows,
"Color is unknown to X server:",reply);
2765 (void) CopyMagickString(reply,
"gray",MagickPathExtent);
2803 MagickPrivate
int XCommandWidget(Display *display,XWindows *windows,
2804 const char *
const *selections,XEvent *event)
2806 #define tile_width 112
2807 #define tile_height 70
2809 static const unsigned char
2812 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2813 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2814 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
2816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
2818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2819 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2820 0x00, 0x00, 0x1e, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2821 0x00, 0x00, 0x00, 0x00, 0x1e, 0xbc, 0x9f, 0x03, 0x00, 0x3e, 0x00, 0xc0,
2822 0x1f, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x0f, 0x80, 0x3f,
2823 0x00, 0xf0, 0x1f, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x1f,
2824 0xe0, 0x3f, 0x00, 0xfc, 0x1f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc,
2825 0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xfe, 0x1f, 0xf8, 0x0f, 0x00, 0x00, 0x00,
2826 0x1e, 0xfc, 0xfc, 0x3f, 0xf8, 0x3f, 0x00, 0xff, 0x1e, 0xfc, 0x0f, 0x00,
2827 0x00, 0x00, 0x1e, 0x7c, 0xfc, 0x3e, 0xf8, 0x3c, 0x80, 0x1f, 0x1e, 0x7c,
2828 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c, 0xc0, 0x0f,
2829 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c,
2830 0xc0, 0x07, 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c,
2831 0x7c, 0x7c, 0xc0, 0x0f, 0x1e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78,
2832 0x78, 0x3c, 0xfc, 0x7c, 0x80, 0x7f, 0x1e, 0x7c, 0x00, 0x00, 0x00, 0x00,
2833 0x1e, 0xf8, 0x78, 0x7c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0xf8, 0xff, 0x00,
2834 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xfe, 0x1f, 0xf8,
2835 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xf8,
2836 0x1f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xc0, 0xef,
2837 0x07, 0xe0, 0x1f, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0x70, 0x40, 0x78,
2838 0x00, 0xc7, 0x07, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x00,
2839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
2840 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
2842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2843 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2844 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2845 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2846 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
2847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00,
2848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
2849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
2850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2851 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00,
2852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07,
2853 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2854 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2855 0x60, 0x00, 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2856 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
2857 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00,
2858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x9f, 0x7f, 0x00,
2859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0xdf,
2860 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x00,
2861 0xe0, 0xdf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0c,
2862 0x78, 0x30, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
2863 0x00, 0x0f, 0xf8, 0x70, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x1f, 0x00, 0xe0,
2864 0x0f, 0x1e, 0x80, 0x0f, 0xf8, 0x78, 0xf0, 0xfd, 0xf9, 0x00, 0xc0, 0x1f,
2865 0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x1f, 0xf8, 0x7c, 0xf0, 0xfc, 0xf9, 0x00,
2866 0xf0, 0x1f, 0x00, 0xfe, 0x0f, 0x00, 0xf0, 0x07, 0xf8, 0x3e, 0xf8, 0xfc,
2867 0xf0, 0x01, 0xf8, 0x1f, 0x00, 0xff, 0x0f, 0x1e, 0xf0, 0x03, 0xf8, 0x3f,
2868 0xf8, 0xf8, 0xf0, 0x01, 0xfc, 0x1f, 0x80, 0x7f, 0x0f, 0x1e, 0xf8, 0x00,
2869 0xf8, 0x1f, 0x78, 0x18, 0xf0, 0x01, 0x7c, 0x1e, 0xc0, 0x0f, 0x0f, 0x1e,
2870 0x7c, 0x00, 0xf0, 0x0f, 0x78, 0x00, 0xf0, 0x01, 0x3e, 0x1e, 0xe0, 0x07,
2871 0x0f, 0x1e, 0x7c, 0x00, 0xf0, 0x07, 0x7c, 0x00, 0xe0, 0x01, 0x3e, 0x1e,
2872 0xe0, 0x03, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x0f, 0x7c, 0x00, 0xe0, 0x03,
2873 0x3e, 0x3e, 0xe0, 0x07, 0x0f, 0x1e, 0x1e, 0x00, 0xf0, 0x1f, 0x3c, 0x00,
2874 0xe0, 0x03, 0x7e, 0x3e, 0xc0, 0x3f, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x1f,
2875 0x3e, 0x00, 0xe0, 0x03, 0xfc, 0x7f, 0x80, 0xff, 0x0f, 0x1e, 0xfc, 0x00,
2876 0xf0, 0x3e, 0x3e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xff, 0x0f, 0x1e,
2877 0xfc, 0x07, 0xf0, 0x7c, 0x1e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xfc,
2878 0x0f, 0x1e, 0xf8, 0x1f, 0xf0, 0xf8, 0x1e, 0x00, 0xc0, 0x03, 0xe0, 0xf7,
2879 0x03, 0xf0, 0x0f, 0x1e, 0xe0, 0x3f, 0xf0, 0x78, 0x1c, 0x00, 0x80, 0x03,
2880 0x80, 0xe3, 0x03, 0x00, 0x0f, 0x1e, 0xc0, 0x3f, 0xf0, 0x30, 0x00, 0x00,
2881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x3e, 0x00, 0x00,
2882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x10,
2883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00,
2884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2885 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2886 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2887 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2888 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2889 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
2890 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
2891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
2892 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2893 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2915 assert(display != (Display *) NULL);
2916 assert(windows != (XWindows *) NULL);
2917 if (IsEventLogging() != MagickFalse)
2918 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2919 font_info=windows->command.font_info;
2920 height=(
unsigned int) (font_info->ascent+font_info->descent);
2923 if (event == (XEvent *) NULL)
2937 assert(selections != (
const char **) NULL);
2938 windows->command.width=0;
2939 for (i=0; selections[i] != (
char *) NULL; i++)
2941 width=WidgetTextWidth(font_info,(
char *) selections[i]);
2942 if (width > windows->command.width)
2943 windows->command.width=width;
2945 number_selections=(
unsigned int) i;
2946 windows->command.width+=3*QuantumMargin+10;
2947 if ((
int) windows->command.width < (tile_width+QuantumMargin+10))
2948 windows->command.width=(
unsigned int) (tile_width+QuantumMargin+10);
2949 windows->command.height=(
unsigned int) (number_selections*
2950 (((3*height) >> 1)+10)+tile_height+20);
2951 windows->command.min_width=windows->command.width;
2952 windows->command.min_height=windows->command.height;
2953 XConstrainWindowPosition(display,&windows->command);
2954 if (windows->command.id != (Window) NULL)
2962 status=XStringListToTextProperty(&windows->command.name,1,
2964 if (status != False)
2966 XSetWMName(display,windows->command.id,&window_name);
2967 XSetWMIconName(display,windows->command.id,&window_name);
2968 (void) XFree((
void *) window_name.value);
2970 window_changes.width=(int) windows->command.width;
2971 window_changes.height=(
int) windows->command.height;
2972 (void) XReconfigureWMWindow(display,windows->command.id,
2973 windows->command.screen,(
unsigned int) (CWWidth | CWHeight),
2979 if (selection_info != (XWidgetInfo *) NULL)
2980 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
2981 selection_info=(XWidgetInfo *) AcquireQuantumMemory(number_selections,
2982 sizeof(*selection_info));
2983 if (selection_info == (XWidgetInfo *) NULL)
2985 ThrowXWindowFatalException(ResourceLimitFatalError,
2986 "MemoryAllocationFailed",
"...");
2989 state|=UpdateConfigurationState | RedrawWidgetState;
2994 if (event != (XEvent *) NULL)
2995 switch (event->type)
2999 for (i=0; i < (int) number_selections; i++)
3001 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
3003 if (i >= (
int) windows->command.data)
3005 selection_info[i].raised=MagickFalse;
3006 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
3009 submenu_info=selection_info[i];
3010 submenu_info.active=MagickTrue;
3011 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3012 (toggle_info.height >> 1);
3014 (void) XCheckWindowEvent(display,windows->widget.id,LeaveWindowMask,
3022 for (i=0; i < (int) number_selections; i++)
3024 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
3027 if (
id >= (
int) windows->command.data)
3029 selection_info[id].raised=MagickTrue;
3030 XDrawBeveledButton(display,&windows->command,&selection_info[
id]);
3042 if (event->xclient.message_type != windows->wm_protocols)
3044 if (*event->xclient.data.l != (
int) windows->wm_delete_window)
3046 (void) XWithdrawWindow(display,windows->command.id,
3047 windows->command.screen);
3050 case ConfigureNotify:
3055 if (event->xconfigure.window != windows->command.id)
3057 if (event->xconfigure.send_event != 0)
3059 windows->command.x=
event->xconfigure.x;
3060 windows->command.y=
event->xconfigure.y;
3062 if ((event->xconfigure.width == (
int) windows->command.width) &&
3063 (
event->xconfigure.height == (int) windows->command.height))
3065 windows->command.width=(
unsigned int)
3066 MagickMax(event->xconfigure.width,(
int) windows->command.min_width);
3067 windows->command.height=(
unsigned int)
3068 MagickMax(event->xconfigure.height,(
int) windows->command.min_height);
3069 state|=UpdateConfigurationState;
3074 if (event->xexpose.window != windows->command.id)
3076 if (event->xexpose.count != 0)
3078 state|=RedrawWidgetState;
3088 for (i=0; i < (int) number_selections; i++)
3090 if (i >= (
int) windows->command.data)
3092 if (selection_info[i].raised ==
3093 MatteIsActive(selection_info[i],event->xmotion))
3098 selection_info[i].raised=!selection_info[i].raised;
3099 XDrawBeveledButton(display,&windows->command,
3100 &selection_info[i]);
3104 if (MatteIsActive(selection_info[i],event->xmotion) == MagickFalse)
3106 submenu_info=selection_info[i];
3107 submenu_info.active=MagickTrue;
3108 toggle_info.raised=MagickTrue;
3109 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3110 (toggle_info.height >> 1);
3111 XDrawTriangleEast(display,&windows->command,&toggle_info);
3114 XDelay(display,SuspendTime);
3115 if (XCheckMaskEvent(display,ButtonMotionMask,event) == MagickFalse)
3117 while (XCheckMaskEvent(display,ButtonMotionMask,event)) ;
3118 toggle_info.raised=MagickFalse;
3119 if (windows->command.data != 0)
3120 XDrawTriangleEast(display,&windows->command,&toggle_info);
3126 windows->command.mapped=MagickTrue;
3131 windows->command.mapped=MagickFalse;
3137 if (state & UpdateConfigurationState)
3142 assert(selections != (
const char **) NULL);
3144 for (i=0; i < (int) number_selections; i++)
3146 XGetWidgetInfo(selections[i],&selection_info[i]);
3147 selection_info[i].center=MagickFalse;
3148 selection_info[i].bevel_width--;
3149 selection_info[i].height=(
unsigned int) ((3*height) >> 1);
3150 selection_info[i].x=(QuantumMargin >> 1)+4;
3151 selection_info[i].width=(
unsigned int) (windows->command.width-
3152 (selection_info[i].x << 1));
3153 selection_info[i].y=y;
3154 y+=selection_info[i].height+(selection_info[i].bevel_width << 1)+6;
3156 XGetWidgetInfo((
char *) NULL,&toggle_info);
3157 toggle_info.bevel_width--;
3158 toggle_info.width=(
unsigned int) (((5*height) >> 3)-
3159 (toggle_info.bevel_width << 1));
3160 toggle_info.height=toggle_info.width;
3161 toggle_info.x=selection_info[0].x+selection_info[0].width-
3162 toggle_info.width-(QuantumMargin >> 1);
3163 if (windows->command.mapped)
3164 (void) XClearWindow(display,windows->command.id);
3166 if (state & RedrawWidgetState)
3174 tile_pixmap=XCreatePixmapFromBitmapData(display,windows->command.id,
3175 (
char *) tile_bits,tile_width,tile_height,1L,0L,1);
3176 if (tile_pixmap != (Pixmap) NULL)
3178 (void) XCopyPlane(display,tile_pixmap,windows->command.id,
3179 windows->command.annotate_context,0,0,tile_width,tile_height,
3180 (
int) ((windows->command.width-tile_width) >> 1),10,1L);
3181 (void) XFreePixmap(display,tile_pixmap);
3183 for (i=0; i < (int) number_selections; i++)
3185 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
3186 if (i >= (
int) windows->command.data)
3188 toggle_info.raised=MagickFalse;
3189 toggle_info.y=selection_info[i].y+(selection_info[i].height >> 1)-
3190 (toggle_info.height >> 1);
3191 XDrawTriangleEast(display,&windows->command,&toggle_info);
3193 XHighlightWidget(display,&windows->command,BorderOffset,BorderOffset);
3230 MagickPrivate
int XConfirmWidget(Display *display,XWindows *windows,
3231 const char *reason,
const char *description)
3233 #define CancelButtonText "Cancel"
3234 #define DismissButtonText "Dismiss"
3235 #define YesButtonText "Yes"
3272 assert(display != (Display *) NULL);
3273 assert(windows != (XWindows *) NULL);
3274 assert(reason != (
char *) NULL);
3275 assert(description != (
char *) NULL);
3276 if (IsEventLogging() != MagickFalse)
3277 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
3278 XCheckRefreshWindows(display,windows);
3279 font_info=windows->widget.font_info;
3280 width=WidgetTextWidth(font_info,CancelButtonText);
3281 if (WidgetTextWidth(font_info,DismissButtonText) > width)
3282 width=WidgetTextWidth(font_info,DismissButtonText);
3283 if (WidgetTextWidth(font_info,YesButtonText) > width)
3284 width=WidgetTextWidth(font_info,YesButtonText);
3286 if (description != (
char *) NULL)
3287 if (WidgetTextWidth(font_info,(
char *) description) > width)
3288 width=WidgetTextWidth(font_info,(
char *) description);
3289 height=(
unsigned int) (font_info->ascent+font_info->descent);
3293 windows->widget.width=(
unsigned int) (width+9*QuantumMargin);
3294 windows->widget.min_width=(
unsigned int) (9*QuantumMargin+
3295 WidgetTextWidth(font_info,CancelButtonText)+
3296 WidgetTextWidth(font_info,DismissButtonText)+
3297 WidgetTextWidth(font_info,YesButtonText));
3298 if (windows->widget.width < windows->widget.min_width)
3299 windows->widget.width=windows->widget.min_width;
3300 windows->widget.height=(
unsigned int) (12*height);
3301 windows->widget.min_height=(
unsigned int) (7*height);
3302 if (windows->widget.height < windows->widget.min_height)
3303 windows->widget.height=windows->widget.min_height;
3304 XConstrainWindowPosition(display,&windows->widget);
3308 (void) CopyMagickString(windows->widget.name,
"Confirm",MagickPathExtent);
3309 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3310 if (status != False)
3312 XSetWMName(display,windows->widget.id,&window_name);
3313 XSetWMIconName(display,windows->widget.id,&window_name);
3314 (void) XFree((
void *) window_name.value);
3316 window_changes.width=(int) windows->widget.width;
3317 window_changes.height=(
int) windows->widget.height;
3318 window_changes.x=windows->widget.x;
3319 window_changes.y=windows->widget.y;
3320 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3321 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3322 (void) XMapRaised(display,windows->widget.id);
3323 windows->widget.mapped=MagickFalse;
3328 state=UpdateConfigurationState;
3329 XSetCursorState(display,windows,MagickTrue);
3332 if (state & UpdateConfigurationState)
3337 XGetWidgetInfo(CancelButtonText,&cancel_info);
3338 cancel_info.width=(
unsigned int) QuantumMargin+
3339 WidgetTextWidth(font_info,CancelButtonText);
3340 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3341 cancel_info.x=(int) (windows->widget.width-cancel_info.width-
3343 cancel_info.y=(int) (windows->widget.height-(cancel_info.height << 1));
3344 dismiss_info=cancel_info;
3345 dismiss_info.text=(
char *) DismissButtonText;
3346 if (LocaleCompare(description,
"Do you want to save it") == 0)
3347 dismiss_info.text=(
char *)
"Don't Save";
3348 dismiss_info.width=(
unsigned int) QuantumMargin+
3349 WidgetTextWidth(font_info,dismiss_info.text);
3350 dismiss_info.x=(int)
3351 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
3352 yes_info=cancel_info;
3353 yes_info.text=(
char *) YesButtonText;
3354 if (LocaleCompare(description,
"Do you want to save it") == 0)
3355 yes_info.text=(
char *)
"Save";
3356 yes_info.width=(
unsigned int) QuantumMargin+
3357 WidgetTextWidth(font_info,yes_info.text);
3358 if (yes_info.width < cancel_info.width)
3359 yes_info.width=cancel_info.width;
3360 yes_info.x=QuantumMargin;
3361 state&=(~UpdateConfigurationState);
3363 if (state & RedrawWidgetState)
3368 width=WidgetTextWidth(font_info,(
char *) reason);
3369 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3370 y=(int) ((windows->widget.height >> 1)-(height << 1));
3371 (void) XDrawString(display,windows->widget.id,
3372 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
3373 if (description != (
char *) NULL)
3376 question[MagickPathExtent];
3378 (void) CopyMagickString(question,description,MagickPathExtent);
3379 (void) ConcatenateMagickString(question,
"?",MagickPathExtent);
3380 width=WidgetTextWidth(font_info,question);
3381 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3383 (void) XDrawString(display,windows->widget.id,
3384 windows->widget.annotate_context,x,y,question,Extent(question));
3386 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3387 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3388 XDrawBeveledButton(display,&windows->widget,&yes_info);
3389 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3390 state&=(~RedrawWidgetState);
3395 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3400 if (MatteIsActive(cancel_info,event.xbutton))
3405 cancel_info.raised=MagickFalse;
3406 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3409 if (MatteIsActive(dismiss_info,event.xbutton))
3414 dismiss_info.raised=MagickFalse;
3415 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3418 if (MatteIsActive(yes_info,event.xbutton))
3423 yes_info.raised=MagickFalse;
3424 XDrawBeveledButton(display,&windows->widget,&yes_info);
3431 if (windows->widget.mapped == MagickFalse)
3433 if (cancel_info.raised == MagickFalse)
3435 if (event.xbutton.window == windows->widget.id)
3436 if (MatteIsActive(cancel_info,event.xbutton))
3441 cancel_info.raised=MagickTrue;
3442 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3444 if (dismiss_info.raised == MagickFalse)
3446 if (event.xbutton.window == windows->widget.id)
3447 if (MatteIsActive(dismiss_info,event.xbutton))
3452 dismiss_info.raised=MagickTrue;
3453 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3455 if (yes_info.raised == MagickFalse)
3457 if (event.xbutton.window == windows->widget.id)
3458 if (MatteIsActive(yes_info,event.xbutton))
3463 yes_info.raised=MagickTrue;
3464 XDrawBeveledButton(display,&windows->widget,&yes_info);
3473 if (event.xclient.message_type != windows->wm_protocols)
3475 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3477 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3478 (Time)
event.xclient.data.l[1]);
3481 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3483 if (event.xclient.window == windows->widget.id)
3490 case ConfigureNotify:
3495 if (event.xconfigure.window != windows->widget.id)
3497 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3498 (
event.xconfigure.height == (int) windows->widget.height))
3500 windows->widget.width=(
unsigned int)
3501 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3502 windows->widget.height=(
unsigned int)
3503 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3504 state|=UpdateConfigurationState;
3509 if (event.xcrossing.window != windows->widget.id)
3511 state&=(~InactiveWidgetState);
3516 if (event.xexpose.window != windows->widget.id)
3518 if (event.xexpose.count != 0)
3520 state|=RedrawWidgetState;
3526 command[MagickPathExtent];
3534 if (event.xkey.window != windows->widget.id)
3536 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
3537 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3538 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3540 yes_info.raised=MagickFalse;
3541 XDrawBeveledButton(display,&windows->widget,&yes_info);
3550 if (event.xcrossing.window != windows->widget.id)
3552 state|=InactiveWidgetState;
3560 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
3561 if (state & InactiveWidgetState)
3563 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
3568 cancel_info.raised=cancel_info.raised == MagickFalse ?
3569 MagickTrue : MagickFalse;
3570 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3573 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
3578 dismiss_info.raised=dismiss_info.raised == MagickFalse ?
3579 MagickTrue : MagickFalse;
3580 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3583 if (yes_info.raised == MatteIsActive(yes_info,event.xmotion))
3588 yes_info.raised=yes_info.raised == MagickFalse ?
3589 MagickTrue : MagickFalse;
3590 XDrawBeveledButton(display,&windows->widget,&yes_info);
3598 }
while ((state & ExitState) == 0);
3599 XSetCursorState(display,windows,MagickFalse);
3600 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
3601 XCheckRefreshWindows(display,windows);
3639 MagickPrivate
int XDialogWidget(Display *display,XWindows *windows,
3640 const char *action,
const char *query,
char *reply)
3642 #define CancelButtonText "Cancel"
3645 primary_selection[MagickPathExtent];
3653 static MagickBooleanType
3654 raised = MagickFalse;
3689 assert(display != (Display *) NULL);
3690 assert(windows != (XWindows *) NULL);
3691 assert(action != (
char *) NULL);
3692 assert(query != (
char *) NULL);
3693 assert(reply != (
char *) NULL);
3694 if (IsEventLogging() != MagickFalse)
3695 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
3696 XCheckRefreshWindows(display,windows);
3697 font_info=windows->widget.font_info;
3698 width=WidgetTextWidth(font_info,(
char *) action);
3699 if (WidgetTextWidth(font_info,CancelButtonText) > width)
3700 width=WidgetTextWidth(font_info,CancelButtonText);
3701 width+=(3*QuantumMargin) >> 1;
3702 height=(
unsigned int) (font_info->ascent+font_info->descent);
3706 windows->widget.width=(
unsigned int) MagickMax((
int) (2*width),(
int)
3707 WidgetTextWidth(font_info,(
char *) query));
3708 if (windows->widget.width < WidgetTextWidth(font_info,reply))
3709 windows->widget.width=WidgetTextWidth(font_info,reply);
3710 windows->widget.width+=6*QuantumMargin;
3711 windows->widget.min_width=(
unsigned int)
3712 (width+28*XTextWidth(font_info,
"#",1)+4*QuantumMargin);
3713 if (windows->widget.width < windows->widget.min_width)
3714 windows->widget.width=windows->widget.min_width;
3715 windows->widget.height=(
unsigned int) (7*height+(QuantumMargin << 1));
3716 windows->widget.min_height=windows->widget.height;
3717 if (windows->widget.height < windows->widget.min_height)
3718 windows->widget.height=windows->widget.min_height;
3719 XConstrainWindowPosition(display,&windows->widget);
3723 (void) CopyMagickString(windows->widget.name,
"Dialog",MagickPathExtent);
3724 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3725 if (status != False)
3727 XSetWMName(display,windows->widget.id,&window_name);
3728 XSetWMIconName(display,windows->widget.id,&window_name);
3729 (void) XFree((
void *) window_name.value);
3731 window_changes.width=(int) windows->widget.width;
3732 window_changes.height=(
int) windows->widget.height;
3733 window_changes.x=windows->widget.x;
3734 window_changes.y=windows->widget.y;
3735 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3736 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3737 (void) XMapRaised(display,windows->widget.id);
3738 windows->widget.mapped=MagickFalse;
3742 anomaly=(LocaleCompare(action,
"Background") == 0) ||
3743 (LocaleCompare(action,
"New") == 0) ||
3744 (LocaleCompare(action,
"Quantize") == 0) ||
3745 (LocaleCompare(action,
"Resize") == 0) ||
3746 (LocaleCompare(action,
"Save") == 0) ||
3747 (LocaleCompare(action,
"Shade") == 0);
3748 state=UpdateConfigurationState;
3749 XSetCursorState(display,windows,MagickTrue);
3752 if (state & UpdateConfigurationState)
3757 XGetWidgetInfo(CancelButtonText,&cancel_info);
3758 cancel_info.width=width;
3759 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3761 (windows->widget.width-cancel_info.width-((3*QuantumMargin) >> 1));
3763 (windows->widget.height-cancel_info.height-((3*QuantumMargin) >> 1));
3764 XGetWidgetInfo(action,&action_info);
3765 action_info.width=width;
3766 action_info.height=(
unsigned int) ((3*height) >> 1);
3767 action_info.x=cancel_info.x-(cancel_info.width+QuantumMargin+
3768 (action_info.bevel_width << 1));
3769 action_info.y=cancel_info.y;
3773 XGetWidgetInfo(reply,&reply_info);
3774 reply_info.raised=MagickFalse;
3775 reply_info.bevel_width--;
3776 reply_info.width=windows->widget.width-(3*QuantumMargin);
3777 reply_info.height=height << 1;
3778 reply_info.x=(3*QuantumMargin) >> 1;
3779 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
3783 XGetWidgetInfo(
"Dither",&special_info);
3784 special_info.raised=raised;
3785 special_info.bevel_width--;
3786 special_info.width=(
unsigned int) QuantumMargin >> 1;
3787 special_info.height=(
unsigned int) QuantumMargin >> 1;
3788 special_info.x=reply_info.x;
3789 special_info.y=action_info.y+action_info.height-special_info.height;
3790 if (LocaleCompare(action,
"Background") == 0)
3791 special_info.text=(
char *)
"Backdrop";
3792 if (LocaleCompare(action,
"New") == 0)
3793 special_info.text=(
char *)
"Gradation";
3794 if (LocaleCompare(action,
"Resize") == 0)
3795 special_info.text=(
char *)
"Constrain ratio";
3796 if (LocaleCompare(action,
"Save") == 0)
3797 special_info.text=(
char *)
"Non-progressive";
3798 if (LocaleCompare(action,
"Shade") == 0)
3799 special_info.text=(
char *)
"Color shading";
3803 XGetWidgetInfo(query,&text_info);
3804 text_info.width=reply_info.width;
3805 text_info.height=height;
3806 text_info.x=reply_info.x-(QuantumMargin >> 1);
3807 text_info.y=QuantumMargin;
3808 text_info.center=MagickFalse;
3809 state&=(~UpdateConfigurationState);
3811 if (state & RedrawWidgetState)
3816 XDrawWidgetText(display,&windows->widget,&text_info);
3817 XDrawBeveledMatte(display,&windows->widget,&reply_info);
3818 XDrawMatteText(display,&windows->widget,&reply_info);
3820 XDrawBeveledButton(display,&windows->widget,&special_info);
3821 XDrawBeveledButton(display,&windows->widget,&action_info);
3822 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3823 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3824 state&=(~RedrawWidgetState);
3829 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3835 if (MatteIsActive(special_info,event.xbutton))
3840 special_info.raised=!special_info.raised;
3841 XDrawBeveledButton(display,&windows->widget,&special_info);
3844 if (MatteIsActive(action_info,event.xbutton))
3849 action_info.raised=MagickFalse;
3850 XDrawBeveledButton(display,&windows->widget,&action_info);
3853 if (MatteIsActive(cancel_info,event.xbutton))
3858 cancel_info.raised=MagickFalse;
3859 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3862 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
3864 if (event.xbutton.button != Button2)
3872 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
3873 for (i=1; i <= Extent(reply_info.marker); i++)
3874 if (XTextWidth(font_info,reply_info.marker,i) > x)
3876 reply_info.cursor=reply_info.marker+i-1;
3877 if (event.xbutton.time > (click_time+DoubleClick))
3878 reply_info.highlight=MagickFalse;
3884 (
void) CopyMagickString(primary_selection,reply_info.text,
3886 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
3887 event.xbutton.time);
3888 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
3889 windows->widget.id ? MagickTrue : MagickFalse;
3891 XDrawMatteText(display,&windows->widget,&reply_info);
3892 click_time=
event.xbutton.time;
3898 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
3899 windows->widget.id,event.xbutton.time);
3904 if (windows->widget.mapped == MagickFalse)
3906 if (action_info.raised == MagickFalse)
3908 if (event.xbutton.window == windows->widget.id)
3909 if (MatteIsActive(action_info,event.xbutton))
3911 action_info.raised=MagickTrue;
3912 XDrawBeveledButton(display,&windows->widget,&action_info);
3914 if (cancel_info.raised == MagickFalse)
3916 if (event.xbutton.window == windows->widget.id)
3917 if (MatteIsActive(cancel_info,event.xbutton))
3919 *reply_info.text=
'\0';
3922 cancel_info.raised=MagickTrue;
3923 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3932 if (event.xclient.message_type != windows->wm_protocols)
3934 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3936 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3937 (Time)
event.xclient.data.l[1]);
3940 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3942 if (event.xclient.window == windows->widget.id)
3944 *reply_info.text=
'\0';
3950 case ConfigureNotify:
3955 if (event.xconfigure.window != windows->widget.id)
3957 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3958 (
event.xconfigure.height == (int) windows->widget.height))
3960 windows->widget.width=(
unsigned int)
3961 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3962 windows->widget.height=(
unsigned int)
3963 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3964 state|=UpdateConfigurationState;
3969 if (event.xcrossing.window != windows->widget.id)
3971 state&=(~InactiveWidgetState);
3976 if (event.xexpose.window != windows->widget.id)
3978 if (event.xexpose.count != 0)
3980 state|=RedrawWidgetState;
3986 command[MagickPathExtent];
3997 if (event.xkey.window != windows->widget.id)
3999 length=XLookupString((XKeyEvent *) &event.xkey,command,
4000 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
4001 *(command+length)=
'\0';
4002 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
4004 action_info.raised=MagickFalse;
4005 XDrawBeveledButton(display,&windows->widget,&action_info);
4009 if (key_symbol == XK_Control_L)
4011 state|=ControlState;
4014 if (state & ControlState)
4015 switch ((
int) key_symbol)
4023 *reply_info.text=
'\0';
4024 reply_info.cursor=reply_info.text;
4025 reply_info.marker=reply_info.text;
4026 reply_info.highlight=MagickFalse;
4032 XEditText(display,&reply_info,key_symbol,command,state);
4033 XDrawMatteText(display,&windows->widget,&reply_info);
4039 command[MagickPathExtent];
4047 if (event.xkey.window != windows->widget.id)
4049 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
4050 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
4051 if (key_symbol == XK_Control_L)
4052 state&=(~ControlState);
4057 if (event.xcrossing.window != windows->widget.id)
4059 state|=InactiveWidgetState;
4067 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
4068 if (state & InactiveWidgetState)
4070 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
4075 action_info.raised=action_info.raised == MagickFalse ?
4076 MagickTrue : MagickFalse;
4077 XDrawBeveledButton(display,&windows->widget,&action_info);
4080 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
4085 cancel_info.raised=cancel_info.raised == MagickFalse ?
4086 MagickTrue : MagickFalse;
4087 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4092 case SelectionClear:
4094 reply_info.highlight=MagickFalse;
4095 XDrawMatteText(display,&windows->widget,&reply_info);
4098 case SelectionNotify:
4116 if (event.xselection.property == (Atom) None)
4118 status=XGetWindowProperty(display,event.xselection.requestor,
4119 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
4120 &format,&length,&after,&data);
4121 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
4124 if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
4125 (void) XBell(display,0);
4131 *(data+length)=
'\0';
4132 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
4134 XDrawMatteText(display,&windows->widget,&reply_info);
4136 (void) XFree((
void *) data);
4139 case SelectionRequest:
4144 XSelectionRequestEvent
4147 if (reply_info.highlight == MagickFalse)
4152 request=(&(
event.xselectionrequest));
4153 (void) XChangeProperty(request->display,request->requestor,
4154 request->property,request->target,8,PropModeReplace,
4155 (
unsigned char *) primary_selection,Extent(primary_selection));
4156 notify.type=SelectionNotify;
4157 notify.display=request->display;
4158 notify.requestor=request->requestor;
4159 notify.selection=request->selection;
4160 notify.target=request->target;
4161 notify.time=request->time;
4162 if (request->property == None)
4163 notify.property=request->target;
4165 notify.property=request->property;
4166 (void) XSendEvent(request->display,request->requestor,False,0,
4167 (XEvent *) ¬ify);
4172 }
while ((state & ExitState) == 0);
4173 XSetCursorState(display,windows,MagickFalse);
4174 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
4175 XCheckRefreshWindows(display,windows);
4177 if (special_info.raised)
4180 return(raised == MagickFalse);
4215 MagickPrivate
void XFileBrowserWidget(Display *display,XWindows *windows,
4216 const char *action,
char *reply)
4218 #define CancelButtonText "Cancel"
4219 #define DirectoryText "Directory:"
4220 #define FilenameText "File name:"
4221 #define GrabButtonText "Grab"
4222 #define FormatButtonText "Format"
4223 #define HomeButtonText "Home"
4224 #define UpButtonText "Up"
4229 home_directory[MagickPathExtent],
4230 primary_selection[MagickPathExtent],
4231 text[MagickPathExtent],
4232 working_path[MagickPathExtent];
4239 glob_pattern[MagickPathExtent] =
"*",
4240 format[MagickPathExtent] =
"miff";
4242 static MagickStatusType
4243 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
4294 assert(display != (Display *) NULL);
4295 assert(windows != (XWindows *) NULL);
4296 assert(action != (
char *) NULL);
4297 assert(reply != (
char *) NULL);
4298 if (IsEventLogging() != MagickFalse)
4299 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
4300 XSetCursorState(display,windows,MagickTrue);
4301 XCheckRefreshWindows(display,windows);
4302 directory=getcwd(home_directory,MagickPathExtent);
4304 (void) CopyMagickString(working_path,home_directory,MagickPathExtent);
4305 filelist=ListFiles(working_path,glob_pattern,&files);
4306 if (filelist == (
char **) NULL)
4311 XNoticeWidget(display,windows,
"Unable to read directory:",working_path);
4312 (void) XDialogWidget(display,windows,action,
"Enter filename:",reply);
4318 font_info=windows->widget.font_info;
4320 for (i=0; i < (ssize_t) files; i++)
4321 if (WidgetTextWidth(font_info,filelist[i]) > text_width)
4322 text_width=WidgetTextWidth(font_info,filelist[i]);
4323 width=WidgetTextWidth(font_info,(
char *) action);
4324 if (WidgetTextWidth(font_info,GrabButtonText) > width)
4325 width=WidgetTextWidth(font_info,GrabButtonText);
4326 if (WidgetTextWidth(font_info,FormatButtonText) > width)
4327 width=WidgetTextWidth(font_info,FormatButtonText);
4328 if (WidgetTextWidth(font_info,CancelButtonText) > width)
4329 width=WidgetTextWidth(font_info,CancelButtonText);
4330 if (WidgetTextWidth(font_info,HomeButtonText) > width)
4331 width=WidgetTextWidth(font_info,HomeButtonText);
4332 if (WidgetTextWidth(font_info,UpButtonText) > width)
4333 width=WidgetTextWidth(font_info,UpButtonText);
4334 width+=QuantumMargin;
4335 if (WidgetTextWidth(font_info,DirectoryText) > width)
4336 width=WidgetTextWidth(font_info,DirectoryText);
4337 if (WidgetTextWidth(font_info,FilenameText) > width)
4338 width=WidgetTextWidth(font_info,FilenameText);
4339 height=(
unsigned int) (font_info->ascent+font_info->descent);
4343 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
4345 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
4346 if (windows->widget.width < windows->widget.min_width)
4347 windows->widget.width=windows->widget.min_width;
4348 windows->widget.height=(
unsigned int)
4349 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
4350 windows->widget.min_height=(
unsigned int)
4351 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
4352 if (windows->widget.height < windows->widget.min_height)
4353 windows->widget.height=windows->widget.min_height;
4354 XConstrainWindowPosition(display,&windows->widget);
4358 (void) CopyMagickString(windows->widget.name,
"Browse and Select a File",
4360 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
4361 if (status != False)
4363 XSetWMName(display,windows->widget.id,&window_name);
4364 XSetWMIconName(display,windows->widget.id,&window_name);
4365 (void) XFree((
void *) window_name.value);
4367 window_changes.width=(int) windows->widget.width;
4368 window_changes.height=(
int) windows->widget.height;
4369 window_changes.x=windows->widget.x;
4370 window_changes.y=windows->widget.y;
4371 (void) XReconfigureWMWindow(display,windows->widget.id,
4372 windows->widget.screen,mask,&window_changes);
4373 (void) XMapRaised(display,windows->widget.id);
4374 windows->widget.mapped=MagickFalse;
4378 XGetWidgetInfo((
char *) NULL,&slider_info);
4379 XGetWidgetInfo((
char *) NULL,&north_info);
4380 XGetWidgetInfo((
char *) NULL,&south_info);
4381 XGetWidgetInfo((
char *) NULL,&expose_info);
4383 anomaly=(LocaleCompare(action,
"Composite") == 0) ||
4384 (LocaleCompare(action,
"Open") == 0) || (LocaleCompare(action,
"Map") == 0);
4385 delay=SuspendTime << 2;
4386 state=UpdateConfigurationState;
4389 if (state & UpdateConfigurationState)
4397 XGetWidgetInfo(CancelButtonText,&cancel_info);
4398 cancel_info.width=width;
4399 cancel_info.height=(
unsigned int) ((3*height) >> 1);
4401 (windows->widget.width-cancel_info.width-QuantumMargin-2);
4403 (windows->widget.height-cancel_info.height-QuantumMargin);
4404 XGetWidgetInfo(action,&action_info);
4405 action_info.width=width;
4406 action_info.height=(
unsigned int) ((3*height) >> 1);
4407 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
4408 (action_info.bevel_width << 1));
4409 action_info.y=cancel_info.y;
4410 XGetWidgetInfo(GrabButtonText,&special_info);
4411 special_info.width=width;
4412 special_info.height=(
unsigned int) ((3*height) >> 1);
4413 special_info.x=action_info.x-(action_info.width+(QuantumMargin >> 1)+
4414 (special_info.bevel_width << 1));
4415 special_info.y=action_info.y;
4416 if (anomaly == MagickFalse)
4421 special_info.text=(
char *) FormatButtonText;
4422 p=reply+Extent(reply)-1;
4423 while ((p > (reply+1)) && (*(p-1) !=
'.'))
4425 if ((p > (reply+1)) && (*(p-1) ==
'.'))
4426 (void) CopyMagickString(format,p,MagickPathExtent);
4428 XGetWidgetInfo(UpButtonText,&up_info);
4429 up_info.width=width;
4430 up_info.height=(
unsigned int) ((3*height) >> 1);
4431 up_info.x=QuantumMargin;
4432 up_info.y=((5*QuantumMargin) >> 1)+height;
4433 XGetWidgetInfo(HomeButtonText,&home_info);
4434 home_info.width=width;
4435 home_info.height=(
unsigned int) ((3*height) >> 1);
4436 home_info.x=QuantumMargin;
4437 home_info.y=up_info.y+up_info.height+QuantumMargin;
4441 XGetWidgetInfo(reply,&reply_info);
4442 reply_info.raised=MagickFalse;
4443 reply_info.bevel_width--;
4444 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
4445 reply_info.height=height << 1;
4446 reply_info.x=(int) (width+(QuantumMargin << 1));
4447 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
4451 XGetWidgetInfo((
char *) NULL,&scroll_info);
4452 scroll_info.bevel_width--;
4453 scroll_info.width=height;
4454 scroll_info.height=(
unsigned int)
4455 (reply_info.y-up_info.y-(QuantumMargin >> 1));
4456 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
4457 scroll_info.y=up_info.y-reply_info.bevel_width;
4458 scroll_info.raised=MagickFalse;
4459 scroll_info.trough=MagickTrue;
4460 north_info=scroll_info;
4461 north_info.raised=MagickTrue;
4462 north_info.width-=(north_info.bevel_width << 1);
4463 north_info.height=north_info.width-1;
4464 north_info.x+=north_info.bevel_width;
4465 north_info.y+=north_info.bevel_width;
4466 south_info=north_info;
4467 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
4470 slider_info=north_info;
4472 slider_info.width-=2;
4473 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
4474 slider_info.bevel_width+2;
4475 slider_info.height=scroll_info.height-((slider_info.min_y-
4476 scroll_info.y+1) << 1)+4;
4477 visible_files=(
unsigned int) (scroll_info.height*
4478 PerceptibleReciprocal((
double) height+(height >> 3)));
4479 if (files > visible_files)
4480 slider_info.height=(
unsigned int)
4481 ((visible_files*slider_info.height)/files);
4482 slider_info.max_y=south_info.y-south_info.bevel_width-
4483 slider_info.bevel_width-2;
4484 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
4485 slider_info.y=slider_info.min_y;
4486 expose_info=scroll_info;
4487 expose_info.y=slider_info.y;
4491 XGetWidgetInfo((
char *) NULL,&list_info);
4492 list_info.raised=MagickFalse;
4493 list_info.bevel_width--;
4494 list_info.width=(
unsigned int)
4495 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
4496 list_info.height=scroll_info.height;
4497 list_info.x=reply_info.x;
4498 list_info.y=scroll_info.y;
4499 if (windows->widget.mapped == MagickFalse)
4500 state|=JumpListState;
4505 XGetWidgetInfo(text,&text_info);
4506 text_info.center=MagickFalse;
4507 text_info.width=reply_info.width;
4508 text_info.height=height;
4509 text_info.x=list_info.x-(QuantumMargin >> 1);
4510 text_info.y=QuantumMargin;
4514 XGetWidgetInfo((
char *) NULL,&selection_info);
4515 selection_info.center=MagickFalse;
4516 selection_info.width=list_info.width;
4517 selection_info.height=(
unsigned int) ((9*height) >> 3);
4518 selection_info.x=list_info.x;
4519 state&=(~UpdateConfigurationState);
4521 if (state & RedrawWidgetState)
4527 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
4528 (void) XDrawString(display,windows->widget.id,
4529 windows->widget.annotate_context,x,y,DirectoryText,
4530 Extent(DirectoryText));
4531 (void) CopyMagickString(text_info.text,working_path,MagickPathExtent);
4532 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4534 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4536 XDrawWidgetText(display,&windows->widget,&text_info);
4537 XDrawBeveledButton(display,&windows->widget,&up_info);
4538 XDrawBeveledButton(display,&windows->widget,&home_info);
4539 XDrawBeveledMatte(display,&windows->widget,&list_info);
4540 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4541 XDrawTriangleNorth(display,&windows->widget,&north_info);
4542 XDrawBeveledButton(display,&windows->widget,&slider_info);
4543 XDrawTriangleSouth(display,&windows->widget,&south_info);
4545 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
4546 (void) XDrawString(display,windows->widget.id,
4547 windows->widget.annotate_context,x,y,FilenameText,
4548 Extent(FilenameText));
4549 XDrawBeveledMatte(display,&windows->widget,&reply_info);
4550 XDrawMatteText(display,&windows->widget,&reply_info);
4551 XDrawBeveledButton(display,&windows->widget,&special_info);
4552 XDrawBeveledButton(display,&windows->widget,&action_info);
4553 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4554 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4555 selection_info.id=(~0);
4556 state|=RedrawListState;
4557 state&=(~RedrawWidgetState);
4559 if (state & UpdateListState)
4570 checklist=ListFiles(working_path,glob_pattern,&number_files);
4571 if (checklist == (
char **) NULL)
4576 action_info.raised=MagickFalse;
4577 XDrawBeveledButton(display,&windows->widget,&action_info);
4580 for (i=0; i < (ssize_t) files; i++)
4581 filelist[i]=DestroyString(filelist[i]);
4582 if (filelist != (
char **) NULL)
4583 filelist=(
char **) RelinquishMagickMemory(filelist);
4590 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
4591 if (files > visible_files)
4592 slider_info.height=(
unsigned int)
4593 ((visible_files*slider_info.height)/files);
4594 slider_info.max_y=south_info.y-south_info.bevel_width-
4595 slider_info.bevel_width-2;
4597 slider_info.y=slider_info.min_y;
4598 expose_info.y=slider_info.y;
4599 selection_info.id=(~0);
4601 state|=RedrawListState;
4605 if (IsGlob(reply_info.text) == MagickFalse)
4607 *reply_info.text=
'\0';
4608 reply_info.cursor=reply_info.text;
4610 (void) CopyMagickString(text_info.text,working_path,MagickPathExtent);
4611 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4613 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4615 XDrawWidgetText(display,&windows->widget,&text_info);
4616 XDrawMatteText(display,&windows->widget,&reply_info);
4617 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4618 XDrawTriangleNorth(display,&windows->widget,&north_info);
4619 XDrawBeveledButton(display,&windows->widget,&slider_info);
4620 XDrawTriangleSouth(display,&windows->widget,&south_info);
4621 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4622 state&=(~UpdateListState);
4624 if (state & JumpListState)
4630 for (i=0; i < (ssize_t) files; i++)
4631 if (LocaleCompare(filelist[i],reply) >= 0)
4634 (LocaleCompare(filelist[i],reply) == 0 ? i : ~0);
4637 if ((i < (ssize_t) slider_info.id) ||
4638 (i >= (ssize_t) (slider_info.id+visible_files)))
4639 slider_info.id=(
int) i-(visible_files >> 1);
4640 selection_info.id=(~0);
4641 state|=RedrawListState;
4642 state&=(~JumpListState);
4644 if (state & RedrawListState)
4649 if (slider_info.id >= (
int) (files-visible_files))
4650 slider_info.id=(int) (files-visible_files);
4651 if ((slider_info.id < 0) || (files <= visible_files))
4653 slider_info.y=slider_info.min_y;
4655 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
4656 slider_info.min_y+1)/files);
4657 if (slider_info.id != selection_info.id)
4662 selection_info.id=slider_info.id;
4663 selection_info.y=list_info.y+(height >> 3)+2;
4664 for (i=0; i < (ssize_t) visible_files; i++)
4666 selection_info.raised=(int) (slider_info.id+i) != list_info.id ?
4667 MagickTrue : MagickFalse;
4668 selection_info.text=(
char *) NULL;
4669 if ((slider_info.id+i) < (ssize_t) files)
4670 selection_info.text=filelist[slider_info.id+i];
4671 XDrawWidgetText(display,&windows->widget,&selection_info);
4672 selection_info.y+=(int) selection_info.height;
4677 if (slider_info.y > expose_info.y)
4679 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
4680 expose_info.y=slider_info.y-expose_info.height-
4681 slider_info.bevel_width-1;
4685 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
4686 expose_info.y=slider_info.y+slider_info.height+
4687 slider_info.bevel_width+1;
4689 XDrawTriangleNorth(display,&windows->widget,&north_info);
4690 XDrawMatte(display,&windows->widget,&expose_info);
4691 XDrawBeveledButton(display,&windows->widget,&slider_info);
4692 XDrawTriangleSouth(display,&windows->widget,&south_info);
4693 expose_info.y=slider_info.y;
4695 state&=(~RedrawListState);
4700 if (north_info.raised && south_info.raised)
4701 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
4707 XDelay(display,delay);
4709 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
4710 if (north_info.raised == MagickFalse)
4711 if (slider_info.id > 0)
4717 state|=RedrawListState;
4719 if (south_info.raised == MagickFalse)
4720 if (slider_info.id < (
int) files)
4726 state|=RedrawListState;
4728 if (event.type != ButtonRelease)
4735 if (MatteIsActive(slider_info,event.xbutton))
4740 slider_info.active=MagickTrue;
4743 if (MatteIsActive(north_info,event.xbutton))
4744 if (slider_info.id > 0)
4749 north_info.raised=MagickFalse;
4751 state|=RedrawListState;
4754 if (MatteIsActive(south_info,event.xbutton))
4755 if (slider_info.id < (
int) files)
4760 south_info.raised=MagickFalse;
4762 state|=RedrawListState;
4765 if (MatteIsActive(scroll_info,event.xbutton))
4770 if (event.xbutton.y < slider_info.y)
4771 slider_info.id-=(visible_files-1);
4773 slider_info.id+=(visible_files-1);
4774 state|=RedrawListState;
4777 if (MatteIsActive(list_info,event.xbutton))
4785 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
4786 selection_info.height;
4787 if (
id >= (
int) files)
4789 (void) CopyMagickString(reply_info.text,filelist[
id],MagickPathExtent);
4790 reply_info.highlight=MagickFalse;
4791 reply_info.marker=reply_info.text;
4792 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4793 XDrawMatteText(display,&windows->widget,&reply_info);
4794 if (
id == list_info.id)
4799 p=reply_info.text+strlen(reply_info.text)-1;
4800 if (*p == *DirectorySeparator)
4801 ChopPathComponents(reply_info.text,1);
4802 (void) ConcatenateMagickString(working_path,DirectorySeparator,
4804 (void) ConcatenateMagickString(working_path,reply_info.text,
4807 state|=UpdateListState;
4809 selection_info.id=(~0);
4811 state|=RedrawListState;
4814 if (MatteIsActive(up_info,event.xbutton))
4819 up_info.raised=MagickFalse;
4820 XDrawBeveledButton(display,&windows->widget,&up_info);
4823 if (MatteIsActive(home_info,event.xbutton))
4828 home_info.raised=MagickFalse;
4829 XDrawBeveledButton(display,&windows->widget,&home_info);
4832 if (MatteIsActive(special_info,event.xbutton))
4837 special_info.raised=MagickFalse;
4838 XDrawBeveledButton(display,&windows->widget,&special_info);
4841 if (MatteIsActive(action_info,event.xbutton))
4846 action_info.raised=MagickFalse;
4847 XDrawBeveledButton(display,&windows->widget,&action_info);
4850 if (MatteIsActive(cancel_info,event.xbutton))
4855 cancel_info.raised=MagickFalse;
4856 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4859 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
4861 if (event.xbutton.button != Button2)
4869 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
4870 for (i=1; i <= (ssize_t) Extent(reply_info.marker); i++)
4871 if (XTextWidth(font_info,reply_info.marker,(
int) i) > x)
4873 reply_info.cursor=reply_info.marker+i-1;
4874 if (event.xbutton.time > (click_time+DoubleClick))
4875 reply_info.highlight=MagickFalse;
4881 (
void) CopyMagickString(primary_selection,reply_info.text,
4883 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
4884 event.xbutton.time);
4885 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
4886 windows->widget.id ? MagickTrue : MagickFalse;
4888 XDrawMatteText(display,&windows->widget,&reply_info);
4889 click_time=
event.xbutton.time;
4895 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
4896 windows->widget.id,event.xbutton.time);
4901 if (windows->widget.mapped == MagickFalse)
4903 if (north_info.raised == MagickFalse)
4908 delay=SuspendTime << 2;
4909 north_info.raised=MagickTrue;
4910 XDrawTriangleNorth(display,&windows->widget,&north_info);
4912 if (south_info.raised == MagickFalse)
4917 delay=SuspendTime << 2;
4918 south_info.raised=MagickTrue;
4919 XDrawTriangleSouth(display,&windows->widget,&south_info);
4921 if (slider_info.active)
4926 slider_info.active=MagickFalse;
4929 if (up_info.raised == MagickFalse)
4931 if (event.xbutton.window == windows->widget.id)
4932 if (MatteIsActive(up_info,event.xbutton))
4934 ChopPathComponents(working_path,1);
4935 if (*working_path ==
'\0')
4936 (void) CopyMagickString(working_path,DirectorySeparator,
4938 state|=UpdateListState;
4940 up_info.raised=MagickTrue;
4941 XDrawBeveledButton(display,&windows->widget,&up_info);
4943 if (home_info.raised == MagickFalse)
4945 if (event.xbutton.window == windows->widget.id)
4946 if (MatteIsActive(home_info,event.xbutton))
4948 (void) CopyMagickString(working_path,home_directory,
4950 state|=UpdateListState;
4952 home_info.raised=MagickTrue;
4953 XDrawBeveledButton(display,&windows->widget,&home_info);
4955 if (special_info.raised == MagickFalse)
4957 if (anomaly == MagickFalse)
4971 exception=AcquireExceptionInfo();
4972 formats=GetMagickList(
"*",&number_formats,exception);
4973 exception=DestroyExceptionInfo(exception);
4974 if (formats == (
char **) NULL)
4976 (void) XCheckDefineCursor(display,windows->widget.id,
4977 windows->widget.busy_cursor);
4978 windows->popup.x=windows->widget.x+60;
4979 windows->popup.y=windows->widget.y+60;
4980 XListBrowserWidget(display,windows,&windows->popup,
4981 (
const char **) formats,
"Select",
"Select image format type:",
4983 XSetCursorState(display,windows,MagickTrue);
4984 (void) XCheckDefineCursor(display,windows->widget.id,
4985 windows->widget.cursor);
4986 LocaleLower(format);
4987 AppendImageFormat(format,reply_info.text);
4988 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4989 XDrawMatteText(display,&windows->widget,&reply_info);
4990 special_info.raised=MagickTrue;
4991 XDrawBeveledButton(display,&windows->widget,&special_info);
4992 for (i=0; i < (ssize_t) number_formats; i++)
4993 formats[i]=DestroyString(formats[i]);
4994 formats=(
char **) RelinquishMagickMemory(formats);
4997 if (event.xbutton.window == windows->widget.id)
4998 if (MatteIsActive(special_info,event.xbutton))
5000 (void) CopyMagickString(working_path,
"x:",MagickPathExtent);
5003 special_info.raised=MagickTrue;
5004 XDrawBeveledButton(display,&windows->widget,&special_info);
5006 if (action_info.raised == MagickFalse)
5008 if (event.xbutton.window == windows->widget.id)
5010 if (MatteIsActive(action_info,event.xbutton))
5012 if (*reply_info.text ==
'\0')
5013 (void) XBell(display,0);
5018 action_info.raised=MagickTrue;
5019 XDrawBeveledButton(display,&windows->widget,&action_info);
5021 if (cancel_info.raised == MagickFalse)
5023 if (event.xbutton.window == windows->widget.id)
5024 if (MatteIsActive(cancel_info,event.xbutton))
5026 *reply_info.text=
'\0';
5030 cancel_info.raised=MagickTrue;
5031 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5040 if (event.xclient.message_type != windows->wm_protocols)
5042 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
5044 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
5045 (Time)
event.xclient.data.l[1]);
5048 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
5050 if (event.xclient.window == windows->widget.id)
5052 *reply_info.text=
'\0';
5058 case ConfigureNotify:
5063 if (event.xconfigure.window != windows->widget.id)
5065 if ((event.xconfigure.width == (
int) windows->widget.width) &&
5066 (
event.xconfigure.height == (int) windows->widget.height))
5068 windows->widget.width=(
unsigned int)
5069 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
5070 windows->widget.height=(
unsigned int)
5071 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
5072 state|=UpdateConfigurationState;
5077 if (event.xcrossing.window != windows->widget.id)
5079 state&=(~InactiveWidgetState);
5084 if (event.xexpose.window != windows->widget.id)
5086 if (event.xexpose.count != 0)
5088 state|=RedrawWidgetState;
5094 command[MagickPathExtent];
5105 if (event.xkey.window != windows->widget.id)
5107 length=XLookupString((XKeyEvent *) &event.xkey,command,
5108 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5109 *(command+length)=
'\0';
5110 if (AreaIsActive(scroll_info,event.xkey))
5115 switch ((
int) key_symbol)
5138 slider_info.id-=visible_files;
5144 slider_info.id+=visible_files;
5150 slider_info.id=(int) files;
5154 state|=RedrawListState;
5157 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
5162 if (*reply_info.text ==
'\0')
5164 if (IsGlob(reply_info.text))
5165 (
void) CopyMagickString(glob_pattern,reply_info.text,
5169 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5171 (void) ConcatenateMagickString(working_path,reply_info.text,
5173 if (*working_path ==
'~')
5174 ExpandFilename(working_path);
5177 state|=UpdateListState;
5180 if (key_symbol == XK_Control_L)
5182 state|=ControlState;
5185 if (state & ControlState)
5186 switch ((
int) key_symbol)
5194 *reply_info.text=
'\0';
5195 reply_info.cursor=reply_info.text;
5196 reply_info.marker=reply_info.text;
5197 reply_info.highlight=MagickFalse;
5203 XEditText(display,&reply_info,key_symbol,command,state);
5204 XDrawMatteText(display,&windows->widget,&reply_info);
5205 state|=JumpListState;
5211 command[MagickPathExtent];
5219 if (event.xkey.window != windows->widget.id)
5221 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
5222 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5223 if (key_symbol == XK_Control_L)
5224 state&=(~ControlState);
5229 if (event.xcrossing.window != windows->widget.id)
5231 state|=InactiveWidgetState;
5245 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
5246 if (slider_info.active)
5251 slider_info.y=
event.xmotion.y-
5252 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
5253 if (slider_info.y < slider_info.min_y)
5254 slider_info.y=slider_info.min_y;
5255 if (slider_info.y > slider_info.max_y)
5256 slider_info.y=slider_info.max_y;
5258 if (slider_info.y != slider_info.min_y)
5259 slider_info.id=(int) ((files*(slider_info.y-slider_info.min_y+1))/
5260 (slider_info.max_y-slider_info.min_y+1));
5261 state|=RedrawListState;
5264 if (state & InactiveWidgetState)
5266 if (up_info.raised == MatteIsActive(up_info,event.xmotion))
5271 up_info.raised=!up_info.raised;
5272 XDrawBeveledButton(display,&windows->widget,&up_info);
5275 if (home_info.raised == MatteIsActive(home_info,event.xmotion))
5280 home_info.raised=!home_info.raised;
5281 XDrawBeveledButton(display,&windows->widget,&home_info);
5284 if (special_info.raised == MatteIsActive(special_info,event.xmotion))
5289 special_info.raised=!special_info.raised;
5290 XDrawBeveledButton(display,&windows->widget,&special_info);
5293 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
5298 action_info.raised=action_info.raised == MagickFalse ?
5299 MagickTrue : MagickFalse;
5300 XDrawBeveledButton(display,&windows->widget,&action_info);
5303 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
5308 cancel_info.raised=cancel_info.raised == MagickFalse ?
5309 MagickTrue : MagickFalse;
5310 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5315 case SelectionClear:
5317 reply_info.highlight=MagickFalse;
5318 XDrawMatteText(display,&windows->widget,&reply_info);
5321 case SelectionNotify:
5339 if (event.xselection.property == (Atom) None)
5341 status=XGetWindowProperty(display,event.xselection.requestor,
5342 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
5343 &format,&length,&after,&data);
5344 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
5347 if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
5348 (void) XBell(display,0);
5354 *(data+length)=
'\0';
5355 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
5357 XDrawMatteText(display,&windows->widget,&reply_info);
5358 state|=JumpListState;
5359 state|=RedrawActionState;
5361 (void) XFree((
void *) data);
5364 case SelectionRequest:
5369 XSelectionRequestEvent
5372 if (reply_info.highlight == MagickFalse)
5377 request=(&(
event.xselectionrequest));
5378 (void) XChangeProperty(request->display,request->requestor,
5379 request->property,request->target,8,PropModeReplace,
5380 (
unsigned char *) primary_selection,Extent(primary_selection));
5381 notify.type=SelectionNotify;
5382 notify.display=request->display;
5383 notify.requestor=request->requestor;
5384 notify.selection=request->selection;
5385 notify.target=request->target;
5386 notify.time=request->time;
5387 if (request->property == None)
5388 notify.property=request->target;
5390 notify.property=request->property;
5391 (void) XSendEvent(request->display,request->requestor,False,0,
5392 (XEvent *) ¬ify);
5397 }
while ((state & ExitState) == 0);
5398 XSetCursorState(display,windows,MagickFalse);
5399 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
5400 XCheckRefreshWindows(display,windows);
5404 for (i=0; i < (ssize_t) files; i++)
5405 filelist[i]=DestroyString(filelist[i]);
5406 if (filelist != (
char **) NULL)
5407 filelist=(
char **) RelinquishMagickMemory(filelist);
5410 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5412 (void) ConcatenateMagickString(working_path,reply,MagickPathExtent);
5414 (void) CopyMagickString(reply,working_path,MagickPathExtent);
5416 ExpandFilename(reply);
5453 #if defined(__cplusplus) || defined(c_plusplus)
5457 static int FontCompare(
const void *x,
const void *y)
5463 p=(
char *) *((
char **) x);
5464 q=(
char *) *((
char **) y);
5465 while ((*p !=
'\0') && (*q !=
'\0') && (*p == *q))
5473 #if defined(__cplusplus) || defined(c_plusplus)
5477 MagickPrivate
void XFontBrowserWidget(Display *display,XWindows *windows,
5478 const char *action,
char *reply)
5480 #define BackButtonText "Back"
5481 #define CancelButtonText "Cancel"
5482 #define FontnameText "Name:"
5483 #define FontPatternText "Pattern:"
5484 #define ResetButtonText "Reset"
5487 back_pattern[MagickPathExtent],
5490 primary_selection[MagickPathExtent] =
"",
5491 reset_pattern[MagickPathExtent],
5492 text[MagickPathExtent];
5503 glob_pattern[MagickPathExtent] =
"*";
5505 static MagickStatusType
5506 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
5552 assert(display != (Display *) NULL);
5553 assert(windows != (XWindows *) NULL);
5554 assert(action != (
char *) NULL);
5555 assert(reply != (
char *) NULL);
5556 if (IsEventLogging() != MagickFalse)
5557 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
5558 XSetCursorState(display,windows,MagickTrue);
5559 XCheckRefreshWindows(display,windows);
5560 (void) CopyMagickString(back_pattern,glob_pattern,MagickPathExtent);
5561 (void) CopyMagickString(reset_pattern,
"*",MagickPathExtent);
5562 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5568 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5570 (void) CopyMagickString(glob_pattern,
"*",MagickPathExtent);
5571 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5572 if (fontlist == (
char **) NULL)
5574 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5583 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
sizeof(*fontlist));
5584 if (fontlist == (
char **) NULL)
5586 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5587 "UnableToViewFonts");
5590 for (i=0; i < fonts; i++)
5591 fontlist[i]=listhead[i];
5592 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5596 font_info=windows->widget.font_info;
5598 for (i=0; i < fonts; i++)
5599 if (WidgetTextWidth(font_info,fontlist[i]) > text_width)
5600 text_width=WidgetTextWidth(font_info,fontlist[i]);
5601 width=WidgetTextWidth(font_info,(
char *) action);
5602 if (WidgetTextWidth(font_info,CancelButtonText) > width)
5603 width=WidgetTextWidth(font_info,CancelButtonText);
5604 if (WidgetTextWidth(font_info,ResetButtonText) > width)
5605 width=WidgetTextWidth(font_info,ResetButtonText);
5606 if (WidgetTextWidth(font_info,BackButtonText) > width)
5607 width=WidgetTextWidth(font_info,BackButtonText);
5608 width+=QuantumMargin;
5609 if (WidgetTextWidth(font_info,FontPatternText) > width)
5610 width=WidgetTextWidth(font_info,FontPatternText);
5611 if (WidgetTextWidth(font_info,FontnameText) > width)
5612 width=WidgetTextWidth(font_info,FontnameText);
5613 height=(
unsigned int) (font_info->ascent+font_info->descent);
5617 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
5619 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
5620 if (windows->widget.width < windows->widget.min_width)
5621 windows->widget.width=windows->widget.min_width;
5622 windows->widget.height=(
unsigned int)
5623 (((85*height) >> 2)+((13*QuantumMargin) >> 1)+4);
5624 windows->widget.min_height=(
unsigned int)
5625 (((27*height) >> 1)+((13*QuantumMargin) >> 1)+4);
5626 if (windows->widget.height < windows->widget.min_height)
5627 windows->widget.height=windows->widget.min_height;
5628 XConstrainWindowPosition(display,&windows->widget);
5632 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Font",
5634 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
5635 if (status != False)
5637 XSetWMName(display,windows->widget.id,&window_name);
5638 XSetWMIconName(display,windows->widget.id,&window_name);
5639 (void) XFree((
void *) window_name.value);
5641 window_changes.width=(int) windows->widget.width;
5642 window_changes.height=(
int) windows->widget.height;
5643 window_changes.x=windows->widget.x;
5644 window_changes.y=windows->widget.y;
5645 (void) XReconfigureWMWindow(display,windows->widget.id,
5646 windows->widget.screen,mask,&window_changes);
5647 (void) XMapRaised(display,windows->widget.id);
5648 windows->widget.mapped=MagickFalse;
5652 XGetWidgetInfo((
char *) NULL,&slider_info);
5653 XGetWidgetInfo((
char *) NULL,&north_info);
5654 XGetWidgetInfo((
char *) NULL,&south_info);
5655 XGetWidgetInfo((
char *) NULL,&expose_info);
5656 XGetWidgetInfo((
char *) NULL,&selection_info);
5658 delay=SuspendTime << 2;
5659 state=UpdateConfigurationState;
5662 if (state & UpdateConfigurationState)
5670 XGetWidgetInfo(CancelButtonText,&cancel_info);
5671 cancel_info.width=width;
5672 cancel_info.height=(
unsigned int) ((3*height) >> 1);
5674 (windows->widget.width-cancel_info.width-QuantumMargin-2);
5676 (windows->widget.height-cancel_info.height-QuantumMargin);
5677 XGetWidgetInfo(action,&action_info);
5678 action_info.width=width;
5679 action_info.height=(
unsigned int) ((3*height) >> 1);
5680 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
5681 (action_info.bevel_width << 1));
5682 action_info.y=cancel_info.y;
5683 XGetWidgetInfo(BackButtonText,&back_info);
5684 back_info.width=width;
5685 back_info.height=(
unsigned int) ((3*height) >> 1);
5686 back_info.x=QuantumMargin;
5687 back_info.y=((5*QuantumMargin) >> 1)+height;
5688 XGetWidgetInfo(ResetButtonText,&reset_info);
5689 reset_info.width=width;
5690 reset_info.height=(
unsigned int) ((3*height) >> 1);
5691 reset_info.x=QuantumMargin;
5692 reset_info.y=back_info.y+back_info.height+QuantumMargin;
5696 XGetWidgetInfo(reply,&reply_info);
5697 reply_info.raised=MagickFalse;
5698 reply_info.bevel_width--;
5699 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
5700 reply_info.height=height << 1;
5701 reply_info.x=(int) (width+(QuantumMargin << 1));
5702 reply_info.y=action_info.y-(action_info.height << 1)-QuantumMargin;
5706 XGetWidgetInfo(reply,&mode_info);
5707 mode_info.bevel_width=0;
5708 mode_info.width=(
unsigned int)
5709 (action_info.x-reply_info.x-QuantumMargin);
5710 mode_info.height=action_info.height << 1;
5711 mode_info.x=reply_info.x;
5712 mode_info.y=action_info.y-action_info.height+action_info.bevel_width;
5716 XGetWidgetInfo((
char *) NULL,&scroll_info);
5717 scroll_info.bevel_width--;
5718 scroll_info.width=height;
5719 scroll_info.height=(
unsigned int)
5720 (reply_info.y-back_info.y-(QuantumMargin >> 1));
5721 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
5722 scroll_info.y=back_info.y-reply_info.bevel_width;
5723 scroll_info.raised=MagickFalse;
5724 scroll_info.trough=MagickTrue;
5725 north_info=scroll_info;
5726 north_info.raised=MagickTrue;
5727 north_info.width-=(north_info.bevel_width << 1);
5728 north_info.height=north_info.width-1;
5729 north_info.x+=north_info.bevel_width;
5730 north_info.y+=north_info.bevel_width;
5731 south_info=north_info;
5732 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
5735 slider_info=north_info;
5737 slider_info.width-=2;
5738 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
5739 slider_info.bevel_width+2;
5740 slider_info.height=scroll_info.height-((slider_info.min_y-
5741 scroll_info.y+1) << 1)+4;
5742 visible_fonts=(
unsigned int) (scroll_info.height*
5743 PerceptibleReciprocal((
double) height+(height >> 3)));
5744 if (fonts > (
int) visible_fonts)
5745 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5746 slider_info.max_y=south_info.y-south_info.bevel_width-
5747 slider_info.bevel_width-2;
5748 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
5749 slider_info.y=slider_info.min_y;
5750 expose_info=scroll_info;
5751 expose_info.y=slider_info.y;
5755 XGetWidgetInfo((
char *) NULL,&list_info);
5756 list_info.raised=MagickFalse;
5757 list_info.bevel_width--;
5758 list_info.width=(
unsigned int)
5759 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
5760 list_info.height=scroll_info.height;
5761 list_info.x=reply_info.x;
5762 list_info.y=scroll_info.y;
5763 if (windows->widget.mapped == MagickFalse)
5764 state|=JumpListState;
5769 XGetWidgetInfo(text,&text_info);
5770 text_info.center=MagickFalse;
5771 text_info.width=reply_info.width;
5772 text_info.height=height;
5773 text_info.x=list_info.x-(QuantumMargin >> 1);
5774 text_info.y=QuantumMargin;
5778 XGetWidgetInfo((
char *) NULL,&selection_info);
5779 selection_info.center=MagickFalse;
5780 selection_info.width=list_info.width;
5781 selection_info.height=(
unsigned int) ((9*height) >> 3);
5782 selection_info.x=list_info.x;
5783 state&=(~UpdateConfigurationState);
5785 if (state & RedrawWidgetState)
5791 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
5792 (void) XDrawString(display,windows->widget.id,
5793 windows->widget.annotate_context,x,y,FontPatternText,
5794 Extent(FontPatternText));
5795 (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
5796 XDrawWidgetText(display,&windows->widget,&text_info);
5797 XDrawBeveledButton(display,&windows->widget,&back_info);
5798 XDrawBeveledButton(display,&windows->widget,&reset_info);
5799 XDrawBeveledMatte(display,&windows->widget,&list_info);
5800 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5801 XDrawTriangleNorth(display,&windows->widget,&north_info);
5802 XDrawBeveledButton(display,&windows->widget,&slider_info);
5803 XDrawTriangleSouth(display,&windows->widget,&south_info);
5805 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
5806 (void) XDrawString(display,windows->widget.id,
5807 windows->widget.annotate_context,x,y,FontnameText,
5808 Extent(FontnameText));
5809 XDrawBeveledMatte(display,&windows->widget,&reply_info);
5810 XDrawMatteText(display,&windows->widget,&reply_info);
5811 XDrawBeveledButton(display,&windows->widget,&action_info);
5812 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5813 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5814 selection_info.id=(~0);
5815 state|=RedrawActionState;
5816 state|=RedrawListState;
5817 state&=(~RedrawWidgetState);
5819 if (state & UpdateListState)
5830 checklist=XListFonts(display,glob_pattern,32767,&number_fonts);
5831 if (checklist == (
char **) NULL)
5833 if ((strchr(glob_pattern,
'*') == (
char *) NULL) &&
5834 (strchr(glob_pattern,
'?') == (
char *) NULL))
5839 (void) CopyMagickString(reply,glob_pattern,MagickPathExtent);
5840 (void) CopyMagickString(glob_pattern,back_pattern,MagickPathExtent);
5841 action_info.raised=MagickFalse;
5842 XDrawBeveledButton(display,&windows->widget,&action_info);
5845 (void) CopyMagickString(glob_pattern,back_pattern,MagickPathExtent);
5846 (void) XBell(display,0);
5849 if (number_fonts == 1)
5854 (void) CopyMagickString(reply,checklist[0],MagickPathExtent);
5855 (void) CopyMagickString(glob_pattern,back_pattern,MagickPathExtent);
5856 (void) XFreeFontNames(checklist);
5857 action_info.raised=MagickFalse;
5858 XDrawBeveledButton(display,&windows->widget,&action_info);
5863 (void) XFreeFontNames(listhead);
5864 fontlist=(
char **) RelinquishMagickMemory(fontlist);
5872 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
5874 if (fontlist == (
char **) NULL)
5876 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5877 "UnableToViewFonts");
5880 for (i=0; i < fonts; i++)
5881 fontlist[i]=listhead[i];
5882 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5884 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
5885 if (fonts > (
int) visible_fonts)
5886 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5887 slider_info.max_y=south_info.y-south_info.bevel_width-
5888 slider_info.bevel_width-2;
5890 slider_info.y=slider_info.min_y;
5891 expose_info.y=slider_info.y;
5892 selection_info.id=(~0);
5894 state|=RedrawListState;
5898 *reply_info.text=
'\0';
5899 reply_info.cursor=reply_info.text;
5900 (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
5901 XDrawWidgetText(display,&windows->widget,&text_info);
5902 XDrawMatteText(display,&windows->widget,&reply_info);
5903 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5904 XDrawTriangleNorth(display,&windows->widget,&north_info);
5905 XDrawBeveledButton(display,&windows->widget,&slider_info);
5906 XDrawTriangleSouth(display,&windows->widget,&south_info);
5907 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5908 state&=(~UpdateListState);
5910 if (state & JumpListState)
5916 for (i=0; i < fonts; i++)
5917 if (LocaleCompare(fontlist[i],reply) >= 0)
5919 list_info.id=LocaleCompare(fontlist[i],reply) == 0 ? i : ~0;
5922 if ((i < slider_info.id) || (i >= (
int) (slider_info.id+visible_fonts)))
5923 slider_info.id=i-(visible_fonts >> 1);
5924 selection_info.id=(~0);
5925 state|=RedrawListState;
5926 state&=(~JumpListState);
5928 if (state & RedrawListState)
5933 if (slider_info.id >= (
int) (fonts-visible_fonts))
5934 slider_info.id=fonts-visible_fonts;
5935 if ((slider_info.id < 0) || (fonts <= (int) visible_fonts))
5937 slider_info.y=slider_info.min_y;
5940 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/fonts;
5941 if (slider_info.id != selection_info.id)
5946 selection_info.id=slider_info.id;
5947 selection_info.y=list_info.y+(height >> 3)+2;
5948 for (i=0; i < (int) visible_fonts; i++)
5950 selection_info.raised=(slider_info.id+i) != list_info.id ?
5951 MagickTrue : MagickFalse;
5952 selection_info.text=(
char *) NULL;
5953 if ((slider_info.id+i) < fonts)
5954 selection_info.text=fontlist[slider_info.id+i];
5955 XDrawWidgetText(display,&windows->widget,&selection_info);
5956 selection_info.y+=(int) selection_info.height;
5961 if (slider_info.y > expose_info.y)
5963 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
5964 expose_info.y=slider_info.y-expose_info.height-
5965 slider_info.bevel_width-1;
5969 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
5970 expose_info.y=slider_info.y+slider_info.height+
5971 slider_info.bevel_width+1;
5973 XDrawTriangleNorth(display,&windows->widget,&north_info);
5974 XDrawMatte(display,&windows->widget,&expose_info);
5975 XDrawBeveledButton(display,&windows->widget,&slider_info);
5976 XDrawTriangleSouth(display,&windows->widget,&south_info);
5977 expose_info.y=slider_info.y;
5979 state&=(~RedrawListState);
5981 if (state & RedrawActionState)
5989 save_info=windows->widget.font_info;
5990 font_info=XLoadQueryFont(display,reply_info.text);
5991 if (font_info != (XFontStruct *) NULL)
5993 windows->widget.font_info=font_info;
5994 (void) XSetFont(display,windows->widget.widget_context,
5997 XDrawBeveledButton(display,&windows->widget,&mode_info);
5998 windows->widget.font_info=save_info;
5999 if (font_info != (XFontStruct *) NULL)
6001 (void) XSetFont(display,windows->widget.widget_context,
6002 windows->widget.font_info->fid);
6003 (void) XFreeFont(display,font_info);
6005 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
6006 XDrawMatteText(display,&windows->widget,&reply_info);
6007 state&=(~RedrawActionState);
6012 if (north_info.raised && south_info.raised)
6013 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
6019 XDelay(display,delay);
6021 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
6022 if (north_info.raised == MagickFalse)
6023 if (slider_info.id > 0)
6029 state|=RedrawListState;
6031 if (south_info.raised == MagickFalse)
6032 if (slider_info.id < fonts)
6038 state|=RedrawListState;
6040 if (event.type != ButtonRelease)
6047 if (MatteIsActive(slider_info,event.xbutton))
6052 slider_info.active=MagickTrue;
6055 if (MatteIsActive(north_info,event.xbutton))
6056 if (slider_info.id > 0)
6061 north_info.raised=MagickFalse;
6063 state|=RedrawListState;
6066 if (MatteIsActive(south_info,event.xbutton))
6067 if (slider_info.id < fonts)
6072 south_info.raised=MagickFalse;
6074 state|=RedrawListState;
6077 if (MatteIsActive(scroll_info,event.xbutton))
6082 if (event.xbutton.y < slider_info.y)
6083 slider_info.id-=(visible_fonts-1);
6085 slider_info.id+=(visible_fonts-1);
6086 state|=RedrawListState;
6089 if (MatteIsActive(list_info,event.xbutton))
6097 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
6098 selection_info.height;
6099 if (
id >= (
int) fonts)
6101 (void) CopyMagickString(reply_info.text,fontlist[
id],MagickPathExtent);
6102 reply_info.highlight=MagickFalse;
6103 reply_info.marker=reply_info.text;
6104 reply_info.cursor=reply_info.text+Extent(reply_info.text);
6105 XDrawMatteText(display,&windows->widget,&reply_info);
6106 state|=RedrawActionState;
6107 if (
id == list_info.id)
6109 (void) CopyMagickString(glob_pattern,reply_info.text,
6111 state|=UpdateListState;
6113 selection_info.id=(~0);
6115 state|=RedrawListState;
6118 if (MatteIsActive(back_info,event.xbutton))
6123 back_info.raised=MagickFalse;
6124 XDrawBeveledButton(display,&windows->widget,&back_info);
6127 if (MatteIsActive(reset_info,event.xbutton))
6132 reset_info.raised=MagickFalse;
6133 XDrawBeveledButton(display,&windows->widget,&reset_info);
6136 if (MatteIsActive(action_info,event.xbutton))
6141 action_info.raised=MagickFalse;
6142 XDrawBeveledButton(display,&windows->widget,&action_info);
6145 if (MatteIsActive(cancel_info,event.xbutton))
6150 cancel_info.raised=MagickFalse;
6151 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6154 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
6156 if (event.xbutton.button != Button2)
6164 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
6165 for (i=1; i <= Extent(reply_info.marker); i++)
6166 if (XTextWidth(font_info,reply_info.marker,i) > x)
6168 reply_info.cursor=reply_info.marker+i-1;
6169 if (event.xbutton.time > (click_time+DoubleClick))
6170 reply_info.highlight=MagickFalse;
6176 (
void) CopyMagickString(primary_selection,reply_info.text,
6178 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
6179 event.xbutton.time);
6180 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
6181 windows->widget.id ? MagickTrue : MagickFalse;
6183 XDrawMatteText(display,&windows->widget,&reply_info);
6184 click_time=
event.xbutton.time;
6190 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
6191 windows->widget.id,event.xbutton.time);
6196 if (windows->widget.mapped == MagickFalse)
6198 if (north_info.raised == MagickFalse)
6203 delay=SuspendTime << 2;
6204 north_info.raised=MagickTrue;
6205 XDrawTriangleNorth(display,&windows->widget,&north_info);
6207 if (south_info.raised == MagickFalse)
6212 delay=SuspendTime << 2;
6213 south_info.raised=MagickTrue;
6214 XDrawTriangleSouth(display,&windows->widget,&south_info);
6216 if (slider_info.active)
6221 slider_info.active=MagickFalse;
6224 if (back_info.raised == MagickFalse)
6226 if (event.xbutton.window == windows->widget.id)
6227 if (MatteIsActive(back_info,event.xbutton))
6229 (void) CopyMagickString(glob_pattern,back_pattern,
6231 state|=UpdateListState;
6233 back_info.raised=MagickTrue;
6234 XDrawBeveledButton(display,&windows->widget,&back_info);
6236 if (reset_info.raised == MagickFalse)
6238 if (event.xbutton.window == windows->widget.id)
6239 if (MatteIsActive(reset_info,event.xbutton))
6241 (void) CopyMagickString(back_pattern,glob_pattern,MagickPathExtent);
6242 (void) CopyMagickString(glob_pattern,reset_pattern,MagickPathExtent);
6243 state|=UpdateListState;
6245 reset_info.raised=MagickTrue;
6246 XDrawBeveledButton(display,&windows->widget,&reset_info);
6248 if (action_info.raised == MagickFalse)
6250 if (event.xbutton.window == windows->widget.id)
6252 if (MatteIsActive(action_info,event.xbutton))
6254 if (*reply_info.text ==
'\0')
6255 (void) XBell(display,0);
6260 action_info.raised=MagickTrue;
6261 XDrawBeveledButton(display,&windows->widget,&action_info);
6263 if (cancel_info.raised == MagickFalse)
6265 if (event.xbutton.window == windows->widget.id)
6266 if (MatteIsActive(cancel_info,event.xbutton))
6268 *reply_info.text=
'\0';
6271 cancel_info.raised=MagickTrue;
6272 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6281 if (event.xclient.message_type != windows->wm_protocols)
6283 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
6285 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
6286 (Time)
event.xclient.data.l[1]);
6289 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
6291 if (event.xclient.window == windows->widget.id)
6293 *reply_info.text=
'\0';
6299 case ConfigureNotify:
6304 if (event.xconfigure.window != windows->widget.id)
6306 if ((event.xconfigure.width == (
int) windows->widget.width) &&
6307 (
event.xconfigure.height == (int) windows->widget.height))
6309 windows->widget.width=(
unsigned int)
6310 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
6311 windows->widget.height=(
unsigned int)
6312 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
6313 state|=UpdateConfigurationState;
6318 if (event.xcrossing.window != windows->widget.id)
6320 state&=(~InactiveWidgetState);
6325 if (event.xexpose.window != windows->widget.id)
6327 if (event.xexpose.count != 0)
6329 state|=RedrawWidgetState;
6335 command[MagickPathExtent];
6346 if (event.xkey.window != windows->widget.id)
6348 length=XLookupString((XKeyEvent *) &event.xkey,command,
6349 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6350 *(command+length)=
'\0';
6351 if (AreaIsActive(scroll_info,event.xkey))
6356 switch ((
int) key_symbol)
6379 slider_info.id-=visible_fonts;
6385 slider_info.id+=visible_fonts;
6391 slider_info.id=fonts;
6395 state|=RedrawListState;
6398 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
6403 if (*reply_info.text ==
'\0')
6405 (void) CopyMagickString(back_pattern,glob_pattern,MagickPathExtent);
6406 (void) CopyMagickString(glob_pattern,reply_info.text,MagickPathExtent);
6407 state|=UpdateListState;
6410 if (key_symbol == XK_Control_L)
6412 state|=ControlState;
6415 if (state & ControlState)
6416 switch ((
int) key_symbol)
6424 *reply_info.text=
'\0';
6425 reply_info.cursor=reply_info.text;
6426 reply_info.marker=reply_info.text;
6427 reply_info.highlight=MagickFalse;
6433 XEditText(display,&reply_info,key_symbol,command,state);
6434 XDrawMatteText(display,&windows->widget,&reply_info);
6435 state|=JumpListState;
6441 command[MagickPathExtent];
6449 if (event.xkey.window != windows->widget.id)
6451 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
6452 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6453 if (key_symbol == XK_Control_L)
6454 state&=(~ControlState);
6459 if (event.xcrossing.window != windows->widget.id)
6461 state|=InactiveWidgetState;
6475 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
6476 if (slider_info.active)
6481 slider_info.y=
event.xmotion.y-
6482 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
6483 if (slider_info.y < slider_info.min_y)
6484 slider_info.y=slider_info.min_y;
6485 if (slider_info.y > slider_info.max_y)
6486 slider_info.y=slider_info.max_y;
6488 if (slider_info.y != slider_info.min_y)
6489 slider_info.id=(fonts*(slider_info.y-slider_info.min_y+1))/
6490 (slider_info.max_y-slider_info.min_y+1);
6491 state|=RedrawListState;
6494 if (state & InactiveWidgetState)
6496 if (back_info.raised == MatteIsActive(back_info,event.xmotion))
6501 back_info.raised=!back_info.raised;
6502 XDrawBeveledButton(display,&windows->widget,&back_info);
6505 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
6510 reset_info.raised=!reset_info.raised;
6511 XDrawBeveledButton(display,&windows->widget,&reset_info);
6514 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
6519 action_info.raised=action_info.raised == MagickFalse ?
6520 MagickTrue : MagickFalse;
6521 XDrawBeveledButton(display,&windows->widget,&action_info);
6524 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
6529 cancel_info.raised=cancel_info.raised == MagickFalse ?
6530 MagickTrue : MagickFalse;
6531 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6536 case SelectionClear:
6538 reply_info.highlight=MagickFalse;
6539 XDrawMatteText(display,&windows->widget,&reply_info);
6542 case SelectionNotify:
6560 if (event.xselection.property == (Atom) None)
6562 status=XGetWindowProperty(display,event.xselection.requestor,
6563 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
6564 &format,&length,&after,&data);
6565 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
6568 if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
6569 (void) XBell(display,0);
6575 *(data+length)=
'\0';
6576 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
6578 XDrawMatteText(display,&windows->widget,&reply_info);
6579 state|=JumpListState;
6580 state|=RedrawActionState;
6582 (void) XFree((
void *) data);
6585 case SelectionRequest:
6590 XSelectionRequestEvent
6596 request=(&(
event.xselectionrequest));
6597 (void) XChangeProperty(request->display,request->requestor,
6598 request->property,request->target,8,PropModeReplace,
6599 (
unsigned char *) primary_selection,Extent(primary_selection));
6600 notify.type=SelectionNotify;
6601 notify.display=request->display;
6602 notify.requestor=request->requestor;
6603 notify.selection=request->selection;
6604 notify.target=request->target;
6605 notify.time=request->time;
6606 if (request->property == None)
6607 notify.property=request->target;
6609 notify.property=request->property;
6610 (void) XSendEvent(request->display,request->requestor,False,0,
6611 (XEvent *) ¬ify);
6616 }
while ((state & ExitState) == 0);
6617 XSetCursorState(display,windows,MagickFalse);
6618 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
6619 XCheckRefreshWindows(display,windows);
6623 (void) XFreeFontNames(listhead);
6624 fontlist=(
char **) RelinquishMagickMemory(fontlist);
6657 MagickPrivate
void XInfoWidget(Display *display,XWindows *windows,
6658 const char *activity)
6674 if (IsEventLogging() != MagickFalse)
6675 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
6676 assert(display != (Display *) NULL);
6677 assert(windows != (XWindows *) NULL);
6678 assert(activity != (
char *) NULL);
6679 font_info=windows->info.font_info;
6680 width=WidgetTextWidth(font_info,(
char *) activity)+((3*QuantumMargin) >> 1)+4;
6681 height=(
unsigned int) (((6*(font_info->ascent+font_info->descent)) >> 2)+4);
6682 if ((windows->info.width != width) || (windows->info.height != height))
6687 windows->info.width=width;
6688 windows->info.height=height;
6689 window_changes.width=(int) width;
6690 window_changes.height=(int) height;
6691 (void) XReconfigureWMWindow(display,windows->info.id,windows->info.screen,
6692 (
unsigned int) (CWWidth | CWHeight),&window_changes);
6694 if (windows->info.mapped == MagickFalse)
6696 (void) XMapRaised(display,windows->info.id);
6697 windows->info.mapped=MagickTrue;
6702 height=(
unsigned int) (font_info->ascent+font_info->descent);
6703 XGetWidgetInfo(activity,&monitor_info);
6704 monitor_info.bevel_width--;
6705 margin=monitor_info.bevel_width+((windows->info.height-height) >> 1)-2;
6706 monitor_info.center=MagickFalse;
6707 monitor_info.x=(int) margin;
6708 monitor_info.y=(int) margin;
6709 monitor_info.width=windows->info.width-(margin << 1);
6710 monitor_info.height=windows->info.height-(margin << 1)+1;
6714 monitor_info.raised=MagickFalse;
6715 XDrawBeveledMatte(display,&windows->info,&monitor_info);
6716 monitor_info.raised=MagickTrue;
6717 XDrawWidgetText(display,&windows->info,&monitor_info);
6759 MagickPrivate
void XListBrowserWidget(Display *display,XWindows *windows,
6760 XWindowInfo *window_info,
const char *
const *list,
const char *action,
6761 const char *query,
char *reply)
6763 #define CancelButtonText "Cancel"
6766 primary_selection[MagickPathExtent];
6774 static MagickStatusType
6775 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
6819 assert(display != (Display *) NULL);
6820 assert(windows != (XWindows *) NULL);
6821 assert(window_info != (XWindowInfo *) NULL);
6822 assert(list != (
const char **) NULL);
6823 assert(action != (
char *) NULL);
6824 assert(query != (
char *) NULL);
6825 assert(reply != (
char *) NULL);
6826 if (IsEventLogging() != MagickFalse)
6827 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
6828 XSetCursorState(display,windows,MagickTrue);
6829 XCheckRefreshWindows(display,windows);
6830 if (list == (
const char **) NULL)
6832 XNoticeWidget(display,windows,
"No text to browse:",(
char *) NULL);
6835 for (entries=0; ; entries++)
6836 if (list[entries] == (
char *) NULL)
6841 font_info=window_info->font_info;
6842 text_width=WidgetTextWidth(font_info,(
char *) query);
6843 for (i=0; i < (int) entries; i++)
6844 if (WidgetTextWidth(font_info,(
char *) list[i]) > text_width)
6845 text_width=WidgetTextWidth(font_info,(
char *) list[i]);
6846 width=WidgetTextWidth(font_info,(
char *) action);
6847 if (WidgetTextWidth(font_info,CancelButtonText) > width)
6848 width=WidgetTextWidth(font_info,CancelButtonText);
6849 width+=QuantumMargin;
6850 height=(
unsigned int) (font_info->ascent+font_info->descent);
6854 window_info->width=(
unsigned int) MagickMin((
int) text_width,(int)
6855 MaxTextWidth)+((9*QuantumMargin) >> 1);
6856 window_info->min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
6857 if (window_info->width < window_info->min_width)
6858 window_info->width=window_info->min_width;
6859 window_info->height=(
unsigned int)
6860 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
6861 window_info->min_height=(
unsigned int)
6862 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
6863 if (window_info->height < window_info->min_height)
6864 window_info->height=window_info->min_height;
6865 XConstrainWindowPosition(display,window_info);
6869 (void) CopyMagickString(window_info->name,
"Browse",MagickPathExtent);
6870 status=XStringListToTextProperty(&window_info->name,1,&window_name);
6871 if (status != False)
6873 XSetWMName(display,window_info->id,&window_name);
6874 XSetWMIconName(display,windows->widget.id,&window_name);
6875 (void) XFree((
void *) window_name.value);
6877 window_changes.width=(int) window_info->width;
6878 window_changes.height=(
int) window_info->height;
6879 window_changes.x=window_info->x;
6880 window_changes.y=window_info->y;
6881 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,mask,
6883 (void) XMapRaised(display,window_info->id);
6884 window_info->mapped=MagickFalse;
6888 XGetWidgetInfo((
char *) NULL,&slider_info);
6889 XGetWidgetInfo((
char *) NULL,&north_info);
6890 XGetWidgetInfo((
char *) NULL,&south_info);
6891 XGetWidgetInfo((
char *) NULL,&expose_info);
6892 XGetWidgetInfo((
char *) NULL,&selection_info);
6894 delay=SuspendTime << 2;
6895 state=UpdateConfigurationState;
6898 if (state & UpdateConfigurationState)
6906 XGetWidgetInfo(CancelButtonText,&cancel_info);
6907 cancel_info.width=width;
6908 cancel_info.height=(
unsigned int) ((3*height) >> 1);
6910 (window_info->width-cancel_info.width-QuantumMargin-2);
6912 (window_info->height-cancel_info.height-QuantumMargin);
6913 XGetWidgetInfo(action,&action_info);
6914 action_info.width=width;
6915 action_info.height=(
unsigned int) ((3*height) >> 1);
6916 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
6917 (action_info.bevel_width << 1));
6918 action_info.y=cancel_info.y;
6922 XGetWidgetInfo(reply,&reply_info);
6923 reply_info.raised=MagickFalse;
6924 reply_info.bevel_width--;
6925 reply_info.width=window_info->width-((4*QuantumMargin) >> 1);
6926 reply_info.height=height << 1;
6927 reply_info.x=QuantumMargin;
6928 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
6932 XGetWidgetInfo((
char *) NULL,&scroll_info);
6933 scroll_info.bevel_width--;
6934 scroll_info.width=height;
6935 scroll_info.height=(
unsigned int)
6936 (reply_info.y-((6*QuantumMargin) >> 1)-height);
6937 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
6938 scroll_info.y=((5*QuantumMargin) >> 1)+height-reply_info.bevel_width;
6939 scroll_info.raised=MagickFalse;
6940 scroll_info.trough=MagickTrue;
6941 north_info=scroll_info;
6942 north_info.raised=MagickTrue;
6943 north_info.width-=(north_info.bevel_width << 1);
6944 north_info.height=north_info.width-1;
6945 north_info.x+=north_info.bevel_width;
6946 north_info.y+=north_info.bevel_width;
6947 south_info=north_info;
6948 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
6951 slider_info=north_info;
6953 slider_info.width-=2;
6954 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
6955 slider_info.bevel_width+2;
6956 slider_info.height=scroll_info.height-((slider_info.min_y-
6957 scroll_info.y+1) << 1)+4;
6958 visible_entries=(
unsigned int) (scroll_info.height*
6959 PerceptibleReciprocal((
double) height+(height >> 3)));
6960 if (entries > visible_entries)
6961 slider_info.height=(visible_entries*slider_info.height)/entries;
6962 slider_info.max_y=south_info.y-south_info.bevel_width-
6963 slider_info.bevel_width-2;
6964 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
6965 slider_info.y=slider_info.min_y;
6966 expose_info=scroll_info;
6967 expose_info.y=slider_info.y;
6971 XGetWidgetInfo((
char *) NULL,&list_info);
6972 list_info.raised=MagickFalse;
6973 list_info.bevel_width--;
6974 list_info.width=(
unsigned int)
6975 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
6976 list_info.height=scroll_info.height;
6977 list_info.x=reply_info.x;
6978 list_info.y=scroll_info.y;
6979 if (window_info->mapped == MagickFalse)
6980 for (i=0; i < (int) entries; i++)
6981 if (LocaleCompare(list[i],reply) == 0)
6984 slider_info.id=i-(visible_entries >> 1);
6985 if (slider_info.id < 0)
6991 XGetWidgetInfo(query,&text_info);
6992 text_info.width=reply_info.width;
6993 text_info.height=height;
6994 text_info.x=list_info.x-(QuantumMargin >> 1);
6995 text_info.y=QuantumMargin;
6999 XGetWidgetInfo((
char *) NULL,&selection_info);
7000 selection_info.center=MagickFalse;
7001 selection_info.width=list_info.width;
7002 selection_info.height=(
unsigned int) ((9*height) >> 3);
7003 selection_info.x=list_info.x;
7004 state&=(~UpdateConfigurationState);
7006 if (state & RedrawWidgetState)
7011 XDrawWidgetText(display,window_info,&text_info);
7012 XDrawBeveledMatte(display,window_info,&list_info);
7013 XDrawBeveledMatte(display,window_info,&scroll_info);
7014 XDrawTriangleNorth(display,window_info,&north_info);
7015 XDrawBeveledButton(display,window_info,&slider_info);
7016 XDrawTriangleSouth(display,window_info,&south_info);
7017 XDrawBeveledMatte(display,window_info,&reply_info);
7018 XDrawMatteText(display,window_info,&reply_info);
7019 XDrawBeveledButton(display,window_info,&action_info);
7020 XDrawBeveledButton(display,window_info,&cancel_info);
7021 XHighlightWidget(display,window_info,BorderOffset,BorderOffset);
7022 selection_info.id=(~0);
7023 state|=RedrawActionState;
7024 state|=RedrawListState;
7025 state&=(~RedrawWidgetState);
7027 if (state & RedrawListState)
7032 if (slider_info.id >= (
int) (entries-visible_entries))
7033 slider_info.id=(int) (entries-visible_entries);
7034 if ((slider_info.id < 0) || (entries <= visible_entries))
7036 slider_info.y=slider_info.min_y;
7039 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/entries;
7040 if (slider_info.id != selection_info.id)
7045 selection_info.id=slider_info.id;
7046 selection_info.y=list_info.y+(height >> 3)+2;
7047 for (i=0; i < (int) visible_entries; i++)
7049 selection_info.raised=(slider_info.id+i) != list_info.id ?
7050 MagickTrue : MagickFalse;
7051 selection_info.text=(
char *) NULL;
7052 if ((slider_info.id+i) < (int) entries)
7053 selection_info.text=(
char *) list[slider_info.id+i];
7054 XDrawWidgetText(display,window_info,&selection_info);
7055 selection_info.y+=(int) selection_info.height;
7060 if (slider_info.y > expose_info.y)
7062 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
7063 expose_info.y=slider_info.y-expose_info.height-
7064 slider_info.bevel_width-1;
7068 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
7069 expose_info.y=slider_info.y+slider_info.height+
7070 slider_info.bevel_width+1;
7072 XDrawTriangleNorth(display,window_info,&north_info);
7073 XDrawMatte(display,window_info,&expose_info);
7074 XDrawBeveledButton(display,window_info,&slider_info);
7075 XDrawTriangleSouth(display,window_info,&south_info);
7076 expose_info.y=slider_info.y;
7078 state&=(~RedrawListState);
7083 if (north_info.raised && south_info.raised)
7084 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7090 XDelay(display,delay);
7092 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
7093 if (north_info.raised == MagickFalse)
7094 if (slider_info.id > 0)
7100 state|=RedrawListState;
7102 if (south_info.raised == MagickFalse)
7103 if (slider_info.id < (
int) entries)
7109 state|=RedrawListState;
7111 if (event.type != ButtonRelease)
7118 if (MatteIsActive(slider_info,event.xbutton))
7123 slider_info.active=MagickTrue;
7126 if (MatteIsActive(north_info,event.xbutton))
7127 if (slider_info.id > 0)
7132 north_info.raised=MagickFalse;
7134 state|=RedrawListState;
7137 if (MatteIsActive(south_info,event.xbutton))
7138 if (slider_info.id < (
int) entries)
7143 south_info.raised=MagickFalse;
7145 state|=RedrawListState;
7148 if (MatteIsActive(scroll_info,event.xbutton))
7153 if (event.xbutton.y < slider_info.y)
7154 slider_info.id-=(visible_entries-1);
7156 slider_info.id+=(visible_entries-1);
7157 state|=RedrawListState;
7160 if (MatteIsActive(list_info,event.xbutton))
7168 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
7169 selection_info.height;
7170 if (
id >= (
int) entries)
7172 (void) CopyMagickString(reply_info.text,list[
id],MagickPathExtent);
7173 reply_info.highlight=MagickFalse;
7174 reply_info.marker=reply_info.text;
7175 reply_info.cursor=reply_info.text+Extent(reply_info.text);
7176 XDrawMatteText(display,window_info,&reply_info);
7177 selection_info.id=(~0);
7178 if (
id == list_info.id)
7180 action_info.raised=MagickFalse;
7181 XDrawBeveledButton(display,window_info,&action_info);
7185 state|=RedrawListState;
7188 if (MatteIsActive(action_info,event.xbutton))
7193 action_info.raised=MagickFalse;
7194 XDrawBeveledButton(display,window_info,&action_info);
7197 if (MatteIsActive(cancel_info,event.xbutton))
7202 cancel_info.raised=MagickFalse;
7203 XDrawBeveledButton(display,window_info,&cancel_info);
7206 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7208 if (event.xbutton.button != Button2)
7216 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
7217 for (i=1; i <= Extent(reply_info.marker); i++)
7218 if (XTextWidth(font_info,reply_info.marker,i) > x)
7220 reply_info.cursor=reply_info.marker+i-1;
7221 if (event.xbutton.time > (click_time+DoubleClick))
7222 reply_info.highlight=MagickFalse;
7228 (
void) CopyMagickString(primary_selection,reply_info.text,
7230 (void) XSetSelectionOwner(display,XA_PRIMARY,window_info->id,
7231 event.xbutton.time);
7232 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
7233 window_info->id ? MagickTrue : MagickFalse;
7235 XDrawMatteText(display,window_info,&reply_info);
7236 click_time=
event.xbutton.time;
7242 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
7243 window_info->id,event.xbutton.time);
7248 if (window_info->mapped == MagickFalse)
7250 if (north_info.raised == MagickFalse)
7255 delay=SuspendTime << 2;
7256 north_info.raised=MagickTrue;
7257 XDrawTriangleNorth(display,window_info,&north_info);
7259 if (south_info.raised == MagickFalse)
7264 delay=SuspendTime << 2;
7265 south_info.raised=MagickTrue;
7266 XDrawTriangleSouth(display,window_info,&south_info);
7268 if (slider_info.active)
7273 slider_info.active=MagickFalse;
7276 if (action_info.raised == MagickFalse)
7278 if (event.xbutton.window == window_info->id)
7280 if (MatteIsActive(action_info,event.xbutton))
7282 if (*reply_info.text ==
'\0')
7283 (void) XBell(display,0);
7288 action_info.raised=MagickTrue;
7289 XDrawBeveledButton(display,window_info,&action_info);
7291 if (cancel_info.raised == MagickFalse)
7293 if (event.xbutton.window == window_info->id)
7294 if (MatteIsActive(cancel_info,event.xbutton))
7296 *reply_info.text=
'\0';
7299 cancel_info.raised=MagickTrue;
7300 XDrawBeveledButton(display,window_info,&cancel_info);
7302 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7311 if (event.xclient.message_type != windows->wm_protocols)
7313 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
7315 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
7316 (Time)
event.xclient.data.l[1]);
7319 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
7321 if (event.xclient.window == window_info->id)
7323 *reply_info.text=
'\0';
7329 case ConfigureNotify:
7334 if (event.xconfigure.window != window_info->id)
7336 if ((event.xconfigure.width == (
int) window_info->width) &&
7337 (
event.xconfigure.height == (int) window_info->height))
7339 window_info->width=(
unsigned int)
7340 MagickMax(event.xconfigure.width,(
int) window_info->min_width);
7341 window_info->height=(
unsigned int)
7342 MagickMax(event.xconfigure.height,(
int) window_info->min_height);
7343 state|=UpdateConfigurationState;
7348 if (event.xcrossing.window != window_info->id)
7350 state&=(~InactiveWidgetState);
7355 if (event.xexpose.window != window_info->id)
7357 if (event.xexpose.count != 0)
7359 state|=RedrawWidgetState;
7365 command[MagickPathExtent];
7376 if (event.xkey.window != window_info->id)
7378 length=XLookupString((XKeyEvent *) &event.xkey,command,
7379 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7380 *(command+length)=
'\0';
7381 if (AreaIsActive(scroll_info,event.xkey))
7386 switch ((
int) key_symbol)
7409 slider_info.id-=visible_entries;
7415 slider_info.id+=visible_entries;
7421 slider_info.id=(int) entries;
7425 state|=RedrawListState;
7428 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
7433 if (*reply_info.text ==
'\0')
7435 action_info.raised=MagickFalse;
7436 XDrawBeveledButton(display,window_info,&action_info);
7440 if (key_symbol == XK_Control_L)
7442 state|=ControlState;
7445 if (state & ControlState)
7446 switch ((
int) key_symbol)
7454 *reply_info.text=
'\0';
7455 reply_info.cursor=reply_info.text;
7456 reply_info.marker=reply_info.text;
7457 reply_info.highlight=MagickFalse;
7463 XEditText(display,&reply_info,key_symbol,command,state);
7464 XDrawMatteText(display,window_info,&reply_info);
7470 command[MagickPathExtent];
7478 if (event.xkey.window != window_info->id)
7480 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
7481 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7482 if (key_symbol == XK_Control_L)
7483 state&=(~ControlState);
7488 if (event.xcrossing.window != window_info->id)
7490 state|=InactiveWidgetState;
7504 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7505 if (slider_info.active)
7510 slider_info.y=
event.xmotion.y-
7511 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
7512 if (slider_info.y < slider_info.min_y)
7513 slider_info.y=slider_info.min_y;
7514 if (slider_info.y > slider_info.max_y)
7515 slider_info.y=slider_info.max_y;
7517 if (slider_info.y != slider_info.min_y)
7518 slider_info.id=(int) ((entries*(slider_info.y-
7519 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
7520 state|=RedrawListState;
7523 if (state & InactiveWidgetState)
7525 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
7530 action_info.raised=action_info.raised == MagickFalse ?
7531 MagickTrue : MagickFalse;
7532 XDrawBeveledButton(display,window_info,&action_info);
7535 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
7540 cancel_info.raised=cancel_info.raised == MagickFalse ?
7541 MagickTrue : MagickFalse;
7542 XDrawBeveledButton(display,window_info,&cancel_info);
7547 case SelectionClear:
7549 reply_info.highlight=MagickFalse;
7550 XDrawMatteText(display,window_info,&reply_info);
7553 case SelectionNotify:
7571 if (event.xselection.property == (Atom) None)
7573 status=XGetWindowProperty(display,
7574 event.xselection.requestor,event.xselection.property,0L,2047L,
7575 MagickTrue,XA_STRING,&type,&format,&length,&after,&data);
7576 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
7579 if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
7580 (void) XBell(display,0);
7586 *(data+length)=
'\0';
7587 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
7589 XDrawMatteText(display,window_info,&reply_info);
7590 state|=RedrawActionState;
7592 (void) XFree((
void *) data);
7595 case SelectionRequest:
7600 XSelectionRequestEvent
7603 if (reply_info.highlight == MagickFalse)
7608 request=(&(
event.xselectionrequest));
7609 (void) XChangeProperty(request->display,request->requestor,
7610 request->property,request->target,8,PropModeReplace,
7611 (
unsigned char *) primary_selection,Extent(primary_selection));
7612 notify.type=SelectionNotify;
7613 notify.send_event=MagickTrue;
7614 notify.display=request->display;
7615 notify.requestor=request->requestor;
7616 notify.selection=request->selection;
7617 notify.target=request->target;
7618 notify.time=request->time;
7619 if (request->property == None)
7620 notify.property=request->target;
7622 notify.property=request->property;
7623 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
7624 (XEvent *) ¬ify);
7629 }
while ((state & ExitState) == 0);
7630 XSetCursorState(display,windows,MagickFalse);
7631 (void) XWithdrawWindow(display,window_info->id,window_info->screen);
7632 XCheckRefreshWindows(display,windows);