43 #include "magick/studio.h"
44 #include "magick/color.h"
45 #include "magick/color-private.h"
46 #include "magick/exception.h"
47 #include "magick/exception-private.h"
48 #include "magick/image.h"
49 #include "magick/magick.h"
50 #include "magick/memory_.h"
51 #include "magick/string_.h"
52 #include "magick/timer-private.h"
53 #include "magick/token.h"
54 #include "magick/utility.h"
55 #include "magick/xwindow-private.h"
56 #include "magick/widget.h"
58 #if defined(MAGICKCORE_X11_DELEGATE)
59 DisableMSCWarning(4389)
60 DisableMSCWarning(4701)
65 #define AreaIsActive(matte_info,position) ( \
66 ((position.y >= (int) (matte_info.y-matte_info.bevel_width)) && \
67 (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
68 ? MagickTrue : MagickFalse)
69 #define Extent(s) ((int) strlen(s))
70 #define MatteIsActive(matte_info,position) ( \
71 ((position.x >= (int) (matte_info.x-matte_info.bevel_width)) && \
72 (position.y >= (int) (matte_info.y-matte_info.bevel_width)) && \
73 (position.x < (int) (matte_info.x+matte_info.width+matte_info.bevel_width)) && \
74 (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
75 ? MagickTrue : MagickFalse)
76 #define MaxTextWidth ((unsigned int) (255*XTextWidth(font_info,"_",1)))
77 #define MinTextWidth (26*XTextWidth(font_info,"_",1))
78 #define QuantumMargin MagickMax(font_info->max_bounds.width,12)
79 #define WidgetTextWidth(font_info,text) \
80 ((unsigned int) XTextWidth(font_info,text,Extent(text)))
81 #define WindowIsActive(window_info,position) ( \
82 ((position.x >= 0) && (position.y >= 0) && \
83 (position.x < (int) window_info.width) && \
84 (position.y < (int) window_info.height)) ? MagickTrue : MagickFalse)
91 ControlState = 0x0001,
92 InactiveWidgetState = 0x0004,
93 JumpListState = 0x0008,
94 RedrawActionState = 0x0010,
95 RedrawListState = 0x0020,
96 RedrawWidgetState = 0x0040,
97 UpdateListState = 0x0100
103 typedef struct _XWidgetInfo
138 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
139 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
143 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
144 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
146 *selection_info = (XWidgetInfo *) NULL,
149 (
char *) NULL, (
char *) NULL, (
char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
150 MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
164 XDrawMatte(Display *,
const XWindowInfo *,
const XWidgetInfo *),
165 XSetBevelColor(Display *,
const XWindowInfo *,
const MagickStatusType),
166 XSetMatteColor(Display *,
const XWindowInfo *,
const MagickStatusType),
167 XSetTextColor(Display *,
const XWindowInfo *,
const MagickStatusType);
189 MagickExport
void DestroyXWidget(
void)
191 if (selection_info != (XWidgetInfo *) NULL)
192 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
225 static void XDrawBevel(Display *display,
const XWindowInfo *window_info,
226 const XWidgetInfo *bevel_info)
244 y1=bevel_info->y+bevel_info->height;
245 x2=bevel_info->x+bevel_info->width;
247 bevel_width=bevel_info->bevel_width;
254 points[3].x=x2+bevel_width;
255 points[3].y=y2-bevel_width;
256 points[4].x=x1-bevel_width;
257 points[4].y=y2-bevel_width;
258 points[5].x=x1-bevel_width;
259 points[5].y=y1+bevel_width;
260 XSetBevelColor(display,window_info,bevel_info->raised);
261 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
262 points,6,Complex,CoordModeOrigin);
272 points[3].x=x2+bevel_width;
273 points[3].y=y2-bevel_width;
274 points[4].x=x2+bevel_width;
275 points[4].y=y1+bevel_width;
276 points[5].x=x1-bevel_width;
277 points[5].y=y1+bevel_width;
278 XSetBevelColor(display,window_info,!bevel_info->raised);
279 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
280 points,6,Complex,CoordModeOrigin);
281 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
314 static void XDrawBeveledButton(Display *display,
const XWindowInfo *window_info,
315 const XWidgetInfo *button_info)
333 XDrawBevel(display,window_info,button_info);
334 XSetMatteColor(display,window_info,button_info->raised);
335 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
336 button_info->x,button_info->y,button_info->width,button_info->height);
337 x=button_info->x-button_info->bevel_width-1;
338 y=button_info->y-button_info->bevel_width-1;
339 (void) XSetForeground(display,window_info->widget_context,
340 window_info->pixel_info->trough_color.pixel);
341 if (button_info->raised || (window_info->depth == 1))
342 (
void) XDrawRectangle(display,window_info->id,window_info->widget_context,
343 x,y,button_info->width+(button_info->bevel_width << 1)+1,
344 button_info->height+(button_info->bevel_width << 1)+1);
345 if (button_info->text == (
char *) NULL)
350 crop_info.width=(
unsigned short) button_info->width;
351 crop_info.height=(
unsigned short) button_info->height;
352 crop_info.x=button_info->x;
353 crop_info.y=button_info->y;
357 font_info=window_info->font_info;
358 width=WidgetTextWidth(font_info,button_info->text);
359 x=button_info->x+(QuantumMargin >> 1);
360 if (button_info->center)
361 x=button_info->x+(button_info->width >> 1)-(width >> 1);
362 y=button_info->y+((button_info->height-
363 (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
364 if ((
int) button_info->width == (QuantumMargin >> 1))
369 XSetTextColor(display,window_info,MagickTrue);
370 x=button_info->x+button_info->width+button_info->bevel_width+
371 (QuantumMargin >> 1);
372 (void) XDrawString(display,window_info->id,window_info->widget_context,
373 x,y,button_info->text,Extent(button_info->text));
376 (void) XSetClipRectangles(display,window_info->widget_context,0,0,&crop_info,
378 XSetTextColor(display,window_info,button_info->raised);
379 (void) XDrawString(display,window_info->id,window_info->widget_context,x,y,
380 button_info->text,Extent(button_info->text));
381 (void) XSetClipMask(display,window_info->widget_context,None);
382 if (button_info->raised == MagickFalse)
383 XDelay(display,SuspendTime << 2);
416 static void XDrawBeveledMatte(Display *display,
const XWindowInfo *window_info,
417 const XWidgetInfo *matte_info)
422 XDrawBevel(display,window_info,matte_info);
423 XDrawMatte(display,window_info,matte_info);
454 static void XDrawMatte(Display *display,
const XWindowInfo *window_info,
455 const XWidgetInfo *matte_info)
460 if ((matte_info->trough == MagickFalse) || (window_info->depth == 1))
461 (void) XFillRectangle(display,window_info->id,
462 window_info->highlight_context,matte_info->x,matte_info->y,
463 matte_info->width,matte_info->height);
466 (void) XSetForeground(display,window_info->widget_context,
467 window_info->pixel_info->trough_color.pixel);
468 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
469 matte_info->x,matte_info->y,matte_info->width,matte_info->height);
502 static void XDrawMatteText(Display *display,
const XWindowInfo *window_info,
503 XWidgetInfo *text_info)
529 XSetMatteColor(display,window_info,MagickFalse);
530 (void) XFillRectangle(display,window_info->id,window_info->widget_context,
531 text_info->x,text_info->y,text_info->width,text_info->height);
532 if (text_info->text == (
char *) NULL)
534 XSetTextColor(display,window_info,text_info->highlight);
535 font_info=window_info->font_info;
536 x=text_info->x+(QuantumMargin >> 2);
537 y=text_info->y+font_info->ascent+(text_info->height >> 2);
538 width=text_info->width-(QuantumMargin >> 1);
539 height=(
unsigned int) (font_info->ascent+font_info->descent);
540 if (*text_info->text ==
'\0')
545 (void) XDrawLine(display,window_info->id,window_info->annotate_context,
552 crop_info.width=(
unsigned short) text_info->width;
553 crop_info.height=(
unsigned short) text_info->height;
554 crop_info.x=text_info->x;
555 crop_info.y=text_info->y;
559 if (text_info->cursor < text_info->marker)
560 text_info->marker=text_info->cursor;
563 text=text_info->marker;
564 if (XTextWidth(font_info,(
char *) text,(int) (text_info->cursor-text)) >
567 text=text_info->text;
568 for (i=0; i < Extent(text); i++)
570 n=XTextWidth(font_info,(
char *) text+i,(
int)
571 (text_info->cursor-text-i));
572 if (n <= (
int) width)
575 text_info->marker=(
char *) text+i;
581 if (text_info->highlight == MagickFalse)
583 (void) XSetClipRectangles(display,window_info->widget_context,0,0,
584 &crop_info,1,Unsorted);
585 (void) XDrawString(display,window_info->id,window_info->widget_context,
586 x,y,text_info->marker,Extent(text_info->marker));
587 (void) XSetClipMask(display,window_info->widget_context,None);
591 (void) XSetClipRectangles(display,window_info->annotate_context,0,0,
592 &crop_info,1,Unsorted);
593 width=WidgetTextWidth(font_info,text_info->marker);
594 (void) XFillRectangle(display,window_info->id,
595 window_info->annotate_context,x,y-font_info->ascent,width,height);
596 (void) XSetClipMask(display,window_info->annotate_context,None);
597 (void) XSetClipRectangles(display,window_info->highlight_context,0,0,
598 &crop_info,1,Unsorted);
599 (void) XDrawString(display,window_info->id,
600 window_info->highlight_context,x,y,text_info->marker,
601 Extent(text_info->marker));
602 (void) XSetClipMask(display,window_info->highlight_context,None);
604 x+=XTextWidth(font_info,text_info->marker,(
int)
605 (text_info->cursor-text_info->marker));
606 (void) XDrawLine(display,window_info->id,window_info->annotate_context,x,y+3,
640 static void XDrawTriangleEast(Display *display,
const XWindowInfo *window_info,
641 const XWidgetInfo *triangle_info)
665 x2=triangle_info->x+triangle_info->width;
666 y2=triangle_info->y+(triangle_info->height >> 1);
668 y3=triangle_info->y+triangle_info->height;
669 bevel_width=triangle_info->bevel_width;
676 XSetMatteColor(display,window_info,triangle_info->raised);
677 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
678 points,3,Complex,CoordModeOrigin);
686 points[2].x=x3-bevel_width;
687 points[2].y=y3+bevel_width;
688 points[3].x=x2+bevel_width;
690 XSetBevelColor(display,window_info,!triangle_info->raised);
691 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
692 points,4,Complex,CoordModeOrigin);
700 points[2].x=x1-bevel_width+1;
701 points[2].y=y1-bevel_width;
702 points[3].x=x3-bevel_width+1;
703 points[3].y=y3+bevel_width;
704 XSetBevelColor(display,window_info,triangle_info->raised);
705 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
706 points,4,Complex,CoordModeOrigin);
714 points[2].x=x2+bevel_width;
716 points[3].x=x1-bevel_width;
717 points[3].y=y1-bevel_width;
718 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
719 points,4,Complex,CoordModeOrigin);
720 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
721 if (triangle_info->text == (
char *) NULL)
726 font_info=window_info->font_info;
727 XSetTextColor(display,window_info,MagickTrue);
728 x1=triangle_info->x+triangle_info->width+triangle_info->bevel_width+
729 (QuantumMargin >> 1);
730 y1=triangle_info->y+((triangle_info->height-
731 (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
732 (
void) XDrawString(display,window_info->id,window_info->widget_context,x1,y1,
733 triangle_info->text,Extent(triangle_info->text));
766 static void XDrawTriangleNorth(Display *display,
const XWindowInfo *window_info,
767 const XWidgetInfo *triangle_info)
787 y1=triangle_info->y+triangle_info->height;
788 x2=triangle_info->x+(triangle_info->width >> 1);
790 x3=triangle_info->x+triangle_info->width;
791 y3=triangle_info->y+triangle_info->height;
792 bevel_width=triangle_info->bevel_width;
799 XSetMatteColor(display,window_info,triangle_info->raised);
800 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
801 points,3,Complex,CoordModeOrigin);
810 points[2].y=y2-bevel_width-2;
811 points[3].x=x1-bevel_width-1;
812 points[3].y=y1+bevel_width;
813 XSetBevelColor(display,window_info,triangle_info->raised);
814 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
815 points,4,Complex,CoordModeOrigin);
823 points[2].x=x3+bevel_width;
824 points[2].y=y3+bevel_width;
826 points[3].y=y2-bevel_width;
827 XSetBevelColor(display,window_info,!triangle_info->raised);
828 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
829 points,4,Complex,CoordModeOrigin);
837 points[2].x=x1-bevel_width;
838 points[2].y=y1+bevel_width;
839 points[3].x=x3+bevel_width;
840 points[3].y=y3+bevel_width;
841 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
842 points,4,Complex,CoordModeOrigin);
843 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
876 static void XDrawTriangleSouth(Display *display,
const XWindowInfo *window_info,
877 const XWidgetInfo *triangle_info)
898 x2=triangle_info->x+(triangle_info->width >> 1);
899 y2=triangle_info->y+triangle_info->height;
900 x3=triangle_info->x+triangle_info->width;
902 bevel_width=triangle_info->bevel_width;
909 XSetMatteColor(display,window_info,triangle_info->raised);
910 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
911 points,3,Complex,CoordModeOrigin);
919 points[2].x=x1-bevel_width;
920 points[2].y=y1-bevel_width;
921 points[3].x=x3+bevel_width;
922 points[3].y=y3-bevel_width;
923 XSetBevelColor(display,window_info,triangle_info->raised);
924 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
925 points,4,Complex,CoordModeOrigin);
932 points[1].y=y3-bevel_width;
933 points[2].x=x3+bevel_width;
934 points[2].y=y3-bevel_width;
936 points[3].y=y2+bevel_width;
937 XSetBevelColor(display,window_info,!triangle_info->raised);
938 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
939 points,4,Complex,CoordModeOrigin);
948 points[2].y=y2+bevel_width;
949 points[3].x=x1-bevel_width;
950 points[3].y=y1-bevel_width;
951 XSetBevelColor(display,window_info,triangle_info->raised);
952 (void) XFillPolygon(display,window_info->id,window_info->widget_context,
953 points,4,Complex,CoordModeOrigin);
954 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
985 static void XDrawWidgetText(Display *display,
const XWindowInfo *window_info,
986 XWidgetInfo *text_info)
1008 widget_context=window_info->annotate_context;
1009 if (text_info->raised)
1010 (void) XClearArea(display,window_info->id,text_info->x,text_info->y,
1011 text_info->width,text_info->height,MagickFalse);
1014 (void) XFillRectangle(display,window_info->id,widget_context,text_info->x,
1015 text_info->y,text_info->width,text_info->height);
1016 widget_context=window_info->highlight_context;
1018 if (text_info->text == (
char *) NULL)
1020 if (*text_info->text ==
'\0')
1025 font_info=window_info->font_info;
1026 crop_info.width=(
unsigned short) text_info->width;
1027 crop_info.height=(
unsigned short) text_info->height;
1028 crop_info.x=text_info->x;
1029 crop_info.y=text_info->y;
1033 width=WidgetTextWidth(font_info,text_info->text);
1034 x=text_info->x+(QuantumMargin >> 1);
1035 if (text_info->center)
1036 x=text_info->x+(text_info->width >> 1)-(width >> 1);
1037 if (text_info->raised)
1038 if (width > (text_info->width-QuantumMargin))
1039 x+=(text_info->width-QuantumMargin-width);
1040 height=(
unsigned int) (font_info->ascent+font_info->descent);
1041 y=text_info->y+((text_info->height-height) >> 1)+font_info->ascent;
1042 (void) XSetClipRectangles(display,widget_context,0,0,&crop_info,1,Unsorted);
1043 (void) XDrawString(display,window_info->id,widget_context,x,y,text_info->text,
1044 Extent(text_info->text));
1045 (void) XSetClipMask(display,widget_context,None);
1046 if (x < text_info->x)
1047 (void) XDrawLine(display,window_info->id,window_info->annotate_context,
1048 text_info->x,text_info->y,text_info->x,text_info->y+text_info->height-1);
1085 static void XEditText(Display *display,XWidgetInfo *text_info,
1086 const KeySym key_symbol,
char *text,
const size_t state)
1088 switch ((
int) key_symbol)
1093 if (text_info->highlight)
1098 *text_info->text=
'\0';
1099 text_info->cursor=text_info->text;
1100 text_info->marker=text_info->text;
1101 text_info->highlight=MagickFalse;
1106 if (text_info->cursor != text_info->text)
1108 text_info->cursor--;
1109 (void) memmove(text_info->cursor,text_info->cursor+1,
1110 strlen(text_info->cursor+1)+1);
1111 text_info->highlight=MagickFalse;
1121 if (text_info->cursor == text_info->text)
1123 text_info->cursor--;
1132 if (text_info->cursor == (text_info->text+Extent(text_info->text)))
1134 text_info->cursor++;
1146 if (state & ControlState)
1150 if ((Extent(text_info->text)+1) >= (int) MaxTextExtent)
1151 (void) XBell(display,0);
1154 if (text_info->highlight)
1159 *text_info->text=
'\0';
1160 text_info->cursor=text_info->text;
1161 text_info->marker=text_info->text;
1162 text_info->highlight=MagickFalse;
1167 q=text_info->text+Extent(text_info->text)+strlen(text);
1168 for (i=0; i <= Extent(text_info->cursor); i++)
1170 *q=(*(q-Extent(text)));
1174 for (i=0; i < Extent(text); i++)
1175 *text_info->cursor++=(*p++);
1206 static void XGetWidgetInfo(
const char *text,XWidgetInfo *widget_info)
1211 widget_info->id=(~0);
1212 widget_info->bevel_width=3;
1213 widget_info->width=1;
1214 widget_info->height=1;
1217 widget_info->min_y=0;
1218 widget_info->max_y=0;
1219 widget_info->raised=MagickTrue;
1220 widget_info->active=MagickFalse;
1221 widget_info->center=MagickTrue;
1222 widget_info->trough=MagickFalse;
1223 widget_info->highlight=MagickFalse;
1224 widget_info->text=(
char *) text;
1225 widget_info->cursor=(
char *) text;
1226 if (text != (
char *) NULL)
1227 widget_info->cursor+=Extent(text);
1228 widget_info->marker=(
char *) text;
1262 static void XHighlightWidget(Display *display,
const XWindowInfo *window_info,
1263 const int x,
const int y)
1268 XSetBevelColor(display,window_info,MagickTrue);
1269 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,x,y,
1270 window_info->width-(x << 1),window_info->height-(y << 1));
1271 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
1272 x-1,y-1,window_info->width-(x << 1)+1,window_info->height-(y << 1)+1);
1273 XSetBevelColor(display,window_info,MagickFalse);
1274 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
1275 x-1,y-1,window_info->width-(x << 1),window_info->height-(y << 1));
1276 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
1308 #if defined(__cplusplus) || defined(c_plusplus)
1312 static int XScreenEvent(Display *display,XEvent *event,
char *data)
1317 windows=(XWindows *) data;
1318 if (event->xany.window == windows->popup.id)
1320 if (event->type == MapNotify)
1321 windows->popup.mapped=MagickTrue;
1322 if (event->type == UnmapNotify)
1323 windows->popup.mapped=MagickFalse;
1326 if (event->xany.window == windows->widget.id)
1328 if (event->type == MapNotify)
1329 windows->widget.mapped=MagickTrue;
1330 if (event->type == UnmapNotify)
1331 windows->widget.mapped=MagickFalse;
1334 switch (event->type)
1338 if ((event->xbutton.button == Button3) &&
1339 (
event->xbutton.state & Mod1Mask))
1344 event->xbutton.button=Button2;
1345 event->xbutton.state&=(~Mod1Mask);
1351 if (event->xexpose.window == windows->image.id)
1353 XRefreshWindow(display,&windows->image,event);
1356 if (event->xexpose.window == windows->magnify.id)
1357 if (event->xexpose.count == 0)
1358 if (windows->magnify.mapped)
1360 XMakeMagnifyImage(display,windows);
1363 if (event->xexpose.window == windows->command.id)
1364 if (event->xexpose.count == 0)
1366 (void) XCommandWidget(display,windows,(
const char *
const *) NULL,
1377 if (event->xfocus.window == windows->image.id)
1378 (void) XSetInputFocus(display,windows->image.id,RevertToNone,
1386 case SelectionNotify:
1391 return(MagickFalse);
1394 #if defined(__cplusplus) || defined(c_plusplus)
1426 static void XSetBevelColor(Display *display,
const XWindowInfo *window_info,
1427 const MagickStatusType raised)
1429 if (window_info->depth == 1)
1437 (void) XSetBackground(display,window_info->widget_context,
1438 XBlackPixel(display,window_info->screen));
1439 (void) XSetForeground(display,window_info->widget_context,
1440 XWhitePixel(display,window_info->screen));
1441 (void) XSetFillStyle(display,window_info->widget_context,
1442 FillOpaqueStippled);
1443 stipple=window_info->highlight_stipple;
1444 if (raised == MagickFalse)
1445 stipple=window_info->shadow_stipple;
1446 (void) XSetStipple(display,window_info->widget_context,stipple);
1450 (void) XSetForeground(display,window_info->widget_context,
1451 window_info->pixel_info->highlight_color.pixel);
1453 (
void) XSetForeground(display,window_info->widget_context,
1454 window_info->pixel_info->shadow_color.pixel);
1484 static void XSetMatteColor(Display *display,
const XWindowInfo *window_info,
1485 const MagickStatusType raised)
1487 if (window_info->depth == 1)
1493 (void) XSetForeground(display,window_info->widget_context,
1494 XWhitePixel(display,window_info->screen));
1496 (
void) XSetForeground(display,window_info->widget_context,
1497 XBlackPixel(display,window_info->screen));
1501 (void) XSetForeground(display,window_info->widget_context,
1502 window_info->pixel_info->matte_color.pixel);
1504 (
void) XSetForeground(display,window_info->widget_context,
1505 window_info->pixel_info->depth_color.pixel);
1536 static void XSetTextColor(Display *display,
const XWindowInfo *window_info,
1537 const MagickStatusType raised)
1543 if (window_info->depth == 1)
1549 (void) XSetForeground(display,window_info->widget_context,
1550 XBlackPixel(display,window_info->screen));
1552 (
void) XSetForeground(display,window_info->widget_context,
1553 XWhitePixel(display,window_info->screen));
1556 foreground=(ssize_t) XPixelIntensity(
1557 &window_info->pixel_info->foreground_color);
1558 matte=(ssize_t) XPixelIntensity(&window_info->pixel_info->matte_color);
1559 if (MagickAbsoluteValue((
int) (foreground-matte)) > (65535L >> 3))
1560 (void) XSetForeground(display,window_info->widget_context,
1561 window_info->pixel_info->foreground_color.pixel);
1563 (
void) XSetForeground(display,window_info->widget_context,
1564 window_info->pixel_info->background_color.pixel);
1599 MagickExport
void XColorBrowserWidget(Display *display,XWindows *windows,
1600 const char *action,
char *reply)
1602 #define CancelButtonText "Cancel"
1603 #define ColornameText "Name:"
1604 #define ColorPatternText "Pattern:"
1605 #define GrabButtonText "Grab"
1606 #define ResetButtonText "Reset"
1610 primary_selection[MaxTextExtent] =
"",
1611 reset_pattern[MaxTextExtent],
1612 text[MaxTextExtent];
1625 glob_pattern[MaxTextExtent] =
"*";
1627 static MagickStatusType
1628 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
1678 assert(display != (Display *) NULL);
1679 assert(windows != (XWindows *) NULL);
1680 assert(action != (
char *) NULL);
1681 assert(reply != (
char *) NULL);
1682 if (IsEventLogging() != MagickFalse)
1683 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
1684 XSetCursorState(display,windows,MagickTrue);
1685 XCheckRefreshWindows(display,windows);
1686 (void) CopyMagickString(reset_pattern,
"*",MaxTextExtent);
1687 exception=AcquireExceptionInfo();
1688 colorlist=GetColorList(glob_pattern,&colors,exception);
1689 if (colorlist == (
char **) NULL)
1694 (void) CopyMagickString(glob_pattern,
"*",MaxTextExtent);
1695 colorlist=GetColorList(glob_pattern,&colors,exception);
1696 if (colorlist == (
char **) NULL)
1698 XNoticeWidget(display,windows,
"Unable to obtain colors names:",
1700 (void) XDialogWidget(display,windows,action,
"Enter color name:",
1708 font_info=windows->widget.font_info;
1710 for (i=0; i < (int) colors; i++)
1711 if (WidgetTextWidth(font_info,colorlist[i]) > text_width)
1712 text_width=WidgetTextWidth(font_info,colorlist[i]);
1713 width=WidgetTextWidth(font_info,(
char *) action);
1714 if (WidgetTextWidth(font_info,CancelButtonText) > width)
1715 width=WidgetTextWidth(font_info,CancelButtonText);
1716 if (WidgetTextWidth(font_info,ResetButtonText) > width)
1717 width=WidgetTextWidth(font_info,ResetButtonText);
1718 if (WidgetTextWidth(font_info,GrabButtonText) > width)
1719 width=WidgetTextWidth(font_info,GrabButtonText);
1720 width+=QuantumMargin;
1721 if (WidgetTextWidth(font_info,ColorPatternText) > width)
1722 width=WidgetTextWidth(font_info,ColorPatternText);
1723 if (WidgetTextWidth(font_info,ColornameText) > width)
1724 width=WidgetTextWidth(font_info,ColornameText);
1725 height=(
unsigned int) (font_info->ascent+font_info->descent);
1729 windows->widget.width=(
unsigned int)
1730 (width+MagickMin((
int) text_width,(int) MaxTextWidth)+6*QuantumMargin);
1731 windows->widget.min_width=(
unsigned int)
1732 (width+MinTextWidth+4*QuantumMargin);
1733 if (windows->widget.width < windows->widget.min_width)
1734 windows->widget.width=windows->widget.min_width;
1735 windows->widget.height=(
unsigned int)
1736 ((81*height) >> 2)+((13*QuantumMargin) >> 1)+4;
1737 windows->widget.min_height=(
unsigned int)
1738 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
1739 if (windows->widget.height < windows->widget.min_height)
1740 windows->widget.height=windows->widget.min_height;
1741 XConstrainWindowPosition(display,&windows->widget);
1745 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Color",
1747 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
1748 if (status != False)
1750 XSetWMName(display,windows->widget.id,&window_name);
1751 XSetWMIconName(display,windows->widget.id,&window_name);
1752 (void) XFree((
void *) window_name.value);
1754 window_changes.width=(int) windows->widget.width;
1755 window_changes.height=(
int) windows->widget.height;
1756 window_changes.x=windows->widget.x;
1757 window_changes.y=windows->widget.y;
1758 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
1759 mask,&window_changes);
1760 (void) XMapRaised(display,windows->widget.id);
1761 windows->widget.mapped=MagickFalse;
1765 XGetWidgetInfo((
char *) NULL,&mode_info);
1766 XGetWidgetInfo((
char *) NULL,&slider_info);
1767 XGetWidgetInfo((
char *) NULL,&north_info);
1768 XGetWidgetInfo((
char *) NULL,&south_info);
1769 XGetWidgetInfo((
char *) NULL,&expose_info);
1770 XGetWidgetInfo((
char *) NULL,&selection_info);
1772 delay=SuspendTime << 2;
1773 state=UpdateConfigurationState;
1776 if (state & UpdateConfigurationState)
1784 XGetWidgetInfo(CancelButtonText,&cancel_info);
1785 cancel_info.width=width;
1786 cancel_info.height=(
unsigned int) ((3*height) >> 1);
1788 (windows->widget.width-cancel_info.width-QuantumMargin-2);
1790 (windows->widget.height-cancel_info.height-QuantumMargin);
1791 XGetWidgetInfo(action,&action_info);
1792 action_info.width=width;
1793 action_info.height=(
unsigned int) ((3*height) >> 1);
1794 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
1795 (action_info.bevel_width << 1));
1796 action_info.y=cancel_info.y;
1797 XGetWidgetInfo(GrabButtonText,&grab_info);
1798 grab_info.width=width;
1799 grab_info.height=(
unsigned int) ((3*height) >> 1);
1800 grab_info.x=QuantumMargin;
1801 grab_info.y=((5*QuantumMargin) >> 1)+height;
1802 XGetWidgetInfo(ResetButtonText,&reset_info);
1803 reset_info.width=width;
1804 reset_info.height=(
unsigned int) ((3*height) >> 1);
1805 reset_info.x=QuantumMargin;
1806 reset_info.y=grab_info.y+grab_info.height+QuantumMargin;
1810 XGetWidgetInfo(reply,&reply_info);
1811 reply_info.raised=MagickFalse;
1812 reply_info.bevel_width--;
1813 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
1814 reply_info.height=height << 1;
1815 reply_info.x=(int) (width+(QuantumMargin << 1));
1816 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
1820 XGetWidgetInfo((
char *) NULL,&mode_info);
1821 mode_info.active=MagickTrue;
1822 mode_info.bevel_width=0;
1823 mode_info.width=(
unsigned int) (action_info.x-(QuantumMargin << 1));
1824 mode_info.height=action_info.height;
1825 mode_info.x=QuantumMargin;
1826 mode_info.y=action_info.y;
1830 XGetWidgetInfo((
char *) NULL,&scroll_info);
1831 scroll_info.bevel_width--;
1832 scroll_info.width=height;
1833 scroll_info.height=(
unsigned int) (reply_info.y-grab_info.y-
1834 (QuantumMargin >> 1));
1835 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
1836 scroll_info.y=grab_info.y-reply_info.bevel_width;
1837 scroll_info.raised=MagickFalse;
1838 scroll_info.trough=MagickTrue;
1839 north_info=scroll_info;
1840 north_info.raised=MagickTrue;
1841 north_info.width-=(north_info.bevel_width << 1);
1842 north_info.height=north_info.width-1;
1843 north_info.x+=north_info.bevel_width;
1844 north_info.y+=north_info.bevel_width;
1845 south_info=north_info;
1846 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
1849 slider_info=north_info;
1851 slider_info.width-=2;
1852 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
1853 slider_info.bevel_width+2;
1854 slider_info.height=scroll_info.height-((slider_info.min_y-
1855 scroll_info.y+1) << 1)+4;
1856 visible_colors=(
unsigned int) (scroll_info.height*
1857 PerceptibleReciprocal((
double) height+(height >> 3)));
1858 if (colors > visible_colors)
1859 slider_info.height=(
unsigned int) ((visible_colors*
1860 slider_info.height)/colors);
1861 slider_info.max_y=south_info.y-south_info.bevel_width-
1862 slider_info.bevel_width-2;
1863 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
1864 slider_info.y=slider_info.min_y;
1865 expose_info=scroll_info;
1866 expose_info.y=slider_info.y;
1870 XGetWidgetInfo((
char *) NULL,&list_info);
1871 list_info.raised=MagickFalse;
1872 list_info.bevel_width--;
1873 list_info.width=(
unsigned int)
1874 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
1875 list_info.height=scroll_info.height;
1876 list_info.x=reply_info.x;
1877 list_info.y=scroll_info.y;
1878 if (windows->widget.mapped == MagickFalse)
1879 state|=JumpListState;
1884 XGetWidgetInfo(text,&text_info);
1885 text_info.center=MagickFalse;
1886 text_info.width=reply_info.width;
1887 text_info.height=height;
1888 text_info.x=list_info.x-(QuantumMargin >> 1);
1889 text_info.y=QuantumMargin;
1893 XGetWidgetInfo((
char *) NULL,&selection_info);
1894 selection_info.center=MagickFalse;
1895 selection_info.width=list_info.width;
1896 selection_info.height=(
unsigned int) ((9*height) >> 3);
1897 selection_info.x=list_info.x;
1898 state&=(~UpdateConfigurationState);
1900 if (state & RedrawWidgetState)
1906 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
1907 (void) XDrawString(display,windows->widget.id,
1908 windows->widget.annotate_context,x,y,ColorPatternText,
1909 Extent(ColorPatternText));
1910 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
1911 XDrawWidgetText(display,&windows->widget,&text_info);
1912 XDrawBeveledButton(display,&windows->widget,&grab_info);
1913 XDrawBeveledButton(display,&windows->widget,&reset_info);
1914 XDrawBeveledMatte(display,&windows->widget,&list_info);
1915 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
1916 XDrawTriangleNorth(display,&windows->widget,&north_info);
1917 XDrawBeveledButton(display,&windows->widget,&slider_info);
1918 XDrawTriangleSouth(display,&windows->widget,&south_info);
1920 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
1921 (void) XDrawString(display,windows->widget.id,
1922 windows->widget.annotate_context,x,y,ColornameText,
1923 Extent(ColornameText));
1924 XDrawBeveledMatte(display,&windows->widget,&reply_info);
1925 XDrawMatteText(display,&windows->widget,&reply_info);
1926 XDrawBeveledButton(display,&windows->widget,&action_info);
1927 XDrawBeveledButton(display,&windows->widget,&cancel_info);
1928 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
1929 selection_info.id=(~0);
1930 state|=RedrawActionState;
1931 state|=RedrawListState;
1932 state&=(~RedrawWidgetState);
1934 if (state & UpdateListState)
1942 status=XParseColor(display,windows->widget.map_info->colormap,
1943 glob_pattern,&color);
1944 if ((status != False) || (strchr(glob_pattern,
'-') != (
char *) NULL))
1949 (void) CopyMagickString(reply,glob_pattern,MaxTextExtent);
1950 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
1951 action_info.raised=MagickFalse;
1952 XDrawBeveledButton(display,&windows->widget,&action_info);
1958 checklist=GetColorList(glob_pattern,&number_colors,exception);
1959 if (number_colors == 0)
1961 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
1962 (void) XBell(display,0);
1966 for (i=0; i < (int) colors; i++)
1967 colorlist[i]=DestroyString(colorlist[i]);
1968 if (colorlist != (
char **) NULL)
1969 colorlist=(
char **) RelinquishMagickMemory(colorlist);
1970 colorlist=checklist;
1971 colors=number_colors;
1977 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
1978 if (colors > visible_colors)
1979 slider_info.height=(
unsigned int)
1980 ((visible_colors*slider_info.height)/colors);
1981 slider_info.max_y=south_info.y-south_info.bevel_width-
1982 slider_info.bevel_width-2;
1984 slider_info.y=slider_info.min_y;
1985 expose_info.y=slider_info.y;
1986 selection_info.id=(~0);
1988 state|=RedrawListState;
1992 *reply_info.text=
'\0';
1993 reply_info.cursor=reply_info.text;
1994 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
1995 XDrawWidgetText(display,&windows->widget,&text_info);
1996 XDrawMatteText(display,&windows->widget,&reply_info);
1997 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
1998 XDrawTriangleNorth(display,&windows->widget,&north_info);
1999 XDrawBeveledButton(display,&windows->widget,&slider_info);
2000 XDrawTriangleSouth(display,&windows->widget,&south_info);
2001 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
2002 state&=(~UpdateListState);
2004 if (state & JumpListState)
2010 for (i=0; i < (int) colors; i++)
2011 if (LocaleCompare(colorlist[i],reply) >= 0)
2013 list_info.id=LocaleCompare(colorlist[i],reply) == 0 ? i : ~0;
2016 if ((i < slider_info.id) ||
2017 (i >= (
int) (slider_info.id+visible_colors)))
2018 slider_info.id=i-(visible_colors >> 1);
2019 selection_info.id=(~0);
2020 state|=RedrawListState;
2021 state&=(~JumpListState);
2023 if (state & RedrawListState)
2028 if (slider_info.id >= (
int) (colors-visible_colors))
2029 slider_info.id=(int) (colors-visible_colors);
2030 if ((slider_info.id < 0) || (colors <= visible_colors))
2032 slider_info.y=slider_info.min_y;
2034 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
2035 slider_info.min_y+1)/colors);
2036 if (slider_info.id != selection_info.id)
2041 selection_info.id=slider_info.id;
2042 selection_info.y=list_info.y+(height >> 3)+2;
2043 for (i=0; i < (int) visible_colors; i++)
2045 selection_info.raised=(slider_info.id+i) != list_info.id ?
2046 MagickTrue : MagickFalse;
2047 selection_info.text=(
char *) NULL;
2048 if ((slider_info.id+i) < (int) colors)
2049 selection_info.text=colorlist[slider_info.id+i];
2050 XDrawWidgetText(display,&windows->widget,&selection_info);
2051 selection_info.y+=(int) selection_info.height;
2056 if (slider_info.y > expose_info.y)
2058 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
2059 expose_info.y=slider_info.y-expose_info.height-
2060 slider_info.bevel_width-1;
2064 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
2065 expose_info.y=slider_info.y+slider_info.height+
2066 slider_info.bevel_width+1;
2068 XDrawTriangleNorth(display,&windows->widget,&north_info);
2069 XDrawMatte(display,&windows->widget,&expose_info);
2070 XDrawBeveledButton(display,&windows->widget,&slider_info);
2071 XDrawTriangleSouth(display,&windows->widget,&south_info);
2072 expose_info.y=slider_info.y;
2074 state&=(~RedrawListState);
2076 if (state & RedrawActionState)
2079 colorname[MaxTextExtent];
2084 color=windows->widget.pixel_info->matte_color;
2085 (void) XParseColor(display,windows->widget.map_info->colormap,
2086 reply_info.text,&windows->widget.pixel_info->matte_color);
2087 XBestPixel(display,windows->widget.map_info->colormap,(XColor *) NULL,
2088 (
unsigned int) windows->widget.visual_info->colormap_size,
2089 &windows->widget.pixel_info->matte_color);
2090 mode_info.text=colorname;
2091 (void) FormatLocaleString(mode_info.text,MaxTextExtent,
"#%02x%02x%02x",
2092 windows->widget.pixel_info->matte_color.red,
2093 windows->widget.pixel_info->matte_color.green,
2094 windows->widget.pixel_info->matte_color.blue);
2095 XDrawBeveledButton(display,&windows->widget,&mode_info);
2096 windows->widget.pixel_info->matte_color=color;
2097 state&=(~RedrawActionState);
2102 if (north_info.raised && south_info.raised)
2103 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
2109 XDelay(display,delay);
2111 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
2112 if (north_info.raised == MagickFalse)
2113 if (slider_info.id > 0)
2119 state|=RedrawListState;
2121 if (south_info.raised == MagickFalse)
2122 if (slider_info.id < (
int) colors)
2128 state|=RedrawListState;
2130 if (event.type != ButtonRelease)
2137 if (MatteIsActive(slider_info,event.xbutton))
2142 slider_info.active=MagickTrue;
2145 if (MatteIsActive(north_info,event.xbutton))
2146 if (slider_info.id > 0)
2151 north_info.raised=MagickFalse;
2153 state|=RedrawListState;
2156 if (MatteIsActive(south_info,event.xbutton))
2157 if (slider_info.id < (
int) colors)
2162 south_info.raised=MagickFalse;
2164 state|=RedrawListState;
2167 if (MatteIsActive(scroll_info,event.xbutton))
2172 if (event.xbutton.y < slider_info.y)
2173 slider_info.id-=(visible_colors-1);
2175 slider_info.id+=(visible_colors-1);
2176 state|=RedrawListState;
2179 if (MatteIsActive(list_info,event.xbutton))
2187 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
2188 selection_info.height;
2189 if (
id >= (
int) colors)
2191 (void) CopyMagickString(reply_info.text,colorlist[
id],
2193 reply_info.highlight=MagickFalse;
2194 reply_info.marker=reply_info.text;
2195 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2196 XDrawMatteText(display,&windows->widget,&reply_info);
2197 state|=RedrawActionState;
2198 if (
id == list_info.id)
2200 (void) CopyMagickString(glob_pattern,reply_info.text,
2202 state|=UpdateListState;
2204 selection_info.id=(~0);
2206 state|=RedrawListState;
2209 if (MatteIsActive(grab_info,event.xbutton))
2214 grab_info.raised=MagickFalse;
2215 XDrawBeveledButton(display,&windows->widget,&grab_info);
2218 if (MatteIsActive(reset_info,event.xbutton))
2223 reset_info.raised=MagickFalse;
2224 XDrawBeveledButton(display,&windows->widget,&reset_info);
2227 if (MatteIsActive(mode_info,event.xbutton))
2232 if (mode_info.text != (
char *) NULL)
2233 (void) CopyMagickString(reply_info.text,mode_info.text,
2235 (void) CopyMagickString(primary_selection,reply_info.text,
2237 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2238 event.xbutton.time);
2239 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2240 windows->widget.id ? MagickTrue : MagickFalse;
2241 reply_info.marker=reply_info.text;
2242 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2243 XDrawMatteText(display,&windows->widget,&reply_info);
2246 if (MatteIsActive(action_info,event.xbutton))
2251 action_info.raised=MagickFalse;
2252 XDrawBeveledButton(display,&windows->widget,&action_info);
2255 if (MatteIsActive(cancel_info,event.xbutton))
2260 cancel_info.raised=MagickFalse;
2261 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2264 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2266 if (event.xbutton.button != Button2)
2274 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
2275 for (i=1; i <= Extent(reply_info.marker); i++)
2276 if (XTextWidth(font_info,reply_info.marker,i) > x)
2278 reply_info.cursor=reply_info.marker+i-1;
2279 if (event.xbutton.time > (click_time+DoubleClick))
2280 reply_info.highlight=MagickFalse;
2286 (
void) CopyMagickString(primary_selection,reply_info.text,
2288 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2289 event.xbutton.time);
2290 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2291 windows->widget.id ? MagickTrue : MagickFalse;
2293 XDrawMatteText(display,&windows->widget,&reply_info);
2294 click_time=
event.xbutton.time;
2300 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
2301 windows->widget.id,event.xbutton.time);
2306 if (windows->widget.mapped == MagickFalse)
2308 if (north_info.raised == MagickFalse)
2313 delay=SuspendTime << 2;
2314 north_info.raised=MagickTrue;
2315 XDrawTriangleNorth(display,&windows->widget,&north_info);
2317 if (south_info.raised == MagickFalse)
2322 delay=SuspendTime << 2;
2323 south_info.raised=MagickTrue;
2324 XDrawTriangleSouth(display,&windows->widget,&south_info);
2326 if (slider_info.active)
2331 slider_info.active=MagickFalse;
2334 if (grab_info.raised == MagickFalse)
2336 if (event.xbutton.window == windows->widget.id)
2337 if (MatteIsActive(grab_info,event.xbutton))
2342 (void) XGetWindowColor(display,windows,reply_info.text);
2343 reply_info.marker=reply_info.text;
2344 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2345 XDrawMatteText(display,&windows->widget,&reply_info);
2346 state|=RedrawActionState;
2348 grab_info.raised=MagickTrue;
2349 XDrawBeveledButton(display,&windows->widget,&grab_info);
2351 if (reset_info.raised == MagickFalse)
2353 if (event.xbutton.window == windows->widget.id)
2354 if (MatteIsActive(reset_info,event.xbutton))
2356 (void) CopyMagickString(glob_pattern,reset_pattern,
2358 state|=UpdateListState;
2360 reset_info.raised=MagickTrue;
2361 XDrawBeveledButton(display,&windows->widget,&reset_info);
2363 if (action_info.raised == MagickFalse)
2365 if (event.xbutton.window == windows->widget.id)
2367 if (MatteIsActive(action_info,event.xbutton))
2369 if (*reply_info.text ==
'\0')
2370 (void) XBell(display,0);
2375 action_info.raised=MagickTrue;
2376 XDrawBeveledButton(display,&windows->widget,&action_info);
2378 if (cancel_info.raised == MagickFalse)
2380 if (event.xbutton.window == windows->widget.id)
2381 if (MatteIsActive(cancel_info,event.xbutton))
2383 *reply_info.text=
'\0';
2386 cancel_info.raised=MagickTrue;
2387 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2389 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2398 if (event.xclient.message_type != windows->wm_protocols)
2400 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
2402 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
2403 (Time)
event.xclient.data.l[1]);
2406 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
2408 if (event.xclient.window == windows->widget.id)
2410 *reply_info.text=
'\0';
2416 case ConfigureNotify:
2421 if (event.xconfigure.window != windows->widget.id)
2423 if ((event.xconfigure.width == (
int) windows->widget.width) &&
2424 (
event.xconfigure.height == (int) windows->widget.height))
2426 windows->widget.width=(
unsigned int)
2427 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
2428 windows->widget.height=(
unsigned int)
2429 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
2430 state|=UpdateConfigurationState;
2435 if (event.xcrossing.window != windows->widget.id)
2437 state&=(~InactiveWidgetState);
2442 if (event.xexpose.window != windows->widget.id)
2444 if (event.xexpose.count != 0)
2446 state|=RedrawWidgetState;
2452 command[MaxTextExtent];
2463 if (event.xkey.window != windows->widget.id)
2465 length=XLookupString((XKeyEvent *) &event.xkey,command,
2466 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2467 *(command+length)=
'\0';
2468 if (AreaIsActive(scroll_info,event.xkey))
2473 switch ((
int) key_symbol)
2496 slider_info.id-=visible_colors;
2502 slider_info.id+=visible_colors;
2508 slider_info.id=(int) colors;
2512 state|=RedrawListState;
2515 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
2520 if (*reply_info.text ==
'\0')
2522 (void) CopyMagickString(glob_pattern,reply_info.text,MaxTextExtent);
2523 state|=UpdateListState;
2526 if (key_symbol == XK_Control_L)
2528 state|=ControlState;
2531 if (state & ControlState)
2532 switch ((
int) key_symbol)
2540 *reply_info.text=
'\0';
2541 reply_info.cursor=reply_info.text;
2542 reply_info.marker=reply_info.text;
2543 reply_info.highlight=MagickFalse;
2549 XEditText(display,&reply_info,key_symbol,command,state);
2550 XDrawMatteText(display,&windows->widget,&reply_info);
2551 state|=JumpListState;
2552 status=XParseColor(display,windows->widget.map_info->colormap,
2553 reply_info.text,&color);
2554 if (status != False)
2555 state|=RedrawActionState;
2561 command[MaxTextExtent];
2569 if (event.xkey.window != windows->widget.id)
2571 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
2572 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2573 if (key_symbol == XK_Control_L)
2574 state&=(~ControlState);
2579 if (event.xcrossing.window != windows->widget.id)
2581 state|=InactiveWidgetState;
2595 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
2596 if (slider_info.active)
2601 slider_info.y=
event.xmotion.y-
2602 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
2603 if (slider_info.y < slider_info.min_y)
2604 slider_info.y=slider_info.min_y;
2605 if (slider_info.y > slider_info.max_y)
2606 slider_info.y=slider_info.max_y;
2608 if (slider_info.y != slider_info.min_y)
2609 slider_info.id=(int) ((colors*(slider_info.y-
2610 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
2611 state|=RedrawListState;
2614 if (state & InactiveWidgetState)
2616 if (grab_info.raised == MatteIsActive(grab_info,event.xmotion))
2621 grab_info.raised=!grab_info.raised;
2622 XDrawBeveledButton(display,&windows->widget,&grab_info);
2625 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
2630 reset_info.raised=!reset_info.raised;
2631 XDrawBeveledButton(display,&windows->widget,&reset_info);
2634 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
2639 action_info.raised=action_info.raised == MagickFalse ?
2640 MagickTrue : MagickFalse;
2641 XDrawBeveledButton(display,&windows->widget,&action_info);
2644 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
2649 cancel_info.raised=cancel_info.raised == MagickFalse ?
2650 MagickTrue : MagickFalse;
2651 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2656 case SelectionClear:
2658 reply_info.highlight=MagickFalse;
2659 XDrawMatteText(display,&windows->widget,&reply_info);
2662 case SelectionNotify:
2680 if (event.xselection.property == (Atom) None)
2682 status=XGetWindowProperty(display,event.xselection.requestor,
2683 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
2684 &format,&length,&after,&data);
2685 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
2688 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
2689 (void) XBell(display,0);
2695 *(data+length)=
'\0';
2696 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
2698 XDrawMatteText(display,&windows->widget,&reply_info);
2699 state|=JumpListState;
2700 state|=RedrawActionState;
2702 (void) XFree((
void *) data);
2705 case SelectionRequest:
2710 XSelectionRequestEvent
2713 if (reply_info.highlight == MagickFalse)
2718 request=(&(
event.xselectionrequest));
2719 (void) XChangeProperty(request->display,request->requestor,
2720 request->property,request->target,8,PropModeReplace,
2721 (
unsigned char *) primary_selection,Extent(primary_selection));
2722 notify.type=SelectionNotify;
2723 notify.send_event=MagickTrue;
2724 notify.display=request->display;
2725 notify.requestor=request->requestor;
2726 notify.selection=request->selection;
2727 notify.target=request->target;
2728 notify.time=request->time;
2729 if (request->property == None)
2730 notify.property=request->target;
2732 notify.property=request->property;
2733 (void) XSendEvent(request->display,request->requestor,False,
2734 NoEventMask,(XEvent *) ¬ify);
2739 }
while ((state & ExitState) == 0);
2740 XSetCursorState(display,windows,MagickFalse);
2741 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
2742 XCheckRefreshWindows(display,windows);
2746 for (i=0; i < (int) colors; i++)
2747 colorlist[i]=DestroyString(colorlist[i]);
2748 if (colorlist != (
char **) NULL)
2749 colorlist=(
char **) RelinquishMagickMemory(colorlist);
2750 exception=DestroyExceptionInfo(exception);
2751 if ((*reply ==
'\0') || (strchr(reply,
'-') != (
char *) NULL))
2753 status=XParseColor(display,windows->widget.map_info->colormap,reply,&color);
2754 if (status != False)
2756 XNoticeWidget(display,windows,
"Color is unknown to X server:",reply);
2757 (void) CopyMagickString(reply,
"gray",MaxTextExtent);
2795 MagickExport
int XCommandWidget(Display *display,XWindows *windows,
2796 const char *
const *selections,XEvent *event)
2798 #define tile_width 112
2799 #define tile_height 70
2801 static const unsigned char
2804 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2805 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2806 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
2808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
2810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2811 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2812 0x00, 0x00, 0x1e, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2813 0x00, 0x00, 0x00, 0x00, 0x1e, 0xbc, 0x9f, 0x03, 0x00, 0x3e, 0x00, 0xc0,
2814 0x1f, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x0f, 0x80, 0x3f,
2815 0x00, 0xf0, 0x1f, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x1f,
2816 0xe0, 0x3f, 0x00, 0xfc, 0x1f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc,
2817 0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xfe, 0x1f, 0xf8, 0x0f, 0x00, 0x00, 0x00,
2818 0x1e, 0xfc, 0xfc, 0x3f, 0xf8, 0x3f, 0x00, 0xff, 0x1e, 0xfc, 0x0f, 0x00,
2819 0x00, 0x00, 0x1e, 0x7c, 0xfc, 0x3e, 0xf8, 0x3c, 0x80, 0x1f, 0x1e, 0x7c,
2820 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c, 0xc0, 0x0f,
2821 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c,
2822 0xc0, 0x07, 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c,
2823 0x7c, 0x7c, 0xc0, 0x0f, 0x1e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78,
2824 0x78, 0x3c, 0xfc, 0x7c, 0x80, 0x7f, 0x1e, 0x7c, 0x00, 0x00, 0x00, 0x00,
2825 0x1e, 0xf8, 0x78, 0x7c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0xf8, 0xff, 0x00,
2826 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xfe, 0x1f, 0xf8,
2827 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xf8,
2828 0x1f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xc0, 0xef,
2829 0x07, 0xe0, 0x1f, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0x70, 0x40, 0x78,
2830 0x00, 0xc7, 0x07, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x00,
2831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
2832 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
2834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2835 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2836 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2837 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2838 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
2839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00,
2840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
2841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
2842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2843 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00,
2844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07,
2845 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2846 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2847 0x60, 0x00, 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2848 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
2849 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00,
2850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x9f, 0x7f, 0x00,
2851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0xdf,
2852 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x00,
2853 0xe0, 0xdf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0c,
2854 0x78, 0x30, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
2855 0x00, 0x0f, 0xf8, 0x70, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x1f, 0x00, 0xe0,
2856 0x0f, 0x1e, 0x80, 0x0f, 0xf8, 0x78, 0xf0, 0xfd, 0xf9, 0x00, 0xc0, 0x1f,
2857 0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x1f, 0xf8, 0x7c, 0xf0, 0xfc, 0xf9, 0x00,
2858 0xf0, 0x1f, 0x00, 0xfe, 0x0f, 0x00, 0xf0, 0x07, 0xf8, 0x3e, 0xf8, 0xfc,
2859 0xf0, 0x01, 0xf8, 0x1f, 0x00, 0xff, 0x0f, 0x1e, 0xf0, 0x03, 0xf8, 0x3f,
2860 0xf8, 0xf8, 0xf0, 0x01, 0xfc, 0x1f, 0x80, 0x7f, 0x0f, 0x1e, 0xf8, 0x00,
2861 0xf8, 0x1f, 0x78, 0x18, 0xf0, 0x01, 0x7c, 0x1e, 0xc0, 0x0f, 0x0f, 0x1e,
2862 0x7c, 0x00, 0xf0, 0x0f, 0x78, 0x00, 0xf0, 0x01, 0x3e, 0x1e, 0xe0, 0x07,
2863 0x0f, 0x1e, 0x7c, 0x00, 0xf0, 0x07, 0x7c, 0x00, 0xe0, 0x01, 0x3e, 0x1e,
2864 0xe0, 0x03, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x0f, 0x7c, 0x00, 0xe0, 0x03,
2865 0x3e, 0x3e, 0xe0, 0x07, 0x0f, 0x1e, 0x1e, 0x00, 0xf0, 0x1f, 0x3c, 0x00,
2866 0xe0, 0x03, 0x7e, 0x3e, 0xc0, 0x3f, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x1f,
2867 0x3e, 0x00, 0xe0, 0x03, 0xfc, 0x7f, 0x80, 0xff, 0x0f, 0x1e, 0xfc, 0x00,
2868 0xf0, 0x3e, 0x3e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xff, 0x0f, 0x1e,
2869 0xfc, 0x07, 0xf0, 0x7c, 0x1e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xfc,
2870 0x0f, 0x1e, 0xf8, 0x1f, 0xf0, 0xf8, 0x1e, 0x00, 0xc0, 0x03, 0xe0, 0xf7,
2871 0x03, 0xf0, 0x0f, 0x1e, 0xe0, 0x3f, 0xf0, 0x78, 0x1c, 0x00, 0x80, 0x03,
2872 0x80, 0xe3, 0x03, 0x00, 0x0f, 0x1e, 0xc0, 0x3f, 0xf0, 0x30, 0x00, 0x00,
2873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x3e, 0x00, 0x00,
2874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x10,
2875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00,
2876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2877 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2878 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2879 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2880 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
2882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
2883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
2884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2885 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2907 assert(display != (Display *) NULL);
2908 assert(windows != (XWindows *) NULL);
2909 if (IsEventLogging() != MagickFalse)
2910 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2911 font_info=windows->command.font_info;
2912 height=(
unsigned int) (font_info->ascent+font_info->descent);
2915 if (event == (XEvent *) NULL)
2929 assert(selections != (
const char **) NULL);
2930 windows->command.width=0;
2931 for (i=0; selections[i] != (
char *) NULL; i++)
2933 width=WidgetTextWidth(font_info,(
char *) selections[i]);
2934 if (width > windows->command.width)
2935 windows->command.width=width;
2937 number_selections=(
unsigned int) i;
2938 windows->command.width+=3*QuantumMargin+10;
2939 if ((
int) windows->command.width < (tile_width+QuantumMargin+10))
2940 windows->command.width=(
unsigned int) (tile_width+QuantumMargin+10);
2941 windows->command.height=(
unsigned int) (number_selections*
2942 (((3*height) >> 1)+10)+tile_height+20);
2943 windows->command.min_width=windows->command.width;
2944 windows->command.min_height=windows->command.height;
2945 XConstrainWindowPosition(display,&windows->command);
2946 if (windows->command.id != (Window) NULL)
2954 status=XStringListToTextProperty(&windows->command.name,1,
2956 if (status != False)
2958 XSetWMName(display,windows->command.id,&window_name);
2959 XSetWMIconName(display,windows->command.id,&window_name);
2960 (void) XFree((
void *) window_name.value);
2962 window_changes.width=(int) windows->command.width;
2963 window_changes.height=(
int) windows->command.height;
2964 (void) XReconfigureWMWindow(display,windows->command.id,
2965 windows->command.screen,(
unsigned int) (CWWidth | CWHeight),
2971 if (selection_info != (XWidgetInfo *) NULL)
2972 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
2973 selection_info=(XWidgetInfo *) AcquireQuantumMemory(number_selections,
2974 sizeof(*selection_info));
2975 if (selection_info == (XWidgetInfo *) NULL)
2976 ThrowXWindowFatalException(ResourceLimitFatalError,
2977 "MemoryAllocationFailed",
"...");
2978 state|=UpdateConfigurationState | RedrawWidgetState;
2983 if (event != (XEvent *) NULL)
2984 switch (event->type)
2988 for (i=0; i < (int) number_selections; i++)
2990 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
2992 if (i >= (
int) windows->command.data)
2994 selection_info[i].raised=MagickFalse;
2995 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
2998 submenu_info=selection_info[i];
2999 submenu_info.active=MagickTrue;
3000 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3001 (toggle_info.height >> 1);
3003 (void) XCheckWindowEvent(display,windows->widget.id,LeaveWindowMask,
3011 for (i=0; i < (int) number_selections; i++)
3013 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
3016 if (
id >= (
int) windows->command.data)
3018 selection_info[id].raised=MagickTrue;
3019 XDrawBeveledButton(display,&windows->command,&selection_info[
id]);
3031 if (event->xclient.message_type != windows->wm_protocols)
3033 if (*event->xclient.data.l != (
int) windows->wm_delete_window)
3035 (void) XWithdrawWindow(display,windows->command.id,
3036 windows->command.screen);
3039 case ConfigureNotify:
3044 if (event->xconfigure.window != windows->command.id)
3046 if (event->xconfigure.send_event != 0)
3048 windows->command.x=
event->xconfigure.x;
3049 windows->command.y=
event->xconfigure.y;
3051 if ((event->xconfigure.width == (
int) windows->command.width) &&
3052 (
event->xconfigure.height == (int) windows->command.height))
3054 windows->command.width=(
unsigned int)
3055 MagickMax(event->xconfigure.width,(
int) windows->command.min_width);
3056 windows->command.height=(
unsigned int)
3057 MagickMax(event->xconfigure.height,(
int) windows->command.min_height);
3058 state|=UpdateConfigurationState;
3063 if (event->xexpose.window != windows->command.id)
3065 if (event->xexpose.count != 0)
3067 state|=RedrawWidgetState;
3077 for (i=0; i < (int) number_selections; i++)
3079 if (i >= (
int) windows->command.data)
3081 if (selection_info[i].raised ==
3082 MatteIsActive(selection_info[i],event->xmotion))
3087 selection_info[i].raised=!selection_info[i].raised;
3088 XDrawBeveledButton(display,&windows->command,
3089 &selection_info[i]);
3093 if (MatteIsActive(selection_info[i],event->xmotion) == MagickFalse)
3095 submenu_info=selection_info[i];
3096 submenu_info.active=MagickTrue;
3097 toggle_info.raised=MagickTrue;
3098 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3099 (toggle_info.height >> 1);
3100 XDrawTriangleEast(display,&windows->command,&toggle_info);
3103 XDelay(display,SuspendTime);
3104 if (XCheckMaskEvent(display,ButtonMotionMask,event) == MagickFalse)
3106 while (XCheckMaskEvent(display,ButtonMotionMask,event)) ;
3107 toggle_info.raised=MagickFalse;
3108 if (windows->command.data != 0)
3109 XDrawTriangleEast(display,&windows->command,&toggle_info);
3115 windows->command.mapped=MagickTrue;
3120 windows->command.mapped=MagickFalse;
3126 if (state & UpdateConfigurationState)
3131 assert(selections != (
const char **) NULL);
3133 for (i=0; i < (int) number_selections; i++)
3135 XGetWidgetInfo(selections[i],&selection_info[i]);
3136 selection_info[i].center=MagickFalse;
3137 selection_info[i].bevel_width--;
3138 selection_info[i].height=(
unsigned int) ((3*height) >> 1);
3139 selection_info[i].x=(QuantumMargin >> 1)+4;
3140 selection_info[i].width=(
unsigned int) (windows->command.width-
3141 (selection_info[i].x << 1));
3142 selection_info[i].y=y;
3143 y+=selection_info[i].height+(selection_info[i].bevel_width << 1)+6;
3145 XGetWidgetInfo((
char *) NULL,&toggle_info);
3146 toggle_info.bevel_width--;
3147 toggle_info.width=(
unsigned int) (((5*height) >> 3)-
3148 (toggle_info.bevel_width << 1));
3149 toggle_info.height=toggle_info.width;
3150 toggle_info.x=selection_info[0].x+selection_info[0].width-
3151 toggle_info.width-(QuantumMargin >> 1);
3152 if (windows->command.mapped)
3153 (void) XClearWindow(display,windows->command.id);
3155 if (state & RedrawWidgetState)
3163 tile_pixmap=XCreatePixmapFromBitmapData(display,windows->command.id,
3164 (
char *) tile_bits,tile_width,tile_height,1L,0L,1);
3165 if (tile_pixmap != (Pixmap) NULL)
3167 (void) XCopyPlane(display,tile_pixmap,windows->command.id,
3168 windows->command.annotate_context,0,0,tile_width,tile_height,
3169 (
int) ((windows->command.width-tile_width) >> 1),10,1L);
3170 (void) XFreePixmap(display,tile_pixmap);
3172 for (i=0; i < (int) number_selections; i++)
3174 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
3175 if (i >= (
int) windows->command.data)
3177 toggle_info.raised=MagickFalse;
3178 toggle_info.y=selection_info[i].y+(selection_info[i].height >> 1)-
3179 (toggle_info.height >> 1);
3180 XDrawTriangleEast(display,&windows->command,&toggle_info);
3182 XHighlightWidget(display,&windows->command,BorderOffset,BorderOffset);
3219 MagickExport
int XConfirmWidget(Display *display,XWindows *windows,
3220 const char *reason,
const char *description)
3222 #define CancelButtonText "Cancel"
3223 #define DismissButtonText "Dismiss"
3224 #define YesButtonText "Yes"
3261 assert(display != (Display *) NULL);
3262 assert(windows != (XWindows *) NULL);
3263 assert(reason != (
char *) NULL);
3264 assert(description != (
char *) NULL);
3265 if (IsEventLogging() != MagickFalse)
3266 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
3267 XCheckRefreshWindows(display,windows);
3268 font_info=windows->widget.font_info;
3269 width=WidgetTextWidth(font_info,CancelButtonText);
3270 if (WidgetTextWidth(font_info,DismissButtonText) > width)
3271 width=WidgetTextWidth(font_info,DismissButtonText);
3272 if (WidgetTextWidth(font_info,YesButtonText) > width)
3273 width=WidgetTextWidth(font_info,YesButtonText);
3275 if (description != (
char *) NULL)
3276 if (WidgetTextWidth(font_info,(
char *) description) > width)
3277 width=WidgetTextWidth(font_info,(
char *) description);
3278 height=(
unsigned int) (font_info->ascent+font_info->descent);
3282 windows->widget.width=(
unsigned int) (width+9*QuantumMargin);
3283 windows->widget.min_width=(
unsigned int) (9*QuantumMargin+
3284 WidgetTextWidth(font_info,CancelButtonText)+
3285 WidgetTextWidth(font_info,DismissButtonText)+
3286 WidgetTextWidth(font_info,YesButtonText));
3287 if (windows->widget.width < windows->widget.min_width)
3288 windows->widget.width=windows->widget.min_width;
3289 windows->widget.height=(
unsigned int) (12*height);
3290 windows->widget.min_height=(
unsigned int) (7*height);
3291 if (windows->widget.height < windows->widget.min_height)
3292 windows->widget.height=windows->widget.min_height;
3293 XConstrainWindowPosition(display,&windows->widget);
3297 (void) CopyMagickString(windows->widget.name,
"Confirm",MaxTextExtent);
3298 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3299 if (status != False)
3301 XSetWMName(display,windows->widget.id,&window_name);
3302 XSetWMIconName(display,windows->widget.id,&window_name);
3303 (void) XFree((
void *) window_name.value);
3305 window_changes.width=(int) windows->widget.width;
3306 window_changes.height=(
int) windows->widget.height;
3307 window_changes.x=windows->widget.x;
3308 window_changes.y=windows->widget.y;
3309 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3310 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3311 (void) XMapRaised(display,windows->widget.id);
3312 windows->widget.mapped=MagickFalse;
3317 state=UpdateConfigurationState;
3318 XSetCursorState(display,windows,MagickTrue);
3321 if (state & UpdateConfigurationState)
3326 XGetWidgetInfo(CancelButtonText,&cancel_info);
3327 cancel_info.width=(
unsigned int) QuantumMargin+
3328 WidgetTextWidth(font_info,CancelButtonText);
3329 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3330 cancel_info.x=(int) (windows->widget.width-cancel_info.width-
3332 cancel_info.y=(int) (windows->widget.height-(cancel_info.height << 1));
3333 dismiss_info=cancel_info;
3334 dismiss_info.text=(
char *) DismissButtonText;
3335 if (LocaleCompare(description,
"Do you want to save it") == 0)
3336 dismiss_info.text=(
char *)
"Don't Save";
3337 dismiss_info.width=(
unsigned int) QuantumMargin+
3338 WidgetTextWidth(font_info,dismiss_info.text);
3339 dismiss_info.x=(int)
3340 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
3341 yes_info=cancel_info;
3342 yes_info.text=(
char *) YesButtonText;
3343 if (LocaleCompare(description,
"Do you want to save it") == 0)
3344 yes_info.text=(
char *)
"Save";
3345 yes_info.width=(
unsigned int) QuantumMargin+
3346 WidgetTextWidth(font_info,yes_info.text);
3347 if (yes_info.width < cancel_info.width)
3348 yes_info.width=cancel_info.width;
3349 yes_info.x=QuantumMargin;
3350 state&=(~UpdateConfigurationState);
3352 if (state & RedrawWidgetState)
3357 width=WidgetTextWidth(font_info,(
char *) reason);
3358 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3359 y=(int) ((windows->widget.height >> 1)-(height << 1));
3360 (void) XDrawString(display,windows->widget.id,
3361 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
3362 if (description != (
char *) NULL)
3365 question[MaxTextExtent];
3367 (void) CopyMagickString(question,description,MaxTextExtent);
3368 (void) ConcatenateMagickString(question,
"?",MaxTextExtent);
3369 width=WidgetTextWidth(font_info,question);
3370 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3372 (void) XDrawString(display,windows->widget.id,
3373 windows->widget.annotate_context,x,y,question,Extent(question));
3375 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3376 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3377 XDrawBeveledButton(display,&windows->widget,&yes_info);
3378 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3379 state&=(~RedrawWidgetState);
3384 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3389 if (MatteIsActive(cancel_info,event.xbutton))
3394 cancel_info.raised=MagickFalse;
3395 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3398 if (MatteIsActive(dismiss_info,event.xbutton))
3403 dismiss_info.raised=MagickFalse;
3404 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3407 if (MatteIsActive(yes_info,event.xbutton))
3412 yes_info.raised=MagickFalse;
3413 XDrawBeveledButton(display,&windows->widget,&yes_info);
3420 if (windows->widget.mapped == MagickFalse)
3422 if (cancel_info.raised == MagickFalse)
3424 if (event.xbutton.window == windows->widget.id)
3425 if (MatteIsActive(cancel_info,event.xbutton))
3430 cancel_info.raised=MagickTrue;
3431 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3433 if (dismiss_info.raised == MagickFalse)
3435 if (event.xbutton.window == windows->widget.id)
3436 if (MatteIsActive(dismiss_info,event.xbutton))
3441 dismiss_info.raised=MagickTrue;
3442 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3444 if (yes_info.raised == MagickFalse)
3446 if (event.xbutton.window == windows->widget.id)
3447 if (MatteIsActive(yes_info,event.xbutton))
3452 yes_info.raised=MagickTrue;
3453 XDrawBeveledButton(display,&windows->widget,&yes_info);
3462 if (event.xclient.message_type != windows->wm_protocols)
3464 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3466 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3467 (Time)
event.xclient.data.l[1]);
3470 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3472 if (event.xclient.window == windows->widget.id)
3479 case ConfigureNotify:
3484 if (event.xconfigure.window != windows->widget.id)
3486 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3487 (
event.xconfigure.height == (int) windows->widget.height))
3489 windows->widget.width=(
unsigned int)
3490 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3491 windows->widget.height=(
unsigned int)
3492 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3493 state|=UpdateConfigurationState;
3498 if (event.xcrossing.window != windows->widget.id)
3500 state&=(~InactiveWidgetState);
3505 if (event.xexpose.window != windows->widget.id)
3507 if (event.xexpose.count != 0)
3509 state|=RedrawWidgetState;
3515 command[MaxTextExtent];
3523 if (event.xkey.window != windows->widget.id)
3525 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
3526 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3527 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3529 yes_info.raised=MagickFalse;
3530 XDrawBeveledButton(display,&windows->widget,&yes_info);
3539 if (event.xcrossing.window != windows->widget.id)
3541 state|=InactiveWidgetState;
3549 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
3550 if (state & InactiveWidgetState)
3552 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
3557 cancel_info.raised=cancel_info.raised == MagickFalse ?
3558 MagickTrue : MagickFalse;
3559 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3562 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
3567 dismiss_info.raised=dismiss_info.raised == MagickFalse ?
3568 MagickTrue : MagickFalse;
3569 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3572 if (yes_info.raised == MatteIsActive(yes_info,event.xmotion))
3577 yes_info.raised=yes_info.raised == MagickFalse ?
3578 MagickTrue : MagickFalse;
3579 XDrawBeveledButton(display,&windows->widget,&yes_info);
3587 }
while ((state & ExitState) == 0);
3588 XSetCursorState(display,windows,MagickFalse);
3589 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
3590 XCheckRefreshWindows(display,windows);
3628 MagickExport
int XDialogWidget(Display *display,XWindows *windows,
3629 const char *action,
const char *query,
char *reply)
3631 #define CancelButtonText "Cancel"
3634 primary_selection[MaxTextExtent];
3642 static MagickBooleanType
3643 raised = MagickFalse;
3678 assert(display != (Display *) NULL);
3679 assert(windows != (XWindows *) NULL);
3680 assert(action != (
char *) NULL);
3681 assert(query != (
char *) NULL);
3682 assert(reply != (
char *) NULL);
3683 if (IsEventLogging() != MagickFalse)
3684 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
3685 XCheckRefreshWindows(display,windows);
3686 font_info=windows->widget.font_info;
3687 width=WidgetTextWidth(font_info,(
char *) action);
3688 if (WidgetTextWidth(font_info,CancelButtonText) > width)
3689 width=WidgetTextWidth(font_info,CancelButtonText);
3690 width+=(3*QuantumMargin) >> 1;
3691 height=(
unsigned int) (font_info->ascent+font_info->descent);
3695 windows->widget.width=(
unsigned int) MagickMax((
int) (2*width),(
int)
3696 WidgetTextWidth(font_info,(
char *) query));
3697 if (windows->widget.width < WidgetTextWidth(font_info,reply))
3698 windows->widget.width=WidgetTextWidth(font_info,reply);
3699 windows->widget.width+=6*QuantumMargin;
3700 windows->widget.min_width=(
unsigned int)
3701 (width+28*XTextWidth(font_info,
"#",1)+4*QuantumMargin);
3702 if (windows->widget.width < windows->widget.min_width)
3703 windows->widget.width=windows->widget.min_width;
3704 windows->widget.height=(
unsigned int) (7*height+(QuantumMargin << 1));
3705 windows->widget.min_height=windows->widget.height;
3706 if (windows->widget.height < windows->widget.min_height)
3707 windows->widget.height=windows->widget.min_height;
3708 XConstrainWindowPosition(display,&windows->widget);
3712 (void) CopyMagickString(windows->widget.name,
"Dialog",MaxTextExtent);
3713 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3714 if (status != False)
3716 XSetWMName(display,windows->widget.id,&window_name);
3717 XSetWMIconName(display,windows->widget.id,&window_name);
3718 (void) XFree((
void *) window_name.value);
3720 window_changes.width=(int) windows->widget.width;
3721 window_changes.height=(
int) windows->widget.height;
3722 window_changes.x=windows->widget.x;
3723 window_changes.y=windows->widget.y;
3724 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3725 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3726 (void) XMapRaised(display,windows->widget.id);
3727 windows->widget.mapped=MagickFalse;
3731 anomaly=(LocaleCompare(action,
"Background") == 0) ||
3732 (LocaleCompare(action,
"New") == 0) ||
3733 (LocaleCompare(action,
"Quantize") == 0) ||
3734 (LocaleCompare(action,
"Resize") == 0) ||
3735 (LocaleCompare(action,
"Save") == 0) ||
3736 (LocaleCompare(action,
"Shade") == 0);
3737 state=UpdateConfigurationState;
3738 XSetCursorState(display,windows,MagickTrue);
3741 if (state & UpdateConfigurationState)
3746 XGetWidgetInfo(CancelButtonText,&cancel_info);
3747 cancel_info.width=width;
3748 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3750 (windows->widget.width-cancel_info.width-((3*QuantumMargin) >> 1));
3752 (windows->widget.height-cancel_info.height-((3*QuantumMargin) >> 1));
3753 XGetWidgetInfo(action,&action_info);
3754 action_info.width=width;
3755 action_info.height=(
unsigned int) ((3*height) >> 1);
3756 action_info.x=cancel_info.x-(cancel_info.width+QuantumMargin+
3757 (action_info.bevel_width << 1));
3758 action_info.y=cancel_info.y;
3762 XGetWidgetInfo(reply,&reply_info);
3763 reply_info.raised=MagickFalse;
3764 reply_info.bevel_width--;
3765 reply_info.width=windows->widget.width-(3*QuantumMargin);
3766 reply_info.height=height << 1;
3767 reply_info.x=(3*QuantumMargin) >> 1;
3768 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
3772 XGetWidgetInfo(
"Dither",&special_info);
3773 special_info.raised=raised;
3774 special_info.bevel_width--;
3775 special_info.width=(
unsigned int) QuantumMargin >> 1;
3776 special_info.height=(
unsigned int) QuantumMargin >> 1;
3777 special_info.x=reply_info.x;
3778 special_info.y=action_info.y+action_info.height-special_info.height;
3779 if (LocaleCompare(action,
"Background") == 0)
3780 special_info.text=(
char *)
"Backdrop";
3781 if (LocaleCompare(action,
"New") == 0)
3782 special_info.text=(
char *)
"Gradation";
3783 if (LocaleCompare(action,
"Resize") == 0)
3784 special_info.text=(
char *)
"Constrain ratio";
3785 if (LocaleCompare(action,
"Save") == 0)
3786 special_info.text=(
char *)
"Non-progressive";
3787 if (LocaleCompare(action,
"Shade") == 0)
3788 special_info.text=(
char *)
"Color shading";
3792 XGetWidgetInfo(query,&text_info);
3793 text_info.width=reply_info.width;
3794 text_info.height=height;
3795 text_info.x=reply_info.x-(QuantumMargin >> 1);
3796 text_info.y=QuantumMargin;
3797 text_info.center=MagickFalse;
3798 state&=(~UpdateConfigurationState);
3800 if (state & RedrawWidgetState)
3805 XDrawWidgetText(display,&windows->widget,&text_info);
3806 XDrawBeveledMatte(display,&windows->widget,&reply_info);
3807 XDrawMatteText(display,&windows->widget,&reply_info);
3809 XDrawBeveledButton(display,&windows->widget,&special_info);
3810 XDrawBeveledButton(display,&windows->widget,&action_info);
3811 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3812 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3813 state&=(~RedrawWidgetState);
3818 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3824 if (MatteIsActive(special_info,event.xbutton))
3829 special_info.raised=!special_info.raised;
3830 XDrawBeveledButton(display,&windows->widget,&special_info);
3833 if (MatteIsActive(action_info,event.xbutton))
3838 action_info.raised=MagickFalse;
3839 XDrawBeveledButton(display,&windows->widget,&action_info);
3842 if (MatteIsActive(cancel_info,event.xbutton))
3847 cancel_info.raised=MagickFalse;
3848 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3851 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
3853 if (event.xbutton.button != Button2)
3861 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
3862 for (i=1; i <= Extent(reply_info.marker); i++)
3863 if (XTextWidth(font_info,reply_info.marker,i) > x)
3865 reply_info.cursor=reply_info.marker+i-1;
3866 if (event.xbutton.time > (click_time+DoubleClick))
3867 reply_info.highlight=MagickFalse;
3873 (
void) CopyMagickString(primary_selection,reply_info.text,
3875 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
3876 event.xbutton.time);
3877 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
3878 windows->widget.id ? MagickTrue : MagickFalse;
3880 XDrawMatteText(display,&windows->widget,&reply_info);
3881 click_time=
event.xbutton.time;
3887 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
3888 windows->widget.id,event.xbutton.time);
3893 if (windows->widget.mapped == MagickFalse)
3895 if (action_info.raised == MagickFalse)
3897 if (event.xbutton.window == windows->widget.id)
3898 if (MatteIsActive(action_info,event.xbutton))
3900 action_info.raised=MagickTrue;
3901 XDrawBeveledButton(display,&windows->widget,&action_info);
3903 if (cancel_info.raised == MagickFalse)
3905 if (event.xbutton.window == windows->widget.id)
3906 if (MatteIsActive(cancel_info,event.xbutton))
3908 *reply_info.text=
'\0';
3911 cancel_info.raised=MagickTrue;
3912 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3921 if (event.xclient.message_type != windows->wm_protocols)
3923 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3925 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3926 (Time)
event.xclient.data.l[1]);
3929 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3931 if (event.xclient.window == windows->widget.id)
3933 *reply_info.text=
'\0';
3939 case ConfigureNotify:
3944 if (event.xconfigure.window != windows->widget.id)
3946 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3947 (
event.xconfigure.height == (int) windows->widget.height))
3949 windows->widget.width=(
unsigned int)
3950 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3951 windows->widget.height=(
unsigned int)
3952 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3953 state|=UpdateConfigurationState;
3958 if (event.xcrossing.window != windows->widget.id)
3960 state&=(~InactiveWidgetState);
3965 if (event.xexpose.window != windows->widget.id)
3967 if (event.xexpose.count != 0)
3969 state|=RedrawWidgetState;
3975 command[MaxTextExtent];
3986 if (event.xkey.window != windows->widget.id)
3988 length=XLookupString((XKeyEvent *) &event.xkey,command,
3989 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3990 *(command+length)=
'\0';
3991 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3993 action_info.raised=MagickFalse;
3994 XDrawBeveledButton(display,&windows->widget,&action_info);
3998 if (key_symbol == XK_Control_L)
4000 state|=ControlState;
4003 if (state & ControlState)
4004 switch ((
int) key_symbol)
4012 *reply_info.text=
'\0';
4013 reply_info.cursor=reply_info.text;
4014 reply_info.marker=reply_info.text;
4015 reply_info.highlight=MagickFalse;
4021 XEditText(display,&reply_info,key_symbol,command,state);
4022 XDrawMatteText(display,&windows->widget,&reply_info);
4028 command[MaxTextExtent];
4036 if (event.xkey.window != windows->widget.id)
4038 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
4039 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
4040 if (key_symbol == XK_Control_L)
4041 state&=(~ControlState);
4046 if (event.xcrossing.window != windows->widget.id)
4048 state|=InactiveWidgetState;
4056 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
4057 if (state & InactiveWidgetState)
4059 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
4064 action_info.raised=action_info.raised == MagickFalse ?
4065 MagickTrue : MagickFalse;
4066 XDrawBeveledButton(display,&windows->widget,&action_info);
4069 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
4074 cancel_info.raised=cancel_info.raised == MagickFalse ?
4075 MagickTrue : MagickFalse;
4076 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4081 case SelectionClear:
4083 reply_info.highlight=MagickFalse;
4084 XDrawMatteText(display,&windows->widget,&reply_info);
4087 case SelectionNotify:
4105 if (event.xselection.property == (Atom) None)
4107 status=XGetWindowProperty(display,event.xselection.requestor,
4108 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
4109 &format,&length,&after,&data);
4110 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
4113 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
4114 (void) XBell(display,0);
4120 *(data+length)=
'\0';
4121 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
4123 XDrawMatteText(display,&windows->widget,&reply_info);
4125 (void) XFree((
void *) data);
4128 case SelectionRequest:
4133 XSelectionRequestEvent
4136 if (reply_info.highlight == MagickFalse)
4141 request=(&(
event.xselectionrequest));
4142 (void) XChangeProperty(request->display,request->requestor,
4143 request->property,request->target,8,PropModeReplace,
4144 (
unsigned char *) primary_selection,Extent(primary_selection));
4145 notify.type=SelectionNotify;
4146 notify.display=request->display;
4147 notify.requestor=request->requestor;
4148 notify.selection=request->selection;
4149 notify.target=request->target;
4150 notify.time=request->time;
4151 if (request->property == None)
4152 notify.property=request->target;
4154 notify.property=request->property;
4155 (void) XSendEvent(request->display,request->requestor,False,0,
4156 (XEvent *) ¬ify);
4161 }
while ((state & ExitState) == 0);
4162 XSetCursorState(display,windows,MagickFalse);
4163 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
4164 XCheckRefreshWindows(display,windows);
4166 if (special_info.raised)
4169 return(raised == MagickFalse);
4204 MagickExport
void XFileBrowserWidget(Display *display,XWindows *windows,
4205 const char *action,
char *reply)
4207 #define CancelButtonText "Cancel"
4208 #define DirectoryText "Directory:"
4209 #define FilenameText "File name:"
4210 #define GrabButtonText "Grab"
4211 #define FormatButtonText "Format"
4212 #define HomeButtonText "Home"
4213 #define UpButtonText "Up"
4218 home_directory[MaxTextExtent],
4219 primary_selection[MaxTextExtent],
4220 text[MaxTextExtent],
4221 working_path[MaxTextExtent];
4231 glob_pattern[MaxTextExtent] =
"*",
4232 format[MaxTextExtent] =
"miff";
4234 static MagickStatusType
4235 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
4283 assert(display != (Display *) NULL);
4284 assert(windows != (XWindows *) NULL);
4285 assert(action != (
char *) NULL);
4286 assert(reply != (
char *) NULL);
4287 if (IsEventLogging() != MagickFalse)
4288 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
4289 XSetCursorState(display,windows,MagickTrue);
4290 XCheckRefreshWindows(display,windows);
4291 directory=getcwd(home_directory,MaxTextExtent);
4293 (void) CopyMagickString(working_path,home_directory,MaxTextExtent);
4294 filelist=ListFiles(working_path,glob_pattern,&files);
4295 if (filelist == (
char **) NULL)
4300 XNoticeWidget(display,windows,
"Unable to read directory:",working_path);
4301 (void) XDialogWidget(display,windows,action,
"Enter filename:",reply);
4307 font_info=windows->widget.font_info;
4309 for (i=0; i < (ssize_t) files; i++)
4310 if (WidgetTextWidth(font_info,filelist[i]) > text_width)
4311 text_width=WidgetTextWidth(font_info,filelist[i]);
4312 width=WidgetTextWidth(font_info,(
char *) action);
4313 if (WidgetTextWidth(font_info,GrabButtonText) > width)
4314 width=WidgetTextWidth(font_info,GrabButtonText);
4315 if (WidgetTextWidth(font_info,FormatButtonText) > width)
4316 width=WidgetTextWidth(font_info,FormatButtonText);
4317 if (WidgetTextWidth(font_info,CancelButtonText) > width)
4318 width=WidgetTextWidth(font_info,CancelButtonText);
4319 if (WidgetTextWidth(font_info,HomeButtonText) > width)
4320 width=WidgetTextWidth(font_info,HomeButtonText);
4321 if (WidgetTextWidth(font_info,UpButtonText) > width)
4322 width=WidgetTextWidth(font_info,UpButtonText);
4323 width+=QuantumMargin;
4324 if (WidgetTextWidth(font_info,DirectoryText) > width)
4325 width=WidgetTextWidth(font_info,DirectoryText);
4326 if (WidgetTextWidth(font_info,FilenameText) > width)
4327 width=WidgetTextWidth(font_info,FilenameText);
4328 height=(
unsigned int) (font_info->ascent+font_info->descent);
4332 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
4334 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
4335 if (windows->widget.width < windows->widget.min_width)
4336 windows->widget.width=windows->widget.min_width;
4337 windows->widget.height=(
unsigned int)
4338 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
4339 windows->widget.min_height=(
unsigned int)
4340 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
4341 if (windows->widget.height < windows->widget.min_height)
4342 windows->widget.height=windows->widget.min_height;
4343 XConstrainWindowPosition(display,&windows->widget);
4347 (void) CopyMagickString(windows->widget.name,
"Browse and Select a File",
4349 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
4350 if (status != False)
4352 XSetWMName(display,windows->widget.id,&window_name);
4353 XSetWMIconName(display,windows->widget.id,&window_name);
4354 (void) XFree((
void *) window_name.value);
4356 window_changes.width=(int) windows->widget.width;
4357 window_changes.height=(
int) windows->widget.height;
4358 window_changes.x=windows->widget.x;
4359 window_changes.y=windows->widget.y;
4360 (void) XReconfigureWMWindow(display,windows->widget.id,
4361 windows->widget.screen,mask,&window_changes);
4362 (void) XMapRaised(display,windows->widget.id);
4363 windows->widget.mapped=MagickFalse;
4367 XGetWidgetInfo((
char *) NULL,&slider_info);
4368 XGetWidgetInfo((
char *) NULL,&north_info);
4369 XGetWidgetInfo((
char *) NULL,&south_info);
4370 XGetWidgetInfo((
char *) NULL,&expose_info);
4372 anomaly=(LocaleCompare(action,
"Composite") == 0) ||
4373 (LocaleCompare(action,
"Open") == 0) || (LocaleCompare(action,
"Map") == 0);
4374 delay=SuspendTime << 2;
4375 state=UpdateConfigurationState;
4378 if (state & UpdateConfigurationState)
4386 XGetWidgetInfo(CancelButtonText,&cancel_info);
4387 cancel_info.width=width;
4388 cancel_info.height=(
unsigned int) ((3*height) >> 1);
4390 (windows->widget.width-cancel_info.width-QuantumMargin-2);
4392 (windows->widget.height-cancel_info.height-QuantumMargin);
4393 XGetWidgetInfo(action,&action_info);
4394 action_info.width=width;
4395 action_info.height=(
unsigned int) ((3*height) >> 1);
4396 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
4397 (action_info.bevel_width << 1));
4398 action_info.y=cancel_info.y;
4399 XGetWidgetInfo(GrabButtonText,&special_info);
4400 special_info.width=width;
4401 special_info.height=(
unsigned int) ((3*height) >> 1);
4402 special_info.x=action_info.x-(action_info.width+(QuantumMargin >> 1)+
4403 (special_info.bevel_width << 1));
4404 special_info.y=action_info.y;
4405 if (anomaly == MagickFalse)
4410 special_info.text=(
char *) FormatButtonText;
4411 p=reply+Extent(reply)-1;
4412 while ((p > (reply+1)) && (*(p-1) !=
'.'))
4414 if ((p > (reply+1)) && (*(p-1) ==
'.'))
4415 (void) CopyMagickString(format,p,MaxTextExtent);
4417 XGetWidgetInfo(UpButtonText,&up_info);
4418 up_info.width=width;
4419 up_info.height=(
unsigned int) ((3*height) >> 1);
4420 up_info.x=QuantumMargin;
4421 up_info.y=((5*QuantumMargin) >> 1)+height;
4422 XGetWidgetInfo(HomeButtonText,&home_info);
4423 home_info.width=width;
4424 home_info.height=(
unsigned int) ((3*height) >> 1);
4425 home_info.x=QuantumMargin;
4426 home_info.y=up_info.y+up_info.height+QuantumMargin;
4430 XGetWidgetInfo(reply,&reply_info);
4431 reply_info.raised=MagickFalse;
4432 reply_info.bevel_width--;
4433 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
4434 reply_info.height=height << 1;
4435 reply_info.x=(int) (width+(QuantumMargin << 1));
4436 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
4440 XGetWidgetInfo((
char *) NULL,&scroll_info);
4441 scroll_info.bevel_width--;
4442 scroll_info.width=height;
4443 scroll_info.height=(
unsigned int)
4444 (reply_info.y-up_info.y-(QuantumMargin >> 1));
4445 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
4446 scroll_info.y=up_info.y-reply_info.bevel_width;
4447 scroll_info.raised=MagickFalse;
4448 scroll_info.trough=MagickTrue;
4449 north_info=scroll_info;
4450 north_info.raised=MagickTrue;
4451 north_info.width-=(north_info.bevel_width << 1);
4452 north_info.height=north_info.width-1;
4453 north_info.x+=north_info.bevel_width;
4454 north_info.y+=north_info.bevel_width;
4455 south_info=north_info;
4456 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
4459 slider_info=north_info;
4461 slider_info.width-=2;
4462 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
4463 slider_info.bevel_width+2;
4464 slider_info.height=scroll_info.height-((slider_info.min_y-
4465 scroll_info.y+1) << 1)+4;
4466 visible_files=(
unsigned int) (scroll_info.height*
4467 PerceptibleReciprocal((
double) height+(height >> 3)));
4468 if (files > visible_files)
4469 slider_info.height=(
unsigned int) ((visible_files*
4470 slider_info.height)/files);
4471 slider_info.max_y=south_info.y-south_info.bevel_width-
4472 slider_info.bevel_width-2;
4473 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
4474 slider_info.y=slider_info.min_y;
4475 expose_info=scroll_info;
4476 expose_info.y=slider_info.y;
4480 XGetWidgetInfo((
char *) NULL,&list_info);
4481 list_info.raised=MagickFalse;
4482 list_info.bevel_width--;
4483 list_info.width=(
unsigned int)
4484 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
4485 list_info.height=scroll_info.height;
4486 list_info.x=reply_info.x;
4487 list_info.y=scroll_info.y;
4488 if (windows->widget.mapped == MagickFalse)
4489 state|=JumpListState;
4494 XGetWidgetInfo(text,&text_info);
4495 text_info.center=MagickFalse;
4496 text_info.width=reply_info.width;
4497 text_info.height=height;
4498 text_info.x=list_info.x-(QuantumMargin >> 1);
4499 text_info.y=QuantumMargin;
4503 XGetWidgetInfo((
char *) NULL,&selection_info);
4504 selection_info.center=MagickFalse;
4505 selection_info.width=list_info.width;
4506 selection_info.height=(
unsigned int) ((9*height) >> 3);
4507 selection_info.x=list_info.x;
4508 state&=(~UpdateConfigurationState);
4510 if (state & RedrawWidgetState)
4516 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
4517 (void) XDrawString(display,windows->widget.id,
4518 windows->widget.annotate_context,x,y,DirectoryText,
4519 Extent(DirectoryText));
4520 (void) CopyMagickString(text_info.text,working_path,MaxTextExtent);
4521 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4523 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4525 XDrawWidgetText(display,&windows->widget,&text_info);
4526 XDrawBeveledButton(display,&windows->widget,&up_info);
4527 XDrawBeveledButton(display,&windows->widget,&home_info);
4528 XDrawBeveledMatte(display,&windows->widget,&list_info);
4529 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4530 XDrawTriangleNorth(display,&windows->widget,&north_info);
4531 XDrawBeveledButton(display,&windows->widget,&slider_info);
4532 XDrawTriangleSouth(display,&windows->widget,&south_info);
4534 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
4535 (void) XDrawString(display,windows->widget.id,
4536 windows->widget.annotate_context,x,y,FilenameText,
4537 Extent(FilenameText));
4538 XDrawBeveledMatte(display,&windows->widget,&reply_info);
4539 XDrawMatteText(display,&windows->widget,&reply_info);
4540 XDrawBeveledButton(display,&windows->widget,&special_info);
4541 XDrawBeveledButton(display,&windows->widget,&action_info);
4542 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4543 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4544 selection_info.id=(~0);
4545 state|=RedrawListState;
4546 state&=(~RedrawWidgetState);
4548 if (state & UpdateListState)
4559 checklist=ListFiles(working_path,glob_pattern,&number_files);
4560 if (checklist == (
char **) NULL)
4565 action_info.raised=MagickFalse;
4566 XDrawBeveledButton(display,&windows->widget,&action_info);
4569 for (i=0; i < (ssize_t) files; i++)
4570 filelist[i]=DestroyString(filelist[i]);
4571 if (filelist != (
char **) NULL)
4572 filelist=(
char **) RelinquishMagickMemory(filelist);
4579 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
4580 if (files > visible_files)
4581 slider_info.height=(
unsigned int)
4582 ((visible_files*slider_info.height)/files);
4583 slider_info.max_y=south_info.y-south_info.bevel_width-
4584 slider_info.bevel_width-2;
4586 slider_info.y=slider_info.min_y;
4587 expose_info.y=slider_info.y;
4588 selection_info.id=(~0);
4590 state|=RedrawListState;
4594 if (IsGlob(reply_info.text) == MagickFalse)
4596 *reply_info.text=
'\0';
4597 reply_info.cursor=reply_info.text;
4599 (void) CopyMagickString(text_info.text,working_path,MaxTextExtent);
4600 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4602 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4604 XDrawWidgetText(display,&windows->widget,&text_info);
4605 XDrawMatteText(display,&windows->widget,&reply_info);
4606 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4607 XDrawTriangleNorth(display,&windows->widget,&north_info);
4608 XDrawBeveledButton(display,&windows->widget,&slider_info);
4609 XDrawTriangleSouth(display,&windows->widget,&south_info);
4610 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4611 state&=(~UpdateListState);
4613 if (state & JumpListState)
4619 for (i=0; i < (ssize_t) files; i++)
4620 if (LocaleCompare(filelist[i],reply) >= 0)
4623 (LocaleCompare(filelist[i],reply) == 0 ? i : ~0);
4626 if ((i < (ssize_t) slider_info.id) ||
4627 (i >= (ssize_t) (slider_info.id+visible_files)))
4628 slider_info.id=(
int) i-(visible_files >> 1);
4629 selection_info.id=(~0);
4630 state|=RedrawListState;
4631 state&=(~JumpListState);
4633 if (state & RedrawListState)
4638 if (slider_info.id >= (
int) (files-visible_files))
4639 slider_info.id=(int) (files-visible_files);
4640 if ((slider_info.id < 0) || (files <= visible_files))
4642 slider_info.y=slider_info.min_y;
4644 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
4645 slider_info.min_y+1)/files);
4646 if (slider_info.id != selection_info.id)
4651 selection_info.id=slider_info.id;
4652 selection_info.y=list_info.y+(height >> 3)+2;
4653 for (i=0; i < (ssize_t) visible_files; i++)
4655 selection_info.raised=(int) (slider_info.id+i) != list_info.id ?
4656 MagickTrue : MagickFalse;
4657 selection_info.text=(
char *) NULL;
4658 if ((slider_info.id+i) < (ssize_t) files)
4659 selection_info.text=filelist[slider_info.id+i];
4660 XDrawWidgetText(display,&windows->widget,&selection_info);
4661 selection_info.y+=(int) selection_info.height;
4666 if (slider_info.y > expose_info.y)
4668 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
4669 expose_info.y=slider_info.y-expose_info.height-
4670 slider_info.bevel_width-1;
4674 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
4675 expose_info.y=slider_info.y+slider_info.height+
4676 slider_info.bevel_width+1;
4678 XDrawTriangleNorth(display,&windows->widget,&north_info);
4679 XDrawMatte(display,&windows->widget,&expose_info);
4680 XDrawBeveledButton(display,&windows->widget,&slider_info);
4681 XDrawTriangleSouth(display,&windows->widget,&south_info);
4682 expose_info.y=slider_info.y;
4684 state&=(~RedrawListState);
4689 if (north_info.raised && south_info.raised)
4690 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
4696 XDelay(display,delay);
4698 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
4699 if (north_info.raised == MagickFalse)
4700 if (slider_info.id > 0)
4706 state|=RedrawListState;
4708 if (south_info.raised == MagickFalse)
4709 if (slider_info.id < (
int) files)
4715 state|=RedrawListState;
4717 if (event.type != ButtonRelease)
4724 if (MatteIsActive(slider_info,event.xbutton))
4729 slider_info.active=MagickTrue;
4732 if (MatteIsActive(north_info,event.xbutton))
4733 if (slider_info.id > 0)
4738 north_info.raised=MagickFalse;
4740 state|=RedrawListState;
4743 if (MatteIsActive(south_info,event.xbutton))
4744 if (slider_info.id < (
int) files)
4749 south_info.raised=MagickFalse;
4751 state|=RedrawListState;
4754 if (MatteIsActive(scroll_info,event.xbutton))
4759 if (event.xbutton.y < slider_info.y)
4760 slider_info.id-=(visible_files-1);
4762 slider_info.id+=(visible_files-1);
4763 state|=RedrawListState;
4766 if (MatteIsActive(list_info,event.xbutton))
4774 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
4775 selection_info.height;
4776 if (
id >= (
int) files)
4778 (void) CopyMagickString(reply_info.text,filelist[
id],MaxTextExtent);
4779 reply_info.highlight=MagickFalse;
4780 reply_info.marker=reply_info.text;
4781 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4782 XDrawMatteText(display,&windows->widget,&reply_info);
4783 if (
id == list_info.id)
4788 p=reply_info.text+strlen(reply_info.text)-1;
4789 if (*p == *DirectorySeparator)
4790 ChopPathComponents(reply_info.text,1);
4791 (void) ConcatenateMagickString(working_path,DirectorySeparator,
4793 (void) ConcatenateMagickString(working_path,reply_info.text,
4796 state|=UpdateListState;
4798 selection_info.id=(~0);
4800 state|=RedrawListState;
4803 if (MatteIsActive(up_info,event.xbutton))
4808 up_info.raised=MagickFalse;
4809 XDrawBeveledButton(display,&windows->widget,&up_info);
4812 if (MatteIsActive(home_info,event.xbutton))
4817 home_info.raised=MagickFalse;
4818 XDrawBeveledButton(display,&windows->widget,&home_info);
4821 if (MatteIsActive(special_info,event.xbutton))
4826 special_info.raised=MagickFalse;
4827 XDrawBeveledButton(display,&windows->widget,&special_info);
4830 if (MatteIsActive(action_info,event.xbutton))
4835 action_info.raised=MagickFalse;
4836 XDrawBeveledButton(display,&windows->widget,&action_info);
4839 if (MatteIsActive(cancel_info,event.xbutton))
4844 cancel_info.raised=MagickFalse;
4845 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4848 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
4850 if (event.xbutton.button != Button2)
4858 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
4859 for (i=1; i <= (ssize_t) Extent(reply_info.marker); i++)
4860 if (XTextWidth(font_info,reply_info.marker,(
int) i) > x)
4862 reply_info.cursor=reply_info.marker+i-1;
4863 if (event.xbutton.time > (click_time+DoubleClick))
4864 reply_info.highlight=MagickFalse;
4870 (
void) CopyMagickString(primary_selection,reply_info.text,
4872 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
4873 event.xbutton.time);
4874 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
4875 windows->widget.id ? MagickTrue : MagickFalse;
4877 XDrawMatteText(display,&windows->widget,&reply_info);
4878 click_time=
event.xbutton.time;
4884 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
4885 windows->widget.id,event.xbutton.time);
4890 if (windows->widget.mapped == MagickFalse)
4892 if (north_info.raised == MagickFalse)
4897 delay=SuspendTime << 2;
4898 north_info.raised=MagickTrue;
4899 XDrawTriangleNorth(display,&windows->widget,&north_info);
4901 if (south_info.raised == MagickFalse)
4906 delay=SuspendTime << 2;
4907 south_info.raised=MagickTrue;
4908 XDrawTriangleSouth(display,&windows->widget,&south_info);
4910 if (slider_info.active)
4915 slider_info.active=MagickFalse;
4918 if (up_info.raised == MagickFalse)
4920 if (event.xbutton.window == windows->widget.id)
4921 if (MatteIsActive(up_info,event.xbutton))
4923 ChopPathComponents(working_path,1);
4924 if (*working_path ==
'\0')
4925 (void) CopyMagickString(working_path,DirectorySeparator,
4927 state|=UpdateListState;
4929 up_info.raised=MagickTrue;
4930 XDrawBeveledButton(display,&windows->widget,&up_info);
4932 if (home_info.raised == MagickFalse)
4934 if (event.xbutton.window == windows->widget.id)
4935 if (MatteIsActive(home_info,event.xbutton))
4937 (void) CopyMagickString(working_path,home_directory,
4939 state|=UpdateListState;
4941 home_info.raised=MagickTrue;
4942 XDrawBeveledButton(display,&windows->widget,&home_info);
4944 if (special_info.raised == MagickFalse)
4946 if (anomaly == MagickFalse)
4960 exception=AcquireExceptionInfo();
4961 formats=GetMagickList(
"*",&number_formats,exception);
4962 exception=DestroyExceptionInfo(exception);
4963 if (formats == (
char **) NULL)
4965 (void) XCheckDefineCursor(display,windows->widget.id,
4966 windows->widget.busy_cursor);
4967 windows->popup.x=windows->widget.x+60;
4968 windows->popup.y=windows->widget.y+60;
4969 XListBrowserWidget(display,windows,&windows->popup,
4970 (
const char **) formats,
"Select",
"Select image format type:",
4972 XSetCursorState(display,windows,MagickTrue);
4973 (void) XCheckDefineCursor(display,windows->widget.id,
4974 windows->widget.cursor);
4975 LocaleLower(format);
4976 AppendImageFormat(format,reply_info.text);
4977 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4978 XDrawMatteText(display,&windows->widget,&reply_info);
4979 special_info.raised=MagickTrue;
4980 XDrawBeveledButton(display,&windows->widget,&special_info);
4981 for (i=0; i < (ssize_t) number_formats; i++)
4982 formats[i]=DestroyString(formats[i]);
4983 formats=(
char **) RelinquishMagickMemory(formats);
4986 if (event.xbutton.window == windows->widget.id)
4987 if (MatteIsActive(special_info,event.xbutton))
4989 (void) CopyMagickString(working_path,
"x:",MaxTextExtent);
4992 special_info.raised=MagickTrue;
4993 XDrawBeveledButton(display,&windows->widget,&special_info);
4995 if (action_info.raised == MagickFalse)
4997 if (event.xbutton.window == windows->widget.id)
4999 if (MatteIsActive(action_info,event.xbutton))
5001 if (*reply_info.text ==
'\0')
5002 (void) XBell(display,0);
5007 action_info.raised=MagickTrue;
5008 XDrawBeveledButton(display,&windows->widget,&action_info);
5010 if (cancel_info.raised == MagickFalse)
5012 if (event.xbutton.window == windows->widget.id)
5013 if (MatteIsActive(cancel_info,event.xbutton))
5015 *reply_info.text=
'\0';
5019 cancel_info.raised=MagickTrue;
5020 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5029 if (event.xclient.message_type != windows->wm_protocols)
5031 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
5033 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
5034 (Time)
event.xclient.data.l[1]);
5037 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
5039 if (event.xclient.window == windows->widget.id)
5041 *reply_info.text=
'\0';
5047 case ConfigureNotify:
5052 if (event.xconfigure.window != windows->widget.id)
5054 if ((event.xconfigure.width == (
int) windows->widget.width) &&
5055 (
event.xconfigure.height == (int) windows->widget.height))
5057 windows->widget.width=(
unsigned int)
5058 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
5059 windows->widget.height=(
unsigned int)
5060 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
5061 state|=UpdateConfigurationState;
5066 if (event.xcrossing.window != windows->widget.id)
5068 state&=(~InactiveWidgetState);
5073 if (event.xexpose.window != windows->widget.id)
5075 if (event.xexpose.count != 0)
5077 state|=RedrawWidgetState;
5083 command[MaxTextExtent];
5094 if (event.xkey.window != windows->widget.id)
5096 length=XLookupString((XKeyEvent *) &event.xkey,command,
5097 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5098 *(command+length)=
'\0';
5099 if (AreaIsActive(scroll_info,event.xkey))
5104 switch ((
int) key_symbol)
5127 slider_info.id-=visible_files;
5133 slider_info.id+=visible_files;
5139 slider_info.id=(int) files;
5143 state|=RedrawListState;
5146 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
5151 if (*reply_info.text ==
'\0')
5153 if (IsGlob(reply_info.text))
5154 (
void) CopyMagickString(glob_pattern,reply_info.text,
5158 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5160 (void) ConcatenateMagickString(working_path,reply_info.text,
5162 if (*working_path ==
'~')
5163 ExpandFilename(working_path);
5166 state|=UpdateListState;
5169 if (key_symbol == XK_Control_L)
5171 state|=ControlState;
5174 if (state & ControlState)
5175 switch ((
int) key_symbol)
5183 *reply_info.text=
'\0';
5184 reply_info.cursor=reply_info.text;
5185 reply_info.marker=reply_info.text;
5186 reply_info.highlight=MagickFalse;
5192 XEditText(display,&reply_info,key_symbol,command,state);
5193 XDrawMatteText(display,&windows->widget,&reply_info);
5194 state|=JumpListState;
5200 command[MaxTextExtent];
5208 if (event.xkey.window != windows->widget.id)
5210 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
5211 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5212 if (key_symbol == XK_Control_L)
5213 state&=(~ControlState);
5218 if (event.xcrossing.window != windows->widget.id)
5220 state|=InactiveWidgetState;
5234 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
5235 if (slider_info.active)
5240 slider_info.y=
event.xmotion.y-
5241 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
5242 if (slider_info.y < slider_info.min_y)
5243 slider_info.y=slider_info.min_y;
5244 if (slider_info.y > slider_info.max_y)
5245 slider_info.y=slider_info.max_y;
5247 if (slider_info.y != slider_info.min_y)
5248 slider_info.id=(int) ((files*(slider_info.y-slider_info.min_y+1))/
5249 (slider_info.max_y-slider_info.min_y+1));
5250 state|=RedrawListState;
5253 if (state & InactiveWidgetState)
5255 if (up_info.raised == MatteIsActive(up_info,event.xmotion))
5260 up_info.raised=!up_info.raised;
5261 XDrawBeveledButton(display,&windows->widget,&up_info);
5264 if (home_info.raised == MatteIsActive(home_info,event.xmotion))
5269 home_info.raised=!home_info.raised;
5270 XDrawBeveledButton(display,&windows->widget,&home_info);
5273 if (special_info.raised == MatteIsActive(special_info,event.xmotion))
5278 special_info.raised=!special_info.raised;
5279 XDrawBeveledButton(display,&windows->widget,&special_info);
5282 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
5287 action_info.raised=action_info.raised == MagickFalse ?
5288 MagickTrue : MagickFalse;
5289 XDrawBeveledButton(display,&windows->widget,&action_info);
5292 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
5297 cancel_info.raised=cancel_info.raised == MagickFalse ?
5298 MagickTrue : MagickFalse;
5299 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5304 case SelectionClear:
5306 reply_info.highlight=MagickFalse;
5307 XDrawMatteText(display,&windows->widget,&reply_info);
5310 case SelectionNotify:
5328 if (event.xselection.property == (Atom) None)
5330 status=XGetWindowProperty(display,event.xselection.requestor,
5331 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
5332 &format,&length,&after,&data);
5333 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
5336 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
5337 (void) XBell(display,0);
5343 *(data+length)=
'\0';
5344 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
5346 XDrawMatteText(display,&windows->widget,&reply_info);
5347 state|=JumpListState;
5348 state|=RedrawActionState;
5350 (void) XFree((
void *) data);
5353 case SelectionRequest:
5358 XSelectionRequestEvent
5361 if (reply_info.highlight == MagickFalse)
5366 request=(&(
event.xselectionrequest));
5367 (void) XChangeProperty(request->display,request->requestor,
5368 request->property,request->target,8,PropModeReplace,
5369 (
unsigned char *) primary_selection,Extent(primary_selection));
5370 notify.type=SelectionNotify;
5371 notify.display=request->display;
5372 notify.requestor=request->requestor;
5373 notify.selection=request->selection;
5374 notify.target=request->target;
5375 notify.time=request->time;
5376 if (request->property == None)
5377 notify.property=request->target;
5379 notify.property=request->property;
5380 (void) XSendEvent(request->display,request->requestor,False,0,
5381 (XEvent *) ¬ify);
5386 }
while ((state & ExitState) == 0);
5387 XSetCursorState(display,windows,MagickFalse);
5388 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
5389 XCheckRefreshWindows(display,windows);
5393 for (i=0; i < (ssize_t) files; i++)
5394 filelist[i]=DestroyString(filelist[i]);
5395 if (filelist != (
char **) NULL)
5396 filelist=(
char **) RelinquishMagickMemory(filelist);
5399 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5401 (void) ConcatenateMagickString(working_path,reply,MaxTextExtent);
5403 (void) CopyMagickString(reply,working_path,MaxTextExtent);
5405 ExpandFilename(reply);
5442 #if defined(__cplusplus) || defined(c_plusplus)
5446 static int FontCompare(
const void *x,
const void *y)
5452 p=(
char *) *((
char **) x);
5453 q=(
char *) *((
char **) y);
5454 while ((*p !=
'\0') && (*q !=
'\0') && (*p == *q))
5462 #if defined(__cplusplus) || defined(c_plusplus)
5466 MagickExport
void XFontBrowserWidget(Display *display,XWindows *windows,
5467 const char *action,
char *reply)
5469 #define BackButtonText "Back"
5470 #define CancelButtonText "Cancel"
5471 #define FontnameText "Name:"
5472 #define FontPatternText "Pattern:"
5473 #define ResetButtonText "Reset"
5476 back_pattern[MaxTextExtent] =
"",
5479 primary_selection[MaxTextExtent] =
"",
5480 reset_pattern[MaxTextExtent] =
"",
5481 text[MaxTextExtent] =
"";
5492 glob_pattern[MaxTextExtent] =
"*";
5494 static MagickStatusType
5495 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
5541 assert(display != (Display *) NULL);
5542 assert(windows != (XWindows *) NULL);
5543 assert(action != (
char *) NULL);
5544 assert(reply != (
char *) NULL);
5545 if (IsEventLogging() != MagickFalse)
5546 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
5547 XSetCursorState(display,windows,MagickTrue);
5548 XCheckRefreshWindows(display,windows);
5549 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
5550 (void) CopyMagickString(reset_pattern,
"*",MaxTextExtent);
5551 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5557 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5559 (void) CopyMagickString(glob_pattern,
"*",MaxTextExtent);
5560 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5561 if (fontlist == (
char **) NULL)
5563 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5572 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
sizeof(*fontlist));
5573 if (fontlist == (
char **) NULL)
5575 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5576 "UnableToViewFonts");
5579 for (i=0; i < fonts; i++)
5580 fontlist[i]=listhead[i];
5581 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5585 font_info=windows->widget.font_info;
5587 for (i=0; i < fonts; i++)
5588 if (WidgetTextWidth(font_info,fontlist[i]) > text_width)
5589 text_width=WidgetTextWidth(font_info,fontlist[i]);
5590 width=WidgetTextWidth(font_info,(
char *) action);
5591 if (WidgetTextWidth(font_info,CancelButtonText) > width)
5592 width=WidgetTextWidth(font_info,CancelButtonText);
5593 if (WidgetTextWidth(font_info,ResetButtonText) > width)
5594 width=WidgetTextWidth(font_info,ResetButtonText);
5595 if (WidgetTextWidth(font_info,BackButtonText) > width)
5596 width=WidgetTextWidth(font_info,BackButtonText);
5597 width+=QuantumMargin;
5598 if (WidgetTextWidth(font_info,FontPatternText) > width)
5599 width=WidgetTextWidth(font_info,FontPatternText);
5600 if (WidgetTextWidth(font_info,FontnameText) > width)
5601 width=WidgetTextWidth(font_info,FontnameText);
5602 height=(
unsigned int) (font_info->ascent+font_info->descent);
5606 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
5608 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
5609 if (windows->widget.width < windows->widget.min_width)
5610 windows->widget.width=windows->widget.min_width;
5611 windows->widget.height=(
unsigned int)
5612 (((85*height) >> 2)+((13*QuantumMargin) >> 1)+4);
5613 windows->widget.min_height=(
unsigned int)
5614 (((27*height) >> 1)+((13*QuantumMargin) >> 1)+4);
5615 if (windows->widget.height < windows->widget.min_height)
5616 windows->widget.height=windows->widget.min_height;
5617 XConstrainWindowPosition(display,&windows->widget);
5621 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Font",
5623 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
5624 if (status != False)
5626 XSetWMName(display,windows->widget.id,&window_name);
5627 XSetWMIconName(display,windows->widget.id,&window_name);
5628 (void) XFree((
void *) window_name.value);
5630 window_changes.width=(int) windows->widget.width;
5631 window_changes.height=(
int) windows->widget.height;
5632 window_changes.x=windows->widget.x;
5633 window_changes.y=windows->widget.y;
5634 (void) XReconfigureWMWindow(display,windows->widget.id,
5635 windows->widget.screen,mask,&window_changes);
5636 (void) XMapRaised(display,windows->widget.id);
5637 windows->widget.mapped=MagickFalse;
5641 XGetWidgetInfo((
char *) NULL,&slider_info);
5642 XGetWidgetInfo((
char *) NULL,&north_info);
5643 XGetWidgetInfo((
char *) NULL,&south_info);
5644 XGetWidgetInfo((
char *) NULL,&expose_info);
5645 XGetWidgetInfo((
char *) NULL,&selection_info);
5647 delay=SuspendTime << 2;
5648 state=UpdateConfigurationState;
5651 if (state & UpdateConfigurationState)
5659 XGetWidgetInfo(CancelButtonText,&cancel_info);
5660 cancel_info.width=width;
5661 cancel_info.height=(
unsigned int) ((3*height) >> 1);
5663 (windows->widget.width-cancel_info.width-QuantumMargin-2);
5665 (windows->widget.height-cancel_info.height-QuantumMargin);
5666 XGetWidgetInfo(action,&action_info);
5667 action_info.width=width;
5668 action_info.height=(
unsigned int) ((3*height) >> 1);
5669 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
5670 (action_info.bevel_width << 1));
5671 action_info.y=cancel_info.y;
5672 XGetWidgetInfo(BackButtonText,&back_info);
5673 back_info.width=width;
5674 back_info.height=(
unsigned int) ((3*height) >> 1);
5675 back_info.x=QuantumMargin;
5676 back_info.y=((5*QuantumMargin) >> 1)+height;
5677 XGetWidgetInfo(ResetButtonText,&reset_info);
5678 reset_info.width=width;
5679 reset_info.height=(
unsigned int) ((3*height) >> 1);
5680 reset_info.x=QuantumMargin;
5681 reset_info.y=back_info.y+back_info.height+QuantumMargin;
5685 XGetWidgetInfo(reply,&reply_info);
5686 reply_info.raised=MagickFalse;
5687 reply_info.bevel_width--;
5688 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
5689 reply_info.height=height << 1;
5690 reply_info.x=(int) (width+(QuantumMargin << 1));
5691 reply_info.y=action_info.y-(action_info.height << 1)-QuantumMargin;
5695 XGetWidgetInfo(reply,&mode_info);
5696 mode_info.bevel_width=0;
5697 mode_info.width=(
unsigned int)
5698 (action_info.x-reply_info.x-QuantumMargin);
5699 mode_info.height=action_info.height << 1;
5700 mode_info.x=reply_info.x;
5701 mode_info.y=action_info.y-action_info.height+action_info.bevel_width;
5705 XGetWidgetInfo((
char *) NULL,&scroll_info);
5706 scroll_info.bevel_width--;
5707 scroll_info.width=height;
5708 scroll_info.height=(
unsigned int)
5709 (reply_info.y-back_info.y-(QuantumMargin >> 1));
5710 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
5711 scroll_info.y=back_info.y-reply_info.bevel_width;
5712 scroll_info.raised=MagickFalse;
5713 scroll_info.trough=MagickTrue;
5714 north_info=scroll_info;
5715 north_info.raised=MagickTrue;
5716 north_info.width-=(north_info.bevel_width << 1);
5717 north_info.height=north_info.width-1;
5718 north_info.x+=north_info.bevel_width;
5719 north_info.y+=north_info.bevel_width;
5720 south_info=north_info;
5721 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
5724 slider_info=north_info;
5726 slider_info.width-=2;
5727 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
5728 slider_info.bevel_width+2;
5729 slider_info.height=scroll_info.height-((slider_info.min_y-
5730 scroll_info.y+1) << 1)+4;
5731 visible_fonts=(
unsigned int) (scroll_info.height*
5732 PerceptibleReciprocal((
double) height+(height >> 3)));
5733 if (fonts > (
int) visible_fonts)
5734 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5735 slider_info.max_y=south_info.y-south_info.bevel_width-
5736 slider_info.bevel_width-2;
5737 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
5738 slider_info.y=slider_info.min_y;
5739 expose_info=scroll_info;
5740 expose_info.y=slider_info.y;
5744 XGetWidgetInfo((
char *) NULL,&list_info);
5745 list_info.raised=MagickFalse;
5746 list_info.bevel_width--;
5747 list_info.width=(
unsigned int)
5748 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
5749 list_info.height=scroll_info.height;
5750 list_info.x=reply_info.x;
5751 list_info.y=scroll_info.y;
5752 if (windows->widget.mapped == MagickFalse)
5753 state|=JumpListState;
5758 XGetWidgetInfo(text,&text_info);
5759 text_info.center=MagickFalse;
5760 text_info.width=reply_info.width;
5761 text_info.height=height;
5762 text_info.x=list_info.x-(QuantumMargin >> 1);
5763 text_info.y=QuantumMargin;
5767 XGetWidgetInfo((
char *) NULL,&selection_info);
5768 selection_info.center=MagickFalse;
5769 selection_info.width=list_info.width;
5770 selection_info.height=(
unsigned int) ((9*height) >> 3);
5771 selection_info.x=list_info.x;
5772 state&=(~UpdateConfigurationState);
5774 if (state & RedrawWidgetState)
5780 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
5781 (void) XDrawString(display,windows->widget.id,
5782 windows->widget.annotate_context,x,y,FontPatternText,
5783 Extent(FontPatternText));
5784 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
5785 XDrawWidgetText(display,&windows->widget,&text_info);
5786 XDrawBeveledButton(display,&windows->widget,&back_info);
5787 XDrawBeveledButton(display,&windows->widget,&reset_info);
5788 XDrawBeveledMatte(display,&windows->widget,&list_info);
5789 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5790 XDrawTriangleNorth(display,&windows->widget,&north_info);
5791 XDrawBeveledButton(display,&windows->widget,&slider_info);
5792 XDrawTriangleSouth(display,&windows->widget,&south_info);
5794 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
5795 (void) XDrawString(display,windows->widget.id,
5796 windows->widget.annotate_context,x,y,FontnameText,
5797 Extent(FontnameText));
5798 XDrawBeveledMatte(display,&windows->widget,&reply_info);
5799 XDrawMatteText(display,&windows->widget,&reply_info);
5800 XDrawBeveledButton(display,&windows->widget,&action_info);
5801 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5802 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5803 selection_info.id=(~0);
5804 state|=RedrawActionState;
5805 state|=RedrawListState;
5806 state&=(~RedrawWidgetState);
5808 if (state & UpdateListState)
5819 checklist=XListFonts(display,glob_pattern,32767,&number_fonts);
5820 if (checklist == (
char **) NULL)
5822 if ((strchr(glob_pattern,
'*') == (
char *) NULL) &&
5823 (strchr(glob_pattern,
'?') == (
char *) NULL))
5828 (void) CopyMagickString(reply,glob_pattern,MaxTextExtent);
5829 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5830 action_info.raised=MagickFalse;
5831 XDrawBeveledButton(display,&windows->widget,&action_info);
5834 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5835 (void) XBell(display,0);
5838 if (number_fonts == 1)
5843 (void) CopyMagickString(reply,checklist[0],MaxTextExtent);
5844 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5845 (void) XFreeFontNames(checklist);
5846 action_info.raised=MagickFalse;
5847 XDrawBeveledButton(display,&windows->widget,&action_info);
5852 (void) XFreeFontNames(listhead);
5853 fontlist=(
char **) RelinquishMagickMemory(fontlist);
5861 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
5863 if (fontlist == (
char **) NULL)
5865 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5866 "UnableToViewFonts");
5869 for (i=0; i < fonts; i++)
5870 fontlist[i]=listhead[i];
5871 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5873 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
5874 if (fonts > (
int) visible_fonts)
5875 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5876 slider_info.max_y=south_info.y-south_info.bevel_width-
5877 slider_info.bevel_width-2;
5879 slider_info.y=slider_info.min_y;
5880 expose_info.y=slider_info.y;
5881 selection_info.id=(~0);
5883 state|=RedrawListState;
5887 *reply_info.text=
'\0';
5888 reply_info.cursor=reply_info.text;
5889 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
5890 XDrawWidgetText(display,&windows->widget,&text_info);
5891 XDrawMatteText(display,&windows->widget,&reply_info);
5892 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5893 XDrawTriangleNorth(display,&windows->widget,&north_info);
5894 XDrawBeveledButton(display,&windows->widget,&slider_info);
5895 XDrawTriangleSouth(display,&windows->widget,&south_info);
5896 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5897 state&=(~UpdateListState);
5899 if (state & JumpListState)
5905 for (i=0; i < fonts; i++)
5906 if (LocaleCompare(fontlist[i],reply) >= 0)
5908 list_info.id=LocaleCompare(fontlist[i],reply) == 0 ? i : ~0;
5911 if ((i < slider_info.id) || (i >= (
int) (slider_info.id+visible_fonts)))
5912 slider_info.id=i-(visible_fonts >> 1);
5913 selection_info.id=(~0);
5914 state|=RedrawListState;
5915 state&=(~JumpListState);
5917 if (state & RedrawListState)
5922 if (slider_info.id >= (
int) (fonts-visible_fonts))
5923 slider_info.id=fonts-visible_fonts;
5924 if ((slider_info.id < 0) || (fonts <= (int) visible_fonts))
5926 slider_info.y=slider_info.min_y;
5929 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/fonts;
5930 if (slider_info.id != selection_info.id)
5935 selection_info.id=slider_info.id;
5936 selection_info.y=list_info.y+(height >> 3)+2;
5937 for (i=0; i < (int) visible_fonts; i++)
5939 selection_info.raised=(slider_info.id+i) != list_info.id ?
5940 MagickTrue : MagickFalse;
5941 selection_info.text=(
char *) NULL;
5942 if ((slider_info.id+i) < fonts)
5943 selection_info.text=fontlist[slider_info.id+i];
5944 XDrawWidgetText(display,&windows->widget,&selection_info);
5945 selection_info.y+=(int) selection_info.height;
5950 if (slider_info.y > expose_info.y)
5952 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
5953 expose_info.y=slider_info.y-expose_info.height-
5954 slider_info.bevel_width-1;
5958 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
5959 expose_info.y=slider_info.y+slider_info.height+
5960 slider_info.bevel_width+1;
5962 XDrawTriangleNorth(display,&windows->widget,&north_info);
5963 XDrawMatte(display,&windows->widget,&expose_info);
5964 XDrawBeveledButton(display,&windows->widget,&slider_info);
5965 XDrawTriangleSouth(display,&windows->widget,&south_info);
5966 expose_info.y=slider_info.y;
5968 state&=(~RedrawListState);
5970 if (state & RedrawActionState)
5978 save_info=windows->widget.font_info;
5979 font_info=XLoadQueryFont(display,reply_info.text);
5980 if (font_info != (XFontStruct *) NULL)
5982 windows->widget.font_info=font_info;
5983 (void) XSetFont(display,windows->widget.widget_context,
5986 XDrawBeveledButton(display,&windows->widget,&mode_info);
5987 windows->widget.font_info=save_info;
5988 if (font_info != (XFontStruct *) NULL)
5990 (void) XSetFont(display,windows->widget.widget_context,
5991 windows->widget.font_info->fid);
5992 (void) XFreeFont(display,font_info);
5994 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5995 XDrawMatteText(display,&windows->widget,&reply_info);
5996 state&=(~RedrawActionState);
6001 if (north_info.raised && south_info.raised)
6002 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
6008 XDelay(display,delay);
6010 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
6011 if (north_info.raised == MagickFalse)
6012 if (slider_info.id > 0)
6018 state|=RedrawListState;
6020 if (south_info.raised == MagickFalse)
6021 if (slider_info.id < fonts)
6027 state|=RedrawListState;
6029 if (event.type != ButtonRelease)
6036 if (MatteIsActive(slider_info,event.xbutton))
6041 slider_info.active=MagickTrue;
6044 if (MatteIsActive(north_info,event.xbutton))
6045 if (slider_info.id > 0)
6050 north_info.raised=MagickFalse;
6052 state|=RedrawListState;
6055 if (MatteIsActive(south_info,event.xbutton))
6056 if (slider_info.id < fonts)
6061 south_info.raised=MagickFalse;
6063 state|=RedrawListState;
6066 if (MatteIsActive(scroll_info,event.xbutton))
6071 if (event.xbutton.y < slider_info.y)
6072 slider_info.id-=(visible_fonts-1);
6074 slider_info.id+=(visible_fonts-1);
6075 state|=RedrawListState;
6078 if (MatteIsActive(list_info,event.xbutton))
6086 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
6087 selection_info.height;
6088 if (
id >= (
int) fonts)
6090 (void) CopyMagickString(reply_info.text,fontlist[
id],MaxTextExtent);
6091 reply_info.highlight=MagickFalse;
6092 reply_info.marker=reply_info.text;
6093 reply_info.cursor=reply_info.text+Extent(reply_info.text);
6094 XDrawMatteText(display,&windows->widget,&reply_info);
6095 state|=RedrawActionState;
6096 if (
id == list_info.id)
6098 (void) CopyMagickString(glob_pattern,reply_info.text,
6100 state|=UpdateListState;
6102 selection_info.id=(~0);
6104 state|=RedrawListState;
6107 if (MatteIsActive(back_info,event.xbutton))
6112 back_info.raised=MagickFalse;
6113 XDrawBeveledButton(display,&windows->widget,&back_info);
6116 if (MatteIsActive(reset_info,event.xbutton))
6121 reset_info.raised=MagickFalse;
6122 XDrawBeveledButton(display,&windows->widget,&reset_info);
6125 if (MatteIsActive(action_info,event.xbutton))
6130 action_info.raised=MagickFalse;
6131 XDrawBeveledButton(display,&windows->widget,&action_info);
6134 if (MatteIsActive(cancel_info,event.xbutton))
6139 cancel_info.raised=MagickFalse;
6140 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6143 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
6145 if (event.xbutton.button != Button2)
6153 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
6154 for (i=1; i <= Extent(reply_info.marker); i++)
6155 if (XTextWidth(font_info,reply_info.marker,i) > x)
6157 reply_info.cursor=reply_info.marker+i-1;
6158 if (event.xbutton.time > (click_time+DoubleClick))
6159 reply_info.highlight=MagickFalse;
6165 (
void) CopyMagickString(primary_selection,reply_info.text,
6167 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
6168 event.xbutton.time);
6169 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
6170 windows->widget.id ? MagickTrue : MagickFalse;
6172 XDrawMatteText(display,&windows->widget,&reply_info);
6173 click_time=
event.xbutton.time;
6179 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
6180 windows->widget.id,event.xbutton.time);
6185 if (windows->widget.mapped == MagickFalse)
6187 if (north_info.raised == MagickFalse)
6192 delay=SuspendTime << 2;
6193 north_info.raised=MagickTrue;
6194 XDrawTriangleNorth(display,&windows->widget,&north_info);
6196 if (south_info.raised == MagickFalse)
6201 delay=SuspendTime << 2;
6202 south_info.raised=MagickTrue;
6203 XDrawTriangleSouth(display,&windows->widget,&south_info);
6205 if (slider_info.active)
6210 slider_info.active=MagickFalse;
6213 if (back_info.raised == MagickFalse)
6215 if (event.xbutton.window == windows->widget.id)
6216 if (MatteIsActive(back_info,event.xbutton))
6218 (void) CopyMagickString(glob_pattern,back_pattern,
6220 state|=UpdateListState;
6222 back_info.raised=MagickTrue;
6223 XDrawBeveledButton(display,&windows->widget,&back_info);
6225 if (reset_info.raised == MagickFalse)
6227 if (event.xbutton.window == windows->widget.id)
6228 if (MatteIsActive(reset_info,event.xbutton))
6230 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
6231 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
6232 state|=UpdateListState;
6234 reset_info.raised=MagickTrue;
6235 XDrawBeveledButton(display,&windows->widget,&reset_info);
6237 if (action_info.raised == MagickFalse)
6239 if (event.xbutton.window == windows->widget.id)
6241 if (MatteIsActive(action_info,event.xbutton))
6243 if (*reply_info.text ==
'\0')
6244 (void) XBell(display,0);
6249 action_info.raised=MagickTrue;
6250 XDrawBeveledButton(display,&windows->widget,&action_info);
6252 if (cancel_info.raised == MagickFalse)
6254 if (event.xbutton.window == windows->widget.id)
6255 if (MatteIsActive(cancel_info,event.xbutton))
6257 *reply_info.text=
'\0';
6260 cancel_info.raised=MagickTrue;
6261 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6270 if (event.xclient.message_type != windows->wm_protocols)
6272 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
6274 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
6275 (Time)
event.xclient.data.l[1]);
6278 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
6280 if (event.xclient.window == windows->widget.id)
6282 *reply_info.text=
'\0';
6288 case ConfigureNotify:
6293 if (event.xconfigure.window != windows->widget.id)
6295 if ((event.xconfigure.width == (
int) windows->widget.width) &&
6296 (
event.xconfigure.height == (int) windows->widget.height))
6298 windows->widget.width=(
unsigned int)
6299 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
6300 windows->widget.height=(
unsigned int)
6301 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
6302 state|=UpdateConfigurationState;
6307 if (event.xcrossing.window != windows->widget.id)
6309 state&=(~InactiveWidgetState);
6314 if (event.xexpose.window != windows->widget.id)
6316 if (event.xexpose.count != 0)
6318 state|=RedrawWidgetState;
6324 command[MaxTextExtent];
6335 if (event.xkey.window != windows->widget.id)
6337 length=XLookupString((XKeyEvent *) &event.xkey,command,
6338 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6339 *(command+length)=
'\0';
6340 if (AreaIsActive(scroll_info,event.xkey))
6345 switch ((
int) key_symbol)
6368 slider_info.id-=visible_fonts;
6374 slider_info.id+=visible_fonts;
6380 slider_info.id=fonts;
6384 state|=RedrawListState;
6387 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
6392 if (*reply_info.text ==
'\0')
6394 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
6395 (void) CopyMagickString(glob_pattern,reply_info.text,MaxTextExtent);
6396 state|=UpdateListState;
6399 if (key_symbol == XK_Control_L)
6401 state|=ControlState;
6404 if (state & ControlState)
6405 switch ((
int) key_symbol)
6413 *reply_info.text=
'\0';
6414 reply_info.cursor=reply_info.text;
6415 reply_info.marker=reply_info.text;
6416 reply_info.highlight=MagickFalse;
6422 XEditText(display,&reply_info,key_symbol,command,state);
6423 XDrawMatteText(display,&windows->widget,&reply_info);
6424 state|=JumpListState;
6430 command[MaxTextExtent];
6438 if (event.xkey.window != windows->widget.id)
6440 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
6441 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6442 if (key_symbol == XK_Control_L)
6443 state&=(~ControlState);
6448 if (event.xcrossing.window != windows->widget.id)
6450 state|=InactiveWidgetState;
6464 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
6465 if (slider_info.active)
6470 slider_info.y=
event.xmotion.y-
6471 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
6472 if (slider_info.y < slider_info.min_y)
6473 slider_info.y=slider_info.min_y;
6474 if (slider_info.y > slider_info.max_y)
6475 slider_info.y=slider_info.max_y;
6477 if (slider_info.y != slider_info.min_y)
6478 slider_info.id=(fonts*(slider_info.y-slider_info.min_y+1))/
6479 (slider_info.max_y-slider_info.min_y+1);
6480 state|=RedrawListState;
6483 if (state & InactiveWidgetState)
6485 if (back_info.raised == MatteIsActive(back_info,event.xmotion))
6490 back_info.raised=!back_info.raised;
6491 XDrawBeveledButton(display,&windows->widget,&back_info);
6494 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
6499 reset_info.raised=!reset_info.raised;
6500 XDrawBeveledButton(display,&windows->widget,&reset_info);
6503 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
6508 action_info.raised=action_info.raised == MagickFalse ?
6509 MagickTrue : MagickFalse;
6510 XDrawBeveledButton(display,&windows->widget,&action_info);
6513 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
6518 cancel_info.raised=cancel_info.raised == MagickFalse ?
6519 MagickTrue : MagickFalse;
6520 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6525 case SelectionClear:
6527 reply_info.highlight=MagickFalse;
6528 XDrawMatteText(display,&windows->widget,&reply_info);
6531 case SelectionNotify:
6549 if (event.xselection.property == (Atom) None)
6551 status=XGetWindowProperty(display,event.xselection.requestor,
6552 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
6553 &format,&length,&after,&data);
6554 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
6557 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
6558 (void) XBell(display,0);
6564 *(data+length)=
'\0';
6565 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
6567 XDrawMatteText(display,&windows->widget,&reply_info);
6568 state|=JumpListState;
6569 state|=RedrawActionState;
6571 (void) XFree((
void *) data);
6574 case SelectionRequest:
6579 XSelectionRequestEvent
6585 request=(&(
event.xselectionrequest));
6586 (void) XChangeProperty(request->display,request->requestor,
6587 request->property,request->target,8,PropModeReplace,
6588 (
unsigned char *) primary_selection,Extent(primary_selection));
6589 notify.type=SelectionNotify;
6590 notify.display=request->display;
6591 notify.requestor=request->requestor;
6592 notify.selection=request->selection;
6593 notify.target=request->target;
6594 notify.time=request->time;
6595 if (request->property == None)
6596 notify.property=request->target;
6598 notify.property=request->property;
6599 (void) XSendEvent(request->display,request->requestor,False,0,
6600 (XEvent *) ¬ify);
6605 }
while ((state & ExitState) == 0);
6606 XSetCursorState(display,windows,MagickFalse);
6607 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
6608 XCheckRefreshWindows(display,windows);
6612 (void) XFreeFontNames(listhead);
6613 fontlist=(
char **) RelinquishMagickMemory(fontlist);
6646 MagickExport
void XInfoWidget(Display *display,XWindows *windows,
6647 const char *activity)
6663 assert(display != (Display *) NULL);
6664 assert(windows != (XWindows *) NULL);
6665 assert(activity != (
char *) NULL);
6666 if (IsEventLogging() != MagickFalse)
6667 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
6668 font_info=windows->info.font_info;
6669 width=WidgetTextWidth(font_info,(
char *) activity)+((3*QuantumMargin) >> 1)+4;
6670 height=(
unsigned int) (((6*(font_info->ascent+font_info->descent)) >> 2)+4);
6671 if ((windows->info.width != width) || (windows->info.height != height))
6676 windows->info.width=width;
6677 windows->info.height=height;
6678 window_changes.width=(int) width;
6679 window_changes.height=(int) height;
6680 (void) XReconfigureWMWindow(display,windows->info.id,windows->info.screen,
6681 (
unsigned int) (CWWidth | CWHeight),&window_changes);
6683 if (windows->info.mapped == MagickFalse)
6685 (void) XMapRaised(display,windows->info.id);
6686 windows->info.mapped=MagickTrue;
6691 height=(
unsigned int) (font_info->ascent+font_info->descent);
6692 XGetWidgetInfo(activity,&monitor_info);
6693 monitor_info.bevel_width--;
6694 margin=monitor_info.bevel_width+((windows->info.height-height) >> 1)-2;
6695 monitor_info.center=MagickFalse;
6696 monitor_info.x=(int) margin;
6697 monitor_info.y=(int) margin;
6698 monitor_info.width=windows->info.width-(margin << 1);
6699 monitor_info.height=windows->info.height-(margin << 1)+1;
6703 monitor_info.raised=MagickFalse;
6704 XDrawBeveledMatte(display,&windows->info,&monitor_info);
6705 monitor_info.raised=MagickTrue;
6706 XDrawWidgetText(display,&windows->info,&monitor_info);
6748 MagickExport
void XListBrowserWidget(Display *display,XWindows *windows,
6749 XWindowInfo *window_info,
const char *
const *list,
const char *action,
6750 const char *query,
char *reply)
6752 #define CancelButtonText "Cancel"
6755 primary_selection[MaxTextExtent];
6763 static MagickStatusType
6764 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
6808 assert(display != (Display *) NULL);
6809 assert(windows != (XWindows *) NULL);
6810 assert(window_info != (XWindowInfo *) NULL);
6811 assert(list != (
const char **) NULL);
6812 assert(action != (
char *) NULL);
6813 assert(query != (
char *) NULL);
6814 assert(reply != (
char *) NULL);
6815 if (IsEventLogging() != MagickFalse)
6816 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
6817 XSetCursorState(display,windows,MagickTrue);
6818 XCheckRefreshWindows(display,windows);
6819 if (list == (
const char **) NULL)
6821 XNoticeWidget(display,windows,
"No text to browse:",(
char *) NULL);
6824 for (entries=0; ; entries++)
6825 if (list[entries] == (
char *) NULL)
6830 font_info=window_info->font_info;
6831 text_width=WidgetTextWidth(font_info,(
char *) query);
6832 for (i=0; i < (int) entries; i++)
6833 if (WidgetTextWidth(font_info,(
char *) list[i]) > text_width)
6834 text_width=WidgetTextWidth(font_info,(
char *) list[i]);
6835 width=WidgetTextWidth(font_info,(
char *) action);
6836 if (WidgetTextWidth(font_info,CancelButtonText) > width)
6837 width=WidgetTextWidth(font_info,CancelButtonText);
6838 width+=QuantumMargin;
6839 height=(
unsigned int) (font_info->ascent+font_info->descent);
6843 window_info->width=(
unsigned int) MagickMin((
int) text_width,(int)
6844 MaxTextWidth)+((9*QuantumMargin) >> 1);
6845 window_info->min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
6846 if (window_info->width < window_info->min_width)
6847 window_info->width=window_info->min_width;
6848 window_info->height=(
unsigned int)
6849 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
6850 window_info->min_height=(
unsigned int)
6851 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
6852 if (window_info->height < window_info->min_height)
6853 window_info->height=window_info->min_height;
6854 XConstrainWindowPosition(display,window_info);
6858 (void) CopyMagickString(window_info->name,
"Browse",MaxTextExtent);
6859 status=XStringListToTextProperty(&window_info->name,1,&window_name);
6860 if (status != False)
6862 XSetWMName(display,window_info->id,&window_name);
6863 XSetWMIconName(display,windows->widget.id,&window_name);
6864 (void) XFree((
void *) window_name.value);
6866 window_changes.width=(int) window_info->width;
6867 window_changes.height=(
int) window_info->height;
6868 window_changes.x=window_info->x;
6869 window_changes.y=window_info->y;
6870 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,mask,
6872 (void) XMapRaised(display,window_info->id);
6873 window_info->mapped=MagickFalse;
6877 XGetWidgetInfo((
char *) NULL,&slider_info);
6878 XGetWidgetInfo((
char *) NULL,&north_info);
6879 XGetWidgetInfo((
char *) NULL,&south_info);
6880 XGetWidgetInfo((
char *) NULL,&expose_info);
6881 XGetWidgetInfo((
char *) NULL,&selection_info);
6883 delay=SuspendTime << 2;
6884 state=UpdateConfigurationState;
6887 if (state & UpdateConfigurationState)
6895 XGetWidgetInfo(CancelButtonText,&cancel_info);
6896 cancel_info.width=width;
6897 cancel_info.height=(
unsigned int) ((3*height) >> 1);
6899 (window_info->width-cancel_info.width-QuantumMargin-2);
6901 (window_info->height-cancel_info.height-QuantumMargin);
6902 XGetWidgetInfo(action,&action_info);
6903 action_info.width=width;
6904 action_info.height=(
unsigned int) ((3*height) >> 1);
6905 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
6906 (action_info.bevel_width << 1));
6907 action_info.y=cancel_info.y;
6911 XGetWidgetInfo(reply,&reply_info);
6912 reply_info.raised=MagickFalse;
6913 reply_info.bevel_width--;
6914 reply_info.width=window_info->width-((4*QuantumMargin) >> 1);
6915 reply_info.height=height << 1;
6916 reply_info.x=QuantumMargin;
6917 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
6921 XGetWidgetInfo((
char *) NULL,&scroll_info);
6922 scroll_info.bevel_width--;
6923 scroll_info.width=height;
6924 scroll_info.height=(
unsigned int)
6925 (reply_info.y-((6*QuantumMargin) >> 1)-height);
6926 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
6927 scroll_info.y=((5*QuantumMargin) >> 1)+height-reply_info.bevel_width;
6928 scroll_info.raised=MagickFalse;
6929 scroll_info.trough=MagickTrue;
6930 north_info=scroll_info;
6931 north_info.raised=MagickTrue;
6932 north_info.width-=(north_info.bevel_width << 1);
6933 north_info.height=north_info.width-1;
6934 north_info.x+=north_info.bevel_width;
6935 north_info.y+=north_info.bevel_width;
6936 south_info=north_info;
6937 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
6940 slider_info=north_info;
6942 slider_info.width-=2;
6943 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
6944 slider_info.bevel_width+2;
6945 slider_info.height=scroll_info.height-((slider_info.min_y-
6946 scroll_info.y+1) << 1)+4;
6947 visible_entries=(
unsigned int) (scroll_info.height*
6948 PerceptibleReciprocal((
double) height+(height >> 3)));
6949 if (entries > visible_entries)
6950 slider_info.height=(visible_entries*slider_info.height)/entries;
6951 slider_info.max_y=south_info.y-south_info.bevel_width-
6952 slider_info.bevel_width-2;
6953 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
6954 slider_info.y=slider_info.min_y;
6955 expose_info=scroll_info;
6956 expose_info.y=slider_info.y;
6960 XGetWidgetInfo((
char *) NULL,&list_info);
6961 list_info.raised=MagickFalse;
6962 list_info.bevel_width--;
6963 list_info.width=(
unsigned int)
6964 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
6965 list_info.height=scroll_info.height;
6966 list_info.x=reply_info.x;
6967 list_info.y=scroll_info.y;
6968 if (window_info->mapped == MagickFalse)
6969 for (i=0; i < (int) entries; i++)
6970 if (LocaleCompare(list[i],reply) == 0)
6973 slider_info.id=i-(visible_entries >> 1);
6974 if (slider_info.id < 0)
6980 XGetWidgetInfo(query,&text_info);
6981 text_info.width=reply_info.width;
6982 text_info.height=height;
6983 text_info.x=list_info.x-(QuantumMargin >> 1);
6984 text_info.y=QuantumMargin;
6988 XGetWidgetInfo((
char *) NULL,&selection_info);
6989 selection_info.center=MagickFalse;
6990 selection_info.width=list_info.width;
6991 selection_info.height=(
unsigned int) ((9*height) >> 3);
6992 selection_info.x=list_info.x;
6993 state&=(~UpdateConfigurationState);
6995 if (state & RedrawWidgetState)
7000 XDrawWidgetText(display,window_info,&text_info);
7001 XDrawBeveledMatte(display,window_info,&list_info);
7002 XDrawBeveledMatte(display,window_info,&scroll_info);
7003 XDrawTriangleNorth(display,window_info,&north_info);
7004 XDrawBeveledButton(display,window_info,&slider_info);
7005 XDrawTriangleSouth(display,window_info,&south_info);
7006 XDrawBeveledMatte(display,window_info,&reply_info);
7007 XDrawMatteText(display,window_info,&reply_info);
7008 XDrawBeveledButton(display,window_info,&action_info);
7009 XDrawBeveledButton(display,window_info,&cancel_info);
7010 XHighlightWidget(display,window_info,BorderOffset,BorderOffset);
7011 selection_info.id=(~0);
7012 state|=RedrawActionState;
7013 state|=RedrawListState;
7014 state&=(~RedrawWidgetState);
7016 if (state & RedrawListState)
7021 if (slider_info.id >= (
int) (entries-visible_entries))
7022 slider_info.id=(int) (entries-visible_entries);
7023 if ((slider_info.id < 0) || (entries <= visible_entries))
7025 slider_info.y=slider_info.min_y;
7028 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/entries;
7029 if (slider_info.id != selection_info.id)
7034 selection_info.id=slider_info.id;
7035 selection_info.y=list_info.y+(height >> 3)+2;
7036 for (i=0; i < (int) visible_entries; i++)
7038 selection_info.raised=(slider_info.id+i) != list_info.id ?
7039 MagickTrue : MagickFalse;
7040 selection_info.text=(
char *) NULL;
7041 if ((slider_info.id+i) < (int) entries)
7042 selection_info.text=(
char *) list[slider_info.id+i];
7043 XDrawWidgetText(display,window_info,&selection_info);
7044 selection_info.y+=(int) selection_info.height;
7049 if (slider_info.y > expose_info.y)
7051 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
7052 expose_info.y=slider_info.y-expose_info.height-
7053 slider_info.bevel_width-1;
7057 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
7058 expose_info.y=slider_info.y+slider_info.height+
7059 slider_info.bevel_width+1;
7061 XDrawTriangleNorth(display,window_info,&north_info);
7062 XDrawMatte(display,window_info,&expose_info);
7063 XDrawBeveledButton(display,window_info,&slider_info);
7064 XDrawTriangleSouth(display,window_info,&south_info);
7065 expose_info.y=slider_info.y;
7067 state&=(~RedrawListState);
7072 if (north_info.raised && south_info.raised)
7073 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7079 XDelay(display,delay);
7081 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
7082 if (north_info.raised == MagickFalse)
7083 if (slider_info.id > 0)
7089 state|=RedrawListState;
7091 if (south_info.raised == MagickFalse)
7092 if (slider_info.id < (
int) entries)
7098 state|=RedrawListState;
7100 if (event.type != ButtonRelease)
7107 if (MatteIsActive(slider_info,event.xbutton))
7112 slider_info.active=MagickTrue;
7115 if (MatteIsActive(north_info,event.xbutton))
7116 if (slider_info.id > 0)
7121 north_info.raised=MagickFalse;
7123 state|=RedrawListState;
7126 if (MatteIsActive(south_info,event.xbutton))
7127 if (slider_info.id < (
int) entries)
7132 south_info.raised=MagickFalse;
7134 state|=RedrawListState;
7137 if (MatteIsActive(scroll_info,event.xbutton))
7142 if (event.xbutton.y < slider_info.y)
7143 slider_info.id-=(visible_entries-1);
7145 slider_info.id+=(visible_entries-1);
7146 state|=RedrawListState;
7149 if (MatteIsActive(list_info,event.xbutton))
7157 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
7158 selection_info.height;
7159 if (
id >= (
int) entries)
7161 (void) CopyMagickString(reply_info.text,list[
id],MaxTextExtent);
7162 reply_info.highlight=MagickFalse;
7163 reply_info.marker=reply_info.text;
7164 reply_info.cursor=reply_info.text+Extent(reply_info.text);
7165 XDrawMatteText(display,window_info,&reply_info);
7166 selection_info.id=(~0);
7167 if (
id == list_info.id)
7169 action_info.raised=MagickFalse;
7170 XDrawBeveledButton(display,window_info,&action_info);
7174 state|=RedrawListState;
7177 if (MatteIsActive(action_info,event.xbutton))
7182 action_info.raised=MagickFalse;
7183 XDrawBeveledButton(display,window_info,&action_info);
7186 if (MatteIsActive(cancel_info,event.xbutton))
7191 cancel_info.raised=MagickFalse;
7192 XDrawBeveledButton(display,window_info,&cancel_info);
7195 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7197 if (event.xbutton.button != Button2)
7205 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
7206 for (i=1; i <= Extent(reply_info.marker); i++)
7207 if (XTextWidth(font_info,reply_info.marker,i) > x)
7209 reply_info.cursor=reply_info.marker+i-1;
7210 if (event.xbutton.time > (click_time+DoubleClick))
7211 reply_info.highlight=MagickFalse;
7217 (
void) CopyMagickString(primary_selection,reply_info.text,
7219 (void) XSetSelectionOwner(display,XA_PRIMARY,window_info->id,
7220 event.xbutton.time);
7221 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
7222 window_info->id ? MagickTrue : MagickFalse;
7224 XDrawMatteText(display,window_info,&reply_info);
7225 click_time=
event.xbutton.time;
7231 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
7232 window_info->id,event.xbutton.time);
7237 if (window_info->mapped == MagickFalse)
7239 if (north_info.raised == MagickFalse)
7244 delay=SuspendTime << 2;
7245 north_info.raised=MagickTrue;
7246 XDrawTriangleNorth(display,window_info,&north_info);
7248 if (south_info.raised == MagickFalse)
7253 delay=SuspendTime << 2;
7254 south_info.raised=MagickTrue;
7255 XDrawTriangleSouth(display,window_info,&south_info);
7257 if (slider_info.active)
7262 slider_info.active=MagickFalse;
7265 if (action_info.raised == MagickFalse)
7267 if (event.xbutton.window == window_info->id)
7269 if (MatteIsActive(action_info,event.xbutton))
7271 if (*reply_info.text ==
'\0')
7272 (void) XBell(display,0);
7277 action_info.raised=MagickTrue;
7278 XDrawBeveledButton(display,window_info,&action_info);
7280 if (cancel_info.raised == MagickFalse)
7282 if (event.xbutton.window == window_info->id)
7283 if (MatteIsActive(cancel_info,event.xbutton))
7285 *reply_info.text=
'\0';
7288 cancel_info.raised=MagickTrue;
7289 XDrawBeveledButton(display,window_info,&cancel_info);
7291 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7300 if (event.xclient.message_type != windows->wm_protocols)
7302 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
7304 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
7305 (Time)
event.xclient.data.l[1]);
7308 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
7310 if (event.xclient.window == window_info->id)
7312 *reply_info.text=
'\0';
7318 case ConfigureNotify:
7323 if (event.xconfigure.window != window_info->id)
7325 if ((event.xconfigure.width == (
int) window_info->width) &&
7326 (
event.xconfigure.height == (int) window_info->height))
7328 window_info->width=(
unsigned int)
7329 MagickMax(event.xconfigure.width,(
int) window_info->min_width);
7330 window_info->height=(
unsigned int)
7331 MagickMax(event.xconfigure.height,(
int) window_info->min_height);
7332 state|=UpdateConfigurationState;
7337 if (event.xcrossing.window != window_info->id)
7339 state&=(~InactiveWidgetState);
7344 if (event.xexpose.window != window_info->id)
7346 if (event.xexpose.count != 0)
7348 state|=RedrawWidgetState;
7354 command[MaxTextExtent];
7365 if (event.xkey.window != window_info->id)
7367 length=XLookupString((XKeyEvent *) &event.xkey,command,
7368 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7369 *(command+length)=
'\0';
7370 if (AreaIsActive(scroll_info,event.xkey))
7375 switch ((
int) key_symbol)
7398 slider_info.id-=visible_entries;
7404 slider_info.id+=visible_entries;
7410 slider_info.id=(int) entries;
7414 state|=RedrawListState;
7417 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
7422 if (*reply_info.text ==
'\0')
7424 action_info.raised=MagickFalse;
7425 XDrawBeveledButton(display,window_info,&action_info);
7429 if (key_symbol == XK_Control_L)
7431 state|=ControlState;
7434 if (state & ControlState)
7435 switch ((
int) key_symbol)
7443 *reply_info.text=
'\0';
7444 reply_info.cursor=reply_info.text;
7445 reply_info.marker=reply_info.text;
7446 reply_info.highlight=MagickFalse;
7452 XEditText(display,&reply_info,key_symbol,command,state);
7453 XDrawMatteText(display,window_info,&reply_info);
7459 command[MaxTextExtent];
7467 if (event.xkey.window != window_info->id)
7469 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
7470 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7471 if (key_symbol == XK_Control_L)
7472 state&=(~ControlState);
7477 if (event.xcrossing.window != window_info->id)
7479 state|=InactiveWidgetState;
7493 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7494 if (slider_info.active)
7499 slider_info.y=
event.xmotion.y-
7500 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
7501 if (slider_info.y < slider_info.min_y)
7502 slider_info.y=slider_info.min_y;
7503 if (slider_info.y > slider_info.max_y)
7504 slider_info.y=slider_info.max_y;
7506 if (slider_info.y != slider_info.min_y)
7507 slider_info.id=(int) ((entries*(slider_info.y-
7508 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
7509 state|=RedrawListState;
7512 if (state & InactiveWidgetState)
7514 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
7519 action_info.raised=action_info.raised == MagickFalse ?
7520 MagickTrue : MagickFalse;
7521 XDrawBeveledButton(display,window_info,&action_info);
7524 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
7529 cancel_info.raised=cancel_info.raised == MagickFalse ?
7530 MagickTrue : MagickFalse;
7531 XDrawBeveledButton(display,window_info,&cancel_info);
7536 case SelectionClear:
7538 reply_info.highlight=MagickFalse;
7539 XDrawMatteText(display,window_info,&reply_info);
7542 case SelectionNotify:
7560 if (event.xselection.property == (Atom) None)
7562 status=XGetWindowProperty(display,
7563 event.xselection.requestor,event.xselection.property,0L,2047L,
7564 MagickTrue,XA_STRING,&type,&format,&length,&after,&data);
7565 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
7568 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
7569 (void) XBell(display,0);
7575 *(data+length)=
'\0';
7576 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
7578 XDrawMatteText(display,window_info,&reply_info);
7579 state|=RedrawActionState;
7581 (void) XFree((
void *) data);
7584 case SelectionRequest:
7589 XSelectionRequestEvent
7592 if (reply_info.highlight == MagickFalse)
7597 request=(&(
event.xselectionrequest));
7598 (void) XChangeProperty(request->display,request->requestor,
7599 request->property,request->target,8,PropModeReplace,
7600 (
unsigned char *) primary_selection,Extent(primary_selection));
7601 notify.type=SelectionNotify;
7602 notify.send_event=MagickTrue;
7603 notify.display=request->display;
7604 notify.requestor=request->requestor;
7605 notify.selection=request->selection;
7606 notify.target=request->target;
7607 notify.time=request->time;
7608 if (request->property == None)
7609 notify.property=request->target;
7611 notify.property=request->property;
7612 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
7613 (XEvent *) ¬ify);
7618 }
while ((state & ExitState) == 0);
7619 XSetCursorState(display,windows,MagickFalse);
7620 (void) XWithdrawWindow(display,window_info->id,window_info->screen);
7621 XCheckRefreshWindows(display,windows);
7662 MagickExport
int XMenuWidget(Display *display,XWindows *windows,
7663 const char *title,
const char *
const *selections,
char *item)
7689 XSetWindowAttributes
7703 assert(display != (Display *) NULL);
7704 assert(windows != (XWindows *) NULL);
7705 assert(title != (
char *) NULL);
7706 assert(selections != (
const char **) NULL);
7707 assert(item != (
char *) NULL);
7708 if (IsEventLogging() != MagickFalse)
7709 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",title);
7710 font_info=windows->widget.font_info;
7711 windows->widget.width=submenu_info.active == 0 ?
7712 WidgetTextWidth(font_info,(
char *) title) : 0;
7713 for (
id=0; selections[id] != (
char *) NULL;
id++)
7715 width=WidgetTextWidth(font_info,(
char *) selections[
id]);
7716 if (width > windows->widget.width)
7717 windows->widget.width=width;
7719 number_selections=(
unsigned int)
id;
7720 XGetWidgetInfo((
char *) NULL,&menu_info);
7721 title_height=(
unsigned int) (submenu_info.active == 0 ?
7722 (3*(font_info->descent+font_info->ascent) >> 1)+5 : 2);
7723 width=WidgetTextWidth(font_info,(
char *) title);
7724 height=(
unsigned int) ((3*(font_info->ascent+font_info->descent)) >> 1);
7728 windows->widget.width+=QuantumMargin+(menu_info.bevel_width << 1);
7729 top_offset=title_height+menu_info.bevel_width-1;
7730 windows->widget.height=top_offset+number_selections*height+4;
7731 windows->widget.min_width=windows->widget.width;
7732 windows->widget.min_height=windows->widget.height;
7733 XQueryPosition(display,windows->widget.root,&x,&y);
7734 windows->widget.x=x-(QuantumMargin >> 1);
7735 if (submenu_info.active != 0)
7738 windows->command.x+windows->command.width-QuantumMargin;
7739 toggle_info.raised=MagickTrue;
7740 XDrawTriangleEast(display,&windows->command,&toggle_info);
7742 windows->widget.y=submenu_info.active == 0 ? y-(int)
7743 ((3*title_height) >> 2) : y;
7744 if (submenu_info.active != 0)
7745 windows->widget.y=windows->command.y+submenu_info.y;
7746 XConstrainWindowPosition(display,&windows->widget);
7750 window_attributes.override_redirect=MagickTrue;
7751 (void) XChangeWindowAttributes(display,windows->widget.id,
7752 (
size_t) CWOverrideRedirect,&window_attributes);
7753 window_changes.width=(int) windows->widget.width;
7754 window_changes.height=(
int) windows->widget.height;
7755 window_changes.x=windows->widget.x;
7756 window_changes.y=windows->widget.y;
7757 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
7758 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
7759 (void) XMapRaised(display,windows->widget.id);
7760 windows->widget.mapped=MagickFalse;
7764 selection_info.height=height;
7765 cursor=XCreateFontCursor(display,XC_right_ptr);
7766 (void) XCheckDefineCursor(display,windows->image.id,cursor);
7767 (void) XCheckDefineCursor(display,windows->command.id,cursor);
7768 (void) XCheckDefineCursor(display,windows->widget.id,cursor);
7769 state=UpdateConfigurationState;
7772 if (state & UpdateConfigurationState)
7777 XGetWidgetInfo((
char *) NULL,&menu_info);
7778 menu_info.bevel_width--;
7779 menu_info.width=windows->widget.width-((menu_info.bevel_width) << 1);
7780 menu_info.height=windows->widget.height-((menu_info.bevel_width) << 1);
7781 menu_info.x=(int) menu_info.bevel_width;
7782 menu_info.y=(
int) menu_info.bevel_width;
7783 XGetWidgetInfo((
char *) NULL,&selection_info);
7784 selection_info.center=MagickFalse;
7785 selection_info.width=menu_info.width;
7786 selection_info.height=height;
7787 selection_info.x=menu_info.x;
7788 highlight_info=selection_info;
7789 highlight_info.bevel_width--;
7790 highlight_info.width-=(highlight_info.bevel_width << 1);
7791 highlight_info.height-=(highlight_info.bevel_width << 1);
7792 highlight_info.x+=highlight_info.bevel_width;
7793 state&=(~UpdateConfigurationState);
7795 if (state & RedrawWidgetState)
7800 if (submenu_info.active == 0)
7802 y=(int) title_height;
7803 XSetBevelColor(display,&windows->widget,MagickFalse);
7804 (void) XDrawLine(display,windows->widget.id,
7805 windows->widget.widget_context,selection_info.x,y-1,
7806 (
int) selection_info.width,y-1);
7807 XSetBevelColor(display,&windows->widget,MagickTrue);
7808 (void) XDrawLine(display,windows->widget.id,
7809 windows->widget.widget_context,selection_info.x,y,
7810 (
int) selection_info.width,y);
7811 (void) XSetFillStyle(display,windows->widget.widget_context,
7817 selection_info.center=MagickTrue;
7818 selection_info.y=(int) menu_info.bevel_width;
7819 selection_info.text=(
char *) title;
7820 if (submenu_info.active == 0)
7821 XDrawWidgetText(display,&windows->widget,&selection_info);
7822 selection_info.center=MagickFalse;
7823 selection_info.y=(int) top_offset;
7824 for (
id=0;
id < (int) number_selections;
id++)
7826 selection_info.text=(
char *) selections[
id];
7827 XDrawWidgetText(display,&windows->widget,&selection_info);
7828 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7829 if (
id == selection_info.id)
7830 XDrawBevel(display,&windows->widget,&highlight_info);
7831 selection_info.y+=(int) selection_info.height;
7833 XDrawBevel(display,&windows->widget,&menu_info);
7834 state&=(~RedrawWidgetState);
7836 if (number_selections > 2)
7841 y=(int) (top_offset+selection_info.height*(number_selections-1));
7842 XSetBevelColor(display,&windows->widget,MagickFalse);
7843 (void) XDrawLine(display,windows->widget.id,
7844 windows->widget.widget_context,selection_info.x,y-1,
7845 (
int) selection_info.width,y-1);
7846 XSetBevelColor(display,&windows->widget,MagickTrue);
7847 (void) XDrawLine(display,windows->widget.id,
7848 windows->widget.widget_context,selection_info.x,y,
7849 (
int) selection_info.width,y);
7850 (void) XSetFillStyle(display,windows->widget.widget_context,FillSolid);
7855 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7860 if (event.xbutton.window != windows->widget.id)
7865 if (event.xbutton.window == windows->command.id)
7866 (void) XPutBackEvent(display,&event);
7867 selection_info.id=(~0);
7872 state&=(~InactiveWidgetState);
7873 if (selection_info.height == 0)
7875 id=(
event.xbutton.y-top_offset)/(
int) selection_info.height;
7876 selection_info.id=id;
7877 if ((
id < 0) || (
id >= (int) number_selections))
7882 selection_info.y=(int) (top_offset+
id*selection_info.height);
7883 selection_info.text=(
char *) selections[
id];
7884 XDrawWidgetText(display,&windows->widget,&selection_info);
7885 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7886 XDrawBevel(display,&windows->widget,&highlight_info);
7891 if (windows->widget.mapped == MagickFalse)
7893 if (event.xbutton.window == windows->command.id)
7894 if ((state & InactiveWidgetState) == 0)
7899 XSetCursorState(display,windows,MagickFalse);
7904 case ConfigureNotify:
7909 if (event.xconfigure.window != windows->widget.id)
7911 if ((event.xconfigure.width == (
int) windows->widget.width) &&
7912 (event.xconfigure.height == (
int) windows->widget.height))
7914 windows->widget.width=(
unsigned int)
7915 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
7916 windows->widget.height=(
unsigned int)
7917 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
7918 state|=UpdateConfigurationState;
7923 if (event.xcrossing.window != windows->widget.id)
7925 if (event.xcrossing.state == 0)
7927 state&=(~InactiveWidgetState);
7928 if (selection_info.height == 0)
7930 id=((
event.xcrossing.y-top_offset)/(
int) selection_info.height);
7931 if ((selection_info.id >= 0) &&
7932 (selection_info.id < (int) number_selections))
7937 if (
id == selection_info.id)
7939 selection_info.y=(int)
7940 (top_offset+selection_info.id*selection_info.height);
7941 selection_info.text=(
char *) selections[selection_info.id];
7942 XDrawWidgetText(display,&windows->widget,&selection_info);
7944 if ((
id < 0) || (
id >= (int) number_selections))
7949 selection_info.id=id;
7950 selection_info.y=(int)
7951 (top_offset+selection_info.id*selection_info.height);
7952 selection_info.text=(
char *) selections[selection_info.id];
7953 XDrawWidgetText(display,&windows->widget,&selection_info);
7954 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7955 XDrawBevel(display,&windows->widget,&highlight_info);
7960 if (event.xexpose.window != windows->widget.id)
7962 if (event.xexpose.count != 0)
7964 state|=RedrawWidgetState;
7969 if (event.xcrossing.window != windows->widget.id)
7971 state|=InactiveWidgetState;
7972 id=selection_info.id;
7973 if ((
id < 0) || (
id >= (
int) number_selections))
7978 selection_info.y=(int) (top_offset+
id*selection_info.height);
7979 selection_info.id=(~0);
7980 selection_info.text=(
char *) selections[
id];
7981 XDrawWidgetText(display,&windows->widget,&selection_info);
7989 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7990 if (submenu_info.active != 0)
7991 if (event.xmotion.window == windows->command.id)
7993 if ((state & InactiveWidgetState) == 0)
7995 if (MatteIsActive(submenu_info,event.xmotion) == MagickFalse)
7997 selection_info.id=(~0);
8004 if (WindowIsActive(windows->command,event.xmotion))
8006 selection_info.id=(~0);
8012 if (event.xmotion.window != windows->widget.id)
8014 if (state & InactiveWidgetState)
8016 if (selection_info.height == 0)
8018 id=(
event.xmotion.y-top_offset)/(
int) selection_info.height;
8019 if ((selection_info.id >= 0) &&
8020 (selection_info.id < (int) number_selections))
8025 if (
id == selection_info.id)
8027 selection_info.y=(int)
8028 (top_offset+selection_info.id*selection_info.height);
8029 selection_info.text=(
char *) selections[selection_info.id];
8030 XDrawWidgetText(display,&windows->widget,&selection_info);
8032 selection_info.id=id;
8033 if ((
id < 0) || (
id >= (int) number_selections))
8038 selection_info.y=(int) (top_offset+
id*selection_info.height);
8039 selection_info.text=(
char *) selections[
id];
8040 XDrawWidgetText(display,&windows->widget,&selection_info);
8041 highlight_info.y=selection_info.y+highlight_info.bevel_width;
8042 XDrawBevel(display,&windows->widget,&highlight_info);
8048 }
while ((state & ExitState) == 0);
8049 (void) XFreeCursor(display,cursor);
8050 window_attributes.override_redirect=MagickFalse;
8051 (void) XChangeWindowAttributes(display,windows->widget.id,
8052 (
size_t) CWOverrideRedirect,&window_attributes);
8053 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8054 XCheckRefreshWindows(display,windows);
8055 if (submenu_info.active != 0)
8057 submenu_info.active=MagickFalse;
8058 toggle_info.raised=MagickFalse;
8059 XDrawTriangleEast(display,&windows->command,&toggle_info);
8061 if ((selection_info.id < 0) || (selection_info.id >= (
int) number_selections))
8063 (void) CopyMagickString(item,selections[selection_info.id],MaxTextExtent);
8064 return(selection_info.id);
8099 MagickExport
void XNoticeWidget(Display *display,XWindows *windows,
8100 const char *reason,
const char *description)
8102 #define DismissButtonText "Dismiss"
8143 assert(display != (Display *) NULL);
8144 assert(windows != (XWindows *) NULL);
8145 assert(reason != (
char *) NULL);
8146 if (IsEventLogging() != MagickFalse)
8147 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
8148 XDelay(display,SuspendTime << 3);
8149 XSetCursorState(display,windows,MagickTrue);
8150 XCheckRefreshWindows(display,windows);
8151 font_info=windows->widget.font_info;
8152 width=WidgetTextWidth(font_info,DismissButtonText);
8153 text=GetLocaleExceptionMessage(XServerError,reason);
8154 if (text != (
char *) NULL)
8155 if (WidgetTextWidth(font_info,(
char *) text) > width)
8156 width=WidgetTextWidth(font_info,(
char *) text);
8157 if (description != (
char *) NULL)
8159 text=GetLocaleExceptionMessage(XServerError,description);
8160 if (text != (
char *) NULL)
8161 if (WidgetTextWidth(font_info,(
char *) text) > width)
8162 width=WidgetTextWidth(font_info,(
char *) text);
8164 height=(
unsigned int) (font_info->ascent+font_info->descent);
8168 windows->widget.width=width+4*QuantumMargin;
8169 windows->widget.min_width=width+QuantumMargin;
8170 if (windows->widget.width < windows->widget.min_width)
8171 windows->widget.width=windows->widget.min_width;
8172 windows->widget.height=(
unsigned int) (12*height);
8173 windows->widget.min_height=(
unsigned int) (7*height);
8174 if (windows->widget.height < windows->widget.min_height)
8175 windows->widget.height=windows->widget.min_height;
8176 XConstrainWindowPosition(display,&windows->widget);
8180 (void) CopyMagickString(windows->widget.name,
"Notice",MaxTextExtent);
8181 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
8182 if (status != False)
8184 XSetWMName(display,windows->widget.id,&window_name);
8185 XSetWMIconName(display,windows->widget.id,&window_name);
8186 (void) XFree((
void *) window_name.value);
8188 window_changes.width=(int) windows->widget.width;
8189 window_changes.height=(
int) windows->widget.height;
8190 window_changes.x=windows->widget.x;
8191 window_changes.y=windows->widget.y;
8192 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
8193 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
8194 (void) XMapRaised(display,windows->widget.id);
8195 windows->widget.mapped=MagickFalse;
8196 (void) XBell(display,0);
8200 timer=GetMagickTime()+Timeout;
8201 state=UpdateConfigurationState;
8204 if (GetMagickTime() > timer)
8206 if (state & UpdateConfigurationState)
8211 XGetWidgetInfo(DismissButtonText,&dismiss_info);
8212 dismiss_info.width=(
unsigned int) QuantumMargin+
8213 WidgetTextWidth(font_info,DismissButtonText);
8214 dismiss_info.height=(
unsigned int) ((3*height) >> 1);
8215 dismiss_info.x=(int)
8216 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
8217 dismiss_info.y=(int)
8218 (windows->widget.height-(dismiss_info.height << 1));
8219 state&=(~UpdateConfigurationState);
8221 if (state & RedrawWidgetState)
8226 width=WidgetTextWidth(font_info,(
char *) reason);
8227 x=(int) ((windows->widget.width >> 1)-(width >> 1));
8228 y=(int) ((windows->widget.height >> 1)-(height << 1));
8229 (void) XDrawString(display,windows->widget.id,
8230 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
8231 if (description != (
char *) NULL)
8233 width=WidgetTextWidth(font_info,(
char *) description);
8234 x=(int) ((windows->widget.width >> 1)-(width >> 1));
8236 (void) XDrawString(display,windows->widget.id,
8237 windows->widget.annotate_context,x,y,(
char *) description,
8238 Extent(description));
8240 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8241 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
8242 state&=(~RedrawWidgetState);
8247 if (XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows) == MagickFalse)
8252 XDelay(display,SuspendTime << 2);
8259 if (MatteIsActive(dismiss_info,event.xbutton))
8264 dismiss_info.raised=MagickFalse;
8265 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8272 if (windows->widget.mapped == MagickFalse)
8274 if (dismiss_info.raised == MagickFalse)
8276 if (event.xbutton.window == windows->widget.id)
8277 if (MatteIsActive(dismiss_info,event.xbutton))
8279 dismiss_info.raised=MagickTrue;
8280 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8289 if (event.xclient.message_type != windows->wm_protocols)
8291 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
8293 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
8294 (Time)
event.xclient.data.l[1]);
8297 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
8299 if (event.xclient.window == windows->widget.id)
8306 case ConfigureNotify:
8311 if (event.xconfigure.window != windows->widget.id)
8313 if ((event.xconfigure.width == (
int) windows->widget.width) &&
8314 (
event.xconfigure.height == (int) windows->widget.height))
8316 windows->widget.width=(
unsigned int)
8317 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
8318 windows->widget.height=(
unsigned int)
8319 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
8320 state|=UpdateConfigurationState;
8325 if (event.xcrossing.window != windows->widget.id)
8327 state&=(~InactiveWidgetState);
8332 if (event.xexpose.window != windows->widget.id)
8334 if (event.xexpose.count != 0)
8336 state|=RedrawWidgetState;
8342 command[MaxTextExtent];
8350 if (event.xkey.window != windows->widget.id)
8352 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
8353 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
8354 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
8356 dismiss_info.raised=MagickFalse;
8357 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8365 if (event.xcrossing.window != windows->widget.id)
8367 state|=InactiveWidgetState;
8375 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
8376 if (state & InactiveWidgetState)
8378 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
8383 dismiss_info.raised=
8384 dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8385 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8393 }
while ((state & ExitState) == 0);
8394 XSetCursorState(display,windows,MagickFalse);
8395 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8396 XCheckRefreshWindows(display,windows);
8429 MagickExport MagickBooleanType XPreferencesWidget(Display *display,
8430 XResourceInfo *resource_info,XWindows *windows)
8432 #define ApplyButtonText "Apply"
8433 #define CacheButtonText "%lu mega-bytes of memory in the undo edit cache "
8434 #define CancelButtonText "Cancel"
8435 #define NumberPreferences 8
8440 "display image centered on a backdrop",
8441 "confirm on program exit",
8442 "confirm on image edits",
8443 "correct image for display gamma",
8444 "display warning messages",
8445 "apply Floyd/Steinberg error diffusion to image",
8446 "use a shared colormap for colormapped X visuals",
8447 "display images as an X server pixmap"
8451 cache[MaxTextExtent];
8484 preferences_info[NumberPreferences];
8492 assert(display != (Display *) NULL);
8493 assert(resource_info != (XResourceInfo *) NULL);
8494 assert(windows != (XWindows *) NULL);
8495 if (IsEventLogging() != MagickFalse)
8496 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8497 XCheckRefreshWindows(display,windows);
8498 font_info=windows->widget.font_info;
8499 text_width=WidgetTextWidth(font_info,CacheButtonText);
8500 for (i=0; i < NumberPreferences; i++)
8501 if (WidgetTextWidth(font_info,(
char *) Preferences[i]) > text_width)
8502 text_width=WidgetTextWidth(font_info,(
char *) Preferences[i]);
8503 width=WidgetTextWidth(font_info,ApplyButtonText);
8504 if (WidgetTextWidth(font_info,CancelButtonText) > width)
8505 width=WidgetTextWidth(font_info,CancelButtonText);
8506 width+=(
unsigned int) QuantumMargin;
8507 height=(
unsigned int) (font_info->ascent+font_info->descent);
8511 windows->widget.width=(
unsigned int) (MagickMax((
int) (width << 1),
8512 (
int) text_width)+6*QuantumMargin);
8513 windows->widget.min_width=(width << 1)+QuantumMargin;
8514 if (windows->widget.width < windows->widget.min_width)
8515 windows->widget.width=windows->widget.min_width;
8516 windows->widget.height=(
unsigned int)
8517 (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
8518 windows->widget.min_height=(
unsigned int)
8519 (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
8520 if (windows->widget.height < windows->widget.min_height)
8521 windows->widget.height=windows->widget.min_height;
8522 XConstrainWindowPosition(display,&windows->widget);
8526 (void) CopyMagickString(windows->widget.name,
"Preferences",MaxTextExtent);
8527 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
8528 if (status != False)
8530 XSetWMName(display,windows->widget.id,&window_name);
8531 XSetWMIconName(display,windows->widget.id,&window_name);
8532 (void) XFree((
void *) window_name.value);
8534 window_changes.width=(int) windows->widget.width;
8535 window_changes.height=(
int) windows->widget.height;
8536 window_changes.x=windows->widget.x;
8537 window_changes.y=windows->widget.y;
8538 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
8539 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
8540 (void) XMapRaised(display,windows->widget.id);
8541 windows->widget.mapped=MagickFalse;
8545 state=UpdateConfigurationState;
8546 XSetCursorState(display,windows,MagickTrue);
8549 if (state & UpdateConfigurationState)
8554 XGetWidgetInfo(CancelButtonText,&cancel_info);
8555 cancel_info.width=width;
8556 cancel_info.height=(
unsigned int) (3*height) >> 1;
8557 cancel_info.x=(int) windows->widget.width-cancel_info.width-
8558 (QuantumMargin << 1);
8559 cancel_info.y=(int) windows->widget.height-
8560 cancel_info.height-QuantumMargin;
8561 XGetWidgetInfo(ApplyButtonText,&apply_info);
8562 apply_info.width=width;
8563 apply_info.height=(
unsigned int) (3*height) >> 1;
8564 apply_info.x=QuantumMargin << 1;
8565 apply_info.y=cancel_info.y;
8566 y=(int) (height << 1);
8567 for (i=0; i < NumberPreferences; i++)
8569 XGetWidgetInfo(Preferences[i],&preferences_info[i]);
8570 preferences_info[i].bevel_width--;
8571 preferences_info[i].width=(
unsigned int) QuantumMargin >> 1;
8572 preferences_info[i].height=(
unsigned int) QuantumMargin >> 1;
8573 preferences_info[i].x=QuantumMargin << 1;
8574 preferences_info[i].y=y;
8575 y+=height+(QuantumMargin >> 1);
8577 preferences_info[0].raised=resource_info->backdrop ==
8578 MagickFalse ? MagickTrue : MagickFalse;
8579 preferences_info[1].raised=resource_info->confirm_exit ==
8580 MagickFalse ? MagickTrue : MagickFalse;
8581 preferences_info[2].raised=resource_info->confirm_edit ==
8582 MagickFalse ? MagickTrue : MagickFalse;
8583 preferences_info[3].raised=resource_info->gamma_correct ==
8584 MagickFalse ? MagickTrue : MagickFalse;
8585 preferences_info[4].raised=resource_info->display_warnings ==
8586 MagickFalse ? MagickTrue : MagickFalse;
8587 preferences_info[5].raised=resource_info->quantize_info->dither ==
8588 MagickFalse ? MagickTrue : MagickFalse;
8589 preferences_info[6].raised=resource_info->colormap !=
8590 SharedColormap ? MagickTrue : MagickFalse;
8591 preferences_info[7].raised=resource_info->use_pixmap ==
8592 MagickFalse ? MagickTrue : MagickFalse;
8593 (void) FormatLocaleString(cache,MaxTextExtent,CacheButtonText,
8594 (
unsigned long) resource_info->undo_cache);
8595 XGetWidgetInfo(cache,&cache_info);
8596 cache_info.bevel_width--;
8597 cache_info.width=(
unsigned int) QuantumMargin >> 1;
8598 cache_info.height=(
unsigned int) QuantumMargin >> 1;
8599 cache_info.x=QuantumMargin << 1;
8601 state&=(~UpdateConfigurationState);
8603 if (state & RedrawWidgetState)
8608 XDrawBeveledButton(display,&windows->widget,&apply_info);
8609 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8610 for (i=0; i < NumberPreferences; i++)
8611 XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
8612 XDrawTriangleEast(display,&windows->widget,&cache_info);
8613 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
8614 state&=(~RedrawWidgetState);
8619 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
8624 if (MatteIsActive(apply_info,event.xbutton))
8629 apply_info.raised=MagickFalse;
8630 XDrawBeveledButton(display,&windows->widget,&apply_info);
8633 if (MatteIsActive(cancel_info,event.xbutton))
8638 cancel_info.raised=MagickFalse;
8639 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8642 for (i=0; i < NumberPreferences; i++)
8643 if (MatteIsActive(preferences_info[i],event.xbutton))
8648 preferences_info[i].raised=preferences_info[i].raised ==
8649 MagickFalse ? MagickTrue : MagickFalse;
8650 XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
8653 if (MatteIsActive(cache_info,event.xbutton))
8658 x=cache_info.x+cache_info.width+cache_info.bevel_width+
8659 (QuantumMargin >> 1);
8660 y=cache_info.y+((cache_info.height-height) >> 1);
8661 width=WidgetTextWidth(font_info,cache);
8662 (void) XClearArea(display,windows->widget.id,x,y,width,height,
8664 resource_info->undo_cache<<=1;
8665 if (resource_info->undo_cache > 256)
8666 resource_info->undo_cache=1;
8667 (void) FormatLocaleString(cache,MaxTextExtent,CacheButtonText,
8668 (
unsigned long) resource_info->undo_cache);
8669 cache_info.raised=MagickFalse;
8670 XDrawTriangleEast(display,&windows->widget,&cache_info);
8677 if (windows->widget.mapped == MagickFalse)
8679 if (apply_info.raised == MagickFalse)
8681 if (event.xbutton.window == windows->widget.id)
8682 if (MatteIsActive(apply_info,event.xbutton))
8684 apply_info.raised=MagickTrue;
8685 XDrawBeveledButton(display,&windows->widget,&apply_info);
8686 apply_info.raised=MagickFalse;
8688 if (cancel_info.raised == MagickFalse)
8690 if (event.xbutton.window == windows->widget.id)
8691 if (MatteIsActive(cancel_info,event.xbutton))
8693 cancel_info.raised=MagickTrue;
8694 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8696 if (cache_info.raised == MagickFalse)
8698 cache_info.raised=MagickTrue;
8699 XDrawTriangleEast(display,&windows->widget,&cache_info);
8708 if (event.xclient.message_type != windows->wm_protocols)
8710 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
8712 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
8713 (Time)
event.xclient.data.l[1]);
8716 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
8718 if (event.xclient.window == windows->widget.id)
8725 case ConfigureNotify:
8730 if (event.xconfigure.window != windows->widget.id)
8732 if ((event.xconfigure.width == (
int) windows->widget.width) &&
8733 (
event.xconfigure.height == (int) windows->widget.height))
8735 windows->widget.width=(
unsigned int)
8736 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
8737 windows->widget.height=(
unsigned int)
8738 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
8739 state|=UpdateConfigurationState;
8744 if (event.xcrossing.window != windows->widget.id)
8746 state&=(~InactiveWidgetState);
8751 if (event.xexpose.window != windows->widget.id)
8753 if (event.xexpose.count != 0)
8755 state|=RedrawWidgetState;
8761 command[MaxTextExtent];
8769 if (event.xkey.window != windows->widget.id)
8771 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
8772 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
8773 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
8775 apply_info.raised=MagickFalse;
8776 XDrawBeveledButton(display,&windows->widget,&apply_info);
8784 if (event.xcrossing.window != windows->widget.id)
8786 state|=InactiveWidgetState;
8794 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
8795 if (state & InactiveWidgetState)
8797 if (apply_info.raised == MatteIsActive(apply_info,event.xmotion))
8803 apply_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8804 XDrawBeveledButton(display,&windows->widget,&apply_info);
8807 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
8813 cancel_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8814 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8822 }
while ((state & ExitState) == 0);
8823 XSetCursorState(display,windows,MagickFalse);
8824 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8825 XCheckRefreshWindows(display,windows);
8826 if (apply_info.raised)
8827 return(MagickFalse);
8831 resource_info->backdrop=
8832 preferences_info[0].raised == MagickFalse ? MagickTrue : MagickFalse;
8833 resource_info->confirm_exit=
8834 preferences_info[1].raised == MagickFalse ? MagickTrue : MagickFalse;
8835 resource_info->confirm_edit=
8836 preferences_info[2].raised == MagickFalse ? MagickTrue : MagickFalse;
8837 resource_info->gamma_correct=
8838 preferences_info[3].raised == MagickFalse ? MagickTrue : MagickFalse;
8839 resource_info->display_warnings=
8840 preferences_info[4].raised == MagickFalse ? MagickTrue : MagickFalse;
8841 resource_info->quantize_info->dither=
8842 preferences_info[5].raised == MagickFalse ? MagickTrue : MagickFalse;
8843 resource_info->colormap=SharedColormap;
8844 if (preferences_info[6].raised)
8845 resource_info->colormap=PrivateColormap;
8846 resource_info->use_pixmap=
8847 preferences_info[7].raised == MagickFalse ? MagickTrue : MagickFalse;
8848 XUserPreferences(resource_info);
8888 MagickExport
void XProgressMonitorWidget(Display *display,XWindows *windows,
8889 const char *task,
const MagickOffsetType offset,
const MagickSizeType span)
8897 assert(display != (Display *) NULL);
8898 assert(windows != (XWindows *) NULL);
8899 assert(task != (
const char *) NULL);
8900 if (IsEventLogging() != MagickFalse)
8901 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",task);
8907 while (XCheckTypedWindowEvent(display,windows->command.id,Expose,&event))
8908 (
void) XCommandWidget(display,windows,(
const char *
const *) NULL,&event);
8909 while (XCheckTypedWindowEvent(display,windows->image.id,Expose,&event))
8910 XRefreshWindow(display,&windows->image,&event);
8911 while (XCheckTypedWindowEvent(display,windows->info.id,Expose,&event))
8912 if (monitor_info.text != (
char *) NULL)
8913 XInfoWidget(display,windows,monitor_info.text);
8917 if ((windows->info.mapped == MagickFalse) || (task != monitor_info.text))
8918 XInfoWidget(display,windows,task);
8919 width=(
unsigned int) (((offset+1)*(windows->info.width-
8920 (2*monitor_info.x)))/span);
8921 if (width < monitor_info.width)
8923 monitor_info.raised=MagickTrue;
8924 XDrawWidgetText(display,&windows->info,&monitor_info);
8925 monitor_info.raised=MagickFalse;
8927 monitor_info.width=width;
8928 XDrawWidgetText(display,&windows->info,&monitor_info);
8929 (void) XFlush(display);
8968 MagickExport
void XTextViewWidget(Display *display,
8969 const XResourceInfo *resource_info,XWindows *windows,
8970 const MagickBooleanType mono,
const char *title,
const char **textlist)
8972 #define DismissButtonText "Dismiss"
8975 primary_selection[MaxTextExtent];
8980 static MagickStatusType
8981 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
9023 assert(display != (Display *) NULL);
9024 assert(resource_info != (XResourceInfo *) NULL);
9025 assert(windows != (XWindows *) NULL);
9026 assert(title != (
const char *) NULL);
9027 assert(textlist != (
const char **) NULL);
9028 if (IsEventLogging() != MagickFalse)
9029 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",title);
9030 XSetCursorState(display,windows,MagickTrue);
9031 XCheckRefreshWindows(display,windows);
9032 if (textlist == (
const char **) NULL)
9034 XNoticeWidget(display,windows,
"No text to view:",(
char *) NULL);
9040 font_info=windows->widget.font_info;
9041 text_info=(XFontStruct *) NULL;
9042 if (mono != MagickFalse)
9043 text_info=XBestFont(display,resource_info,MagickTrue);
9044 if (text_info == (XFontStruct *) NULL)
9045 text_info=windows->widget.font_info;
9047 for (i=0; textlist[i] != (
char *) NULL; i++)
9048 if (WidgetTextWidth(text_info,(
char *) textlist[i]) > text_width)
9049 text_width=(
unsigned int) XTextWidth(text_info,(
char *) textlist[i],
9050 MagickMin(Extent(textlist[i]),160));
9051 lines=(
unsigned int) i;
9052 width=WidgetTextWidth(font_info,DismissButtonText);
9053 width+=QuantumMargin;
9054 height=(
unsigned int) (text_info->ascent+text_info->descent);
9058 windows->widget.width=(
unsigned int) (MagickMin((
int) text_width,
9059 (int) MaxTextWidth)+5*QuantumMargin);
9060 windows->widget.min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
9061 if (windows->widget.width < windows->widget.min_width)
9062 windows->widget.width=windows->widget.min_width;
9063 windows->widget.height=(
unsigned int) (MagickMin(MagickMax((
int) lines,3),32)*
9064 height+((13*height) >> 1)+((9*QuantumMargin) >> 1));
9065 windows->widget.min_height=(
unsigned int) (3*height+((13*height) >> 1)+((9*
9066 QuantumMargin) >> 1));
9067 if (windows->widget.height < windows->widget.min_height)
9068 windows->widget.height=windows->widget.min_height;
9069 XConstrainWindowPosition(display,&windows->widget);
9073 (void) CopyMagickString(windows->widget.name,title,MaxTextExtent);
9074 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
9075 if (status != False)
9077 XSetWMName(display,windows->widget.id,&window_name);
9078 XSetWMIconName(display,windows->widget.id,&window_name);
9079 (void) XFree((
void *) window_name.value);
9081 window_changes.width=(int) windows->widget.width;
9082 window_changes.height=(
int) windows->widget.height;
9083 window_changes.x=windows->widget.x;
9084 window_changes.y=windows->widget.y;
9085 (void) XReconfigureWMWindow(display,windows->widget.id,
9086 windows->widget.screen,(
unsigned int) mask,&window_changes);
9087 (void) XMapRaised(display,windows->widget.id);
9088 windows->widget.mapped=MagickFalse;
9092 XGetWidgetInfo((
char *) NULL,&slider_info);
9093 XGetWidgetInfo((
char *) NULL,&north_info);
9094 XGetWidgetInfo((
char *) NULL,&south_info);
9095 XGetWidgetInfo((
char *) NULL,&expose_info);
9096 XGetWidgetInfo((
char *) NULL,&selection_info);
9098 delay=SuspendTime << 2;
9099 height=(
unsigned int) (font_info->ascent+font_info->descent);
9100 state=UpdateConfigurationState;
9103 if (state & UpdateConfigurationState)
9111 XGetWidgetInfo(DismissButtonText,&dismiss_info);
9112 dismiss_info.width=width;
9113 dismiss_info.height=(
unsigned int) ((3*height) >> 1);
9114 dismiss_info.x=(int) windows->widget.width-dismiss_info.width-
9116 dismiss_info.y=(
int) windows->widget.height-dismiss_info.height-
9121 XGetWidgetInfo((
char *) NULL,&scroll_info);
9122 scroll_info.bevel_width--;
9123 scroll_info.width=height;
9124 scroll_info.height=(
unsigned int) (dismiss_info.y-((5*QuantumMargin) >>
9126 scroll_info.x=(int) windows->widget.width-QuantumMargin-
9128 scroll_info.y=(3*QuantumMargin) >> 1;
9129 scroll_info.raised=MagickFalse;
9130 scroll_info.trough=MagickTrue;
9131 north_info=scroll_info;
9132 north_info.raised=MagickTrue;
9133 north_info.width-=(north_info.bevel_width << 1);
9134 north_info.height=north_info.width-1;
9135 north_info.x+=north_info.bevel_width;
9136 north_info.y+=north_info.bevel_width;
9137 south_info=north_info;
9138 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
9141 slider_info=north_info;
9143 slider_info.width-=2;
9144 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
9145 slider_info.bevel_width+2;
9146 slider_info.height=scroll_info.height-((slider_info.min_y-
9147 scroll_info.y+1) << 1)+4;
9148 visible_lines=(
unsigned int) (scroll_info.height*PerceptibleReciprocal(
9149 (
double) text_info->ascent+text_info->descent+((text_info->ascent+
9150 text_info->descent) >> 3)));
9151 if (lines > visible_lines)
9152 slider_info.height=(
unsigned int) (visible_lines*slider_info.height)/
9154 slider_info.max_y=south_info.y-south_info.bevel_width-
9155 slider_info.bevel_width-2;
9156 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
9157 slider_info.y=slider_info.min_y;
9158 expose_info=scroll_info;
9159 expose_info.y=slider_info.y;
9163 XGetWidgetInfo((
char *) NULL,&list_info);
9164 list_info.raised=MagickFalse;
9165 list_info.bevel_width--;
9166 list_info.width=(
unsigned int) scroll_info.x-((3*QuantumMargin) >> 1);
9167 list_info.height=scroll_info.height;
9168 list_info.x=QuantumMargin;
9169 list_info.y=scroll_info.y;
9173 XGetWidgetInfo((
char *) NULL,&selection_info);
9174 selection_info.center=MagickFalse;
9175 selection_info.width=list_info.width;
9176 selection_info.height=(
unsigned int)
9177 (9*(text_info->ascent+text_info->descent)) >> 3;
9178 selection_info.x=list_info.x;
9179 state&=(~UpdateConfigurationState);
9181 if (state & RedrawWidgetState)
9186 XDrawBeveledMatte(display,&windows->widget,&list_info);
9187 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
9188 XDrawTriangleNorth(display,&windows->widget,&north_info);
9189 XDrawBeveledButton(display,&windows->widget,&slider_info);
9190 XDrawTriangleSouth(display,&windows->widget,&south_info);
9191 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9192 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
9193 selection_info.id=(~0);
9194 state|=RedrawListState;
9195 state&=(~RedrawWidgetState);
9197 if (state & RedrawListState)
9202 if (slider_info.id >= (
int) (lines-visible_lines))
9203 slider_info.id=(int) lines-visible_lines;
9204 if ((slider_info.id < 0) || (lines <= visible_lines))
9206 slider_info.y=slider_info.min_y;
9209 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/lines;
9210 if (slider_info.id != selection_info.id)
9215 windows->widget.font_info=text_info;
9216 (void) XSetFont(display,windows->widget.annotate_context,
9218 (void) XSetFont(display,windows->widget.highlight_context,
9220 selection_info.id=slider_info.id;
9221 selection_info.y=list_info.y+(height >> 3)+2;
9222 for (i=0; i < (int) visible_lines; i++)
9224 selection_info.raised=
9225 (slider_info.id+i) != list_info.id ? MagickTrue : MagickFalse;
9226 selection_info.text=(
char *) NULL;
9227 if ((slider_info.id+i) < (int) lines)
9228 selection_info.text=(
char *) textlist[slider_info.id+i];
9229 XDrawWidgetText(display,&windows->widget,&selection_info);
9230 selection_info.y+=(int) selection_info.height;
9232 windows->widget.font_info=font_info;
9233 (void) XSetFont(display,windows->widget.annotate_context,
9235 (void) XSetFont(display,windows->widget.highlight_context,
9240 if (slider_info.y > expose_info.y)
9242 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
9243 expose_info.y=slider_info.y-expose_info.height-
9244 slider_info.bevel_width-1;
9248 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
9249 expose_info.y=slider_info.y+slider_info.height+
9250 slider_info.bevel_width+1;
9252 XDrawTriangleNorth(display,&windows->widget,&north_info);
9253 XDrawMatte(display,&windows->widget,&expose_info);
9254 XDrawBeveledButton(display,&windows->widget,&slider_info);
9255 XDrawTriangleSouth(display,&windows->widget,&south_info);
9256 expose_info.y=slider_info.y;
9258 state&=(~RedrawListState);
9263 if (north_info.raised && south_info.raised)
9264 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
9270 XDelay(display,delay);
9272 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
9273 if (north_info.raised == MagickFalse)
9274 if (slider_info.id > 0)
9280 state|=RedrawListState;
9282 if (south_info.raised == MagickFalse)
9283 if (slider_info.id < (
int) lines)
9289 state|=RedrawListState;
9291 if (event.type != ButtonRelease)
9298 if (MatteIsActive(slider_info,event.xbutton))
9303 slider_info.active=MagickTrue;
9306 if (MatteIsActive(north_info,event.xbutton))
9307 if (slider_info.id > 0)
9312 north_info.raised=MagickFalse;
9314 state|=RedrawListState;
9317 if (MatteIsActive(south_info,event.xbutton))
9318 if (slider_info.id < (
int) lines)
9323 south_info.raised=MagickFalse;
9325 state|=RedrawListState;
9328 if (MatteIsActive(scroll_info,event.xbutton))
9333 if (event.xbutton.y < slider_info.y)
9334 slider_info.id-=(visible_lines-1);
9336 slider_info.id+=(visible_lines-1);
9337 state|=RedrawListState;
9340 if (MatteIsActive(dismiss_info,event.xbutton))
9345 dismiss_info.raised=MagickFalse;
9346 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9349 if (MatteIsActive(list_info,event.xbutton))
9360 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
9361 selection_info.height;
9362 if (
id >= (
int) lines)
9364 if (
id != list_info.id)
9367 click_time=
event.xbutton.time;
9371 if (event.xbutton.time >= (click_time+DoubleClick))
9373 click_time=
event.xbutton.time;
9376 click_time=
event.xbutton.time;
9380 (void) CopyMagickString(primary_selection,textlist[list_info.id],
9382 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
9383 event.xbutton.time);
9384 if (XGetSelectionOwner(display,XA_PRIMARY) != windows->widget.id)
9386 selection_info.id=(~0);
9388 state|=RedrawListState;
9395 if (windows->widget.mapped == MagickFalse)
9397 if (north_info.raised == MagickFalse)
9402 delay=SuspendTime << 2;
9403 north_info.raised=MagickTrue;
9404 XDrawTriangleNorth(display,&windows->widget,&north_info);
9406 if (south_info.raised == MagickFalse)
9411 delay=SuspendTime << 2;
9412 south_info.raised=MagickTrue;
9413 XDrawTriangleSouth(display,&windows->widget,&south_info);
9415 if (slider_info.active)
9420 slider_info.active=MagickFalse;
9423 if (dismiss_info.raised == MagickFalse)
9425 if (event.xbutton.window == windows->widget.id)
9426 if (MatteIsActive(dismiss_info,event.xbutton))
9428 dismiss_info.raised=MagickTrue;
9429 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9438 if (event.xclient.message_type != windows->wm_protocols)
9440 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
9442 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
9443 (Time)
event.xclient.data.l[1]);
9446 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
9448 if (event.xclient.window == windows->widget.id)
9455 case ConfigureNotify:
9460 if (event.xconfigure.window != windows->widget.id)
9462 if ((event.xconfigure.width == (
int) windows->widget.width) &&
9463 (
event.xconfigure.height == (int) windows->widget.height))
9465 windows->widget.width=(
unsigned int)
9466 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
9467 windows->widget.height=(
unsigned int)
9468 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
9469 state|=UpdateConfigurationState;
9474 if (event.xcrossing.window != windows->widget.id)
9476 state&=(~InactiveWidgetState);
9481 if (event.xexpose.window != windows->widget.id)
9483 if (event.xexpose.count != 0)
9485 state|=RedrawWidgetState;
9491 command[MaxTextExtent];
9502 if (event.xkey.window != windows->widget.id)
9504 length=XLookupString((XKeyEvent *) &event.xkey,command,
9505 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
9506 *(command+length)=
'\0';
9507 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
9509 dismiss_info.raised=MagickFalse;
9510 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9514 if (AreaIsActive(scroll_info,event.xkey))
9519 switch ((
int) key_symbol)
9542 slider_info.id-=visible_lines;
9548 slider_info.id+=visible_lines;
9554 slider_info.id=(int) lines;
9558 state|=RedrawListState;
9567 if (event.xcrossing.window != windows->widget.id)
9569 state|=InactiveWidgetState;
9583 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9584 if (slider_info.active)
9589 slider_info.y=
event.xmotion.y-
9590 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
9591 if (slider_info.y < slider_info.min_y)
9592 slider_info.y=slider_info.min_y;
9593 if (slider_info.y > slider_info.max_y)
9594 slider_info.y=slider_info.max_y;
9596 if (slider_info.y != slider_info.min_y)
9597 slider_info.id=(int) (lines*(slider_info.y-slider_info.min_y+1))/
9598 (slider_info.max_y-slider_info.min_y+1);
9599 state|=RedrawListState;
9602 if (state & InactiveWidgetState)
9604 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
9609 dismiss_info.raised=
9610 dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
9611 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9616 case SelectionClear:
9619 selection_info.id=(~0);
9620 state|=RedrawListState;
9623 case SelectionRequest:
9628 XSelectionRequestEvent
9631 if (list_info.id == (~0))
9636 request=(&(
event.xselectionrequest));
9637 (void) XChangeProperty(request->display,request->requestor,
9638 request->property,request->target,8,PropModeReplace,
9639 (
unsigned char *) primary_selection,Extent(primary_selection));
9640 notify.type=SelectionNotify;
9641 notify.send_event=MagickTrue;
9642 notify.display=request->display;
9643 notify.requestor=request->requestor;
9644 notify.selection=request->selection;
9645 notify.target=request->target;
9646 notify.time=request->time;
9647 if (request->property == None)
9648 notify.property=request->target;
9650 notify.property=request->property;
9651 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
9652 (XEvent *) ¬ify);
9657 }
while ((state & ExitState) == 0);
9658 if (text_info != windows->widget.font_info)
9659 (void) XFreeFont(display,text_info);
9660 XSetCursorState(display,windows,MagickFalse);
9661 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
9662 XCheckRefreshWindows(display,windows);