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;
1122 if (text_info->cursor == text_info->text)
1124 text_info->cursor--;
1133 if (text_info->cursor == (text_info->text+Extent(text_info->text)))
1135 text_info->cursor++;
1147 if (state & ControlState)
1151 if ((Extent(text_info->text)+1) >= (int) MaxTextExtent)
1152 (void) XBell(display,0);
1155 if (text_info->highlight)
1160 *text_info->text=
'\0';
1161 text_info->cursor=text_info->text;
1162 text_info->marker=text_info->text;
1163 text_info->highlight=MagickFalse;
1168 q=text_info->text+Extent(text_info->text)+strlen(text);
1169 for (i=0; i <= Extent(text_info->cursor); i++)
1171 *q=(*(q-Extent(text)));
1175 for (i=0; i < Extent(text); i++)
1176 *text_info->cursor++=(*p++);
1207 static void XGetWidgetInfo(
const char *text,XWidgetInfo *widget_info)
1212 widget_info->id=(~0);
1213 widget_info->bevel_width=3;
1214 widget_info->width=1;
1215 widget_info->height=1;
1218 widget_info->min_y=0;
1219 widget_info->max_y=0;
1220 widget_info->raised=MagickTrue;
1221 widget_info->active=MagickFalse;
1222 widget_info->center=MagickTrue;
1223 widget_info->trough=MagickFalse;
1224 widget_info->highlight=MagickFalse;
1225 widget_info->text=(
char *) text;
1226 widget_info->cursor=(
char *) text;
1227 if (text != (
char *) NULL)
1228 widget_info->cursor+=Extent(text);
1229 widget_info->marker=(
char *) text;
1263 static void XHighlightWidget(Display *display,
const XWindowInfo *window_info,
1264 const int x,
const int y)
1269 XSetBevelColor(display,window_info,MagickTrue);
1270 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,x,y,
1271 window_info->width-(x << 1),window_info->height-(y << 1));
1272 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
1273 x-1,y-1,window_info->width-(x << 1)+1,window_info->height-(y << 1)+1);
1274 XSetBevelColor(display,window_info,MagickFalse);
1275 (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
1276 x-1,y-1,window_info->width-(x << 1),window_info->height-(y << 1));
1277 (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
1309 #if defined(__cplusplus) || defined(c_plusplus)
1313 static int XScreenEvent(Display *display,XEvent *event,
char *data)
1318 windows=(XWindows *) data;
1319 if (event->xany.window == windows->popup.id)
1321 if (event->type == MapNotify)
1322 windows->popup.mapped=MagickTrue;
1323 if (event->type == UnmapNotify)
1324 windows->popup.mapped=MagickFalse;
1327 if (event->xany.window == windows->widget.id)
1329 if (event->type == MapNotify)
1330 windows->widget.mapped=MagickTrue;
1331 if (event->type == UnmapNotify)
1332 windows->widget.mapped=MagickFalse;
1335 switch (event->type)
1339 if ((event->xbutton.button == Button3) &&
1340 (
event->xbutton.state & Mod1Mask))
1345 event->xbutton.button=Button2;
1346 event->xbutton.state&=(~Mod1Mask);
1352 if (event->xexpose.window == windows->image.id)
1354 XRefreshWindow(display,&windows->image,event);
1357 if (event->xexpose.window == windows->magnify.id)
1358 if (event->xexpose.count == 0)
1359 if (windows->magnify.mapped)
1361 XMakeMagnifyImage(display,windows);
1364 if (event->xexpose.window == windows->command.id)
1365 if (event->xexpose.count == 0)
1367 (void) XCommandWidget(display,windows,(
const char *
const *) NULL,
1378 if (event->xfocus.window == windows->image.id)
1379 (void) XSetInputFocus(display,windows->image.id,RevertToNone,
1387 case SelectionNotify:
1392 return(MagickFalse);
1395 #if defined(__cplusplus) || defined(c_plusplus)
1427 static void XSetBevelColor(Display *display,
const XWindowInfo *window_info,
1428 const MagickStatusType raised)
1430 if (window_info->depth == 1)
1438 (void) XSetBackground(display,window_info->widget_context,
1439 XBlackPixel(display,window_info->screen));
1440 (void) XSetForeground(display,window_info->widget_context,
1441 XWhitePixel(display,window_info->screen));
1442 (void) XSetFillStyle(display,window_info->widget_context,
1443 FillOpaqueStippled);
1444 stipple=window_info->highlight_stipple;
1445 if (raised == MagickFalse)
1446 stipple=window_info->shadow_stipple;
1447 (void) XSetStipple(display,window_info->widget_context,stipple);
1451 (void) XSetForeground(display,window_info->widget_context,
1452 window_info->pixel_info->highlight_color.pixel);
1454 (
void) XSetForeground(display,window_info->widget_context,
1455 window_info->pixel_info->shadow_color.pixel);
1485 static void XSetMatteColor(Display *display,
const XWindowInfo *window_info,
1486 const MagickStatusType raised)
1488 if (window_info->depth == 1)
1494 (void) XSetForeground(display,window_info->widget_context,
1495 XWhitePixel(display,window_info->screen));
1497 (
void) XSetForeground(display,window_info->widget_context,
1498 XBlackPixel(display,window_info->screen));
1502 (void) XSetForeground(display,window_info->widget_context,
1503 window_info->pixel_info->matte_color.pixel);
1505 (
void) XSetForeground(display,window_info->widget_context,
1506 window_info->pixel_info->depth_color.pixel);
1537 static void XSetTextColor(Display *display,
const XWindowInfo *window_info,
1538 const MagickStatusType raised)
1544 if (window_info->depth == 1)
1550 (void) XSetForeground(display,window_info->widget_context,
1551 XBlackPixel(display,window_info->screen));
1553 (
void) XSetForeground(display,window_info->widget_context,
1554 XWhitePixel(display,window_info->screen));
1557 foreground=(ssize_t) XPixelIntensity(
1558 &window_info->pixel_info->foreground_color);
1559 matte=(ssize_t) XPixelIntensity(&window_info->pixel_info->matte_color);
1560 if (MagickAbsoluteValue((
int) (foreground-matte)) > (65535L >> 3))
1561 (void) XSetForeground(display,window_info->widget_context,
1562 window_info->pixel_info->foreground_color.pixel);
1564 (
void) XSetForeground(display,window_info->widget_context,
1565 window_info->pixel_info->background_color.pixel);
1600 MagickExport
void XColorBrowserWidget(Display *display,XWindows *windows,
1601 const char *action,
char *reply)
1603 #define CancelButtonText "Cancel"
1604 #define ColornameText "Name:"
1605 #define ColorPatternText "Pattern:"
1606 #define GrabButtonText "Grab"
1607 #define ResetButtonText "Reset"
1611 primary_selection[MaxTextExtent] =
"",
1612 reset_pattern[MaxTextExtent],
1613 text[MaxTextExtent];
1626 glob_pattern[MaxTextExtent] =
"*";
1628 static MagickStatusType
1629 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
1679 assert(display != (Display *) NULL);
1680 assert(windows != (XWindows *) NULL);
1681 assert(action != (
char *) NULL);
1682 assert(reply != (
char *) NULL);
1683 if (IsEventLogging() != MagickFalse)
1684 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
1685 XSetCursorState(display,windows,MagickTrue);
1686 XCheckRefreshWindows(display,windows);
1687 (void) CopyMagickString(reset_pattern,
"*",MaxTextExtent);
1688 exception=AcquireExceptionInfo();
1689 colorlist=GetColorList(glob_pattern,&colors,exception);
1690 if (colorlist == (
char **) NULL)
1695 (void) CopyMagickString(glob_pattern,
"*",MaxTextExtent);
1696 colorlist=GetColorList(glob_pattern,&colors,exception);
1697 if (colorlist == (
char **) NULL)
1699 XNoticeWidget(display,windows,
"Unable to obtain colors names:",
1701 (void) XDialogWidget(display,windows,action,
"Enter color name:",
1709 font_info=windows->widget.font_info;
1711 for (i=0; i < (int) colors; i++)
1712 if (WidgetTextWidth(font_info,colorlist[i]) > text_width)
1713 text_width=WidgetTextWidth(font_info,colorlist[i]);
1714 width=WidgetTextWidth(font_info,(
char *) action);
1715 if (WidgetTextWidth(font_info,CancelButtonText) > width)
1716 width=WidgetTextWidth(font_info,CancelButtonText);
1717 if (WidgetTextWidth(font_info,ResetButtonText) > width)
1718 width=WidgetTextWidth(font_info,ResetButtonText);
1719 if (WidgetTextWidth(font_info,GrabButtonText) > width)
1720 width=WidgetTextWidth(font_info,GrabButtonText);
1721 width+=QuantumMargin;
1722 if (WidgetTextWidth(font_info,ColorPatternText) > width)
1723 width=WidgetTextWidth(font_info,ColorPatternText);
1724 if (WidgetTextWidth(font_info,ColornameText) > width)
1725 width=WidgetTextWidth(font_info,ColornameText);
1726 height=(
unsigned int) (font_info->ascent+font_info->descent);
1730 windows->widget.width=(
unsigned int)
1731 (width+MagickMin((
int) text_width,(int) MaxTextWidth)+6*QuantumMargin);
1732 windows->widget.min_width=(
unsigned int)
1733 (width+MinTextWidth+4*QuantumMargin);
1734 if (windows->widget.width < windows->widget.min_width)
1735 windows->widget.width=windows->widget.min_width;
1736 windows->widget.height=(
unsigned int)
1737 ((81*height) >> 2)+((13*QuantumMargin) >> 1)+4;
1738 windows->widget.min_height=(
unsigned int)
1739 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
1740 if (windows->widget.height < windows->widget.min_height)
1741 windows->widget.height=windows->widget.min_height;
1742 XConstrainWindowPosition(display,&windows->widget);
1746 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Color",
1748 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
1749 if (status != False)
1751 XSetWMName(display,windows->widget.id,&window_name);
1752 XSetWMIconName(display,windows->widget.id,&window_name);
1753 (void) XFree((
void *) window_name.value);
1755 window_changes.width=(int) windows->widget.width;
1756 window_changes.height=(
int) windows->widget.height;
1757 window_changes.x=windows->widget.x;
1758 window_changes.y=windows->widget.y;
1759 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
1760 mask,&window_changes);
1761 (void) XMapRaised(display,windows->widget.id);
1762 windows->widget.mapped=MagickFalse;
1766 XGetWidgetInfo((
char *) NULL,&mode_info);
1767 XGetWidgetInfo((
char *) NULL,&slider_info);
1768 XGetWidgetInfo((
char *) NULL,&north_info);
1769 XGetWidgetInfo((
char *) NULL,&south_info);
1770 XGetWidgetInfo((
char *) NULL,&expose_info);
1771 XGetWidgetInfo((
char *) NULL,&selection_info);
1773 delay=SuspendTime << 2;
1774 state=UpdateConfigurationState;
1777 if (state & UpdateConfigurationState)
1785 XGetWidgetInfo(CancelButtonText,&cancel_info);
1786 cancel_info.width=width;
1787 cancel_info.height=(
unsigned int) ((3*height) >> 1);
1789 (windows->widget.width-cancel_info.width-QuantumMargin-2);
1791 (windows->widget.height-cancel_info.height-QuantumMargin);
1792 XGetWidgetInfo(action,&action_info);
1793 action_info.width=width;
1794 action_info.height=(
unsigned int) ((3*height) >> 1);
1795 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
1796 (action_info.bevel_width << 1));
1797 action_info.y=cancel_info.y;
1798 XGetWidgetInfo(GrabButtonText,&grab_info);
1799 grab_info.width=width;
1800 grab_info.height=(
unsigned int) ((3*height) >> 1);
1801 grab_info.x=QuantumMargin;
1802 grab_info.y=((5*QuantumMargin) >> 1)+height;
1803 XGetWidgetInfo(ResetButtonText,&reset_info);
1804 reset_info.width=width;
1805 reset_info.height=(
unsigned int) ((3*height) >> 1);
1806 reset_info.x=QuantumMargin;
1807 reset_info.y=grab_info.y+grab_info.height+QuantumMargin;
1811 XGetWidgetInfo(reply,&reply_info);
1812 reply_info.raised=MagickFalse;
1813 reply_info.bevel_width--;
1814 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
1815 reply_info.height=height << 1;
1816 reply_info.x=(int) (width+(QuantumMargin << 1));
1817 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
1821 XGetWidgetInfo((
char *) NULL,&mode_info);
1822 mode_info.active=MagickTrue;
1823 mode_info.bevel_width=0;
1824 mode_info.width=(
unsigned int) (action_info.x-(QuantumMargin << 1));
1825 mode_info.height=action_info.height;
1826 mode_info.x=QuantumMargin;
1827 mode_info.y=action_info.y;
1831 XGetWidgetInfo((
char *) NULL,&scroll_info);
1832 scroll_info.bevel_width--;
1833 scroll_info.width=height;
1834 scroll_info.height=(
unsigned int) (reply_info.y-grab_info.y-
1835 (QuantumMargin >> 1));
1836 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
1837 scroll_info.y=grab_info.y-reply_info.bevel_width;
1838 scroll_info.raised=MagickFalse;
1839 scroll_info.trough=MagickTrue;
1840 north_info=scroll_info;
1841 north_info.raised=MagickTrue;
1842 north_info.width-=(north_info.bevel_width << 1);
1843 north_info.height=north_info.width-1;
1844 north_info.x+=north_info.bevel_width;
1845 north_info.y+=north_info.bevel_width;
1846 south_info=north_info;
1847 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
1850 slider_info=north_info;
1852 slider_info.width-=2;
1853 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
1854 slider_info.bevel_width+2;
1855 slider_info.height=scroll_info.height-((slider_info.min_y-
1856 scroll_info.y+1) << 1)+4;
1857 visible_colors=(
unsigned int) (scroll_info.height*
1858 PerceptibleReciprocal((
double) height+(height >> 3)));
1859 if (colors > visible_colors)
1860 slider_info.height=(
unsigned int) ((visible_colors*
1861 slider_info.height)/colors);
1862 slider_info.max_y=south_info.y-south_info.bevel_width-
1863 slider_info.bevel_width-2;
1864 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
1865 slider_info.y=slider_info.min_y;
1866 expose_info=scroll_info;
1867 expose_info.y=slider_info.y;
1871 XGetWidgetInfo((
char *) NULL,&list_info);
1872 list_info.raised=MagickFalse;
1873 list_info.bevel_width--;
1874 list_info.width=(
unsigned int)
1875 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
1876 list_info.height=scroll_info.height;
1877 list_info.x=reply_info.x;
1878 list_info.y=scroll_info.y;
1879 if (windows->widget.mapped == MagickFalse)
1880 state|=JumpListState;
1885 XGetWidgetInfo(text,&text_info);
1886 text_info.center=MagickFalse;
1887 text_info.width=reply_info.width;
1888 text_info.height=height;
1889 text_info.x=list_info.x-(QuantumMargin >> 1);
1890 text_info.y=QuantumMargin;
1894 XGetWidgetInfo((
char *) NULL,&selection_info);
1895 selection_info.center=MagickFalse;
1896 selection_info.width=list_info.width;
1897 selection_info.height=(
unsigned int) ((9*height) >> 3);
1898 selection_info.x=list_info.x;
1899 state&=(~UpdateConfigurationState);
1901 if (state & RedrawWidgetState)
1907 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
1908 (void) XDrawString(display,windows->widget.id,
1909 windows->widget.annotate_context,x,y,ColorPatternText,
1910 Extent(ColorPatternText));
1911 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
1912 XDrawWidgetText(display,&windows->widget,&text_info);
1913 XDrawBeveledButton(display,&windows->widget,&grab_info);
1914 XDrawBeveledButton(display,&windows->widget,&reset_info);
1915 XDrawBeveledMatte(display,&windows->widget,&list_info);
1916 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
1917 XDrawTriangleNorth(display,&windows->widget,&north_info);
1918 XDrawBeveledButton(display,&windows->widget,&slider_info);
1919 XDrawTriangleSouth(display,&windows->widget,&south_info);
1921 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
1922 (void) XDrawString(display,windows->widget.id,
1923 windows->widget.annotate_context,x,y,ColornameText,
1924 Extent(ColornameText));
1925 XDrawBeveledMatte(display,&windows->widget,&reply_info);
1926 XDrawMatteText(display,&windows->widget,&reply_info);
1927 XDrawBeveledButton(display,&windows->widget,&action_info);
1928 XDrawBeveledButton(display,&windows->widget,&cancel_info);
1929 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
1930 selection_info.id=(~0);
1931 state|=RedrawActionState;
1932 state|=RedrawListState;
1933 state&=(~RedrawWidgetState);
1935 if (state & UpdateListState)
1943 status=XParseColor(display,windows->widget.map_info->colormap,
1944 glob_pattern,&color);
1945 if ((status != False) || (strchr(glob_pattern,
'-') != (
char *) NULL))
1950 (void) CopyMagickString(reply,glob_pattern,MaxTextExtent);
1951 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
1952 action_info.raised=MagickFalse;
1953 XDrawBeveledButton(display,&windows->widget,&action_info);
1959 checklist=GetColorList(glob_pattern,&number_colors,exception);
1960 if (number_colors == 0)
1962 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
1963 (void) XBell(display,0);
1967 for (i=0; i < (int) colors; i++)
1968 colorlist[i]=DestroyString(colorlist[i]);
1969 if (colorlist != (
char **) NULL)
1970 colorlist=(
char **) RelinquishMagickMemory(colorlist);
1971 colorlist=checklist;
1972 colors=number_colors;
1978 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
1979 if (colors > visible_colors)
1980 slider_info.height=(
unsigned int)
1981 ((visible_colors*slider_info.height)/colors);
1982 slider_info.max_y=south_info.y-south_info.bevel_width-
1983 slider_info.bevel_width-2;
1985 slider_info.y=slider_info.min_y;
1986 expose_info.y=slider_info.y;
1987 selection_info.id=(~0);
1989 state|=RedrawListState;
1993 *reply_info.text=
'\0';
1994 reply_info.cursor=reply_info.text;
1995 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
1996 XDrawWidgetText(display,&windows->widget,&text_info);
1997 XDrawMatteText(display,&windows->widget,&reply_info);
1998 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
1999 XDrawTriangleNorth(display,&windows->widget,&north_info);
2000 XDrawBeveledButton(display,&windows->widget,&slider_info);
2001 XDrawTriangleSouth(display,&windows->widget,&south_info);
2002 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
2003 state&=(~UpdateListState);
2005 if (state & JumpListState)
2011 for (i=0; i < (int) colors; i++)
2012 if (LocaleCompare(colorlist[i],reply) >= 0)
2014 list_info.id=LocaleCompare(colorlist[i],reply) == 0 ? i : ~0;
2017 if ((i < slider_info.id) ||
2018 (i >= (
int) (slider_info.id+visible_colors)))
2019 slider_info.id=i-(visible_colors >> 1);
2020 selection_info.id=(~0);
2021 state|=RedrawListState;
2022 state&=(~JumpListState);
2024 if (state & RedrawListState)
2029 if (slider_info.id >= (
int) (colors-visible_colors))
2030 slider_info.id=(int) (colors-visible_colors);
2031 if ((slider_info.id < 0) || (colors <= visible_colors))
2033 slider_info.y=slider_info.min_y;
2035 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
2036 slider_info.min_y+1)/colors);
2037 if (slider_info.id != selection_info.id)
2042 selection_info.id=slider_info.id;
2043 selection_info.y=list_info.y+(height >> 3)+2;
2044 for (i=0; i < (int) visible_colors; i++)
2046 selection_info.raised=(slider_info.id+i) != list_info.id ?
2047 MagickTrue : MagickFalse;
2048 selection_info.text=(
char *) NULL;
2049 if ((slider_info.id+i) < (int) colors)
2050 selection_info.text=colorlist[slider_info.id+i];
2051 XDrawWidgetText(display,&windows->widget,&selection_info);
2052 selection_info.y+=(int) selection_info.height;
2057 if (slider_info.y > expose_info.y)
2059 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
2060 expose_info.y=slider_info.y-expose_info.height-
2061 slider_info.bevel_width-1;
2065 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
2066 expose_info.y=slider_info.y+slider_info.height+
2067 slider_info.bevel_width+1;
2069 XDrawTriangleNorth(display,&windows->widget,&north_info);
2070 XDrawMatte(display,&windows->widget,&expose_info);
2071 XDrawBeveledButton(display,&windows->widget,&slider_info);
2072 XDrawTriangleSouth(display,&windows->widget,&south_info);
2073 expose_info.y=slider_info.y;
2075 state&=(~RedrawListState);
2077 if (state & RedrawActionState)
2080 colorname[MaxTextExtent];
2085 color=windows->widget.pixel_info->matte_color;
2086 (void) XParseColor(display,windows->widget.map_info->colormap,
2087 reply_info.text,&windows->widget.pixel_info->matte_color);
2088 XBestPixel(display,windows->widget.map_info->colormap,(XColor *) NULL,
2089 (
unsigned int) windows->widget.visual_info->colormap_size,
2090 &windows->widget.pixel_info->matte_color);
2091 mode_info.text=colorname;
2092 (void) FormatLocaleString(mode_info.text,MaxTextExtent,
"#%02x%02x%02x",
2093 windows->widget.pixel_info->matte_color.red,
2094 windows->widget.pixel_info->matte_color.green,
2095 windows->widget.pixel_info->matte_color.blue);
2096 XDrawBeveledButton(display,&windows->widget,&mode_info);
2097 windows->widget.pixel_info->matte_color=color;
2098 state&=(~RedrawActionState);
2103 if (north_info.raised && south_info.raised)
2104 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
2110 XDelay(display,delay);
2112 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
2113 if (north_info.raised == MagickFalse)
2114 if (slider_info.id > 0)
2120 state|=RedrawListState;
2122 if (south_info.raised == MagickFalse)
2123 if (slider_info.id < (
int) colors)
2129 state|=RedrawListState;
2131 if (event.type != ButtonRelease)
2138 if (MatteIsActive(slider_info,event.xbutton))
2143 slider_info.active=MagickTrue;
2146 if (MatteIsActive(north_info,event.xbutton))
2147 if (slider_info.id > 0)
2152 north_info.raised=MagickFalse;
2154 state|=RedrawListState;
2157 if (MatteIsActive(south_info,event.xbutton))
2158 if (slider_info.id < (
int) colors)
2163 south_info.raised=MagickFalse;
2165 state|=RedrawListState;
2168 if (MatteIsActive(scroll_info,event.xbutton))
2173 if (event.xbutton.y < slider_info.y)
2174 slider_info.id-=(visible_colors-1);
2176 slider_info.id+=(visible_colors-1);
2177 state|=RedrawListState;
2180 if (MatteIsActive(list_info,event.xbutton))
2188 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
2189 selection_info.height;
2190 if (
id >= (
int) colors)
2192 (void) CopyMagickString(reply_info.text,colorlist[
id],
2194 reply_info.highlight=MagickFalse;
2195 reply_info.marker=reply_info.text;
2196 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2197 XDrawMatteText(display,&windows->widget,&reply_info);
2198 state|=RedrawActionState;
2199 if (
id == list_info.id)
2201 (void) CopyMagickString(glob_pattern,reply_info.text,
2203 state|=UpdateListState;
2205 selection_info.id=(~0);
2207 state|=RedrawListState;
2210 if (MatteIsActive(grab_info,event.xbutton))
2215 grab_info.raised=MagickFalse;
2216 XDrawBeveledButton(display,&windows->widget,&grab_info);
2219 if (MatteIsActive(reset_info,event.xbutton))
2224 reset_info.raised=MagickFalse;
2225 XDrawBeveledButton(display,&windows->widget,&reset_info);
2228 if (MatteIsActive(mode_info,event.xbutton))
2233 if (mode_info.text != (
char *) NULL)
2234 (void) CopyMagickString(reply_info.text,mode_info.text,
2236 (void) CopyMagickString(primary_selection,reply_info.text,
2238 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2239 event.xbutton.time);
2240 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2241 windows->widget.id ? MagickTrue : MagickFalse;
2242 reply_info.marker=reply_info.text;
2243 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2244 XDrawMatteText(display,&windows->widget,&reply_info);
2247 if (MatteIsActive(action_info,event.xbutton))
2252 action_info.raised=MagickFalse;
2253 XDrawBeveledButton(display,&windows->widget,&action_info);
2256 if (MatteIsActive(cancel_info,event.xbutton))
2261 cancel_info.raised=MagickFalse;
2262 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2265 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2267 if (event.xbutton.button != Button2)
2275 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
2276 for (i=1; i <= Extent(reply_info.marker); i++)
2277 if (XTextWidth(font_info,reply_info.marker,i) > x)
2279 reply_info.cursor=reply_info.marker+i-1;
2280 if (event.xbutton.time > (click_time+DoubleClick))
2281 reply_info.highlight=MagickFalse;
2287 (
void) CopyMagickString(primary_selection,reply_info.text,
2289 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
2290 event.xbutton.time);
2291 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
2292 windows->widget.id ? MagickTrue : MagickFalse;
2294 XDrawMatteText(display,&windows->widget,&reply_info);
2295 click_time=
event.xbutton.time;
2301 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
2302 windows->widget.id,event.xbutton.time);
2307 if (windows->widget.mapped == MagickFalse)
2309 if (north_info.raised == MagickFalse)
2314 delay=SuspendTime << 2;
2315 north_info.raised=MagickTrue;
2316 XDrawTriangleNorth(display,&windows->widget,&north_info);
2318 if (south_info.raised == MagickFalse)
2323 delay=SuspendTime << 2;
2324 south_info.raised=MagickTrue;
2325 XDrawTriangleSouth(display,&windows->widget,&south_info);
2327 if (slider_info.active)
2332 slider_info.active=MagickFalse;
2335 if (grab_info.raised == MagickFalse)
2337 if (event.xbutton.window == windows->widget.id)
2338 if (MatteIsActive(grab_info,event.xbutton))
2343 (void) XGetWindowColor(display,windows,reply_info.text);
2344 reply_info.marker=reply_info.text;
2345 reply_info.cursor=reply_info.text+Extent(reply_info.text);
2346 XDrawMatteText(display,&windows->widget,&reply_info);
2347 state|=RedrawActionState;
2349 grab_info.raised=MagickTrue;
2350 XDrawBeveledButton(display,&windows->widget,&grab_info);
2352 if (reset_info.raised == MagickFalse)
2354 if (event.xbutton.window == windows->widget.id)
2355 if (MatteIsActive(reset_info,event.xbutton))
2357 (void) CopyMagickString(glob_pattern,reset_pattern,
2359 state|=UpdateListState;
2361 reset_info.raised=MagickTrue;
2362 XDrawBeveledButton(display,&windows->widget,&reset_info);
2364 if (action_info.raised == MagickFalse)
2366 if (event.xbutton.window == windows->widget.id)
2368 if (MatteIsActive(action_info,event.xbutton))
2370 if (*reply_info.text ==
'\0')
2371 (void) XBell(display,0);
2376 action_info.raised=MagickTrue;
2377 XDrawBeveledButton(display,&windows->widget,&action_info);
2379 if (cancel_info.raised == MagickFalse)
2381 if (event.xbutton.window == windows->widget.id)
2382 if (MatteIsActive(cancel_info,event.xbutton))
2384 *reply_info.text=
'\0';
2387 cancel_info.raised=MagickTrue;
2388 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2390 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
2399 if (event.xclient.message_type != windows->wm_protocols)
2401 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
2403 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
2404 (Time)
event.xclient.data.l[1]);
2407 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
2409 if (event.xclient.window == windows->widget.id)
2411 *reply_info.text=
'\0';
2417 case ConfigureNotify:
2422 if (event.xconfigure.window != windows->widget.id)
2424 if ((event.xconfigure.width == (
int) windows->widget.width) &&
2425 (
event.xconfigure.height == (int) windows->widget.height))
2427 windows->widget.width=(
unsigned int)
2428 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
2429 windows->widget.height=(
unsigned int)
2430 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
2431 state|=UpdateConfigurationState;
2436 if (event.xcrossing.window != windows->widget.id)
2438 state&=(~InactiveWidgetState);
2443 if (event.xexpose.window != windows->widget.id)
2445 if (event.xexpose.count != 0)
2447 state|=RedrawWidgetState;
2453 command[MaxTextExtent];
2464 if (event.xkey.window != windows->widget.id)
2466 length=XLookupString((XKeyEvent *) &event.xkey,command,
2467 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2468 *(command+length)=
'\0';
2469 if (AreaIsActive(scroll_info,event.xkey))
2474 switch ((
int) key_symbol)
2497 slider_info.id-=visible_colors;
2503 slider_info.id+=visible_colors;
2509 slider_info.id=(int) colors;
2513 state|=RedrawListState;
2516 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
2521 if (*reply_info.text ==
'\0')
2523 (void) CopyMagickString(glob_pattern,reply_info.text,MaxTextExtent);
2524 state|=UpdateListState;
2527 if (key_symbol == XK_Control_L)
2529 state|=ControlState;
2532 if (state & ControlState)
2533 switch ((
int) key_symbol)
2541 *reply_info.text=
'\0';
2542 reply_info.cursor=reply_info.text;
2543 reply_info.marker=reply_info.text;
2544 reply_info.highlight=MagickFalse;
2550 XEditText(display,&reply_info,key_symbol,command,state);
2551 XDrawMatteText(display,&windows->widget,&reply_info);
2552 state|=JumpListState;
2553 status=XParseColor(display,windows->widget.map_info->colormap,
2554 reply_info.text,&color);
2555 if (status != False)
2556 state|=RedrawActionState;
2562 command[MaxTextExtent];
2570 if (event.xkey.window != windows->widget.id)
2572 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
2573 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
2574 if (key_symbol == XK_Control_L)
2575 state&=(~ControlState);
2580 if (event.xcrossing.window != windows->widget.id)
2582 state|=InactiveWidgetState;
2596 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
2597 if (slider_info.active)
2602 slider_info.y=
event.xmotion.y-
2603 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
2604 if (slider_info.y < slider_info.min_y)
2605 slider_info.y=slider_info.min_y;
2606 if (slider_info.y > slider_info.max_y)
2607 slider_info.y=slider_info.max_y;
2609 if (slider_info.y != slider_info.min_y)
2610 slider_info.id=(int) ((colors*(slider_info.y-
2611 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
2612 state|=RedrawListState;
2615 if (state & InactiveWidgetState)
2617 if (grab_info.raised == MatteIsActive(grab_info,event.xmotion))
2622 grab_info.raised=!grab_info.raised;
2623 XDrawBeveledButton(display,&windows->widget,&grab_info);
2626 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
2631 reset_info.raised=!reset_info.raised;
2632 XDrawBeveledButton(display,&windows->widget,&reset_info);
2635 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
2640 action_info.raised=action_info.raised == MagickFalse ?
2641 MagickTrue : MagickFalse;
2642 XDrawBeveledButton(display,&windows->widget,&action_info);
2645 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
2650 cancel_info.raised=cancel_info.raised == MagickFalse ?
2651 MagickTrue : MagickFalse;
2652 XDrawBeveledButton(display,&windows->widget,&cancel_info);
2657 case SelectionClear:
2659 reply_info.highlight=MagickFalse;
2660 XDrawMatteText(display,&windows->widget,&reply_info);
2663 case SelectionNotify:
2681 if (event.xselection.property == (Atom) None)
2683 status=XGetWindowProperty(display,event.xselection.requestor,
2684 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
2685 &format,&length,&after,&data);
2686 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
2689 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
2690 (void) XBell(display,0);
2696 *(data+length)=
'\0';
2697 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
2699 XDrawMatteText(display,&windows->widget,&reply_info);
2700 state|=JumpListState;
2701 state|=RedrawActionState;
2703 (void) XFree((
void *) data);
2706 case SelectionRequest:
2711 XSelectionRequestEvent
2714 if (reply_info.highlight == MagickFalse)
2719 request=(&(
event.xselectionrequest));
2720 (void) XChangeProperty(request->display,request->requestor,
2721 request->property,request->target,8,PropModeReplace,
2722 (
unsigned char *) primary_selection,Extent(primary_selection));
2723 notify.type=SelectionNotify;
2724 notify.send_event=MagickTrue;
2725 notify.display=request->display;
2726 notify.requestor=request->requestor;
2727 notify.selection=request->selection;
2728 notify.target=request->target;
2729 notify.time=request->time;
2730 if (request->property == None)
2731 notify.property=request->target;
2733 notify.property=request->property;
2734 (void) XSendEvent(request->display,request->requestor,False,
2735 NoEventMask,(XEvent *) ¬ify);
2740 }
while ((state & ExitState) == 0);
2741 XSetCursorState(display,windows,MagickFalse);
2742 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
2743 XCheckRefreshWindows(display,windows);
2747 for (i=0; i < (int) colors; i++)
2748 colorlist[i]=DestroyString(colorlist[i]);
2749 if (colorlist != (
char **) NULL)
2750 colorlist=(
char **) RelinquishMagickMemory(colorlist);
2751 exception=DestroyExceptionInfo(exception);
2752 if ((*reply ==
'\0') || (strchr(reply,
'-') != (
char *) NULL))
2754 status=XParseColor(display,windows->widget.map_info->colormap,reply,&color);
2755 if (status != False)
2757 XNoticeWidget(display,windows,
"Color is unknown to X server:",reply);
2758 (void) CopyMagickString(reply,
"gray",MaxTextExtent);
2796 MagickExport
int XCommandWidget(Display *display,XWindows *windows,
2797 const char *
const *selections,XEvent *event)
2799 #define tile_width 112
2800 #define tile_height 70
2802 static const unsigned char
2805 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2806 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2807 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
2809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
2811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2812 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2813 0x00, 0x00, 0x1e, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2814 0x00, 0x00, 0x00, 0x00, 0x1e, 0xbc, 0x9f, 0x03, 0x00, 0x3e, 0x00, 0xc0,
2815 0x1f, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x0f, 0x80, 0x3f,
2816 0x00, 0xf0, 0x1f, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x1f,
2817 0xe0, 0x3f, 0x00, 0xfc, 0x1f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc,
2818 0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xfe, 0x1f, 0xf8, 0x0f, 0x00, 0x00, 0x00,
2819 0x1e, 0xfc, 0xfc, 0x3f, 0xf8, 0x3f, 0x00, 0xff, 0x1e, 0xfc, 0x0f, 0x00,
2820 0x00, 0x00, 0x1e, 0x7c, 0xfc, 0x3e, 0xf8, 0x3c, 0x80, 0x1f, 0x1e, 0x7c,
2821 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c, 0xc0, 0x0f,
2822 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c,
2823 0xc0, 0x07, 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c,
2824 0x7c, 0x7c, 0xc0, 0x0f, 0x1e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78,
2825 0x78, 0x3c, 0xfc, 0x7c, 0x80, 0x7f, 0x1e, 0x7c, 0x00, 0x00, 0x00, 0x00,
2826 0x1e, 0xf8, 0x78, 0x7c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0xf8, 0xff, 0x00,
2827 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xfe, 0x1f, 0xf8,
2828 0xff, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xf8,
2829 0x1f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xc0, 0xef,
2830 0x07, 0xe0, 0x1f, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0x70, 0x40, 0x78,
2831 0x00, 0xc7, 0x07, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x00,
2832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
2833 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
2834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
2835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2836 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2837 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2838 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2839 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
2840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00,
2841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
2842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
2843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2844 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00,
2845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07,
2846 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2847 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2848 0x60, 0x00, 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2849 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
2850 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00,
2851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x9f, 0x7f, 0x00,
2852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0xdf,
2853 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x00,
2854 0xe0, 0xdf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0c,
2855 0x78, 0x30, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
2856 0x00, 0x0f, 0xf8, 0x70, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x1f, 0x00, 0xe0,
2857 0x0f, 0x1e, 0x80, 0x0f, 0xf8, 0x78, 0xf0, 0xfd, 0xf9, 0x00, 0xc0, 0x1f,
2858 0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x1f, 0xf8, 0x7c, 0xf0, 0xfc, 0xf9, 0x00,
2859 0xf0, 0x1f, 0x00, 0xfe, 0x0f, 0x00, 0xf0, 0x07, 0xf8, 0x3e, 0xf8, 0xfc,
2860 0xf0, 0x01, 0xf8, 0x1f, 0x00, 0xff, 0x0f, 0x1e, 0xf0, 0x03, 0xf8, 0x3f,
2861 0xf8, 0xf8, 0xf0, 0x01, 0xfc, 0x1f, 0x80, 0x7f, 0x0f, 0x1e, 0xf8, 0x00,
2862 0xf8, 0x1f, 0x78, 0x18, 0xf0, 0x01, 0x7c, 0x1e, 0xc0, 0x0f, 0x0f, 0x1e,
2863 0x7c, 0x00, 0xf0, 0x0f, 0x78, 0x00, 0xf0, 0x01, 0x3e, 0x1e, 0xe0, 0x07,
2864 0x0f, 0x1e, 0x7c, 0x00, 0xf0, 0x07, 0x7c, 0x00, 0xe0, 0x01, 0x3e, 0x1e,
2865 0xe0, 0x03, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x0f, 0x7c, 0x00, 0xe0, 0x03,
2866 0x3e, 0x3e, 0xe0, 0x07, 0x0f, 0x1e, 0x1e, 0x00, 0xf0, 0x1f, 0x3c, 0x00,
2867 0xe0, 0x03, 0x7e, 0x3e, 0xc0, 0x3f, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x1f,
2868 0x3e, 0x00, 0xe0, 0x03, 0xfc, 0x7f, 0x80, 0xff, 0x0f, 0x1e, 0xfc, 0x00,
2869 0xf0, 0x3e, 0x3e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xff, 0x0f, 0x1e,
2870 0xfc, 0x07, 0xf0, 0x7c, 0x1e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xfc,
2871 0x0f, 0x1e, 0xf8, 0x1f, 0xf0, 0xf8, 0x1e, 0x00, 0xc0, 0x03, 0xe0, 0xf7,
2872 0x03, 0xf0, 0x0f, 0x1e, 0xe0, 0x3f, 0xf0, 0x78, 0x1c, 0x00, 0x80, 0x03,
2873 0x80, 0xe3, 0x03, 0x00, 0x0f, 0x1e, 0xc0, 0x3f, 0xf0, 0x30, 0x00, 0x00,
2874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x3e, 0x00, 0x00,
2875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x10,
2876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00,
2877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2878 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2879 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2880 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2881 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
2883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
2884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
2885 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2886 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2908 assert(display != (Display *) NULL);
2909 assert(windows != (XWindows *) NULL);
2910 if (IsEventLogging() != MagickFalse)
2911 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
2912 font_info=windows->command.font_info;
2913 height=(
unsigned int) (font_info->ascent+font_info->descent);
2916 if (event == (XEvent *) NULL)
2930 assert(selections != (
const char **) NULL);
2931 windows->command.width=0;
2932 for (i=0; selections[i] != (
char *) NULL; i++)
2934 width=WidgetTextWidth(font_info,(
char *) selections[i]);
2935 if (width > windows->command.width)
2936 windows->command.width=width;
2938 number_selections=(
unsigned int) i;
2939 windows->command.width+=3*QuantumMargin+10;
2940 if ((
int) windows->command.width < (tile_width+QuantumMargin+10))
2941 windows->command.width=(
unsigned int) (tile_width+QuantumMargin+10);
2942 windows->command.height=(
unsigned int) (number_selections*
2943 (((3*height) >> 1)+10)+tile_height+20);
2944 windows->command.min_width=windows->command.width;
2945 windows->command.min_height=windows->command.height;
2946 XConstrainWindowPosition(display,&windows->command);
2947 if (windows->command.id != (Window) NULL)
2955 status=XStringListToTextProperty(&windows->command.name,1,
2957 if (status != False)
2959 XSetWMName(display,windows->command.id,&window_name);
2960 XSetWMIconName(display,windows->command.id,&window_name);
2961 (void) XFree((
void *) window_name.value);
2963 window_changes.width=(int) windows->command.width;
2964 window_changes.height=(
int) windows->command.height;
2965 (void) XReconfigureWMWindow(display,windows->command.id,
2966 windows->command.screen,(
unsigned int) (CWWidth | CWHeight),
2972 if (selection_info != (XWidgetInfo *) NULL)
2973 selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
2974 selection_info=(XWidgetInfo *) AcquireQuantumMemory(number_selections,
2975 sizeof(*selection_info));
2976 if (selection_info == (XWidgetInfo *) NULL)
2977 ThrowXWindowFatalException(ResourceLimitFatalError,
2978 "MemoryAllocationFailed",
"...");
2979 state|=UpdateConfigurationState | RedrawWidgetState;
2984 if (event != (XEvent *) NULL)
2985 switch (event->type)
2989 for (i=0; i < (int) number_selections; i++)
2991 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
2993 if (i >= (
int) windows->command.data)
2995 selection_info[i].raised=MagickFalse;
2996 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
2999 submenu_info=selection_info[i];
3000 submenu_info.active=MagickTrue;
3001 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3002 (toggle_info.height >> 1);
3004 (void) XCheckWindowEvent(display,windows->widget.id,LeaveWindowMask,
3012 for (i=0; i < (int) number_selections; i++)
3014 if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
3017 if (
id >= (
int) windows->command.data)
3019 selection_info[id].raised=MagickTrue;
3020 XDrawBeveledButton(display,&windows->command,&selection_info[
id]);
3032 if (event->xclient.message_type != windows->wm_protocols)
3034 if (*event->xclient.data.l != (
int) windows->wm_delete_window)
3036 (void) XWithdrawWindow(display,windows->command.id,
3037 windows->command.screen);
3040 case ConfigureNotify:
3045 if (event->xconfigure.window != windows->command.id)
3047 if (event->xconfigure.send_event != 0)
3049 windows->command.x=
event->xconfigure.x;
3050 windows->command.y=
event->xconfigure.y;
3052 if ((event->xconfigure.width == (
int) windows->command.width) &&
3053 (
event->xconfigure.height == (int) windows->command.height))
3055 windows->command.width=(
unsigned int)
3056 MagickMax(event->xconfigure.width,(
int) windows->command.min_width);
3057 windows->command.height=(
unsigned int)
3058 MagickMax(event->xconfigure.height,(
int) windows->command.min_height);
3059 state|=UpdateConfigurationState;
3064 if (event->xexpose.window != windows->command.id)
3066 if (event->xexpose.count != 0)
3068 state|=RedrawWidgetState;
3078 for (i=0; i < (int) number_selections; i++)
3080 if (i >= (
int) windows->command.data)
3082 if (selection_info[i].raised ==
3083 MatteIsActive(selection_info[i],event->xmotion))
3088 selection_info[i].raised=!selection_info[i].raised;
3089 XDrawBeveledButton(display,&windows->command,
3090 &selection_info[i]);
3094 if (MatteIsActive(selection_info[i],event->xmotion) == MagickFalse)
3096 submenu_info=selection_info[i];
3097 submenu_info.active=MagickTrue;
3098 toggle_info.raised=MagickTrue;
3099 toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
3100 (toggle_info.height >> 1);
3101 XDrawTriangleEast(display,&windows->command,&toggle_info);
3104 XDelay(display,SuspendTime);
3105 if (XCheckMaskEvent(display,ButtonMotionMask,event) == MagickFalse)
3107 while (XCheckMaskEvent(display,ButtonMotionMask,event)) ;
3108 toggle_info.raised=MagickFalse;
3109 if (windows->command.data != 0)
3110 XDrawTriangleEast(display,&windows->command,&toggle_info);
3116 windows->command.mapped=MagickTrue;
3121 windows->command.mapped=MagickFalse;
3127 if (state & UpdateConfigurationState)
3132 assert(selections != (
const char **) NULL);
3134 for (i=0; i < (int) number_selections; i++)
3136 XGetWidgetInfo(selections[i],&selection_info[i]);
3137 selection_info[i].center=MagickFalse;
3138 selection_info[i].bevel_width--;
3139 selection_info[i].height=(
unsigned int) ((3*height) >> 1);
3140 selection_info[i].x=(QuantumMargin >> 1)+4;
3141 selection_info[i].width=(
unsigned int) (windows->command.width-
3142 (selection_info[i].x << 1));
3143 selection_info[i].y=y;
3144 y+=selection_info[i].height+(selection_info[i].bevel_width << 1)+6;
3146 XGetWidgetInfo((
char *) NULL,&toggle_info);
3147 toggle_info.bevel_width--;
3148 toggle_info.width=(
unsigned int) (((5*height) >> 3)-
3149 (toggle_info.bevel_width << 1));
3150 toggle_info.height=toggle_info.width;
3151 toggle_info.x=selection_info[0].x+selection_info[0].width-
3152 toggle_info.width-(QuantumMargin >> 1);
3153 if (windows->command.mapped)
3154 (void) XClearWindow(display,windows->command.id);
3156 if (state & RedrawWidgetState)
3164 tile_pixmap=XCreatePixmapFromBitmapData(display,windows->command.id,
3165 (
char *) tile_bits,tile_width,tile_height,1L,0L,1);
3166 if (tile_pixmap != (Pixmap) NULL)
3168 (void) XCopyPlane(display,tile_pixmap,windows->command.id,
3169 windows->command.annotate_context,0,0,tile_width,tile_height,
3170 (
int) ((windows->command.width-tile_width) >> 1),10,1L);
3171 (void) XFreePixmap(display,tile_pixmap);
3173 for (i=0; i < (int) number_selections; i++)
3175 XDrawBeveledButton(display,&windows->command,&selection_info[i]);
3176 if (i >= (
int) windows->command.data)
3178 toggle_info.raised=MagickFalse;
3179 toggle_info.y=selection_info[i].y+(selection_info[i].height >> 1)-
3180 (toggle_info.height >> 1);
3181 XDrawTriangleEast(display,&windows->command,&toggle_info);
3183 XHighlightWidget(display,&windows->command,BorderOffset,BorderOffset);
3220 MagickExport
int XConfirmWidget(Display *display,XWindows *windows,
3221 const char *reason,
const char *description)
3223 #define CancelButtonText "Cancel"
3224 #define DismissButtonText "Dismiss"
3225 #define YesButtonText "Yes"
3262 assert(display != (Display *) NULL);
3263 assert(windows != (XWindows *) NULL);
3264 assert(reason != (
char *) NULL);
3265 assert(description != (
char *) NULL);
3266 if (IsEventLogging() != MagickFalse)
3267 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
3268 XCheckRefreshWindows(display,windows);
3269 font_info=windows->widget.font_info;
3270 width=WidgetTextWidth(font_info,CancelButtonText);
3271 if (WidgetTextWidth(font_info,DismissButtonText) > width)
3272 width=WidgetTextWidth(font_info,DismissButtonText);
3273 if (WidgetTextWidth(font_info,YesButtonText) > width)
3274 width=WidgetTextWidth(font_info,YesButtonText);
3276 if (description != (
char *) NULL)
3277 if (WidgetTextWidth(font_info,(
char *) description) > width)
3278 width=WidgetTextWidth(font_info,(
char *) description);
3279 height=(
unsigned int) (font_info->ascent+font_info->descent);
3283 windows->widget.width=(
unsigned int) (width+9*QuantumMargin);
3284 windows->widget.min_width=(
unsigned int) (9*QuantumMargin+
3285 WidgetTextWidth(font_info,CancelButtonText)+
3286 WidgetTextWidth(font_info,DismissButtonText)+
3287 WidgetTextWidth(font_info,YesButtonText));
3288 if (windows->widget.width < windows->widget.min_width)
3289 windows->widget.width=windows->widget.min_width;
3290 windows->widget.height=(
unsigned int) (12*height);
3291 windows->widget.min_height=(
unsigned int) (7*height);
3292 if (windows->widget.height < windows->widget.min_height)
3293 windows->widget.height=windows->widget.min_height;
3294 XConstrainWindowPosition(display,&windows->widget);
3298 (void) CopyMagickString(windows->widget.name,
"Confirm",MaxTextExtent);
3299 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3300 if (status != False)
3302 XSetWMName(display,windows->widget.id,&window_name);
3303 XSetWMIconName(display,windows->widget.id,&window_name);
3304 (void) XFree((
void *) window_name.value);
3306 window_changes.width=(int) windows->widget.width;
3307 window_changes.height=(
int) windows->widget.height;
3308 window_changes.x=windows->widget.x;
3309 window_changes.y=windows->widget.y;
3310 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3311 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3312 (void) XMapRaised(display,windows->widget.id);
3313 windows->widget.mapped=MagickFalse;
3318 state=UpdateConfigurationState;
3319 XSetCursorState(display,windows,MagickTrue);
3322 if (state & UpdateConfigurationState)
3327 XGetWidgetInfo(CancelButtonText,&cancel_info);
3328 cancel_info.width=(
unsigned int) QuantumMargin+
3329 WidgetTextWidth(font_info,CancelButtonText);
3330 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3331 cancel_info.x=(int) (windows->widget.width-cancel_info.width-
3333 cancel_info.y=(int) (windows->widget.height-(cancel_info.height << 1));
3334 dismiss_info=cancel_info;
3335 dismiss_info.text=(
char *) DismissButtonText;
3336 if (LocaleCompare(description,
"Do you want to save it") == 0)
3337 dismiss_info.text=(
char *)
"Don't Save";
3338 dismiss_info.width=(
unsigned int) QuantumMargin+
3339 WidgetTextWidth(font_info,dismiss_info.text);
3340 dismiss_info.x=(int)
3341 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
3342 yes_info=cancel_info;
3343 yes_info.text=(
char *) YesButtonText;
3344 if (LocaleCompare(description,
"Do you want to save it") == 0)
3345 yes_info.text=(
char *)
"Save";
3346 yes_info.width=(
unsigned int) QuantumMargin+
3347 WidgetTextWidth(font_info,yes_info.text);
3348 if (yes_info.width < cancel_info.width)
3349 yes_info.width=cancel_info.width;
3350 yes_info.x=QuantumMargin;
3351 state&=(~UpdateConfigurationState);
3353 if (state & RedrawWidgetState)
3358 width=WidgetTextWidth(font_info,(
char *) reason);
3359 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3360 y=(int) ((windows->widget.height >> 1)-(height << 1));
3361 (void) XDrawString(display,windows->widget.id,
3362 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
3363 if (description != (
char *) NULL)
3366 question[MaxTextExtent];
3368 (void) CopyMagickString(question,description,MaxTextExtent);
3369 (void) ConcatenateMagickString(question,
"?",MaxTextExtent);
3370 width=WidgetTextWidth(font_info,question);
3371 x=(int) ((windows->widget.width >> 1)-(width >> 1));
3373 (void) XDrawString(display,windows->widget.id,
3374 windows->widget.annotate_context,x,y,question,Extent(question));
3376 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3377 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3378 XDrawBeveledButton(display,&windows->widget,&yes_info);
3379 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3380 state&=(~RedrawWidgetState);
3385 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3390 if (MatteIsActive(cancel_info,event.xbutton))
3395 cancel_info.raised=MagickFalse;
3396 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3399 if (MatteIsActive(dismiss_info,event.xbutton))
3404 dismiss_info.raised=MagickFalse;
3405 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3408 if (MatteIsActive(yes_info,event.xbutton))
3413 yes_info.raised=MagickFalse;
3414 XDrawBeveledButton(display,&windows->widget,&yes_info);
3421 if (windows->widget.mapped == MagickFalse)
3423 if (cancel_info.raised == MagickFalse)
3425 if (event.xbutton.window == windows->widget.id)
3426 if (MatteIsActive(cancel_info,event.xbutton))
3431 cancel_info.raised=MagickTrue;
3432 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3434 if (dismiss_info.raised == MagickFalse)
3436 if (event.xbutton.window == windows->widget.id)
3437 if (MatteIsActive(dismiss_info,event.xbutton))
3442 dismiss_info.raised=MagickTrue;
3443 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3445 if (yes_info.raised == MagickFalse)
3447 if (event.xbutton.window == windows->widget.id)
3448 if (MatteIsActive(yes_info,event.xbutton))
3453 yes_info.raised=MagickTrue;
3454 XDrawBeveledButton(display,&windows->widget,&yes_info);
3463 if (event.xclient.message_type != windows->wm_protocols)
3465 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3467 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3468 (Time)
event.xclient.data.l[1]);
3471 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3473 if (event.xclient.window == windows->widget.id)
3480 case ConfigureNotify:
3485 if (event.xconfigure.window != windows->widget.id)
3487 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3488 (
event.xconfigure.height == (int) windows->widget.height))
3490 windows->widget.width=(
unsigned int)
3491 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3492 windows->widget.height=(
unsigned int)
3493 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3494 state|=UpdateConfigurationState;
3499 if (event.xcrossing.window != windows->widget.id)
3501 state&=(~InactiveWidgetState);
3506 if (event.xexpose.window != windows->widget.id)
3508 if (event.xexpose.count != 0)
3510 state|=RedrawWidgetState;
3516 command[MaxTextExtent];
3524 if (event.xkey.window != windows->widget.id)
3526 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
3527 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3528 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3530 yes_info.raised=MagickFalse;
3531 XDrawBeveledButton(display,&windows->widget,&yes_info);
3540 if (event.xcrossing.window != windows->widget.id)
3542 state|=InactiveWidgetState;
3550 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
3551 if (state & InactiveWidgetState)
3553 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
3558 cancel_info.raised=cancel_info.raised == MagickFalse ?
3559 MagickTrue : MagickFalse;
3560 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3563 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
3568 dismiss_info.raised=dismiss_info.raised == MagickFalse ?
3569 MagickTrue : MagickFalse;
3570 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
3573 if (yes_info.raised == MatteIsActive(yes_info,event.xmotion))
3578 yes_info.raised=yes_info.raised == MagickFalse ?
3579 MagickTrue : MagickFalse;
3580 XDrawBeveledButton(display,&windows->widget,&yes_info);
3588 }
while ((state & ExitState) == 0);
3589 XSetCursorState(display,windows,MagickFalse);
3590 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
3591 XCheckRefreshWindows(display,windows);
3629 MagickExport
int XDialogWidget(Display *display,XWindows *windows,
3630 const char *action,
const char *query,
char *reply)
3632 #define CancelButtonText "Cancel"
3635 primary_selection[MaxTextExtent];
3643 static MagickBooleanType
3644 raised = MagickFalse;
3679 assert(display != (Display *) NULL);
3680 assert(windows != (XWindows *) NULL);
3681 assert(action != (
char *) NULL);
3682 assert(query != (
char *) NULL);
3683 assert(reply != (
char *) NULL);
3684 if (IsEventLogging() != MagickFalse)
3685 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
3686 XCheckRefreshWindows(display,windows);
3687 font_info=windows->widget.font_info;
3688 width=WidgetTextWidth(font_info,(
char *) action);
3689 if (WidgetTextWidth(font_info,CancelButtonText) > width)
3690 width=WidgetTextWidth(font_info,CancelButtonText);
3691 width+=(3*QuantumMargin) >> 1;
3692 height=(
unsigned int) (font_info->ascent+font_info->descent);
3696 windows->widget.width=(
unsigned int) MagickMax((
int) (2*width),(
int)
3697 WidgetTextWidth(font_info,(
char *) query));
3698 if (windows->widget.width < WidgetTextWidth(font_info,reply))
3699 windows->widget.width=WidgetTextWidth(font_info,reply);
3700 windows->widget.width+=6*QuantumMargin;
3701 windows->widget.min_width=(
unsigned int)
3702 (width+28*XTextWidth(font_info,
"#",1)+4*QuantumMargin);
3703 if (windows->widget.width < windows->widget.min_width)
3704 windows->widget.width=windows->widget.min_width;
3705 windows->widget.height=(
unsigned int) (7*height+(QuantumMargin << 1));
3706 windows->widget.min_height=windows->widget.height;
3707 if (windows->widget.height < windows->widget.min_height)
3708 windows->widget.height=windows->widget.min_height;
3709 XConstrainWindowPosition(display,&windows->widget);
3713 (void) CopyMagickString(windows->widget.name,
"Dialog",MaxTextExtent);
3714 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
3715 if (status != False)
3717 XSetWMName(display,windows->widget.id,&window_name);
3718 XSetWMIconName(display,windows->widget.id,&window_name);
3719 (void) XFree((
void *) window_name.value);
3721 window_changes.width=(int) windows->widget.width;
3722 window_changes.height=(
int) windows->widget.height;
3723 window_changes.x=windows->widget.x;
3724 window_changes.y=windows->widget.y;
3725 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
3726 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
3727 (void) XMapRaised(display,windows->widget.id);
3728 windows->widget.mapped=MagickFalse;
3732 anomaly=(LocaleCompare(action,
"Background") == 0) ||
3733 (LocaleCompare(action,
"New") == 0) ||
3734 (LocaleCompare(action,
"Quantize") == 0) ||
3735 (LocaleCompare(action,
"Resize") == 0) ||
3736 (LocaleCompare(action,
"Save") == 0) ||
3737 (LocaleCompare(action,
"Shade") == 0);
3738 state=UpdateConfigurationState;
3739 XSetCursorState(display,windows,MagickTrue);
3742 if (state & UpdateConfigurationState)
3747 XGetWidgetInfo(CancelButtonText,&cancel_info);
3748 cancel_info.width=width;
3749 cancel_info.height=(
unsigned int) ((3*height) >> 1);
3751 (windows->widget.width-cancel_info.width-((3*QuantumMargin) >> 1));
3753 (windows->widget.height-cancel_info.height-((3*QuantumMargin) >> 1));
3754 XGetWidgetInfo(action,&action_info);
3755 action_info.width=width;
3756 action_info.height=(
unsigned int) ((3*height) >> 1);
3757 action_info.x=cancel_info.x-(cancel_info.width+QuantumMargin+
3758 (action_info.bevel_width << 1));
3759 action_info.y=cancel_info.y;
3763 XGetWidgetInfo(reply,&reply_info);
3764 reply_info.raised=MagickFalse;
3765 reply_info.bevel_width--;
3766 reply_info.width=windows->widget.width-(3*QuantumMargin);
3767 reply_info.height=height << 1;
3768 reply_info.x=(3*QuantumMargin) >> 1;
3769 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
3773 XGetWidgetInfo(
"Dither",&special_info);
3774 special_info.raised=raised;
3775 special_info.bevel_width--;
3776 special_info.width=(
unsigned int) QuantumMargin >> 1;
3777 special_info.height=(
unsigned int) QuantumMargin >> 1;
3778 special_info.x=reply_info.x;
3779 special_info.y=action_info.y+action_info.height-special_info.height;
3780 if (LocaleCompare(action,
"Background") == 0)
3781 special_info.text=(
char *)
"Backdrop";
3782 if (LocaleCompare(action,
"New") == 0)
3783 special_info.text=(
char *)
"Gradation";
3784 if (LocaleCompare(action,
"Resize") == 0)
3785 special_info.text=(
char *)
"Constrain ratio";
3786 if (LocaleCompare(action,
"Save") == 0)
3787 special_info.text=(
char *)
"Non-progressive";
3788 if (LocaleCompare(action,
"Shade") == 0)
3789 special_info.text=(
char *)
"Color shading";
3793 XGetWidgetInfo(query,&text_info);
3794 text_info.width=reply_info.width;
3795 text_info.height=height;
3796 text_info.x=reply_info.x-(QuantumMargin >> 1);
3797 text_info.y=QuantumMargin;
3798 text_info.center=MagickFalse;
3799 state&=(~UpdateConfigurationState);
3801 if (state & RedrawWidgetState)
3806 XDrawWidgetText(display,&windows->widget,&text_info);
3807 XDrawBeveledMatte(display,&windows->widget,&reply_info);
3808 XDrawMatteText(display,&windows->widget,&reply_info);
3810 XDrawBeveledButton(display,&windows->widget,&special_info);
3811 XDrawBeveledButton(display,&windows->widget,&action_info);
3812 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3813 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
3814 state&=(~RedrawWidgetState);
3819 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
3825 if (MatteIsActive(special_info,event.xbutton))
3830 special_info.raised=!special_info.raised;
3831 XDrawBeveledButton(display,&windows->widget,&special_info);
3834 if (MatteIsActive(action_info,event.xbutton))
3839 action_info.raised=MagickFalse;
3840 XDrawBeveledButton(display,&windows->widget,&action_info);
3843 if (MatteIsActive(cancel_info,event.xbutton))
3848 cancel_info.raised=MagickFalse;
3849 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3852 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
3854 if (event.xbutton.button != Button2)
3862 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
3863 for (i=1; i <= Extent(reply_info.marker); i++)
3864 if (XTextWidth(font_info,reply_info.marker,i) > x)
3866 reply_info.cursor=reply_info.marker+i-1;
3867 if (event.xbutton.time > (click_time+DoubleClick))
3868 reply_info.highlight=MagickFalse;
3874 (
void) CopyMagickString(primary_selection,reply_info.text,
3876 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
3877 event.xbutton.time);
3878 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
3879 windows->widget.id ? MagickTrue : MagickFalse;
3881 XDrawMatteText(display,&windows->widget,&reply_info);
3882 click_time=
event.xbutton.time;
3888 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
3889 windows->widget.id,event.xbutton.time);
3894 if (windows->widget.mapped == MagickFalse)
3896 if (action_info.raised == MagickFalse)
3898 if (event.xbutton.window == windows->widget.id)
3899 if (MatteIsActive(action_info,event.xbutton))
3901 action_info.raised=MagickTrue;
3902 XDrawBeveledButton(display,&windows->widget,&action_info);
3904 if (cancel_info.raised == MagickFalse)
3906 if (event.xbutton.window == windows->widget.id)
3907 if (MatteIsActive(cancel_info,event.xbutton))
3909 *reply_info.text=
'\0';
3912 cancel_info.raised=MagickTrue;
3913 XDrawBeveledButton(display,&windows->widget,&cancel_info);
3922 if (event.xclient.message_type != windows->wm_protocols)
3924 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
3926 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
3927 (Time)
event.xclient.data.l[1]);
3930 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
3932 if (event.xclient.window == windows->widget.id)
3934 *reply_info.text=
'\0';
3940 case ConfigureNotify:
3945 if (event.xconfigure.window != windows->widget.id)
3947 if ((event.xconfigure.width == (
int) windows->widget.width) &&
3948 (
event.xconfigure.height == (int) windows->widget.height))
3950 windows->widget.width=(
unsigned int)
3951 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
3952 windows->widget.height=(
unsigned int)
3953 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
3954 state|=UpdateConfigurationState;
3959 if (event.xcrossing.window != windows->widget.id)
3961 state&=(~InactiveWidgetState);
3966 if (event.xexpose.window != windows->widget.id)
3968 if (event.xexpose.count != 0)
3970 state|=RedrawWidgetState;
3976 command[MaxTextExtent];
3987 if (event.xkey.window != windows->widget.id)
3989 length=XLookupString((XKeyEvent *) &event.xkey,command,
3990 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
3991 *(command+length)=
'\0';
3992 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
3994 action_info.raised=MagickFalse;
3995 XDrawBeveledButton(display,&windows->widget,&action_info);
3999 if (key_symbol == XK_Control_L)
4001 state|=ControlState;
4004 if (state & ControlState)
4005 switch ((
int) key_symbol)
4013 *reply_info.text=
'\0';
4014 reply_info.cursor=reply_info.text;
4015 reply_info.marker=reply_info.text;
4016 reply_info.highlight=MagickFalse;
4022 XEditText(display,&reply_info,key_symbol,command,state);
4023 XDrawMatteText(display,&windows->widget,&reply_info);
4029 command[MaxTextExtent];
4037 if (event.xkey.window != windows->widget.id)
4039 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
4040 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
4041 if (key_symbol == XK_Control_L)
4042 state&=(~ControlState);
4047 if (event.xcrossing.window != windows->widget.id)
4049 state|=InactiveWidgetState;
4057 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
4058 if (state & InactiveWidgetState)
4060 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
4065 action_info.raised=action_info.raised == MagickFalse ?
4066 MagickTrue : MagickFalse;
4067 XDrawBeveledButton(display,&windows->widget,&action_info);
4070 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
4075 cancel_info.raised=cancel_info.raised == MagickFalse ?
4076 MagickTrue : MagickFalse;
4077 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4082 case SelectionClear:
4084 reply_info.highlight=MagickFalse;
4085 XDrawMatteText(display,&windows->widget,&reply_info);
4088 case SelectionNotify:
4106 if (event.xselection.property == (Atom) None)
4108 status=XGetWindowProperty(display,event.xselection.requestor,
4109 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
4110 &format,&length,&after,&data);
4111 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
4114 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
4115 (void) XBell(display,0);
4121 *(data+length)=
'\0';
4122 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
4124 XDrawMatteText(display,&windows->widget,&reply_info);
4126 (void) XFree((
void *) data);
4129 case SelectionRequest:
4134 XSelectionRequestEvent
4137 if (reply_info.highlight == MagickFalse)
4142 request=(&(
event.xselectionrequest));
4143 (void) XChangeProperty(request->display,request->requestor,
4144 request->property,request->target,8,PropModeReplace,
4145 (
unsigned char *) primary_selection,Extent(primary_selection));
4146 notify.type=SelectionNotify;
4147 notify.display=request->display;
4148 notify.requestor=request->requestor;
4149 notify.selection=request->selection;
4150 notify.target=request->target;
4151 notify.time=request->time;
4152 if (request->property == None)
4153 notify.property=request->target;
4155 notify.property=request->property;
4156 (void) XSendEvent(request->display,request->requestor,False,0,
4157 (XEvent *) ¬ify);
4162 }
while ((state & ExitState) == 0);
4163 XSetCursorState(display,windows,MagickFalse);
4164 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
4165 XCheckRefreshWindows(display,windows);
4167 if (special_info.raised)
4170 return(raised == MagickFalse);
4205 MagickExport
void XFileBrowserWidget(Display *display,XWindows *windows,
4206 const char *action,
char *reply)
4208 #define CancelButtonText "Cancel"
4209 #define DirectoryText "Directory:"
4210 #define FilenameText "File name:"
4211 #define GrabButtonText "Grab"
4212 #define FormatButtonText "Format"
4213 #define HomeButtonText "Home"
4214 #define UpButtonText "Up"
4219 home_directory[MaxTextExtent],
4220 primary_selection[MaxTextExtent],
4221 text[MaxTextExtent],
4222 working_path[MaxTextExtent];
4232 glob_pattern[MaxTextExtent] =
"*",
4233 format[MaxTextExtent] =
"miff";
4235 static MagickStatusType
4236 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
4284 assert(display != (Display *) NULL);
4285 assert(windows != (XWindows *) NULL);
4286 assert(action != (
char *) NULL);
4287 assert(reply != (
char *) NULL);
4288 if (IsEventLogging() != MagickFalse)
4289 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
4290 XSetCursorState(display,windows,MagickTrue);
4291 XCheckRefreshWindows(display,windows);
4292 directory=getcwd(home_directory,MaxTextExtent);
4294 (void) CopyMagickString(working_path,home_directory,MaxTextExtent);
4295 filelist=ListFiles(working_path,glob_pattern,&files);
4296 if (filelist == (
char **) NULL)
4301 XNoticeWidget(display,windows,
"Unable to read directory:",working_path);
4302 (void) XDialogWidget(display,windows,action,
"Enter filename:",reply);
4308 font_info=windows->widget.font_info;
4310 for (i=0; i < (ssize_t) files; i++)
4311 if (WidgetTextWidth(font_info,filelist[i]) > text_width)
4312 text_width=WidgetTextWidth(font_info,filelist[i]);
4313 width=WidgetTextWidth(font_info,(
char *) action);
4314 if (WidgetTextWidth(font_info,GrabButtonText) > width)
4315 width=WidgetTextWidth(font_info,GrabButtonText);
4316 if (WidgetTextWidth(font_info,FormatButtonText) > width)
4317 width=WidgetTextWidth(font_info,FormatButtonText);
4318 if (WidgetTextWidth(font_info,CancelButtonText) > width)
4319 width=WidgetTextWidth(font_info,CancelButtonText);
4320 if (WidgetTextWidth(font_info,HomeButtonText) > width)
4321 width=WidgetTextWidth(font_info,HomeButtonText);
4322 if (WidgetTextWidth(font_info,UpButtonText) > width)
4323 width=WidgetTextWidth(font_info,UpButtonText);
4324 width+=QuantumMargin;
4325 if (WidgetTextWidth(font_info,DirectoryText) > width)
4326 width=WidgetTextWidth(font_info,DirectoryText);
4327 if (WidgetTextWidth(font_info,FilenameText) > width)
4328 width=WidgetTextWidth(font_info,FilenameText);
4329 height=(
unsigned int) (font_info->ascent+font_info->descent);
4333 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
4335 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
4336 if (windows->widget.width < windows->widget.min_width)
4337 windows->widget.width=windows->widget.min_width;
4338 windows->widget.height=(
unsigned int)
4339 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
4340 windows->widget.min_height=(
unsigned int)
4341 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
4342 if (windows->widget.height < windows->widget.min_height)
4343 windows->widget.height=windows->widget.min_height;
4344 XConstrainWindowPosition(display,&windows->widget);
4348 (void) CopyMagickString(windows->widget.name,
"Browse and Select a File",
4350 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
4351 if (status != False)
4353 XSetWMName(display,windows->widget.id,&window_name);
4354 XSetWMIconName(display,windows->widget.id,&window_name);
4355 (void) XFree((
void *) window_name.value);
4357 window_changes.width=(int) windows->widget.width;
4358 window_changes.height=(
int) windows->widget.height;
4359 window_changes.x=windows->widget.x;
4360 window_changes.y=windows->widget.y;
4361 (void) XReconfigureWMWindow(display,windows->widget.id,
4362 windows->widget.screen,mask,&window_changes);
4363 (void) XMapRaised(display,windows->widget.id);
4364 windows->widget.mapped=MagickFalse;
4368 XGetWidgetInfo((
char *) NULL,&slider_info);
4369 XGetWidgetInfo((
char *) NULL,&north_info);
4370 XGetWidgetInfo((
char *) NULL,&south_info);
4371 XGetWidgetInfo((
char *) NULL,&expose_info);
4373 anomaly=(LocaleCompare(action,
"Composite") == 0) ||
4374 (LocaleCompare(action,
"Open") == 0) || (LocaleCompare(action,
"Map") == 0);
4375 delay=SuspendTime << 2;
4376 state=UpdateConfigurationState;
4379 if (state & UpdateConfigurationState)
4387 XGetWidgetInfo(CancelButtonText,&cancel_info);
4388 cancel_info.width=width;
4389 cancel_info.height=(
unsigned int) ((3*height) >> 1);
4391 (windows->widget.width-cancel_info.width-QuantumMargin-2);
4393 (windows->widget.height-cancel_info.height-QuantumMargin);
4394 XGetWidgetInfo(action,&action_info);
4395 action_info.width=width;
4396 action_info.height=(
unsigned int) ((3*height) >> 1);
4397 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
4398 (action_info.bevel_width << 1));
4399 action_info.y=cancel_info.y;
4400 XGetWidgetInfo(GrabButtonText,&special_info);
4401 special_info.width=width;
4402 special_info.height=(
unsigned int) ((3*height) >> 1);
4403 special_info.x=action_info.x-(action_info.width+(QuantumMargin >> 1)+
4404 (special_info.bevel_width << 1));
4405 special_info.y=action_info.y;
4406 if (anomaly == MagickFalse)
4411 special_info.text=(
char *) FormatButtonText;
4412 p=reply+Extent(reply)-1;
4413 while ((p > (reply+1)) && (*(p-1) !=
'.'))
4415 if ((p > (reply+1)) && (*(p-1) ==
'.'))
4416 (void) CopyMagickString(format,p,MaxTextExtent);
4418 XGetWidgetInfo(UpButtonText,&up_info);
4419 up_info.width=width;
4420 up_info.height=(
unsigned int) ((3*height) >> 1);
4421 up_info.x=QuantumMargin;
4422 up_info.y=((5*QuantumMargin) >> 1)+height;
4423 XGetWidgetInfo(HomeButtonText,&home_info);
4424 home_info.width=width;
4425 home_info.height=(
unsigned int) ((3*height) >> 1);
4426 home_info.x=QuantumMargin;
4427 home_info.y=up_info.y+up_info.height+QuantumMargin;
4431 XGetWidgetInfo(reply,&reply_info);
4432 reply_info.raised=MagickFalse;
4433 reply_info.bevel_width--;
4434 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
4435 reply_info.height=height << 1;
4436 reply_info.x=(int) (width+(QuantumMargin << 1));
4437 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
4441 XGetWidgetInfo((
char *) NULL,&scroll_info);
4442 scroll_info.bevel_width--;
4443 scroll_info.width=height;
4444 scroll_info.height=(
unsigned int)
4445 (reply_info.y-up_info.y-(QuantumMargin >> 1));
4446 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
4447 scroll_info.y=up_info.y-reply_info.bevel_width;
4448 scroll_info.raised=MagickFalse;
4449 scroll_info.trough=MagickTrue;
4450 north_info=scroll_info;
4451 north_info.raised=MagickTrue;
4452 north_info.width-=(north_info.bevel_width << 1);
4453 north_info.height=north_info.width-1;
4454 north_info.x+=north_info.bevel_width;
4455 north_info.y+=north_info.bevel_width;
4456 south_info=north_info;
4457 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
4460 slider_info=north_info;
4462 slider_info.width-=2;
4463 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
4464 slider_info.bevel_width+2;
4465 slider_info.height=scroll_info.height-((slider_info.min_y-
4466 scroll_info.y+1) << 1)+4;
4467 visible_files=(
unsigned int) (scroll_info.height*
4468 PerceptibleReciprocal((
double) height+(height >> 3)));
4469 if (files > visible_files)
4470 slider_info.height=(
unsigned int) ((visible_files*
4471 slider_info.height)/files);
4472 slider_info.max_y=south_info.y-south_info.bevel_width-
4473 slider_info.bevel_width-2;
4474 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
4475 slider_info.y=slider_info.min_y;
4476 expose_info=scroll_info;
4477 expose_info.y=slider_info.y;
4481 XGetWidgetInfo((
char *) NULL,&list_info);
4482 list_info.raised=MagickFalse;
4483 list_info.bevel_width--;
4484 list_info.width=(
unsigned int)
4485 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
4486 list_info.height=scroll_info.height;
4487 list_info.x=reply_info.x;
4488 list_info.y=scroll_info.y;
4489 if (windows->widget.mapped == MagickFalse)
4490 state|=JumpListState;
4495 XGetWidgetInfo(text,&text_info);
4496 text_info.center=MagickFalse;
4497 text_info.width=reply_info.width;
4498 text_info.height=height;
4499 text_info.x=list_info.x-(QuantumMargin >> 1);
4500 text_info.y=QuantumMargin;
4504 XGetWidgetInfo((
char *) NULL,&selection_info);
4505 selection_info.center=MagickFalse;
4506 selection_info.width=list_info.width;
4507 selection_info.height=(
unsigned int) ((9*height) >> 3);
4508 selection_info.x=list_info.x;
4509 state&=(~UpdateConfigurationState);
4511 if (state & RedrawWidgetState)
4517 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
4518 (void) XDrawString(display,windows->widget.id,
4519 windows->widget.annotate_context,x,y,DirectoryText,
4520 Extent(DirectoryText));
4521 (void) CopyMagickString(text_info.text,working_path,MaxTextExtent);
4522 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4524 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4526 XDrawWidgetText(display,&windows->widget,&text_info);
4527 XDrawBeveledButton(display,&windows->widget,&up_info);
4528 XDrawBeveledButton(display,&windows->widget,&home_info);
4529 XDrawBeveledMatte(display,&windows->widget,&list_info);
4530 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4531 XDrawTriangleNorth(display,&windows->widget,&north_info);
4532 XDrawBeveledButton(display,&windows->widget,&slider_info);
4533 XDrawTriangleSouth(display,&windows->widget,&south_info);
4535 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
4536 (void) XDrawString(display,windows->widget.id,
4537 windows->widget.annotate_context,x,y,FilenameText,
4538 Extent(FilenameText));
4539 XDrawBeveledMatte(display,&windows->widget,&reply_info);
4540 XDrawMatteText(display,&windows->widget,&reply_info);
4541 XDrawBeveledButton(display,&windows->widget,&special_info);
4542 XDrawBeveledButton(display,&windows->widget,&action_info);
4543 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4544 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4545 selection_info.id=(~0);
4546 state|=RedrawListState;
4547 state&=(~RedrawWidgetState);
4549 if (state & UpdateListState)
4560 checklist=ListFiles(working_path,glob_pattern,&number_files);
4561 if (checklist == (
char **) NULL)
4566 action_info.raised=MagickFalse;
4567 XDrawBeveledButton(display,&windows->widget,&action_info);
4570 for (i=0; i < (ssize_t) files; i++)
4571 filelist[i]=DestroyString(filelist[i]);
4572 if (filelist != (
char **) NULL)
4573 filelist=(
char **) RelinquishMagickMemory(filelist);
4580 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
4581 if (files > visible_files)
4582 slider_info.height=(
unsigned int)
4583 ((visible_files*slider_info.height)/files);
4584 slider_info.max_y=south_info.y-south_info.bevel_width-
4585 slider_info.bevel_width-2;
4587 slider_info.y=slider_info.min_y;
4588 expose_info.y=slider_info.y;
4589 selection_info.id=(~0);
4591 state|=RedrawListState;
4595 if (IsGlob(reply_info.text) == MagickFalse)
4597 *reply_info.text=
'\0';
4598 reply_info.cursor=reply_info.text;
4600 (void) CopyMagickString(text_info.text,working_path,MaxTextExtent);
4601 (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4603 (void) ConcatenateMagickString(text_info.text,glob_pattern,
4605 XDrawWidgetText(display,&windows->widget,&text_info);
4606 XDrawMatteText(display,&windows->widget,&reply_info);
4607 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
4608 XDrawTriangleNorth(display,&windows->widget,&north_info);
4609 XDrawBeveledButton(display,&windows->widget,&slider_info);
4610 XDrawTriangleSouth(display,&windows->widget,&south_info);
4611 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
4612 state&=(~UpdateListState);
4614 if (state & JumpListState)
4620 for (i=0; i < (ssize_t) files; i++)
4621 if (LocaleCompare(filelist[i],reply) >= 0)
4624 (LocaleCompare(filelist[i],reply) == 0 ? i : ~0);
4627 if ((i < (ssize_t) slider_info.id) ||
4628 (i >= (ssize_t) (slider_info.id+visible_files)))
4629 slider_info.id=(
int) i-(visible_files >> 1);
4630 selection_info.id=(~0);
4631 state|=RedrawListState;
4632 state&=(~JumpListState);
4634 if (state & RedrawListState)
4639 if (slider_info.id >= (
int) (files-visible_files))
4640 slider_info.id=(int) (files-visible_files);
4641 if ((slider_info.id < 0) || (files <= visible_files))
4643 slider_info.y=slider_info.min_y;
4645 slider_info.y+=((ssize_t) slider_info.id*(slider_info.max_y-
4646 slider_info.min_y+1)/files);
4647 if (slider_info.id != selection_info.id)
4652 selection_info.id=slider_info.id;
4653 selection_info.y=list_info.y+(height >> 3)+2;
4654 for (i=0; i < (ssize_t) visible_files; i++)
4656 selection_info.raised=(int) (slider_info.id+i) != list_info.id ?
4657 MagickTrue : MagickFalse;
4658 selection_info.text=(
char *) NULL;
4659 if ((slider_info.id+i) < (ssize_t) files)
4660 selection_info.text=filelist[slider_info.id+i];
4661 XDrawWidgetText(display,&windows->widget,&selection_info);
4662 selection_info.y+=(int) selection_info.height;
4667 if (slider_info.y > expose_info.y)
4669 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
4670 expose_info.y=slider_info.y-expose_info.height-
4671 slider_info.bevel_width-1;
4675 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
4676 expose_info.y=slider_info.y+slider_info.height+
4677 slider_info.bevel_width+1;
4679 XDrawTriangleNorth(display,&windows->widget,&north_info);
4680 XDrawMatte(display,&windows->widget,&expose_info);
4681 XDrawBeveledButton(display,&windows->widget,&slider_info);
4682 XDrawTriangleSouth(display,&windows->widget,&south_info);
4683 expose_info.y=slider_info.y;
4685 state&=(~RedrawListState);
4690 if (north_info.raised && south_info.raised)
4691 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
4697 XDelay(display,delay);
4699 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
4700 if (north_info.raised == MagickFalse)
4701 if (slider_info.id > 0)
4707 state|=RedrawListState;
4709 if (south_info.raised == MagickFalse)
4710 if (slider_info.id < (
int) files)
4716 state|=RedrawListState;
4718 if (event.type != ButtonRelease)
4725 if (MatteIsActive(slider_info,event.xbutton))
4730 slider_info.active=MagickTrue;
4733 if (MatteIsActive(north_info,event.xbutton))
4734 if (slider_info.id > 0)
4739 north_info.raised=MagickFalse;
4741 state|=RedrawListState;
4744 if (MatteIsActive(south_info,event.xbutton))
4745 if (slider_info.id < (
int) files)
4750 south_info.raised=MagickFalse;
4752 state|=RedrawListState;
4755 if (MatteIsActive(scroll_info,event.xbutton))
4760 if (event.xbutton.y < slider_info.y)
4761 slider_info.id-=(visible_files-1);
4763 slider_info.id+=(visible_files-1);
4764 state|=RedrawListState;
4767 if (MatteIsActive(list_info,event.xbutton))
4775 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
4776 selection_info.height;
4777 if (
id >= (
int) files)
4779 (void) CopyMagickString(reply_info.text,filelist[
id],MaxTextExtent);
4780 reply_info.highlight=MagickFalse;
4781 reply_info.marker=reply_info.text;
4782 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4783 XDrawMatteText(display,&windows->widget,&reply_info);
4784 if (
id == list_info.id)
4789 p=reply_info.text+strlen(reply_info.text)-1;
4790 if (*p == *DirectorySeparator)
4791 ChopPathComponents(reply_info.text,1);
4792 (void) ConcatenateMagickString(working_path,DirectorySeparator,
4794 (void) ConcatenateMagickString(working_path,reply_info.text,
4797 state|=UpdateListState;
4799 selection_info.id=(~0);
4801 state|=RedrawListState;
4804 if (MatteIsActive(up_info,event.xbutton))
4809 up_info.raised=MagickFalse;
4810 XDrawBeveledButton(display,&windows->widget,&up_info);
4813 if (MatteIsActive(home_info,event.xbutton))
4818 home_info.raised=MagickFalse;
4819 XDrawBeveledButton(display,&windows->widget,&home_info);
4822 if (MatteIsActive(special_info,event.xbutton))
4827 special_info.raised=MagickFalse;
4828 XDrawBeveledButton(display,&windows->widget,&special_info);
4831 if (MatteIsActive(action_info,event.xbutton))
4836 action_info.raised=MagickFalse;
4837 XDrawBeveledButton(display,&windows->widget,&action_info);
4840 if (MatteIsActive(cancel_info,event.xbutton))
4845 cancel_info.raised=MagickFalse;
4846 XDrawBeveledButton(display,&windows->widget,&cancel_info);
4849 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
4851 if (event.xbutton.button != Button2)
4859 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
4860 for (i=1; i <= (ssize_t) Extent(reply_info.marker); i++)
4861 if (XTextWidth(font_info,reply_info.marker,(
int) i) > x)
4863 reply_info.cursor=reply_info.marker+i-1;
4864 if (event.xbutton.time > (click_time+DoubleClick))
4865 reply_info.highlight=MagickFalse;
4871 (
void) CopyMagickString(primary_selection,reply_info.text,
4873 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
4874 event.xbutton.time);
4875 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
4876 windows->widget.id ? MagickTrue : MagickFalse;
4878 XDrawMatteText(display,&windows->widget,&reply_info);
4879 click_time=
event.xbutton.time;
4885 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
4886 windows->widget.id,event.xbutton.time);
4891 if (windows->widget.mapped == MagickFalse)
4893 if (north_info.raised == MagickFalse)
4898 delay=SuspendTime << 2;
4899 north_info.raised=MagickTrue;
4900 XDrawTriangleNorth(display,&windows->widget,&north_info);
4902 if (south_info.raised == MagickFalse)
4907 delay=SuspendTime << 2;
4908 south_info.raised=MagickTrue;
4909 XDrawTriangleSouth(display,&windows->widget,&south_info);
4911 if (slider_info.active)
4916 slider_info.active=MagickFalse;
4919 if (up_info.raised == MagickFalse)
4921 if (event.xbutton.window == windows->widget.id)
4922 if (MatteIsActive(up_info,event.xbutton))
4924 ChopPathComponents(working_path,1);
4925 if (*working_path ==
'\0')
4926 (void) CopyMagickString(working_path,DirectorySeparator,
4928 state|=UpdateListState;
4930 up_info.raised=MagickTrue;
4931 XDrawBeveledButton(display,&windows->widget,&up_info);
4933 if (home_info.raised == MagickFalse)
4935 if (event.xbutton.window == windows->widget.id)
4936 if (MatteIsActive(home_info,event.xbutton))
4938 (void) CopyMagickString(working_path,home_directory,
4940 state|=UpdateListState;
4942 home_info.raised=MagickTrue;
4943 XDrawBeveledButton(display,&windows->widget,&home_info);
4945 if (special_info.raised == MagickFalse)
4947 if (anomaly == MagickFalse)
4961 exception=AcquireExceptionInfo();
4962 formats=GetMagickList(
"*",&number_formats,exception);
4963 exception=DestroyExceptionInfo(exception);
4964 if (formats == (
char **) NULL)
4966 (void) XCheckDefineCursor(display,windows->widget.id,
4967 windows->widget.busy_cursor);
4968 windows->popup.x=windows->widget.x+60;
4969 windows->popup.y=windows->widget.y+60;
4970 XListBrowserWidget(display,windows,&windows->popup,
4971 (
const char **) formats,
"Select",
"Select image format type:",
4973 XSetCursorState(display,windows,MagickTrue);
4974 (void) XCheckDefineCursor(display,windows->widget.id,
4975 windows->widget.cursor);
4976 LocaleLower(format);
4977 AppendImageFormat(format,reply_info.text);
4978 reply_info.cursor=reply_info.text+Extent(reply_info.text);
4979 XDrawMatteText(display,&windows->widget,&reply_info);
4980 special_info.raised=MagickTrue;
4981 XDrawBeveledButton(display,&windows->widget,&special_info);
4982 for (i=0; i < (ssize_t) number_formats; i++)
4983 formats[i]=DestroyString(formats[i]);
4984 formats=(
char **) RelinquishMagickMemory(formats);
4987 if (event.xbutton.window == windows->widget.id)
4988 if (MatteIsActive(special_info,event.xbutton))
4990 (void) CopyMagickString(working_path,
"x:",MaxTextExtent);
4993 special_info.raised=MagickTrue;
4994 XDrawBeveledButton(display,&windows->widget,&special_info);
4996 if (action_info.raised == MagickFalse)
4998 if (event.xbutton.window == windows->widget.id)
5000 if (MatteIsActive(action_info,event.xbutton))
5002 if (*reply_info.text ==
'\0')
5003 (void) XBell(display,0);
5008 action_info.raised=MagickTrue;
5009 XDrawBeveledButton(display,&windows->widget,&action_info);
5011 if (cancel_info.raised == MagickFalse)
5013 if (event.xbutton.window == windows->widget.id)
5014 if (MatteIsActive(cancel_info,event.xbutton))
5016 *reply_info.text=
'\0';
5020 cancel_info.raised=MagickTrue;
5021 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5030 if (event.xclient.message_type != windows->wm_protocols)
5032 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
5034 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
5035 (Time)
event.xclient.data.l[1]);
5038 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
5040 if (event.xclient.window == windows->widget.id)
5042 *reply_info.text=
'\0';
5048 case ConfigureNotify:
5053 if (event.xconfigure.window != windows->widget.id)
5055 if ((event.xconfigure.width == (
int) windows->widget.width) &&
5056 (
event.xconfigure.height == (int) windows->widget.height))
5058 windows->widget.width=(
unsigned int)
5059 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
5060 windows->widget.height=(
unsigned int)
5061 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
5062 state|=UpdateConfigurationState;
5067 if (event.xcrossing.window != windows->widget.id)
5069 state&=(~InactiveWidgetState);
5074 if (event.xexpose.window != windows->widget.id)
5076 if (event.xexpose.count != 0)
5078 state|=RedrawWidgetState;
5084 command[MaxTextExtent];
5095 if (event.xkey.window != windows->widget.id)
5097 length=XLookupString((XKeyEvent *) &event.xkey,command,
5098 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5099 *(command+length)=
'\0';
5100 if (AreaIsActive(scroll_info,event.xkey))
5105 switch ((
int) key_symbol)
5128 slider_info.id-=visible_files;
5134 slider_info.id+=visible_files;
5140 slider_info.id=(int) files;
5144 state|=RedrawListState;
5147 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
5152 if (*reply_info.text ==
'\0')
5154 if (IsGlob(reply_info.text))
5155 (
void) CopyMagickString(glob_pattern,reply_info.text,
5159 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5161 (void) ConcatenateMagickString(working_path,reply_info.text,
5163 if (*working_path ==
'~')
5164 ExpandFilename(working_path);
5167 state|=UpdateListState;
5170 if (key_symbol == XK_Control_L)
5172 state|=ControlState;
5175 if (state & ControlState)
5176 switch ((
int) key_symbol)
5184 *reply_info.text=
'\0';
5185 reply_info.cursor=reply_info.text;
5186 reply_info.marker=reply_info.text;
5187 reply_info.highlight=MagickFalse;
5193 XEditText(display,&reply_info,key_symbol,command,state);
5194 XDrawMatteText(display,&windows->widget,&reply_info);
5195 state|=JumpListState;
5201 command[MaxTextExtent];
5209 if (event.xkey.window != windows->widget.id)
5211 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
5212 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
5213 if (key_symbol == XK_Control_L)
5214 state&=(~ControlState);
5219 if (event.xcrossing.window != windows->widget.id)
5221 state|=InactiveWidgetState;
5235 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
5236 if (slider_info.active)
5241 slider_info.y=
event.xmotion.y-
5242 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
5243 if (slider_info.y < slider_info.min_y)
5244 slider_info.y=slider_info.min_y;
5245 if (slider_info.y > slider_info.max_y)
5246 slider_info.y=slider_info.max_y;
5248 if (slider_info.y != slider_info.min_y)
5249 slider_info.id=(int) ((files*(slider_info.y-slider_info.min_y+1))/
5250 (slider_info.max_y-slider_info.min_y+1));
5251 state|=RedrawListState;
5254 if (state & InactiveWidgetState)
5256 if (up_info.raised == MatteIsActive(up_info,event.xmotion))
5261 up_info.raised=!up_info.raised;
5262 XDrawBeveledButton(display,&windows->widget,&up_info);
5265 if (home_info.raised == MatteIsActive(home_info,event.xmotion))
5270 home_info.raised=!home_info.raised;
5271 XDrawBeveledButton(display,&windows->widget,&home_info);
5274 if (special_info.raised == MatteIsActive(special_info,event.xmotion))
5279 special_info.raised=!special_info.raised;
5280 XDrawBeveledButton(display,&windows->widget,&special_info);
5283 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
5288 action_info.raised=action_info.raised == MagickFalse ?
5289 MagickTrue : MagickFalse;
5290 XDrawBeveledButton(display,&windows->widget,&action_info);
5293 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
5298 cancel_info.raised=cancel_info.raised == MagickFalse ?
5299 MagickTrue : MagickFalse;
5300 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5305 case SelectionClear:
5307 reply_info.highlight=MagickFalse;
5308 XDrawMatteText(display,&windows->widget,&reply_info);
5311 case SelectionNotify:
5329 if (event.xselection.property == (Atom) None)
5331 status=XGetWindowProperty(display,event.xselection.requestor,
5332 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
5333 &format,&length,&after,&data);
5334 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
5337 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
5338 (void) XBell(display,0);
5344 *(data+length)=
'\0';
5345 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
5347 XDrawMatteText(display,&windows->widget,&reply_info);
5348 state|=JumpListState;
5349 state|=RedrawActionState;
5351 (void) XFree((
void *) data);
5354 case SelectionRequest:
5359 XSelectionRequestEvent
5362 if (reply_info.highlight == MagickFalse)
5367 request=(&(
event.xselectionrequest));
5368 (void) XChangeProperty(request->display,request->requestor,
5369 request->property,request->target,8,PropModeReplace,
5370 (
unsigned char *) primary_selection,Extent(primary_selection));
5371 notify.type=SelectionNotify;
5372 notify.display=request->display;
5373 notify.requestor=request->requestor;
5374 notify.selection=request->selection;
5375 notify.target=request->target;
5376 notify.time=request->time;
5377 if (request->property == None)
5378 notify.property=request->target;
5380 notify.property=request->property;
5381 (void) XSendEvent(request->display,request->requestor,False,0,
5382 (XEvent *) ¬ify);
5387 }
while ((state & ExitState) == 0);
5388 XSetCursorState(display,windows,MagickFalse);
5389 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
5390 XCheckRefreshWindows(display,windows);
5394 for (i=0; i < (ssize_t) files; i++)
5395 filelist[i]=DestroyString(filelist[i]);
5396 if (filelist != (
char **) NULL)
5397 filelist=(
char **) RelinquishMagickMemory(filelist);
5400 (void) ConcatenateMagickString(working_path,DirectorySeparator,
5402 (void) ConcatenateMagickString(working_path,reply,MaxTextExtent);
5404 (void) CopyMagickString(reply,working_path,MaxTextExtent);
5406 ExpandFilename(reply);
5443 #if defined(__cplusplus) || defined(c_plusplus)
5447 static int FontCompare(
const void *x,
const void *y)
5453 p=(
char *) *((
char **) x);
5454 q=(
char *) *((
char **) y);
5455 while ((*p !=
'\0') && (*q !=
'\0') && (*p == *q))
5463 #if defined(__cplusplus) || defined(c_plusplus)
5467 MagickExport
void XFontBrowserWidget(Display *display,XWindows *windows,
5468 const char *action,
char *reply)
5470 #define BackButtonText "Back"
5471 #define CancelButtonText "Cancel"
5472 #define FontnameText "Name:"
5473 #define FontPatternText "Pattern:"
5474 #define ResetButtonText "Reset"
5477 back_pattern[MaxTextExtent] =
"",
5480 primary_selection[MaxTextExtent] =
"",
5481 reset_pattern[MaxTextExtent] =
"",
5482 text[MaxTextExtent] =
"";
5493 glob_pattern[MaxTextExtent] =
"*";
5495 static MagickStatusType
5496 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
5542 assert(display != (Display *) NULL);
5543 assert(windows != (XWindows *) NULL);
5544 assert(action != (
char *) NULL);
5545 assert(reply != (
char *) NULL);
5546 if (IsEventLogging() != MagickFalse)
5547 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
5548 XSetCursorState(display,windows,MagickTrue);
5549 XCheckRefreshWindows(display,windows);
5550 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
5551 (void) CopyMagickString(reset_pattern,
"*",MaxTextExtent);
5552 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5558 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5560 (void) CopyMagickString(glob_pattern,
"*",MaxTextExtent);
5561 fontlist=XListFonts(display,glob_pattern,32767,&fonts);
5562 if (fontlist == (
char **) NULL)
5564 XNoticeWidget(display,windows,
"Unable to obtain fonts names:",
5573 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
sizeof(*fontlist));
5574 if (fontlist == (
char **) NULL)
5576 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5577 "UnableToViewFonts");
5580 for (i=0; i < fonts; i++)
5581 fontlist[i]=listhead[i];
5582 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5586 font_info=windows->widget.font_info;
5588 for (i=0; i < fonts; i++)
5589 if (WidgetTextWidth(font_info,fontlist[i]) > text_width)
5590 text_width=WidgetTextWidth(font_info,fontlist[i]);
5591 width=WidgetTextWidth(font_info,(
char *) action);
5592 if (WidgetTextWidth(font_info,CancelButtonText) > width)
5593 width=WidgetTextWidth(font_info,CancelButtonText);
5594 if (WidgetTextWidth(font_info,ResetButtonText) > width)
5595 width=WidgetTextWidth(font_info,ResetButtonText);
5596 if (WidgetTextWidth(font_info,BackButtonText) > width)
5597 width=WidgetTextWidth(font_info,BackButtonText);
5598 width+=QuantumMargin;
5599 if (WidgetTextWidth(font_info,FontPatternText) > width)
5600 width=WidgetTextWidth(font_info,FontPatternText);
5601 if (WidgetTextWidth(font_info,FontnameText) > width)
5602 width=WidgetTextWidth(font_info,FontnameText);
5603 height=(
unsigned int) (font_info->ascent+font_info->descent);
5607 windows->widget.width=width+MagickMin((
int) text_width,(
int) MaxTextWidth)+
5609 windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
5610 if (windows->widget.width < windows->widget.min_width)
5611 windows->widget.width=windows->widget.min_width;
5612 windows->widget.height=(
unsigned int)
5613 (((85*height) >> 2)+((13*QuantumMargin) >> 1)+4);
5614 windows->widget.min_height=(
unsigned int)
5615 (((27*height) >> 1)+((13*QuantumMargin) >> 1)+4);
5616 if (windows->widget.height < windows->widget.min_height)
5617 windows->widget.height=windows->widget.min_height;
5618 XConstrainWindowPosition(display,&windows->widget);
5622 (void) CopyMagickString(windows->widget.name,
"Browse and Select a Font",
5624 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
5625 if (status != False)
5627 XSetWMName(display,windows->widget.id,&window_name);
5628 XSetWMIconName(display,windows->widget.id,&window_name);
5629 (void) XFree((
void *) window_name.value);
5631 window_changes.width=(int) windows->widget.width;
5632 window_changes.height=(
int) windows->widget.height;
5633 window_changes.x=windows->widget.x;
5634 window_changes.y=windows->widget.y;
5635 (void) XReconfigureWMWindow(display,windows->widget.id,
5636 windows->widget.screen,mask,&window_changes);
5637 (void) XMapRaised(display,windows->widget.id);
5638 windows->widget.mapped=MagickFalse;
5642 XGetWidgetInfo((
char *) NULL,&slider_info);
5643 XGetWidgetInfo((
char *) NULL,&north_info);
5644 XGetWidgetInfo((
char *) NULL,&south_info);
5645 XGetWidgetInfo((
char *) NULL,&expose_info);
5646 XGetWidgetInfo((
char *) NULL,&selection_info);
5648 delay=SuspendTime << 2;
5649 state=UpdateConfigurationState;
5652 if (state & UpdateConfigurationState)
5660 XGetWidgetInfo(CancelButtonText,&cancel_info);
5661 cancel_info.width=width;
5662 cancel_info.height=(
unsigned int) ((3*height) >> 1);
5664 (windows->widget.width-cancel_info.width-QuantumMargin-2);
5666 (windows->widget.height-cancel_info.height-QuantumMargin);
5667 XGetWidgetInfo(action,&action_info);
5668 action_info.width=width;
5669 action_info.height=(
unsigned int) ((3*height) >> 1);
5670 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
5671 (action_info.bevel_width << 1));
5672 action_info.y=cancel_info.y;
5673 XGetWidgetInfo(BackButtonText,&back_info);
5674 back_info.width=width;
5675 back_info.height=(
unsigned int) ((3*height) >> 1);
5676 back_info.x=QuantumMargin;
5677 back_info.y=((5*QuantumMargin) >> 1)+height;
5678 XGetWidgetInfo(ResetButtonText,&reset_info);
5679 reset_info.width=width;
5680 reset_info.height=(
unsigned int) ((3*height) >> 1);
5681 reset_info.x=QuantumMargin;
5682 reset_info.y=back_info.y+back_info.height+QuantumMargin;
5686 XGetWidgetInfo(reply,&reply_info);
5687 reply_info.raised=MagickFalse;
5688 reply_info.bevel_width--;
5689 reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
5690 reply_info.height=height << 1;
5691 reply_info.x=(int) (width+(QuantumMargin << 1));
5692 reply_info.y=action_info.y-(action_info.height << 1)-QuantumMargin;
5696 XGetWidgetInfo(reply,&mode_info);
5697 mode_info.bevel_width=0;
5698 mode_info.width=(
unsigned int)
5699 (action_info.x-reply_info.x-QuantumMargin);
5700 mode_info.height=action_info.height << 1;
5701 mode_info.x=reply_info.x;
5702 mode_info.y=action_info.y-action_info.height+action_info.bevel_width;
5706 XGetWidgetInfo((
char *) NULL,&scroll_info);
5707 scroll_info.bevel_width--;
5708 scroll_info.width=height;
5709 scroll_info.height=(
unsigned int)
5710 (reply_info.y-back_info.y-(QuantumMargin >> 1));
5711 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
5712 scroll_info.y=back_info.y-reply_info.bevel_width;
5713 scroll_info.raised=MagickFalse;
5714 scroll_info.trough=MagickTrue;
5715 north_info=scroll_info;
5716 north_info.raised=MagickTrue;
5717 north_info.width-=(north_info.bevel_width << 1);
5718 north_info.height=north_info.width-1;
5719 north_info.x+=north_info.bevel_width;
5720 north_info.y+=north_info.bevel_width;
5721 south_info=north_info;
5722 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
5725 slider_info=north_info;
5727 slider_info.width-=2;
5728 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
5729 slider_info.bevel_width+2;
5730 slider_info.height=scroll_info.height-((slider_info.min_y-
5731 scroll_info.y+1) << 1)+4;
5732 visible_fonts=(
unsigned int) (scroll_info.height*
5733 PerceptibleReciprocal((
double) height+(height >> 3)));
5734 if (fonts > (
int) visible_fonts)
5735 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5736 slider_info.max_y=south_info.y-south_info.bevel_width-
5737 slider_info.bevel_width-2;
5738 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
5739 slider_info.y=slider_info.min_y;
5740 expose_info=scroll_info;
5741 expose_info.y=slider_info.y;
5745 XGetWidgetInfo((
char *) NULL,&list_info);
5746 list_info.raised=MagickFalse;
5747 list_info.bevel_width--;
5748 list_info.width=(
unsigned int)
5749 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
5750 list_info.height=scroll_info.height;
5751 list_info.x=reply_info.x;
5752 list_info.y=scroll_info.y;
5753 if (windows->widget.mapped == MagickFalse)
5754 state|=JumpListState;
5759 XGetWidgetInfo(text,&text_info);
5760 text_info.center=MagickFalse;
5761 text_info.width=reply_info.width;
5762 text_info.height=height;
5763 text_info.x=list_info.x-(QuantumMargin >> 1);
5764 text_info.y=QuantumMargin;
5768 XGetWidgetInfo((
char *) NULL,&selection_info);
5769 selection_info.center=MagickFalse;
5770 selection_info.width=list_info.width;
5771 selection_info.height=(
unsigned int) ((9*height) >> 3);
5772 selection_info.x=list_info.x;
5773 state&=(~UpdateConfigurationState);
5775 if (state & RedrawWidgetState)
5781 y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
5782 (void) XDrawString(display,windows->widget.id,
5783 windows->widget.annotate_context,x,y,FontPatternText,
5784 Extent(FontPatternText));
5785 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
5786 XDrawWidgetText(display,&windows->widget,&text_info);
5787 XDrawBeveledButton(display,&windows->widget,&back_info);
5788 XDrawBeveledButton(display,&windows->widget,&reset_info);
5789 XDrawBeveledMatte(display,&windows->widget,&list_info);
5790 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5791 XDrawTriangleNorth(display,&windows->widget,&north_info);
5792 XDrawBeveledButton(display,&windows->widget,&slider_info);
5793 XDrawTriangleSouth(display,&windows->widget,&south_info);
5795 y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
5796 (void) XDrawString(display,windows->widget.id,
5797 windows->widget.annotate_context,x,y,FontnameText,
5798 Extent(FontnameText));
5799 XDrawBeveledMatte(display,&windows->widget,&reply_info);
5800 XDrawMatteText(display,&windows->widget,&reply_info);
5801 XDrawBeveledButton(display,&windows->widget,&action_info);
5802 XDrawBeveledButton(display,&windows->widget,&cancel_info);
5803 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5804 selection_info.id=(~0);
5805 state|=RedrawActionState;
5806 state|=RedrawListState;
5807 state&=(~RedrawWidgetState);
5809 if (state & UpdateListState)
5820 checklist=XListFonts(display,glob_pattern,32767,&number_fonts);
5821 if (checklist == (
char **) NULL)
5823 if ((strchr(glob_pattern,
'*') == (
char *) NULL) &&
5824 (strchr(glob_pattern,
'?') == (
char *) NULL))
5829 (void) CopyMagickString(reply,glob_pattern,MaxTextExtent);
5830 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5831 action_info.raised=MagickFalse;
5832 XDrawBeveledButton(display,&windows->widget,&action_info);
5835 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5836 (void) XBell(display,0);
5839 if (number_fonts == 1)
5844 (void) CopyMagickString(reply,checklist[0],MaxTextExtent);
5845 (void) CopyMagickString(glob_pattern,back_pattern,MaxTextExtent);
5846 (void) XFreeFontNames(checklist);
5847 action_info.raised=MagickFalse;
5848 XDrawBeveledButton(display,&windows->widget,&action_info);
5853 (void) XFreeFontNames(listhead);
5854 fontlist=(
char **) RelinquishMagickMemory(fontlist);
5862 fontlist=(
char **) AcquireQuantumMemory((
size_t) fonts,
5864 if (fontlist == (
char **) NULL)
5866 XNoticeWidget(display,windows,
"MemoryAllocationFailed",
5867 "UnableToViewFonts");
5870 for (i=0; i < fonts; i++)
5871 fontlist[i]=listhead[i];
5872 qsort((
void *) fontlist,(
size_t) fonts,
sizeof(*fontlist),FontCompare);
5874 scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
5875 if (fonts > (
int) visible_fonts)
5876 slider_info.height=(visible_fonts*slider_info.height)/fonts;
5877 slider_info.max_y=south_info.y-south_info.bevel_width-
5878 slider_info.bevel_width-2;
5880 slider_info.y=slider_info.min_y;
5881 expose_info.y=slider_info.y;
5882 selection_info.id=(~0);
5884 state|=RedrawListState;
5888 *reply_info.text=
'\0';
5889 reply_info.cursor=reply_info.text;
5890 (void) CopyMagickString(text_info.text,glob_pattern,MaxTextExtent);
5891 XDrawWidgetText(display,&windows->widget,&text_info);
5892 XDrawMatteText(display,&windows->widget,&reply_info);
5893 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
5894 XDrawTriangleNorth(display,&windows->widget,&north_info);
5895 XDrawBeveledButton(display,&windows->widget,&slider_info);
5896 XDrawTriangleSouth(display,&windows->widget,&south_info);
5897 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5898 state&=(~UpdateListState);
5900 if (state & JumpListState)
5906 for (i=0; i < fonts; i++)
5907 if (LocaleCompare(fontlist[i],reply) >= 0)
5909 list_info.id=LocaleCompare(fontlist[i],reply) == 0 ? i : ~0;
5912 if ((i < slider_info.id) || (i >= (
int) (slider_info.id+visible_fonts)))
5913 slider_info.id=i-(visible_fonts >> 1);
5914 selection_info.id=(~0);
5915 state|=RedrawListState;
5916 state&=(~JumpListState);
5918 if (state & RedrawListState)
5923 if (slider_info.id >= (
int) (fonts-visible_fonts))
5924 slider_info.id=fonts-visible_fonts;
5925 if ((slider_info.id < 0) || (fonts <= (int) visible_fonts))
5927 slider_info.y=slider_info.min_y;
5930 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/fonts;
5931 if (slider_info.id != selection_info.id)
5936 selection_info.id=slider_info.id;
5937 selection_info.y=list_info.y+(height >> 3)+2;
5938 for (i=0; i < (int) visible_fonts; i++)
5940 selection_info.raised=(slider_info.id+i) != list_info.id ?
5941 MagickTrue : MagickFalse;
5942 selection_info.text=(
char *) NULL;
5943 if ((slider_info.id+i) < fonts)
5944 selection_info.text=fontlist[slider_info.id+i];
5945 XDrawWidgetText(display,&windows->widget,&selection_info);
5946 selection_info.y+=(int) selection_info.height;
5951 if (slider_info.y > expose_info.y)
5953 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
5954 expose_info.y=slider_info.y-expose_info.height-
5955 slider_info.bevel_width-1;
5959 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
5960 expose_info.y=slider_info.y+slider_info.height+
5961 slider_info.bevel_width+1;
5963 XDrawTriangleNorth(display,&windows->widget,&north_info);
5964 XDrawMatte(display,&windows->widget,&expose_info);
5965 XDrawBeveledButton(display,&windows->widget,&slider_info);
5966 XDrawTriangleSouth(display,&windows->widget,&south_info);
5967 expose_info.y=slider_info.y;
5969 state&=(~RedrawListState);
5971 if (state & RedrawActionState)
5979 save_info=windows->widget.font_info;
5980 font_info=XLoadQueryFont(display,reply_info.text);
5981 if (font_info != (XFontStruct *) NULL)
5983 windows->widget.font_info=font_info;
5984 (void) XSetFont(display,windows->widget.widget_context,
5987 XDrawBeveledButton(display,&windows->widget,&mode_info);
5988 windows->widget.font_info=save_info;
5989 if (font_info != (XFontStruct *) NULL)
5991 (void) XSetFont(display,windows->widget.widget_context,
5992 windows->widget.font_info->fid);
5993 (void) XFreeFont(display,font_info);
5995 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
5996 XDrawMatteText(display,&windows->widget,&reply_info);
5997 state&=(~RedrawActionState);
6002 if (north_info.raised && south_info.raised)
6003 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
6009 XDelay(display,delay);
6011 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
6012 if (north_info.raised == MagickFalse)
6013 if (slider_info.id > 0)
6019 state|=RedrawListState;
6021 if (south_info.raised == MagickFalse)
6022 if (slider_info.id < fonts)
6028 state|=RedrawListState;
6030 if (event.type != ButtonRelease)
6037 if (MatteIsActive(slider_info,event.xbutton))
6042 slider_info.active=MagickTrue;
6045 if (MatteIsActive(north_info,event.xbutton))
6046 if (slider_info.id > 0)
6051 north_info.raised=MagickFalse;
6053 state|=RedrawListState;
6056 if (MatteIsActive(south_info,event.xbutton))
6057 if (slider_info.id < fonts)
6062 south_info.raised=MagickFalse;
6064 state|=RedrawListState;
6067 if (MatteIsActive(scroll_info,event.xbutton))
6072 if (event.xbutton.y < slider_info.y)
6073 slider_info.id-=(visible_fonts-1);
6075 slider_info.id+=(visible_fonts-1);
6076 state|=RedrawListState;
6079 if (MatteIsActive(list_info,event.xbutton))
6087 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
6088 selection_info.height;
6089 if (
id >= (
int) fonts)
6091 (void) CopyMagickString(reply_info.text,fontlist[
id],MaxTextExtent);
6092 reply_info.highlight=MagickFalse;
6093 reply_info.marker=reply_info.text;
6094 reply_info.cursor=reply_info.text+Extent(reply_info.text);
6095 XDrawMatteText(display,&windows->widget,&reply_info);
6096 state|=RedrawActionState;
6097 if (
id == list_info.id)
6099 (void) CopyMagickString(glob_pattern,reply_info.text,
6101 state|=UpdateListState;
6103 selection_info.id=(~0);
6105 state|=RedrawListState;
6108 if (MatteIsActive(back_info,event.xbutton))
6113 back_info.raised=MagickFalse;
6114 XDrawBeveledButton(display,&windows->widget,&back_info);
6117 if (MatteIsActive(reset_info,event.xbutton))
6122 reset_info.raised=MagickFalse;
6123 XDrawBeveledButton(display,&windows->widget,&reset_info);
6126 if (MatteIsActive(action_info,event.xbutton))
6131 action_info.raised=MagickFalse;
6132 XDrawBeveledButton(display,&windows->widget,&action_info);
6135 if (MatteIsActive(cancel_info,event.xbutton))
6140 cancel_info.raised=MagickFalse;
6141 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6144 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
6146 if (event.xbutton.button != Button2)
6154 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
6155 for (i=1; i <= Extent(reply_info.marker); i++)
6156 if (XTextWidth(font_info,reply_info.marker,i) > x)
6158 reply_info.cursor=reply_info.marker+i-1;
6159 if (event.xbutton.time > (click_time+DoubleClick))
6160 reply_info.highlight=MagickFalse;
6166 (
void) CopyMagickString(primary_selection,reply_info.text,
6168 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
6169 event.xbutton.time);
6170 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
6171 windows->widget.id ? MagickTrue : MagickFalse;
6173 XDrawMatteText(display,&windows->widget,&reply_info);
6174 click_time=
event.xbutton.time;
6180 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
6181 windows->widget.id,event.xbutton.time);
6186 if (windows->widget.mapped == MagickFalse)
6188 if (north_info.raised == MagickFalse)
6193 delay=SuspendTime << 2;
6194 north_info.raised=MagickTrue;
6195 XDrawTriangleNorth(display,&windows->widget,&north_info);
6197 if (south_info.raised == MagickFalse)
6202 delay=SuspendTime << 2;
6203 south_info.raised=MagickTrue;
6204 XDrawTriangleSouth(display,&windows->widget,&south_info);
6206 if (slider_info.active)
6211 slider_info.active=MagickFalse;
6214 if (back_info.raised == MagickFalse)
6216 if (event.xbutton.window == windows->widget.id)
6217 if (MatteIsActive(back_info,event.xbutton))
6219 (void) CopyMagickString(glob_pattern,back_pattern,
6221 state|=UpdateListState;
6223 back_info.raised=MagickTrue;
6224 XDrawBeveledButton(display,&windows->widget,&back_info);
6226 if (reset_info.raised == MagickFalse)
6228 if (event.xbutton.window == windows->widget.id)
6229 if (MatteIsActive(reset_info,event.xbutton))
6231 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
6232 (void) CopyMagickString(glob_pattern,reset_pattern,MaxTextExtent);
6233 state|=UpdateListState;
6235 reset_info.raised=MagickTrue;
6236 XDrawBeveledButton(display,&windows->widget,&reset_info);
6238 if (action_info.raised == MagickFalse)
6240 if (event.xbutton.window == windows->widget.id)
6242 if (MatteIsActive(action_info,event.xbutton))
6244 if (*reply_info.text ==
'\0')
6245 (void) XBell(display,0);
6250 action_info.raised=MagickTrue;
6251 XDrawBeveledButton(display,&windows->widget,&action_info);
6253 if (cancel_info.raised == MagickFalse)
6255 if (event.xbutton.window == windows->widget.id)
6256 if (MatteIsActive(cancel_info,event.xbutton))
6258 *reply_info.text=
'\0';
6261 cancel_info.raised=MagickTrue;
6262 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6271 if (event.xclient.message_type != windows->wm_protocols)
6273 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
6275 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
6276 (Time)
event.xclient.data.l[1]);
6279 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
6281 if (event.xclient.window == windows->widget.id)
6283 *reply_info.text=
'\0';
6289 case ConfigureNotify:
6294 if (event.xconfigure.window != windows->widget.id)
6296 if ((event.xconfigure.width == (
int) windows->widget.width) &&
6297 (
event.xconfigure.height == (int) windows->widget.height))
6299 windows->widget.width=(
unsigned int)
6300 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
6301 windows->widget.height=(
unsigned int)
6302 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
6303 state|=UpdateConfigurationState;
6308 if (event.xcrossing.window != windows->widget.id)
6310 state&=(~InactiveWidgetState);
6315 if (event.xexpose.window != windows->widget.id)
6317 if (event.xexpose.count != 0)
6319 state|=RedrawWidgetState;
6325 command[MaxTextExtent];
6336 if (event.xkey.window != windows->widget.id)
6338 length=XLookupString((XKeyEvent *) &event.xkey,command,
6339 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6340 *(command+length)=
'\0';
6341 if (AreaIsActive(scroll_info,event.xkey))
6346 switch ((
int) key_symbol)
6369 slider_info.id-=visible_fonts;
6375 slider_info.id+=visible_fonts;
6381 slider_info.id=fonts;
6385 state|=RedrawListState;
6388 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
6393 if (*reply_info.text ==
'\0')
6395 (void) CopyMagickString(back_pattern,glob_pattern,MaxTextExtent);
6396 (void) CopyMagickString(glob_pattern,reply_info.text,MaxTextExtent);
6397 state|=UpdateListState;
6400 if (key_symbol == XK_Control_L)
6402 state|=ControlState;
6405 if (state & ControlState)
6406 switch ((
int) key_symbol)
6414 *reply_info.text=
'\0';
6415 reply_info.cursor=reply_info.text;
6416 reply_info.marker=reply_info.text;
6417 reply_info.highlight=MagickFalse;
6423 XEditText(display,&reply_info,key_symbol,command,state);
6424 XDrawMatteText(display,&windows->widget,&reply_info);
6425 state|=JumpListState;
6431 command[MaxTextExtent];
6439 if (event.xkey.window != windows->widget.id)
6441 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
6442 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
6443 if (key_symbol == XK_Control_L)
6444 state&=(~ControlState);
6449 if (event.xcrossing.window != windows->widget.id)
6451 state|=InactiveWidgetState;
6465 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
6466 if (slider_info.active)
6471 slider_info.y=
event.xmotion.y-
6472 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
6473 if (slider_info.y < slider_info.min_y)
6474 slider_info.y=slider_info.min_y;
6475 if (slider_info.y > slider_info.max_y)
6476 slider_info.y=slider_info.max_y;
6478 if (slider_info.y != slider_info.min_y)
6479 slider_info.id=(fonts*(slider_info.y-slider_info.min_y+1))/
6480 (slider_info.max_y-slider_info.min_y+1);
6481 state|=RedrawListState;
6484 if (state & InactiveWidgetState)
6486 if (back_info.raised == MatteIsActive(back_info,event.xmotion))
6491 back_info.raised=!back_info.raised;
6492 XDrawBeveledButton(display,&windows->widget,&back_info);
6495 if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
6500 reset_info.raised=!reset_info.raised;
6501 XDrawBeveledButton(display,&windows->widget,&reset_info);
6504 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
6509 action_info.raised=action_info.raised == MagickFalse ?
6510 MagickTrue : MagickFalse;
6511 XDrawBeveledButton(display,&windows->widget,&action_info);
6514 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
6519 cancel_info.raised=cancel_info.raised == MagickFalse ?
6520 MagickTrue : MagickFalse;
6521 XDrawBeveledButton(display,&windows->widget,&cancel_info);
6526 case SelectionClear:
6528 reply_info.highlight=MagickFalse;
6529 XDrawMatteText(display,&windows->widget,&reply_info);
6532 case SelectionNotify:
6550 if (event.xselection.property == (Atom) None)
6552 status=XGetWindowProperty(display,event.xselection.requestor,
6553 event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
6554 &format,&length,&after,&data);
6555 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
6558 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
6559 (void) XBell(display,0);
6565 *(data+length)=
'\0';
6566 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
6568 XDrawMatteText(display,&windows->widget,&reply_info);
6569 state|=JumpListState;
6570 state|=RedrawActionState;
6572 (void) XFree((
void *) data);
6575 case SelectionRequest:
6580 XSelectionRequestEvent
6586 request=(&(
event.xselectionrequest));
6587 (void) XChangeProperty(request->display,request->requestor,
6588 request->property,request->target,8,PropModeReplace,
6589 (
unsigned char *) primary_selection,Extent(primary_selection));
6590 notify.type=SelectionNotify;
6591 notify.display=request->display;
6592 notify.requestor=request->requestor;
6593 notify.selection=request->selection;
6594 notify.target=request->target;
6595 notify.time=request->time;
6596 if (request->property == None)
6597 notify.property=request->target;
6599 notify.property=request->property;
6600 (void) XSendEvent(request->display,request->requestor,False,0,
6601 (XEvent *) ¬ify);
6606 }
while ((state & ExitState) == 0);
6607 XSetCursorState(display,windows,MagickFalse);
6608 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
6609 XCheckRefreshWindows(display,windows);
6613 (void) XFreeFontNames(listhead);
6614 fontlist=(
char **) RelinquishMagickMemory(fontlist);
6647 MagickExport
void XInfoWidget(Display *display,XWindows *windows,
6648 const char *activity)
6664 assert(display != (Display *) NULL);
6665 assert(windows != (XWindows *) NULL);
6666 assert(activity != (
char *) NULL);
6667 if (IsEventLogging() != MagickFalse)
6668 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
6669 font_info=windows->info.font_info;
6670 width=WidgetTextWidth(font_info,(
char *) activity)+((3*QuantumMargin) >> 1)+4;
6671 height=(
unsigned int) (((6*(font_info->ascent+font_info->descent)) >> 2)+4);
6672 if ((windows->info.width != width) || (windows->info.height != height))
6677 windows->info.width=width;
6678 windows->info.height=height;
6679 window_changes.width=(int) width;
6680 window_changes.height=(int) height;
6681 (void) XReconfigureWMWindow(display,windows->info.id,windows->info.screen,
6682 (
unsigned int) (CWWidth | CWHeight),&window_changes);
6684 if (windows->info.mapped == MagickFalse)
6686 (void) XMapRaised(display,windows->info.id);
6687 windows->info.mapped=MagickTrue;
6692 height=(
unsigned int) (font_info->ascent+font_info->descent);
6693 XGetWidgetInfo(activity,&monitor_info);
6694 monitor_info.bevel_width--;
6695 margin=monitor_info.bevel_width+((windows->info.height-height) >> 1)-2;
6696 monitor_info.center=MagickFalse;
6697 monitor_info.x=(int) margin;
6698 monitor_info.y=(int) margin;
6699 monitor_info.width=windows->info.width-(margin << 1);
6700 monitor_info.height=windows->info.height-(margin << 1)+1;
6704 monitor_info.raised=MagickFalse;
6705 XDrawBeveledMatte(display,&windows->info,&monitor_info);
6706 monitor_info.raised=MagickTrue;
6707 XDrawWidgetText(display,&windows->info,&monitor_info);
6749 MagickExport
void XListBrowserWidget(Display *display,XWindows *windows,
6750 XWindowInfo *window_info,
const char *
const *list,
const char *action,
6751 const char *query,
char *reply)
6753 #define CancelButtonText "Cancel"
6756 primary_selection[MaxTextExtent];
6764 static MagickStatusType
6765 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
6809 assert(display != (Display *) NULL);
6810 assert(windows != (XWindows *) NULL);
6811 assert(window_info != (XWindowInfo *) NULL);
6812 assert(list != (
const char **) NULL);
6813 assert(action != (
char *) NULL);
6814 assert(query != (
char *) NULL);
6815 assert(reply != (
char *) NULL);
6816 if (IsEventLogging() != MagickFalse)
6817 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",action);
6818 XSetCursorState(display,windows,MagickTrue);
6819 XCheckRefreshWindows(display,windows);
6820 if (list == (
const char **) NULL)
6822 XNoticeWidget(display,windows,
"No text to browse:",(
char *) NULL);
6825 for (entries=0; ; entries++)
6826 if (list[entries] == (
char *) NULL)
6831 font_info=window_info->font_info;
6832 text_width=WidgetTextWidth(font_info,(
char *) query);
6833 for (i=0; i < (int) entries; i++)
6834 if (WidgetTextWidth(font_info,(
char *) list[i]) > text_width)
6835 text_width=WidgetTextWidth(font_info,(
char *) list[i]);
6836 width=WidgetTextWidth(font_info,(
char *) action);
6837 if (WidgetTextWidth(font_info,CancelButtonText) > width)
6838 width=WidgetTextWidth(font_info,CancelButtonText);
6839 width+=QuantumMargin;
6840 height=(
unsigned int) (font_info->ascent+font_info->descent);
6844 window_info->width=(
unsigned int) MagickMin((
int) text_width,(int)
6845 MaxTextWidth)+((9*QuantumMargin) >> 1);
6846 window_info->min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
6847 if (window_info->width < window_info->min_width)
6848 window_info->width=window_info->min_width;
6849 window_info->height=(
unsigned int)
6850 (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
6851 window_info->min_height=(
unsigned int)
6852 (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
6853 if (window_info->height < window_info->min_height)
6854 window_info->height=window_info->min_height;
6855 XConstrainWindowPosition(display,window_info);
6859 (void) CopyMagickString(window_info->name,
"Browse",MaxTextExtent);
6860 status=XStringListToTextProperty(&window_info->name,1,&window_name);
6861 if (status != False)
6863 XSetWMName(display,window_info->id,&window_name);
6864 XSetWMIconName(display,windows->widget.id,&window_name);
6865 (void) XFree((
void *) window_name.value);
6867 window_changes.width=(int) window_info->width;
6868 window_changes.height=(
int) window_info->height;
6869 window_changes.x=window_info->x;
6870 window_changes.y=window_info->y;
6871 (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,mask,
6873 (void) XMapRaised(display,window_info->id);
6874 window_info->mapped=MagickFalse;
6878 XGetWidgetInfo((
char *) NULL,&slider_info);
6879 XGetWidgetInfo((
char *) NULL,&north_info);
6880 XGetWidgetInfo((
char *) NULL,&south_info);
6881 XGetWidgetInfo((
char *) NULL,&expose_info);
6882 XGetWidgetInfo((
char *) NULL,&selection_info);
6884 delay=SuspendTime << 2;
6885 state=UpdateConfigurationState;
6888 if (state & UpdateConfigurationState)
6896 XGetWidgetInfo(CancelButtonText,&cancel_info);
6897 cancel_info.width=width;
6898 cancel_info.height=(
unsigned int) ((3*height) >> 1);
6900 (window_info->width-cancel_info.width-QuantumMargin-2);
6902 (window_info->height-cancel_info.height-QuantumMargin);
6903 XGetWidgetInfo(action,&action_info);
6904 action_info.width=width;
6905 action_info.height=(
unsigned int) ((3*height) >> 1);
6906 action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
6907 (action_info.bevel_width << 1));
6908 action_info.y=cancel_info.y;
6912 XGetWidgetInfo(reply,&reply_info);
6913 reply_info.raised=MagickFalse;
6914 reply_info.bevel_width--;
6915 reply_info.width=window_info->width-((4*QuantumMargin) >> 1);
6916 reply_info.height=height << 1;
6917 reply_info.x=QuantumMargin;
6918 reply_info.y=action_info.y-reply_info.height-QuantumMargin;
6922 XGetWidgetInfo((
char *) NULL,&scroll_info);
6923 scroll_info.bevel_width--;
6924 scroll_info.width=height;
6925 scroll_info.height=(
unsigned int)
6926 (reply_info.y-((6*QuantumMargin) >> 1)-height);
6927 scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
6928 scroll_info.y=((5*QuantumMargin) >> 1)+height-reply_info.bevel_width;
6929 scroll_info.raised=MagickFalse;
6930 scroll_info.trough=MagickTrue;
6931 north_info=scroll_info;
6932 north_info.raised=MagickTrue;
6933 north_info.width-=(north_info.bevel_width << 1);
6934 north_info.height=north_info.width-1;
6935 north_info.x+=north_info.bevel_width;
6936 north_info.y+=north_info.bevel_width;
6937 south_info=north_info;
6938 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
6941 slider_info=north_info;
6943 slider_info.width-=2;
6944 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
6945 slider_info.bevel_width+2;
6946 slider_info.height=scroll_info.height-((slider_info.min_y-
6947 scroll_info.y+1) << 1)+4;
6948 visible_entries=(
unsigned int) (scroll_info.height*
6949 PerceptibleReciprocal((
double) height+(height >> 3)));
6950 if (entries > visible_entries)
6951 slider_info.height=(visible_entries*slider_info.height)/entries;
6952 slider_info.max_y=south_info.y-south_info.bevel_width-
6953 slider_info.bevel_width-2;
6954 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
6955 slider_info.y=slider_info.min_y;
6956 expose_info=scroll_info;
6957 expose_info.y=slider_info.y;
6961 XGetWidgetInfo((
char *) NULL,&list_info);
6962 list_info.raised=MagickFalse;
6963 list_info.bevel_width--;
6964 list_info.width=(
unsigned int)
6965 (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
6966 list_info.height=scroll_info.height;
6967 list_info.x=reply_info.x;
6968 list_info.y=scroll_info.y;
6969 if (window_info->mapped == MagickFalse)
6970 for (i=0; i < (int) entries; i++)
6971 if (LocaleCompare(list[i],reply) == 0)
6974 slider_info.id=i-(visible_entries >> 1);
6975 if (slider_info.id < 0)
6981 XGetWidgetInfo(query,&text_info);
6982 text_info.width=reply_info.width;
6983 text_info.height=height;
6984 text_info.x=list_info.x-(QuantumMargin >> 1);
6985 text_info.y=QuantumMargin;
6989 XGetWidgetInfo((
char *) NULL,&selection_info);
6990 selection_info.center=MagickFalse;
6991 selection_info.width=list_info.width;
6992 selection_info.height=(
unsigned int) ((9*height) >> 3);
6993 selection_info.x=list_info.x;
6994 state&=(~UpdateConfigurationState);
6996 if (state & RedrawWidgetState)
7001 XDrawWidgetText(display,window_info,&text_info);
7002 XDrawBeveledMatte(display,window_info,&list_info);
7003 XDrawBeveledMatte(display,window_info,&scroll_info);
7004 XDrawTriangleNorth(display,window_info,&north_info);
7005 XDrawBeveledButton(display,window_info,&slider_info);
7006 XDrawTriangleSouth(display,window_info,&south_info);
7007 XDrawBeveledMatte(display,window_info,&reply_info);
7008 XDrawMatteText(display,window_info,&reply_info);
7009 XDrawBeveledButton(display,window_info,&action_info);
7010 XDrawBeveledButton(display,window_info,&cancel_info);
7011 XHighlightWidget(display,window_info,BorderOffset,BorderOffset);
7012 selection_info.id=(~0);
7013 state|=RedrawActionState;
7014 state|=RedrawListState;
7015 state&=(~RedrawWidgetState);
7017 if (state & RedrawListState)
7022 if (slider_info.id >= (
int) (entries-visible_entries))
7023 slider_info.id=(int) (entries-visible_entries);
7024 if ((slider_info.id < 0) || (entries <= visible_entries))
7026 slider_info.y=slider_info.min_y;
7029 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/entries;
7030 if (slider_info.id != selection_info.id)
7035 selection_info.id=slider_info.id;
7036 selection_info.y=list_info.y+(height >> 3)+2;
7037 for (i=0; i < (int) visible_entries; i++)
7039 selection_info.raised=(slider_info.id+i) != list_info.id ?
7040 MagickTrue : MagickFalse;
7041 selection_info.text=(
char *) NULL;
7042 if ((slider_info.id+i) < (int) entries)
7043 selection_info.text=(
char *) list[slider_info.id+i];
7044 XDrawWidgetText(display,window_info,&selection_info);
7045 selection_info.y+=(int) selection_info.height;
7050 if (slider_info.y > expose_info.y)
7052 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
7053 expose_info.y=slider_info.y-expose_info.height-
7054 slider_info.bevel_width-1;
7058 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
7059 expose_info.y=slider_info.y+slider_info.height+
7060 slider_info.bevel_width+1;
7062 XDrawTriangleNorth(display,window_info,&north_info);
7063 XDrawMatte(display,window_info,&expose_info);
7064 XDrawBeveledButton(display,window_info,&slider_info);
7065 XDrawTriangleSouth(display,window_info,&south_info);
7066 expose_info.y=slider_info.y;
7068 state&=(~RedrawListState);
7073 if (north_info.raised && south_info.raised)
7074 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7080 XDelay(display,delay);
7082 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
7083 if (north_info.raised == MagickFalse)
7084 if (slider_info.id > 0)
7090 state|=RedrawListState;
7092 if (south_info.raised == MagickFalse)
7093 if (slider_info.id < (
int) entries)
7099 state|=RedrawListState;
7101 if (event.type != ButtonRelease)
7108 if (MatteIsActive(slider_info,event.xbutton))
7113 slider_info.active=MagickTrue;
7116 if (MatteIsActive(north_info,event.xbutton))
7117 if (slider_info.id > 0)
7122 north_info.raised=MagickFalse;
7124 state|=RedrawListState;
7127 if (MatteIsActive(south_info,event.xbutton))
7128 if (slider_info.id < (
int) entries)
7133 south_info.raised=MagickFalse;
7135 state|=RedrawListState;
7138 if (MatteIsActive(scroll_info,event.xbutton))
7143 if (event.xbutton.y < slider_info.y)
7144 slider_info.id-=(visible_entries-1);
7146 slider_info.id+=(visible_entries-1);
7147 state|=RedrawListState;
7150 if (MatteIsActive(list_info,event.xbutton))
7158 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
7159 selection_info.height;
7160 if (
id >= (
int) entries)
7162 (void) CopyMagickString(reply_info.text,list[
id],MaxTextExtent);
7163 reply_info.highlight=MagickFalse;
7164 reply_info.marker=reply_info.text;
7165 reply_info.cursor=reply_info.text+Extent(reply_info.text);
7166 XDrawMatteText(display,window_info,&reply_info);
7167 selection_info.id=(~0);
7168 if (
id == list_info.id)
7170 action_info.raised=MagickFalse;
7171 XDrawBeveledButton(display,window_info,&action_info);
7175 state|=RedrawListState;
7178 if (MatteIsActive(action_info,event.xbutton))
7183 action_info.raised=MagickFalse;
7184 XDrawBeveledButton(display,window_info,&action_info);
7187 if (MatteIsActive(cancel_info,event.xbutton))
7192 cancel_info.raised=MagickFalse;
7193 XDrawBeveledButton(display,window_info,&cancel_info);
7196 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7198 if (event.xbutton.button != Button2)
7206 x=
event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
7207 for (i=1; i <= Extent(reply_info.marker); i++)
7208 if (XTextWidth(font_info,reply_info.marker,i) > x)
7210 reply_info.cursor=reply_info.marker+i-1;
7211 if (event.xbutton.time > (click_time+DoubleClick))
7212 reply_info.highlight=MagickFalse;
7218 (
void) CopyMagickString(primary_selection,reply_info.text,
7220 (void) XSetSelectionOwner(display,XA_PRIMARY,window_info->id,
7221 event.xbutton.time);
7222 reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
7223 window_info->id ? MagickTrue : MagickFalse;
7225 XDrawMatteText(display,window_info,&reply_info);
7226 click_time=
event.xbutton.time;
7232 (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
7233 window_info->id,event.xbutton.time);
7238 if (window_info->mapped == MagickFalse)
7240 if (north_info.raised == MagickFalse)
7245 delay=SuspendTime << 2;
7246 north_info.raised=MagickTrue;
7247 XDrawTriangleNorth(display,window_info,&north_info);
7249 if (south_info.raised == MagickFalse)
7254 delay=SuspendTime << 2;
7255 south_info.raised=MagickTrue;
7256 XDrawTriangleSouth(display,window_info,&south_info);
7258 if (slider_info.active)
7263 slider_info.active=MagickFalse;
7266 if (action_info.raised == MagickFalse)
7268 if (event.xbutton.window == window_info->id)
7270 if (MatteIsActive(action_info,event.xbutton))
7272 if (*reply_info.text ==
'\0')
7273 (void) XBell(display,0);
7278 action_info.raised=MagickTrue;
7279 XDrawBeveledButton(display,window_info,&action_info);
7281 if (cancel_info.raised == MagickFalse)
7283 if (event.xbutton.window == window_info->id)
7284 if (MatteIsActive(cancel_info,event.xbutton))
7286 *reply_info.text=
'\0';
7289 cancel_info.raised=MagickTrue;
7290 XDrawBeveledButton(display,window_info,&cancel_info);
7292 if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
7301 if (event.xclient.message_type != windows->wm_protocols)
7303 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
7305 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
7306 (Time)
event.xclient.data.l[1]);
7309 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
7311 if (event.xclient.window == window_info->id)
7313 *reply_info.text=
'\0';
7319 case ConfigureNotify:
7324 if (event.xconfigure.window != window_info->id)
7326 if ((event.xconfigure.width == (
int) window_info->width) &&
7327 (
event.xconfigure.height == (int) window_info->height))
7329 window_info->width=(
unsigned int)
7330 MagickMax(event.xconfigure.width,(
int) window_info->min_width);
7331 window_info->height=(
unsigned int)
7332 MagickMax(event.xconfigure.height,(
int) window_info->min_height);
7333 state|=UpdateConfigurationState;
7338 if (event.xcrossing.window != window_info->id)
7340 state&=(~InactiveWidgetState);
7345 if (event.xexpose.window != window_info->id)
7347 if (event.xexpose.count != 0)
7349 state|=RedrawWidgetState;
7355 command[MaxTextExtent];
7366 if (event.xkey.window != window_info->id)
7368 length=XLookupString((XKeyEvent *) &event.xkey,command,
7369 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7370 *(command+length)=
'\0';
7371 if (AreaIsActive(scroll_info,event.xkey))
7376 switch ((
int) key_symbol)
7399 slider_info.id-=visible_entries;
7405 slider_info.id+=visible_entries;
7411 slider_info.id=(int) entries;
7415 state|=RedrawListState;
7418 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
7423 if (*reply_info.text ==
'\0')
7425 action_info.raised=MagickFalse;
7426 XDrawBeveledButton(display,window_info,&action_info);
7430 if (key_symbol == XK_Control_L)
7432 state|=ControlState;
7435 if (state & ControlState)
7436 switch ((
int) key_symbol)
7444 *reply_info.text=
'\0';
7445 reply_info.cursor=reply_info.text;
7446 reply_info.marker=reply_info.text;
7447 reply_info.highlight=MagickFalse;
7453 XEditText(display,&reply_info,key_symbol,command,state);
7454 XDrawMatteText(display,window_info,&reply_info);
7460 command[MaxTextExtent];
7468 if (event.xkey.window != window_info->id)
7470 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
7471 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
7472 if (key_symbol == XK_Control_L)
7473 state&=(~ControlState);
7478 if (event.xcrossing.window != window_info->id)
7480 state|=InactiveWidgetState;
7494 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7495 if (slider_info.active)
7500 slider_info.y=
event.xmotion.y-
7501 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
7502 if (slider_info.y < slider_info.min_y)
7503 slider_info.y=slider_info.min_y;
7504 if (slider_info.y > slider_info.max_y)
7505 slider_info.y=slider_info.max_y;
7507 if (slider_info.y != slider_info.min_y)
7508 slider_info.id=(int) ((entries*(slider_info.y-
7509 slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
7510 state|=RedrawListState;
7513 if (state & InactiveWidgetState)
7515 if (action_info.raised == MatteIsActive(action_info,event.xmotion))
7520 action_info.raised=action_info.raised == MagickFalse ?
7521 MagickTrue : MagickFalse;
7522 XDrawBeveledButton(display,window_info,&action_info);
7525 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
7530 cancel_info.raised=cancel_info.raised == MagickFalse ?
7531 MagickTrue : MagickFalse;
7532 XDrawBeveledButton(display,window_info,&cancel_info);
7537 case SelectionClear:
7539 reply_info.highlight=MagickFalse;
7540 XDrawMatteText(display,window_info,&reply_info);
7543 case SelectionNotify:
7561 if (event.xselection.property == (Atom) None)
7563 status=XGetWindowProperty(display,
7564 event.xselection.requestor,event.xselection.property,0L,2047L,
7565 MagickTrue,XA_STRING,&type,&format,&length,&after,&data);
7566 if ((status != Success) || (type != XA_STRING) || (format == 32) ||
7569 if ((Extent(reply_info.text)+length) >= (MaxTextExtent-1))
7570 (void) XBell(display,0);
7576 *(data+length)=
'\0';
7577 XEditText(display,&reply_info,(KeySym) XK_Insert,(
char *) data,
7579 XDrawMatteText(display,window_info,&reply_info);
7580 state|=RedrawActionState;
7582 (void) XFree((
void *) data);
7585 case SelectionRequest:
7590 XSelectionRequestEvent
7593 if (reply_info.highlight == MagickFalse)
7598 request=(&(
event.xselectionrequest));
7599 (void) XChangeProperty(request->display,request->requestor,
7600 request->property,request->target,8,PropModeReplace,
7601 (
unsigned char *) primary_selection,Extent(primary_selection));
7602 notify.type=SelectionNotify;
7603 notify.send_event=MagickTrue;
7604 notify.display=request->display;
7605 notify.requestor=request->requestor;
7606 notify.selection=request->selection;
7607 notify.target=request->target;
7608 notify.time=request->time;
7609 if (request->property == None)
7610 notify.property=request->target;
7612 notify.property=request->property;
7613 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
7614 (XEvent *) ¬ify);
7619 }
while ((state & ExitState) == 0);
7620 XSetCursorState(display,windows,MagickFalse);
7621 (void) XWithdrawWindow(display,window_info->id,window_info->screen);
7622 XCheckRefreshWindows(display,windows);
7663 MagickExport
int XMenuWidget(Display *display,XWindows *windows,
7664 const char *title,
const char *
const *selections,
char *item)
7690 XSetWindowAttributes
7704 assert(display != (Display *) NULL);
7705 assert(windows != (XWindows *) NULL);
7706 assert(title != (
char *) NULL);
7707 assert(selections != (
const char **) NULL);
7708 assert(item != (
char *) NULL);
7709 if (IsEventLogging() != MagickFalse)
7710 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",title);
7711 font_info=windows->widget.font_info;
7712 windows->widget.width=submenu_info.active == 0 ?
7713 WidgetTextWidth(font_info,(
char *) title) : 0;
7714 for (
id=0; selections[id] != (
char *) NULL;
id++)
7716 width=WidgetTextWidth(font_info,(
char *) selections[
id]);
7717 if (width > windows->widget.width)
7718 windows->widget.width=width;
7720 number_selections=(
unsigned int)
id;
7721 XGetWidgetInfo((
char *) NULL,&menu_info);
7722 title_height=(
unsigned int) (submenu_info.active == 0 ?
7723 (3*(font_info->descent+font_info->ascent) >> 1)+5 : 2);
7724 width=WidgetTextWidth(font_info,(
char *) title);
7725 height=(
unsigned int) ((3*(font_info->ascent+font_info->descent)) >> 1);
7729 windows->widget.width+=QuantumMargin+(menu_info.bevel_width << 1);
7730 top_offset=title_height+menu_info.bevel_width-1;
7731 windows->widget.height=top_offset+number_selections*height+4;
7732 windows->widget.min_width=windows->widget.width;
7733 windows->widget.min_height=windows->widget.height;
7734 XQueryPosition(display,windows->widget.root,&x,&y);
7735 windows->widget.x=x-(QuantumMargin >> 1);
7736 if (submenu_info.active != 0)
7739 windows->command.x+windows->command.width-QuantumMargin;
7740 toggle_info.raised=MagickTrue;
7741 XDrawTriangleEast(display,&windows->command,&toggle_info);
7743 windows->widget.y=submenu_info.active == 0 ? y-(int)
7744 ((3*title_height) >> 2) : y;
7745 if (submenu_info.active != 0)
7746 windows->widget.y=windows->command.y+submenu_info.y;
7747 XConstrainWindowPosition(display,&windows->widget);
7751 window_attributes.override_redirect=MagickTrue;
7752 (void) XChangeWindowAttributes(display,windows->widget.id,
7753 (
size_t) CWOverrideRedirect,&window_attributes);
7754 window_changes.width=(int) windows->widget.width;
7755 window_changes.height=(
int) windows->widget.height;
7756 window_changes.x=windows->widget.x;
7757 window_changes.y=windows->widget.y;
7758 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
7759 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
7760 (void) XMapRaised(display,windows->widget.id);
7761 windows->widget.mapped=MagickFalse;
7765 selection_info.height=height;
7766 cursor=XCreateFontCursor(display,XC_right_ptr);
7767 (void) XCheckDefineCursor(display,windows->image.id,cursor);
7768 (void) XCheckDefineCursor(display,windows->command.id,cursor);
7769 (void) XCheckDefineCursor(display,windows->widget.id,cursor);
7770 state=UpdateConfigurationState;
7773 if (state & UpdateConfigurationState)
7778 XGetWidgetInfo((
char *) NULL,&menu_info);
7779 menu_info.bevel_width--;
7780 menu_info.width=windows->widget.width-((menu_info.bevel_width) << 1);
7781 menu_info.height=windows->widget.height-((menu_info.bevel_width) << 1);
7782 menu_info.x=(int) menu_info.bevel_width;
7783 menu_info.y=(
int) menu_info.bevel_width;
7784 XGetWidgetInfo((
char *) NULL,&selection_info);
7785 selection_info.center=MagickFalse;
7786 selection_info.width=menu_info.width;
7787 selection_info.height=height;
7788 selection_info.x=menu_info.x;
7789 highlight_info=selection_info;
7790 highlight_info.bevel_width--;
7791 highlight_info.width-=(highlight_info.bevel_width << 1);
7792 highlight_info.height-=(highlight_info.bevel_width << 1);
7793 highlight_info.x+=highlight_info.bevel_width;
7794 state&=(~UpdateConfigurationState);
7796 if (state & RedrawWidgetState)
7801 if (submenu_info.active == 0)
7803 y=(int) title_height;
7804 XSetBevelColor(display,&windows->widget,MagickFalse);
7805 (void) XDrawLine(display,windows->widget.id,
7806 windows->widget.widget_context,selection_info.x,y-1,
7807 (
int) selection_info.width,y-1);
7808 XSetBevelColor(display,&windows->widget,MagickTrue);
7809 (void) XDrawLine(display,windows->widget.id,
7810 windows->widget.widget_context,selection_info.x,y,
7811 (
int) selection_info.width,y);
7812 (void) XSetFillStyle(display,windows->widget.widget_context,
7818 selection_info.center=MagickTrue;
7819 selection_info.y=(int) menu_info.bevel_width;
7820 selection_info.text=(
char *) title;
7821 if (submenu_info.active == 0)
7822 XDrawWidgetText(display,&windows->widget,&selection_info);
7823 selection_info.center=MagickFalse;
7824 selection_info.y=(int) top_offset;
7825 for (
id=0;
id < (int) number_selections;
id++)
7827 selection_info.text=(
char *) selections[
id];
7828 XDrawWidgetText(display,&windows->widget,&selection_info);
7829 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7830 if (
id == selection_info.id)
7831 XDrawBevel(display,&windows->widget,&highlight_info);
7832 selection_info.y+=(int) selection_info.height;
7834 XDrawBevel(display,&windows->widget,&menu_info);
7835 state&=(~RedrawWidgetState);
7837 if (number_selections > 2)
7842 y=(int) (top_offset+selection_info.height*(number_selections-1));
7843 XSetBevelColor(display,&windows->widget,MagickFalse);
7844 (void) XDrawLine(display,windows->widget.id,
7845 windows->widget.widget_context,selection_info.x,y-1,
7846 (
int) selection_info.width,y-1);
7847 XSetBevelColor(display,&windows->widget,MagickTrue);
7848 (void) XDrawLine(display,windows->widget.id,
7849 windows->widget.widget_context,selection_info.x,y,
7850 (
int) selection_info.width,y);
7851 (void) XSetFillStyle(display,windows->widget.widget_context,FillSolid);
7856 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
7861 if (event.xbutton.window != windows->widget.id)
7866 if (event.xbutton.window == windows->command.id)
7867 (void) XPutBackEvent(display,&event);
7868 selection_info.id=(~0);
7873 state&=(~InactiveWidgetState);
7874 if (selection_info.height == 0)
7876 id=(
event.xbutton.y-top_offset)/(
int) selection_info.height;
7877 selection_info.id=id;
7878 if ((
id < 0) || (
id >= (int) number_selections))
7883 selection_info.y=(int) (top_offset+
id*selection_info.height);
7884 selection_info.text=(
char *) selections[
id];
7885 XDrawWidgetText(display,&windows->widget,&selection_info);
7886 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7887 XDrawBevel(display,&windows->widget,&highlight_info);
7892 if (windows->widget.mapped == MagickFalse)
7894 if (event.xbutton.window == windows->command.id)
7895 if ((state & InactiveWidgetState) == 0)
7900 XSetCursorState(display,windows,MagickFalse);
7905 case ConfigureNotify:
7910 if (event.xconfigure.window != windows->widget.id)
7912 if ((event.xconfigure.width == (
int) windows->widget.width) &&
7913 (event.xconfigure.height == (
int) windows->widget.height))
7915 windows->widget.width=(
unsigned int)
7916 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
7917 windows->widget.height=(
unsigned int)
7918 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
7919 state|=UpdateConfigurationState;
7924 if (event.xcrossing.window != windows->widget.id)
7926 if (event.xcrossing.state == 0)
7928 state&=(~InactiveWidgetState);
7929 if (selection_info.height == 0)
7931 id=((
event.xcrossing.y-top_offset)/(
int) selection_info.height);
7932 if ((selection_info.id >= 0) &&
7933 (selection_info.id < (int) number_selections))
7938 if (
id == selection_info.id)
7940 selection_info.y=(int)
7941 (top_offset+selection_info.id*selection_info.height);
7942 selection_info.text=(
char *) selections[selection_info.id];
7943 XDrawWidgetText(display,&windows->widget,&selection_info);
7945 if ((
id < 0) || (
id >= (int) number_selections))
7950 selection_info.id=id;
7951 selection_info.y=(int)
7952 (top_offset+selection_info.id*selection_info.height);
7953 selection_info.text=(
char *) selections[selection_info.id];
7954 XDrawWidgetText(display,&windows->widget,&selection_info);
7955 highlight_info.y=selection_info.y+highlight_info.bevel_width;
7956 XDrawBevel(display,&windows->widget,&highlight_info);
7961 if (event.xexpose.window != windows->widget.id)
7963 if (event.xexpose.count != 0)
7965 state|=RedrawWidgetState;
7970 if (event.xcrossing.window != windows->widget.id)
7972 state|=InactiveWidgetState;
7973 id=selection_info.id;
7974 if ((
id < 0) || (
id >= (
int) number_selections))
7979 selection_info.y=(int) (top_offset+
id*selection_info.height);
7980 selection_info.id=(~0);
7981 selection_info.text=(
char *) selections[
id];
7982 XDrawWidgetText(display,&windows->widget,&selection_info);
7990 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
7991 if (submenu_info.active != 0)
7992 if (event.xmotion.window == windows->command.id)
7994 if ((state & InactiveWidgetState) == 0)
7996 if (MatteIsActive(submenu_info,event.xmotion) == MagickFalse)
7998 selection_info.id=(~0);
8005 if (WindowIsActive(windows->command,event.xmotion))
8007 selection_info.id=(~0);
8013 if (event.xmotion.window != windows->widget.id)
8015 if (state & InactiveWidgetState)
8017 if (selection_info.height == 0)
8019 id=(
event.xmotion.y-top_offset)/(
int) selection_info.height;
8020 if ((selection_info.id >= 0) &&
8021 (selection_info.id < (int) number_selections))
8026 if (
id == selection_info.id)
8028 selection_info.y=(int)
8029 (top_offset+selection_info.id*selection_info.height);
8030 selection_info.text=(
char *) selections[selection_info.id];
8031 XDrawWidgetText(display,&windows->widget,&selection_info);
8033 selection_info.id=id;
8034 if ((
id < 0) || (
id >= (int) number_selections))
8039 selection_info.y=(int) (top_offset+
id*selection_info.height);
8040 selection_info.text=(
char *) selections[
id];
8041 XDrawWidgetText(display,&windows->widget,&selection_info);
8042 highlight_info.y=selection_info.y+highlight_info.bevel_width;
8043 XDrawBevel(display,&windows->widget,&highlight_info);
8049 }
while ((state & ExitState) == 0);
8050 (void) XFreeCursor(display,cursor);
8051 window_attributes.override_redirect=MagickFalse;
8052 (void) XChangeWindowAttributes(display,windows->widget.id,
8053 (
size_t) CWOverrideRedirect,&window_attributes);
8054 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8055 XCheckRefreshWindows(display,windows);
8056 if (submenu_info.active != 0)
8058 submenu_info.active=MagickFalse;
8059 toggle_info.raised=MagickFalse;
8060 XDrawTriangleEast(display,&windows->command,&toggle_info);
8062 if ((selection_info.id < 0) || (selection_info.id >= (
int) number_selections))
8064 (void) CopyMagickString(item,selections[selection_info.id],MaxTextExtent);
8065 return(selection_info.id);
8100 MagickExport
void XNoticeWidget(Display *display,XWindows *windows,
8101 const char *reason,
const char *description)
8103 #define DismissButtonText "Dismiss"
8144 assert(display != (Display *) NULL);
8145 assert(windows != (XWindows *) NULL);
8146 assert(reason != (
char *) NULL);
8147 if (IsEventLogging() != MagickFalse)
8148 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",reason);
8149 XDelay(display,SuspendTime << 3);
8150 XSetCursorState(display,windows,MagickTrue);
8151 XCheckRefreshWindows(display,windows);
8152 font_info=windows->widget.font_info;
8153 width=WidgetTextWidth(font_info,DismissButtonText);
8154 text=GetLocaleExceptionMessage(XServerError,reason);
8155 if (text != (
char *) NULL)
8156 if (WidgetTextWidth(font_info,(
char *) text) > width)
8157 width=WidgetTextWidth(font_info,(
char *) text);
8158 if (description != (
char *) NULL)
8160 text=GetLocaleExceptionMessage(XServerError,description);
8161 if (text != (
char *) NULL)
8162 if (WidgetTextWidth(font_info,(
char *) text) > width)
8163 width=WidgetTextWidth(font_info,(
char *) text);
8165 height=(
unsigned int) (font_info->ascent+font_info->descent);
8169 windows->widget.width=width+4*QuantumMargin;
8170 windows->widget.min_width=width+QuantumMargin;
8171 if (windows->widget.width < windows->widget.min_width)
8172 windows->widget.width=windows->widget.min_width;
8173 windows->widget.height=(
unsigned int) (12*height);
8174 windows->widget.min_height=(
unsigned int) (7*height);
8175 if (windows->widget.height < windows->widget.min_height)
8176 windows->widget.height=windows->widget.min_height;
8177 XConstrainWindowPosition(display,&windows->widget);
8181 (void) CopyMagickString(windows->widget.name,
"Notice",MaxTextExtent);
8182 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
8183 if (status != False)
8185 XSetWMName(display,windows->widget.id,&window_name);
8186 XSetWMIconName(display,windows->widget.id,&window_name);
8187 (void) XFree((
void *) window_name.value);
8189 window_changes.width=(int) windows->widget.width;
8190 window_changes.height=(
int) windows->widget.height;
8191 window_changes.x=windows->widget.x;
8192 window_changes.y=windows->widget.y;
8193 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
8194 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
8195 (void) XMapRaised(display,windows->widget.id);
8196 windows->widget.mapped=MagickFalse;
8197 (void) XBell(display,0);
8201 timer=GetMagickTime()+Timeout;
8202 state=UpdateConfigurationState;
8205 if (GetMagickTime() > timer)
8207 if (state & UpdateConfigurationState)
8212 XGetWidgetInfo(DismissButtonText,&dismiss_info);
8213 dismiss_info.width=(
unsigned int) QuantumMargin+
8214 WidgetTextWidth(font_info,DismissButtonText);
8215 dismiss_info.height=(
unsigned int) ((3*height) >> 1);
8216 dismiss_info.x=(int)
8217 ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
8218 dismiss_info.y=(int)
8219 (windows->widget.height-(dismiss_info.height << 1));
8220 state&=(~UpdateConfigurationState);
8222 if (state & RedrawWidgetState)
8227 width=WidgetTextWidth(font_info,(
char *) reason);
8228 x=(int) ((windows->widget.width >> 1)-(width >> 1));
8229 y=(int) ((windows->widget.height >> 1)-(height << 1));
8230 (void) XDrawString(display,windows->widget.id,
8231 windows->widget.annotate_context,x,y,(
char *) reason,Extent(reason));
8232 if (description != (
char *) NULL)
8234 width=WidgetTextWidth(font_info,(
char *) description);
8235 x=(int) ((windows->widget.width >> 1)-(width >> 1));
8237 (void) XDrawString(display,windows->widget.id,
8238 windows->widget.annotate_context,x,y,(
char *) description,
8239 Extent(description));
8241 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8242 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
8243 state&=(~RedrawWidgetState);
8248 if (XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows) == MagickFalse)
8253 XDelay(display,SuspendTime << 2);
8260 if (MatteIsActive(dismiss_info,event.xbutton))
8265 dismiss_info.raised=MagickFalse;
8266 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8273 if (windows->widget.mapped == MagickFalse)
8275 if (dismiss_info.raised == MagickFalse)
8277 if (event.xbutton.window == windows->widget.id)
8278 if (MatteIsActive(dismiss_info,event.xbutton))
8280 dismiss_info.raised=MagickTrue;
8281 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8290 if (event.xclient.message_type != windows->wm_protocols)
8292 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
8294 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
8295 (Time)
event.xclient.data.l[1]);
8298 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
8300 if (event.xclient.window == windows->widget.id)
8307 case ConfigureNotify:
8312 if (event.xconfigure.window != windows->widget.id)
8314 if ((event.xconfigure.width == (
int) windows->widget.width) &&
8315 (
event.xconfigure.height == (int) windows->widget.height))
8317 windows->widget.width=(
unsigned int)
8318 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
8319 windows->widget.height=(
unsigned int)
8320 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
8321 state|=UpdateConfigurationState;
8326 if (event.xcrossing.window != windows->widget.id)
8328 state&=(~InactiveWidgetState);
8333 if (event.xexpose.window != windows->widget.id)
8335 if (event.xexpose.count != 0)
8337 state|=RedrawWidgetState;
8343 command[MaxTextExtent];
8351 if (event.xkey.window != windows->widget.id)
8353 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
8354 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
8355 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
8357 dismiss_info.raised=MagickFalse;
8358 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8366 if (event.xcrossing.window != windows->widget.id)
8368 state|=InactiveWidgetState;
8376 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
8377 if (state & InactiveWidgetState)
8379 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
8384 dismiss_info.raised=
8385 dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8386 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
8394 }
while ((state & ExitState) == 0);
8395 XSetCursorState(display,windows,MagickFalse);
8396 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8397 XCheckRefreshWindows(display,windows);
8430 MagickExport MagickBooleanType XPreferencesWidget(Display *display,
8431 XResourceInfo *resource_info,XWindows *windows)
8433 #define ApplyButtonText "Apply"
8434 #define CacheButtonText "%lu mega-bytes of memory in the undo edit cache "
8435 #define CancelButtonText "Cancel"
8436 #define NumberPreferences 8
8441 "display image centered on a backdrop",
8442 "confirm on program exit",
8443 "confirm on image edits",
8444 "correct image for display gamma",
8445 "display warning messages",
8446 "apply Floyd/Steinberg error diffusion to image",
8447 "use a shared colormap for colormapped X visuals",
8448 "display images as an X server pixmap"
8452 cache[MaxTextExtent];
8485 preferences_info[NumberPreferences];
8493 assert(display != (Display *) NULL);
8494 assert(resource_info != (XResourceInfo *) NULL);
8495 assert(windows != (XWindows *) NULL);
8496 if (IsEventLogging() != MagickFalse)
8497 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
8498 XCheckRefreshWindows(display,windows);
8499 font_info=windows->widget.font_info;
8500 text_width=WidgetTextWidth(font_info,CacheButtonText);
8501 for (i=0; i < NumberPreferences; i++)
8502 if (WidgetTextWidth(font_info,(
char *) Preferences[i]) > text_width)
8503 text_width=WidgetTextWidth(font_info,(
char *) Preferences[i]);
8504 width=WidgetTextWidth(font_info,ApplyButtonText);
8505 if (WidgetTextWidth(font_info,CancelButtonText) > width)
8506 width=WidgetTextWidth(font_info,CancelButtonText);
8507 width+=(
unsigned int) QuantumMargin;
8508 height=(
unsigned int) (font_info->ascent+font_info->descent);
8512 windows->widget.width=(
unsigned int) (MagickMax((
int) (width << 1),
8513 (
int) text_width)+6*QuantumMargin);
8514 windows->widget.min_width=(width << 1)+QuantumMargin;
8515 if (windows->widget.width < windows->widget.min_width)
8516 windows->widget.width=windows->widget.min_width;
8517 windows->widget.height=(
unsigned int)
8518 (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
8519 windows->widget.min_height=(
unsigned int)
8520 (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
8521 if (windows->widget.height < windows->widget.min_height)
8522 windows->widget.height=windows->widget.min_height;
8523 XConstrainWindowPosition(display,&windows->widget);
8527 (void) CopyMagickString(windows->widget.name,
"Preferences",MaxTextExtent);
8528 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
8529 if (status != False)
8531 XSetWMName(display,windows->widget.id,&window_name);
8532 XSetWMIconName(display,windows->widget.id,&window_name);
8533 (void) XFree((
void *) window_name.value);
8535 window_changes.width=(int) windows->widget.width;
8536 window_changes.height=(
int) windows->widget.height;
8537 window_changes.x=windows->widget.x;
8538 window_changes.y=windows->widget.y;
8539 (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
8540 (
unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
8541 (void) XMapRaised(display,windows->widget.id);
8542 windows->widget.mapped=MagickFalse;
8546 state=UpdateConfigurationState;
8547 XSetCursorState(display,windows,MagickTrue);
8550 if (state & UpdateConfigurationState)
8555 XGetWidgetInfo(CancelButtonText,&cancel_info);
8556 cancel_info.width=width;
8557 cancel_info.height=(
unsigned int) (3*height) >> 1;
8558 cancel_info.x=(int) windows->widget.width-cancel_info.width-
8559 (QuantumMargin << 1);
8560 cancel_info.y=(int) windows->widget.height-
8561 cancel_info.height-QuantumMargin;
8562 XGetWidgetInfo(ApplyButtonText,&apply_info);
8563 apply_info.width=width;
8564 apply_info.height=(
unsigned int) (3*height) >> 1;
8565 apply_info.x=QuantumMargin << 1;
8566 apply_info.y=cancel_info.y;
8567 y=(int) (height << 1);
8568 for (i=0; i < NumberPreferences; i++)
8570 XGetWidgetInfo(Preferences[i],&preferences_info[i]);
8571 preferences_info[i].bevel_width--;
8572 preferences_info[i].width=(
unsigned int) QuantumMargin >> 1;
8573 preferences_info[i].height=(
unsigned int) QuantumMargin >> 1;
8574 preferences_info[i].x=QuantumMargin << 1;
8575 preferences_info[i].y=y;
8576 y+=height+(QuantumMargin >> 1);
8578 preferences_info[0].raised=resource_info->backdrop ==
8579 MagickFalse ? MagickTrue : MagickFalse;
8580 preferences_info[1].raised=resource_info->confirm_exit ==
8581 MagickFalse ? MagickTrue : MagickFalse;
8582 preferences_info[2].raised=resource_info->confirm_edit ==
8583 MagickFalse ? MagickTrue : MagickFalse;
8584 preferences_info[3].raised=resource_info->gamma_correct ==
8585 MagickFalse ? MagickTrue : MagickFalse;
8586 preferences_info[4].raised=resource_info->display_warnings ==
8587 MagickFalse ? MagickTrue : MagickFalse;
8588 preferences_info[5].raised=resource_info->quantize_info->dither ==
8589 MagickFalse ? MagickTrue : MagickFalse;
8590 preferences_info[6].raised=resource_info->colormap !=
8591 SharedColormap ? MagickTrue : MagickFalse;
8592 preferences_info[7].raised=resource_info->use_pixmap ==
8593 MagickFalse ? MagickTrue : MagickFalse;
8594 (void) FormatLocaleString(cache,MaxTextExtent,CacheButtonText,
8595 (
unsigned long) resource_info->undo_cache);
8596 XGetWidgetInfo(cache,&cache_info);
8597 cache_info.bevel_width--;
8598 cache_info.width=(
unsigned int) QuantumMargin >> 1;
8599 cache_info.height=(
unsigned int) QuantumMargin >> 1;
8600 cache_info.x=QuantumMargin << 1;
8602 state&=(~UpdateConfigurationState);
8604 if (state & RedrawWidgetState)
8609 XDrawBeveledButton(display,&windows->widget,&apply_info);
8610 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8611 for (i=0; i < NumberPreferences; i++)
8612 XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
8613 XDrawTriangleEast(display,&windows->widget,&cache_info);
8614 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
8615 state&=(~RedrawWidgetState);
8620 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
8625 if (MatteIsActive(apply_info,event.xbutton))
8630 apply_info.raised=MagickFalse;
8631 XDrawBeveledButton(display,&windows->widget,&apply_info);
8634 if (MatteIsActive(cancel_info,event.xbutton))
8639 cancel_info.raised=MagickFalse;
8640 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8643 for (i=0; i < NumberPreferences; i++)
8644 if (MatteIsActive(preferences_info[i],event.xbutton))
8649 preferences_info[i].raised=preferences_info[i].raised ==
8650 MagickFalse ? MagickTrue : MagickFalse;
8651 XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
8654 if (MatteIsActive(cache_info,event.xbutton))
8659 x=cache_info.x+cache_info.width+cache_info.bevel_width+
8660 (QuantumMargin >> 1);
8661 y=cache_info.y+((cache_info.height-height) >> 1);
8662 width=WidgetTextWidth(font_info,cache);
8663 (void) XClearArea(display,windows->widget.id,x,y,width,height,
8665 resource_info->undo_cache<<=1;
8666 if (resource_info->undo_cache > 256)
8667 resource_info->undo_cache=1;
8668 (void) FormatLocaleString(cache,MaxTextExtent,CacheButtonText,
8669 (
unsigned long) resource_info->undo_cache);
8670 cache_info.raised=MagickFalse;
8671 XDrawTriangleEast(display,&windows->widget,&cache_info);
8678 if (windows->widget.mapped == MagickFalse)
8680 if (apply_info.raised == MagickFalse)
8682 if (event.xbutton.window == windows->widget.id)
8683 if (MatteIsActive(apply_info,event.xbutton))
8685 apply_info.raised=MagickTrue;
8686 XDrawBeveledButton(display,&windows->widget,&apply_info);
8687 apply_info.raised=MagickFalse;
8689 if (cancel_info.raised == MagickFalse)
8691 if (event.xbutton.window == windows->widget.id)
8692 if (MatteIsActive(cancel_info,event.xbutton))
8694 cancel_info.raised=MagickTrue;
8695 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8697 if (cache_info.raised == MagickFalse)
8699 cache_info.raised=MagickTrue;
8700 XDrawTriangleEast(display,&windows->widget,&cache_info);
8709 if (event.xclient.message_type != windows->wm_protocols)
8711 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
8713 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
8714 (Time)
event.xclient.data.l[1]);
8717 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
8719 if (event.xclient.window == windows->widget.id)
8726 case ConfigureNotify:
8731 if (event.xconfigure.window != windows->widget.id)
8733 if ((event.xconfigure.width == (
int) windows->widget.width) &&
8734 (
event.xconfigure.height == (int) windows->widget.height))
8736 windows->widget.width=(
unsigned int)
8737 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
8738 windows->widget.height=(
unsigned int)
8739 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
8740 state|=UpdateConfigurationState;
8745 if (event.xcrossing.window != windows->widget.id)
8747 state&=(~InactiveWidgetState);
8752 if (event.xexpose.window != windows->widget.id)
8754 if (event.xexpose.count != 0)
8756 state|=RedrawWidgetState;
8762 command[MaxTextExtent];
8770 if (event.xkey.window != windows->widget.id)
8772 (void) XLookupString((XKeyEvent *) &
event.xkey,command,
8773 (int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
8774 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
8776 apply_info.raised=MagickFalse;
8777 XDrawBeveledButton(display,&windows->widget,&apply_info);
8785 if (event.xcrossing.window != windows->widget.id)
8787 state|=InactiveWidgetState;
8795 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
8796 if (state & InactiveWidgetState)
8798 if (apply_info.raised == MatteIsActive(apply_info,event.xmotion))
8804 apply_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8805 XDrawBeveledButton(display,&windows->widget,&apply_info);
8808 if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
8814 cancel_info.raised == MagickFalse ? MagickTrue : MagickFalse;
8815 XDrawBeveledButton(display,&windows->widget,&cancel_info);
8823 }
while ((state & ExitState) == 0);
8824 XSetCursorState(display,windows,MagickFalse);
8825 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
8826 XCheckRefreshWindows(display,windows);
8827 if (apply_info.raised)
8828 return(MagickFalse);
8832 resource_info->backdrop=
8833 preferences_info[0].raised == MagickFalse ? MagickTrue : MagickFalse;
8834 resource_info->confirm_exit=
8835 preferences_info[1].raised == MagickFalse ? MagickTrue : MagickFalse;
8836 resource_info->confirm_edit=
8837 preferences_info[2].raised == MagickFalse ? MagickTrue : MagickFalse;
8838 resource_info->gamma_correct=
8839 preferences_info[3].raised == MagickFalse ? MagickTrue : MagickFalse;
8840 resource_info->display_warnings=
8841 preferences_info[4].raised == MagickFalse ? MagickTrue : MagickFalse;
8842 resource_info->quantize_info->dither=
8843 preferences_info[5].raised == MagickFalse ? MagickTrue : MagickFalse;
8844 resource_info->colormap=SharedColormap;
8845 if (preferences_info[6].raised)
8846 resource_info->colormap=PrivateColormap;
8847 resource_info->use_pixmap=
8848 preferences_info[7].raised == MagickFalse ? MagickTrue : MagickFalse;
8849 XUserPreferences(resource_info);
8889 MagickExport
void XProgressMonitorWidget(Display *display,XWindows *windows,
8890 const char *task,
const MagickOffsetType offset,
const MagickSizeType span)
8898 assert(display != (Display *) NULL);
8899 assert(windows != (XWindows *) NULL);
8900 assert(task != (
const char *) NULL);
8901 if (IsEventLogging() != MagickFalse)
8902 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",task);
8908 while (XCheckTypedWindowEvent(display,windows->command.id,Expose,&event))
8909 (
void) XCommandWidget(display,windows,(
const char *
const *) NULL,&event);
8910 while (XCheckTypedWindowEvent(display,windows->image.id,Expose,&event))
8911 XRefreshWindow(display,&windows->image,&event);
8912 while (XCheckTypedWindowEvent(display,windows->info.id,Expose,&event))
8913 if (monitor_info.text != (
char *) NULL)
8914 XInfoWidget(display,windows,monitor_info.text);
8918 if ((windows->info.mapped == MagickFalse) || (task != monitor_info.text))
8919 XInfoWidget(display,windows,task);
8920 width=(
unsigned int) (((offset+1)*(windows->info.width-
8921 (2*monitor_info.x)))/span);
8922 if (width < monitor_info.width)
8924 monitor_info.raised=MagickTrue;
8925 XDrawWidgetText(display,&windows->info,&monitor_info);
8926 monitor_info.raised=MagickFalse;
8928 monitor_info.width=width;
8929 XDrawWidgetText(display,&windows->info,&monitor_info);
8930 (void) XFlush(display);
8969 MagickExport
void XTextViewWidget(Display *display,
8970 const XResourceInfo *resource_info,XWindows *windows,
8971 const MagickBooleanType mono,
const char *title,
const char **textlist)
8973 #define DismissButtonText "Dismiss"
8976 primary_selection[MaxTextExtent];
8981 static MagickStatusType
8982 mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
9024 assert(display != (Display *) NULL);
9025 assert(resource_info != (XResourceInfo *) NULL);
9026 assert(windows != (XWindows *) NULL);
9027 assert(title != (
const char *) NULL);
9028 assert(textlist != (
const char **) NULL);
9029 if (IsEventLogging() != MagickFalse)
9030 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",title);
9031 XSetCursorState(display,windows,MagickTrue);
9032 XCheckRefreshWindows(display,windows);
9033 if (textlist == (
const char **) NULL)
9035 XNoticeWidget(display,windows,
"No text to view:",(
char *) NULL);
9041 font_info=windows->widget.font_info;
9042 text_info=(XFontStruct *) NULL;
9043 if (mono != MagickFalse)
9044 text_info=XBestFont(display,resource_info,MagickTrue);
9045 if (text_info == (XFontStruct *) NULL)
9046 text_info=windows->widget.font_info;
9048 for (i=0; textlist[i] != (
char *) NULL; i++)
9049 if (WidgetTextWidth(text_info,(
char *) textlist[i]) > text_width)
9050 text_width=(
unsigned int) XTextWidth(text_info,(
char *) textlist[i],
9051 MagickMin(Extent(textlist[i]),160));
9052 lines=(
unsigned int) i;
9053 width=WidgetTextWidth(font_info,DismissButtonText);
9054 width+=QuantumMargin;
9055 height=(
unsigned int) (text_info->ascent+text_info->descent);
9059 windows->widget.width=(
unsigned int) (MagickMin((
int) text_width,
9060 (int) MaxTextWidth)+5*QuantumMargin);
9061 windows->widget.min_width=(
unsigned int) (MinTextWidth+4*QuantumMargin);
9062 if (windows->widget.width < windows->widget.min_width)
9063 windows->widget.width=windows->widget.min_width;
9064 windows->widget.height=(
unsigned int) (MagickMin(MagickMax((
int) lines,3),32)*
9065 height+((13*height) >> 1)+((9*QuantumMargin) >> 1));
9066 windows->widget.min_height=(
unsigned int) (3*height+((13*height) >> 1)+((9*
9067 QuantumMargin) >> 1));
9068 if (windows->widget.height < windows->widget.min_height)
9069 windows->widget.height=windows->widget.min_height;
9070 XConstrainWindowPosition(display,&windows->widget);
9074 (void) CopyMagickString(windows->widget.name,title,MaxTextExtent);
9075 status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
9076 if (status != False)
9078 XSetWMName(display,windows->widget.id,&window_name);
9079 XSetWMIconName(display,windows->widget.id,&window_name);
9080 (void) XFree((
void *) window_name.value);
9082 window_changes.width=(int) windows->widget.width;
9083 window_changes.height=(
int) windows->widget.height;
9084 window_changes.x=windows->widget.x;
9085 window_changes.y=windows->widget.y;
9086 (void) XReconfigureWMWindow(display,windows->widget.id,
9087 windows->widget.screen,(
unsigned int) mask,&window_changes);
9088 (void) XMapRaised(display,windows->widget.id);
9089 windows->widget.mapped=MagickFalse;
9093 XGetWidgetInfo((
char *) NULL,&slider_info);
9094 XGetWidgetInfo((
char *) NULL,&north_info);
9095 XGetWidgetInfo((
char *) NULL,&south_info);
9096 XGetWidgetInfo((
char *) NULL,&expose_info);
9097 XGetWidgetInfo((
char *) NULL,&selection_info);
9099 delay=SuspendTime << 2;
9100 height=(
unsigned int) (font_info->ascent+font_info->descent);
9101 state=UpdateConfigurationState;
9104 if (state & UpdateConfigurationState)
9112 XGetWidgetInfo(DismissButtonText,&dismiss_info);
9113 dismiss_info.width=width;
9114 dismiss_info.height=(
unsigned int) ((3*height) >> 1);
9115 dismiss_info.x=(int) windows->widget.width-dismiss_info.width-
9117 dismiss_info.y=(
int) windows->widget.height-dismiss_info.height-
9122 XGetWidgetInfo((
char *) NULL,&scroll_info);
9123 scroll_info.bevel_width--;
9124 scroll_info.width=height;
9125 scroll_info.height=(
unsigned int) (dismiss_info.y-((5*QuantumMargin) >>
9127 scroll_info.x=(int) windows->widget.width-QuantumMargin-
9129 scroll_info.y=(3*QuantumMargin) >> 1;
9130 scroll_info.raised=MagickFalse;
9131 scroll_info.trough=MagickTrue;
9132 north_info=scroll_info;
9133 north_info.raised=MagickTrue;
9134 north_info.width-=(north_info.bevel_width << 1);
9135 north_info.height=north_info.width-1;
9136 north_info.x+=north_info.bevel_width;
9137 north_info.y+=north_info.bevel_width;
9138 south_info=north_info;
9139 south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
9142 slider_info=north_info;
9144 slider_info.width-=2;
9145 slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
9146 slider_info.bevel_width+2;
9147 slider_info.height=scroll_info.height-((slider_info.min_y-
9148 scroll_info.y+1) << 1)+4;
9149 visible_lines=(
unsigned int) (scroll_info.height*PerceptibleReciprocal(
9150 (
double) text_info->ascent+text_info->descent+((text_info->ascent+
9151 text_info->descent) >> 3)));
9152 if (lines > visible_lines)
9153 slider_info.height=(
unsigned int) (visible_lines*slider_info.height)/
9155 slider_info.max_y=south_info.y-south_info.bevel_width-
9156 slider_info.bevel_width-2;
9157 slider_info.x=scroll_info.x+slider_info.bevel_width+1;
9158 slider_info.y=slider_info.min_y;
9159 expose_info=scroll_info;
9160 expose_info.y=slider_info.y;
9164 XGetWidgetInfo((
char *) NULL,&list_info);
9165 list_info.raised=MagickFalse;
9166 list_info.bevel_width--;
9167 list_info.width=(
unsigned int) scroll_info.x-((3*QuantumMargin) >> 1);
9168 list_info.height=scroll_info.height;
9169 list_info.x=QuantumMargin;
9170 list_info.y=scroll_info.y;
9174 XGetWidgetInfo((
char *) NULL,&selection_info);
9175 selection_info.center=MagickFalse;
9176 selection_info.width=list_info.width;
9177 selection_info.height=(
unsigned int)
9178 (9*(text_info->ascent+text_info->descent)) >> 3;
9179 selection_info.x=list_info.x;
9180 state&=(~UpdateConfigurationState);
9182 if (state & RedrawWidgetState)
9187 XDrawBeveledMatte(display,&windows->widget,&list_info);
9188 XDrawBeveledMatte(display,&windows->widget,&scroll_info);
9189 XDrawTriangleNorth(display,&windows->widget,&north_info);
9190 XDrawBeveledButton(display,&windows->widget,&slider_info);
9191 XDrawTriangleSouth(display,&windows->widget,&south_info);
9192 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9193 XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
9194 selection_info.id=(~0);
9195 state|=RedrawListState;
9196 state&=(~RedrawWidgetState);
9198 if (state & RedrawListState)
9203 if (slider_info.id >= (
int) (lines-visible_lines))
9204 slider_info.id=(int) lines-visible_lines;
9205 if ((slider_info.id < 0) || (lines <= visible_lines))
9207 slider_info.y=slider_info.min_y;
9210 slider_info.id*(slider_info.max_y-slider_info.min_y+1)/lines;
9211 if (slider_info.id != selection_info.id)
9216 windows->widget.font_info=text_info;
9217 (void) XSetFont(display,windows->widget.annotate_context,
9219 (void) XSetFont(display,windows->widget.highlight_context,
9221 selection_info.id=slider_info.id;
9222 selection_info.y=list_info.y+(height >> 3)+2;
9223 for (i=0; i < (int) visible_lines; i++)
9225 selection_info.raised=
9226 (slider_info.id+i) != list_info.id ? MagickTrue : MagickFalse;
9227 selection_info.text=(
char *) NULL;
9228 if ((slider_info.id+i) < (int) lines)
9229 selection_info.text=(
char *) textlist[slider_info.id+i];
9230 XDrawWidgetText(display,&windows->widget,&selection_info);
9231 selection_info.y+=(int) selection_info.height;
9233 windows->widget.font_info=font_info;
9234 (void) XSetFont(display,windows->widget.annotate_context,
9236 (void) XSetFont(display,windows->widget.highlight_context,
9241 if (slider_info.y > expose_info.y)
9243 expose_info.height=(
unsigned int) slider_info.y-expose_info.y;
9244 expose_info.y=slider_info.y-expose_info.height-
9245 slider_info.bevel_width-1;
9249 expose_info.height=(
unsigned int) expose_info.y-slider_info.y;
9250 expose_info.y=slider_info.y+slider_info.height+
9251 slider_info.bevel_width+1;
9253 XDrawTriangleNorth(display,&windows->widget,&north_info);
9254 XDrawMatte(display,&windows->widget,&expose_info);
9255 XDrawBeveledButton(display,&windows->widget,&slider_info);
9256 XDrawTriangleSouth(display,&windows->widget,&south_info);
9257 expose_info.y=slider_info.y;
9259 state&=(~RedrawListState);
9264 if (north_info.raised && south_info.raised)
9265 (void) XIfEvent(display,&event,XScreenEvent,(
char *) windows);
9271 XDelay(display,delay);
9273 (void) XCheckIfEvent(display,&event,XScreenEvent,(
char *) windows);
9274 if (north_info.raised == MagickFalse)
9275 if (slider_info.id > 0)
9281 state|=RedrawListState;
9283 if (south_info.raised == MagickFalse)
9284 if (slider_info.id < (
int) lines)
9290 state|=RedrawListState;
9292 if (event.type != ButtonRelease)
9299 if (MatteIsActive(slider_info,event.xbutton))
9304 slider_info.active=MagickTrue;
9307 if (MatteIsActive(north_info,event.xbutton))
9308 if (slider_info.id > 0)
9313 north_info.raised=MagickFalse;
9315 state|=RedrawListState;
9318 if (MatteIsActive(south_info,event.xbutton))
9319 if (slider_info.id < (
int) lines)
9324 south_info.raised=MagickFalse;
9326 state|=RedrawListState;
9329 if (MatteIsActive(scroll_info,event.xbutton))
9334 if (event.xbutton.y < slider_info.y)
9335 slider_info.id-=(visible_lines-1);
9337 slider_info.id+=(visible_lines-1);
9338 state|=RedrawListState;
9341 if (MatteIsActive(dismiss_info,event.xbutton))
9346 dismiss_info.raised=MagickFalse;
9347 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9350 if (MatteIsActive(list_info,event.xbutton))
9361 id=slider_info.id+(
event.xbutton.y-(list_info.y+(height >> 1))+1)/
9362 selection_info.height;
9363 if (
id >= (
int) lines)
9365 if (
id != list_info.id)
9368 click_time=
event.xbutton.time;
9372 if (event.xbutton.time >= (click_time+DoubleClick))
9374 click_time=
event.xbutton.time;
9377 click_time=
event.xbutton.time;
9381 (void) CopyMagickString(primary_selection,textlist[list_info.id],
9383 (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
9384 event.xbutton.time);
9385 if (XGetSelectionOwner(display,XA_PRIMARY) != windows->widget.id)
9387 selection_info.id=(~0);
9389 state|=RedrawListState;
9396 if (windows->widget.mapped == MagickFalse)
9398 if (north_info.raised == MagickFalse)
9403 delay=SuspendTime << 2;
9404 north_info.raised=MagickTrue;
9405 XDrawTriangleNorth(display,&windows->widget,&north_info);
9407 if (south_info.raised == MagickFalse)
9412 delay=SuspendTime << 2;
9413 south_info.raised=MagickTrue;
9414 XDrawTriangleSouth(display,&windows->widget,&south_info);
9416 if (slider_info.active)
9421 slider_info.active=MagickFalse;
9424 if (dismiss_info.raised == MagickFalse)
9426 if (event.xbutton.window == windows->widget.id)
9427 if (MatteIsActive(dismiss_info,event.xbutton))
9429 dismiss_info.raised=MagickTrue;
9430 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9439 if (event.xclient.message_type != windows->wm_protocols)
9441 if (*event.xclient.data.l == (
int) windows->wm_take_focus)
9443 (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
9444 (Time)
event.xclient.data.l[1]);
9447 if (*event.xclient.data.l != (
int) windows->wm_delete_window)
9449 if (event.xclient.window == windows->widget.id)
9456 case ConfigureNotify:
9461 if (event.xconfigure.window != windows->widget.id)
9463 if ((event.xconfigure.width == (
int) windows->widget.width) &&
9464 (
event.xconfigure.height == (int) windows->widget.height))
9466 windows->widget.width=(
unsigned int)
9467 MagickMax(event.xconfigure.width,(
int) windows->widget.min_width);
9468 windows->widget.height=(
unsigned int)
9469 MagickMax(event.xconfigure.height,(
int) windows->widget.min_height);
9470 state|=UpdateConfigurationState;
9475 if (event.xcrossing.window != windows->widget.id)
9477 state&=(~InactiveWidgetState);
9482 if (event.xexpose.window != windows->widget.id)
9484 if (event.xexpose.count != 0)
9486 state|=RedrawWidgetState;
9492 command[MaxTextExtent];
9503 if (event.xkey.window != windows->widget.id)
9505 length=XLookupString((XKeyEvent *) &event.xkey,command,
9506 (
int)
sizeof(command),&key_symbol,(XComposeStatus *) NULL);
9507 *(command+length)=
'\0';
9508 if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
9510 dismiss_info.raised=MagickFalse;
9511 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9515 if (AreaIsActive(scroll_info,event.xkey))
9520 switch ((
int) key_symbol)
9543 slider_info.id-=visible_lines;
9549 slider_info.id+=visible_lines;
9555 slider_info.id=(int) lines;
9559 state|=RedrawListState;
9568 if (event.xcrossing.window != windows->widget.id)
9570 state|=InactiveWidgetState;
9584 while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
9585 if (slider_info.active)
9590 slider_info.y=
event.xmotion.y-
9591 ((slider_info.height+slider_info.bevel_width) >> 1)+1;
9592 if (slider_info.y < slider_info.min_y)
9593 slider_info.y=slider_info.min_y;
9594 if (slider_info.y > slider_info.max_y)
9595 slider_info.y=slider_info.max_y;
9597 if (slider_info.y != slider_info.min_y)
9598 slider_info.id=(int) (lines*(slider_info.y-slider_info.min_y+1))/
9599 (slider_info.max_y-slider_info.min_y+1);
9600 state|=RedrawListState;
9603 if (state & InactiveWidgetState)
9605 if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
9610 dismiss_info.raised=
9611 dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
9612 XDrawBeveledButton(display,&windows->widget,&dismiss_info);
9617 case SelectionClear:
9620 selection_info.id=(~0);
9621 state|=RedrawListState;
9624 case SelectionRequest:
9629 XSelectionRequestEvent
9632 if (list_info.id == (~0))
9637 request=(&(
event.xselectionrequest));
9638 (void) XChangeProperty(request->display,request->requestor,
9639 request->property,request->target,8,PropModeReplace,
9640 (
unsigned char *) primary_selection,Extent(primary_selection));
9641 notify.type=SelectionNotify;
9642 notify.send_event=MagickTrue;
9643 notify.display=request->display;
9644 notify.requestor=request->requestor;
9645 notify.selection=request->selection;
9646 notify.target=request->target;
9647 notify.time=request->time;
9648 if (request->property == None)
9649 notify.property=request->target;
9651 notify.property=request->property;
9652 (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
9653 (XEvent *) ¬ify);
9658 }
while ((state & ExitState) == 0);
9659 if (text_info != windows->widget.font_info)
9660 (void) XFreeFont(display,text_info);
9661 XSetCursorState(display,windows,MagickFalse);
9662 (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
9663 XCheckRefreshWindows(display,windows);