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