13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  W   W  IIIII  DDDD    GGGG  EEEEE  TTTTT                   %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  W   W    I    D   D  G      E        T                     %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  W W W    I    D   D  G  GG  EEE      T                     %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  WW WW    I    D   D  G   G  E        T                     %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  W   W  IIIII  DDDD    GGGG  EEEEE    T                     %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                   MagickCore X11 User Interface Methods                     %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
17de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              September 1993                                 %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
217ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/token.h"
537832dc2d904c471770087cce18a9a2d76c2216a3cristy#include "MagickCore/token-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
55d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/utility-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/xwindow-private.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/widget.h"
58bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristy#include "MagickCore/widget-private.h"
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_X11_DELEGATE)
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Define declarations.
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define AreaIsActive(matte_info,position)  ( \
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ((position.y >= (int) (matte_info.y-matte_info.bevel_width)) &&  \
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   ? MagickTrue : MagickFalse)
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define Extent(s)  ((int) strlen(s))
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MatteIsActive(matte_info,position)  ( \
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ((position.x >= (int) (matte_info.x-matte_info.bevel_width)) && \
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (position.y >= (int) (matte_info.y-matte_info.bevel_width)) &&  \
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (position.x < (int) (matte_info.x+matte_info.width+matte_info.bevel_width)) &&  \
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (position.y < (int) (matte_info.y+matte_info.height+matte_info.bevel_width))) \
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   ? MagickTrue : MagickFalse)
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MaxTextWidth  ((unsigned int) (255*XTextWidth(font_info,"_",1)))
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MinTextWidth  (26*XTextWidth(font_info,"_",1))
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QuantumMargin   MagickMax(font_info->max_bounds.width,12)
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define WidgetTextWidth(font_info,text)  \
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ((unsigned int) XTextWidth(font_info,text,Extent(text)))
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define WindowIsActive(window_info,position)  ( \
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ((position.x >= 0) && (position.y >= 0) &&  \
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (position.x < (int) window_info.width) &&  \
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   (position.y < (int) window_info.height)) ? MagickTrue : MagickFalse)
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Enum declarations.
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef enum
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ControlState = 0x0001,
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  InactiveWidgetState = 0x0004,
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  JumpListState = 0x0008,
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RedrawActionState = 0x0010,
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RedrawListState = 0x0020,
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RedrawWidgetState = 0x0040,
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  UpdateListState = 0x0100
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} WidgetState;
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _XWidgetInfo
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *cursor,
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text,
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *marker;
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id;
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bevel_width,
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width,
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height;
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y,
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    min_y,
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    max_y;
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickStatusType
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    raised,
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    active,
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    center,
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    trough,
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    highlight;
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} XWidgetInfo;
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Variable declarations.
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic XWidgetInfo
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info =
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL, (char *) NULL, (char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  },
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  submenu_info =
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL, (char *) NULL, (char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  },
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *selection_info = (XWidgetInfo *) NULL,
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  toggle_info =
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (char *) NULL, (char *) NULL, (char *) NULL, 0, 0, 0, 0, 0, 0, 0, 0,
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickFalse, MagickFalse, MagickFalse, MagickFalse, MagickFalse
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Constant declarations.
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const int
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  BorderOffset = 4,
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DoubleClick = 250;
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Method prototypes.
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawMatte(Display *,const XWindowInfo *,const XWidgetInfo *),
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(Display *,const XWindowInfo *,const MagickStatusType),
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetMatteColor(Display *,const XWindowInfo *,const MagickStatusType),
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetTextColor(Display *,const XWindowInfo *,const MagickStatusType);
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y X W i d g e t                                               %
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyXWidget() destroys resources associated with the X widget.
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyXWidget method is:
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void DestroyXWidget()
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
189bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void DestroyXWidget(void)
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (selection_info != (XWidgetInfo *) NULL)
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w B e v e l                                                       %
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawBevel() "sets off" an area with a highlighted upper and left bevel and
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a shadowed lower and right bevel.  The highlighted and shadowed bevels
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  create a 3-D effect.
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawBevel function is:
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawBevel(display,window_info,bevel_info)
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o bevel_info: Specifies a pointer to a XWidgetInfo structure.  It
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the bevel.
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawBevel(Display *display,const XWindowInfo *window_info,
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *bevel_info)
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x1,
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x2,
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y1,
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y2;
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bevel_width;
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XPoint
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points[6];
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw upper and left beveled border.
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x1=bevel_info->x;
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y1=bevel_info->y+bevel_info->height;
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x2=bevel_info->x+bevel_info->width;
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y2=bevel_info->y;
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bevel_width=bevel_info->bevel_width;
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x1;
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x2;
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y2;
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x2+bevel_width;
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y2-bevel_width;
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[4].x=x1-bevel_width;
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[4].y=y2-bevel_width;
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[5].x=x1-bevel_width;
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[5].y=y1+bevel_width;
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,bevel_info->raised);
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,6,Complex,CoordModeOrigin);
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw lower and right beveled border.
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y1;
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x2;
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y2;
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x2+bevel_width;
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y2-bevel_width;
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[4].x=x2+bevel_width;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[4].y=y1+bevel_width;
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[5].x=x1-bevel_width;
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[5].y=y1+bevel_width;
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,!bevel_info->raised);
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,6,Complex,CoordModeOrigin);
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w B e v e l e d B u t t o n                                       %
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawBeveledButton() draws a button with a highlighted upper and left bevel
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and a shadowed lower and right bevel.  The highlighted and shadowed bevels
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  create a 3-D effect.
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawBeveledButton function is:
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawBeveledButton(display,window_info,button_info)
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o button_info: Specifies a pointer to a XWidgetInfo structure.  It
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the button.
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawBeveledButton(Display *display,const XWindowInfo *window_info,
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *button_info)
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XRectangle
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw matte.
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawBevel(display,window_info,button_info);
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetMatteColor(display,window_info,button_info->raised);
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillRectangle(display,window_info->id,window_info->widget_context,
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    button_info->x,button_info->y,button_info->width,button_info->height);
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=button_info->x-button_info->bevel_width-1;
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=button_info->y-button_info->bevel_width-1;
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetForeground(display,window_info->widget_context,
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->pixel_info->trough_color.pixel);
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (button_info->raised || (window_info->depth == 1))
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x,y,button_info->width+(button_info->bevel_width << 1)+1,
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      button_info->height+(button_info->bevel_width << 1)+1);
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (button_info->text == (char *) NULL)
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set cropping region.
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.width=(unsigned short) button_info->width;
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.height=(unsigned short) button_info->height;
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x=button_info->x;
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y=button_info->y;
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw text.
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=window_info->font_info;
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,button_info->text);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=button_info->x+(QuantumMargin >> 1);
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (button_info->center)
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=button_info->x+(button_info->width >> 1)-(width >> 1);
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=button_info->y+((button_info->height-
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((int) button_info->width == (QuantumMargin >> 1))
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Option button-- write label to right of button.
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetTextColor(display,window_info,MagickTrue);
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x=button_info->x+button_info->width+button_info->bevel_width+
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (QuantumMargin >> 1);
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawString(display,window_info->id,window_info->widget_context,
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x,y,button_info->text,Extent(button_info->text));
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetClipRectangles(display,window_info->widget_context,0,0,&crop_info,
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    1,Unsorted);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetTextColor(display,window_info,button_info->raised);
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawString(display,window_info->id,window_info->widget_context,x,y,
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    button_info->text,Extent(button_info->text));
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetClipMask(display,window_info->widget_context,None);
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (button_info->raised == MagickFalse)
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XDelay(display,SuspendTime << 2);
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w B e v e l e d M a t t e                                         %
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawBeveledMatte() draws a matte with a shadowed upper and left bevel and
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a highlighted lower and right bevel.  The highlighted and shadowed bevels
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  create a 3-D effect.
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawBeveledMatte function is:
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawBeveledMatte(display,window_info,matte_info)
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o matte_info: Specifies a pointer to a XWidgetInfo structure.  It
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the matte.
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawBeveledMatte(Display *display,const XWindowInfo *window_info,
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *matte_info)
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw matte.
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawBevel(display,window_info,matte_info);
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawMatte(display,window_info,matte_info);
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w M a t t e                                                       %
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawMatte() fills a rectangular area with the matte color.
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawMatte function is:
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawMatte(display,window_info,matte_info)
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o matte_info: Specifies a pointer to a XWidgetInfo structure.  It
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the matte.
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawMatte(Display *display,const XWindowInfo *window_info,
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *matte_info)
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw matte.
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((matte_info->trough == MagickFalse) || (window_info->depth == 1))
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFillRectangle(display,window_info->id,
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->highlight_context,matte_info->x,matte_info->y,
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      matte_info->width,matte_info->height);
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetForeground(display,window_info->widget_context,
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->pixel_info->trough_color.pixel);
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillRectangle(display,window_info->id,window_info->widget_context,
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        matte_info->x,matte_info->y,matte_info->width,matte_info->height);
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w M a t t e T e x t                                               %
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawMatteText() draws a matte with text.  If the text exceeds the extents
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  of the text, a portion of the text relative to the cursor is displayed.
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawMatteText function is:
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawMatteText(display,window_info,text_info)
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text_info: Specifies a pointer to a XWidgetInfo structure.  It
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the text.
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawMatteText(Display *display,const XWindowInfo *window_info,
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo *text_info)
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text;
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    n,
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XRectangle
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Clear the text area.
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetMatteColor(display,window_info,MagickFalse);
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillRectangle(display,window_info->id,window_info->widget_context,
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info->x,text_info->y,text_info->width,text_info->height);
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->text == (char *) NULL)
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetTextColor(display,window_info,text_info->highlight);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=window_info->font_info;
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=text_info->x+(QuantumMargin >> 2);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=text_info->y+font_info->ascent+(text_info->height >> 2);
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=text_info->width-(QuantumMargin >> 1);
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*text_info->text == '\0')
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        No text-- just draw cursor.
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawLine(display,window_info->id,window_info->annotate_context,
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x,y+3,x,y-height+3);
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set cropping region.
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.width=(unsigned short) text_info->width;
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.height=(unsigned short) text_info->height;
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x=text_info->x;
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y=text_info->y;
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine beginning of the visible text.
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->cursor < text_info->marker)
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info->marker=text_info->cursor;
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text=text_info->marker;
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (XTextWidth(font_info,(char *) text,(int) (text_info->cursor-text)) >
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) width)
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text=text_info->text;
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < Extent(text); i++)
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            n=XTextWidth(font_info,(char *) text+i,(int)
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (text_info->cursor-text-i));
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (n <= (int) width)
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text_info->marker=(char *) text+i;
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw text and cursor.
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->highlight == MagickFalse)
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetClipRectangles(display,window_info->widget_context,0,0,
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &crop_info,1,Unsorted);
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawString(display,window_info->id,window_info->widget_context,
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x,y,text_info->marker,Extent(text_info->marker));
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetClipMask(display,window_info->widget_context,None);
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetClipRectangles(display,window_info->annotate_context,0,0,
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &crop_info,1,Unsorted);
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=WidgetTextWidth(font_info,text_info->marker);
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillRectangle(display,window_info->id,
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->annotate_context,x,y-font_info->ascent,width,height);
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetClipMask(display,window_info->annotate_context,None);
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetClipRectangles(display,window_info->highlight_context,0,0,
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        &crop_info,1,Unsorted);
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDrawString(display,window_info->id,
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->highlight_context,x,y,text_info->marker,
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Extent(text_info->marker));
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetClipMask(display,window_info->highlight_context,None);
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x+=XTextWidth(font_info,text_info->marker,(int)
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (text_info->cursor-text_info->marker));
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawLine(display,window_info->id,window_info->annotate_context,x,y+3,
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,y-height+3);
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w T r i a n g l e E a s t                                         %
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawTriangleEast() draws a triangle with a highlighted left bevel and a
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  shadowed right and lower bevel.  The highlighted and shadowed bevels create
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a 3-D effect.
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawTriangleEast function is:
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawTriangleEast(display,window_info,triangle_info)
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o triangle_info: Specifies a pointer to a XWidgetInfo structure.  It
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the triangle.
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawTriangleEast(Display *display,const XWindowInfo *window_info,
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *triangle_info)
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x1,
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x2,
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x3,
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y1,
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y2,
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y3;
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bevel_width;
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XPoint
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points[4];
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw triangle matte.
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x1=triangle_info->x;
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y1=triangle_info->y;
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x2=triangle_info->x+triangle_info->width;
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y2=triangle_info->y+(triangle_info->height >> 1);
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x3=triangle_info->x;
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y3=triangle_info->y+triangle_info->height;
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bevel_width=triangle_info->bevel_width;
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x3;
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y3;
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetMatteColor(display,window_info,triangle_info->raised);
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,3,Complex,CoordModeOrigin);
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw bottom bevel.
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x2;
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y2;
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x3;
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y3;
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x3-bevel_width;
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y3+bevel_width;
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x2+bevel_width;
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y2;
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,!triangle_info->raised);
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw Left bevel.
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x3;
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y3;
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x1;
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y1;
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x1-bevel_width+1;
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y1-bevel_width;
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x3-bevel_width+1;
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y3+bevel_width;
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,triangle_info->raised);
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw top bevel.
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x2+bevel_width;
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y2;
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x1-bevel_width;
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y1-bevel_width;
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (triangle_info->text == (char *) NULL)
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write label to right of triangle.
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=window_info->font_info;
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetTextColor(display,window_info,MagickTrue);
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x1=triangle_info->x+triangle_info->width+triangle_info->bevel_width+
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (QuantumMargin >> 1);
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y1=triangle_info->y+((triangle_info->height-
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (font_info->ascent+font_info->descent)) >> 1)+font_info->ascent;
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawString(display,window_info->id,window_info->widget_context,x1,y1,
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    triangle_info->text,Extent(triangle_info->text));
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w T r i a n g l e N o r t h                                       %
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawTriangleNorth() draws a triangle with a highlighted left bevel and a
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  shadowed right and lower bevel.  The highlighted and shadowed bevels create
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  a 3-D effect.
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawTriangleNorth function is:
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawTriangleNorth(display,window_info,triangle_info)
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o triangle_info: Specifies a pointer to a XWidgetInfo structure.  It
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the triangle.
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawTriangleNorth(Display *display,const XWindowInfo *window_info,
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *triangle_info)
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x1,
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x2,
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x3,
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y1,
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y2,
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y3;
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bevel_width;
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XPoint
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points[4];
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw triangle matte.
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x1=triangle_info->x;
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y1=triangle_info->y+triangle_info->height;
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x2=triangle_info->x+(triangle_info->width >> 1);
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y2=triangle_info->y;
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x3=triangle_info->x+triangle_info->width;
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y3=triangle_info->y+triangle_info->height;
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bevel_width=triangle_info->bevel_width;
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x3;
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y3;
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetMatteColor(display,window_info,triangle_info->raised);
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,3,Complex,CoordModeOrigin);
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw left bevel.
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x2;
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y2-bevel_width-2;
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x1-bevel_width-1;
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y1+bevel_width;
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,triangle_info->raised);
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw right bevel.
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x2;
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y2;
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x3;
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y3;
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x3+bevel_width;
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y3+bevel_width;
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x2;
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y2-bevel_width;
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,!triangle_info->raised);
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw lower bevel.
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x3;
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y3;
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x1;
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y1;
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x1-bevel_width;
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y1+bevel_width;
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x3+bevel_width;
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y3+bevel_width;
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w T r i a n g l e S o u t h                                       %
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawTriangleSouth() draws a border with a highlighted left and right bevel
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and a shadowed lower bevel.  The highlighted and shadowed bevels create a
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  3-D effect.
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawTriangleSouth function is:
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawTriangleSouth(display,window_info,triangle_info)
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o triangle_info: Specifies a pointer to a XWidgetInfo structure.  It
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the triangle.
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawTriangleSouth(Display *display,const XWindowInfo *window_info,
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XWidgetInfo *triangle_info)
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x1,
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x2,
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x3,
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y1,
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y2,
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y3;
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bevel_width;
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XPoint
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points[4];
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw triangle matte.
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x1=triangle_info->x;
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y1=triangle_info->y;
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x2=triangle_info->x+(triangle_info->width >> 1);
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y2=triangle_info->y+triangle_info->height;
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x3=triangle_info->x+triangle_info->width;
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y3=triangle_info->y;
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bevel_width=triangle_info->bevel_width;
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x3;
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y3;
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetMatteColor(display,window_info,triangle_info->raised);
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,3,Complex,CoordModeOrigin);
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw top bevel.
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x3;
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y3;
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x1;
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y1;
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x1-bevel_width;
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y1-bevel_width;
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x3+bevel_width;
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y3-bevel_width;
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,triangle_info->raised);
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw right bevel.
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x2;
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y2;
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x3+1;
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y3-bevel_width;
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x3+bevel_width;
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y3-bevel_width;
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x2;
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y2+bevel_width;
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,!triangle_info->raised);
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw left bevel.
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].x=x1;
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[0].y=y1;
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].x=x2;
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[1].y=y2;
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].x=x2;
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[2].y=y2+bevel_width;
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].x=x1-bevel_width;
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  points[3].y=y1-bevel_width;
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,triangle_info->raised);
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFillPolygon(display,window_info->id,window_info->widget_context,
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    points,4,Complex,CoordModeOrigin);
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X D r a w W i d g e t T e x t                                             %
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDrawWidgetText() first clears the widget and draws a text string justifed
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  left (or center) in the x-direction and centered within the y-direction.
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDrawWidgetText function is:
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XDrawWidgetText(display,window_info,text_info)
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a XWindowText structure.
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text_info: Specifies a pointer to XWidgetInfo structure.
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XDrawWidgetText(Display *display,const XWindowInfo *window_info,
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo *text_info)
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GC
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    widget_context;
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XRectangle
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    crop_info;
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Clear the text area.
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_context=window_info->annotate_context;
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->raised)
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XClearArea(display,window_info->id,text_info->x,text_info->y,
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_info->width,text_info->height,MagickFalse);
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFillRectangle(display,window_info->id,widget_context,text_info->x,
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info->y,text_info->width,text_info->height);
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      widget_context=window_info->highlight_context;
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->text == (char *) NULL)
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*text_info->text == '\0')
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set cropping region.
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=window_info->font_info;
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.width=(unsigned short) text_info->width;
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.height=(unsigned short) text_info->height;
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.x=text_info->x;
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  crop_info.y=text_info->y;
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw text.
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,text_info->text);
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=text_info->x+(QuantumMargin >> 1);
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->center)
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x=text_info->x+(text_info->width >> 1)-(width >> 1);
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info->raised)
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (width > (text_info->width-QuantumMargin))
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x+=(text_info->width-QuantumMargin-width);
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y=text_info->y+((text_info->height-height) >> 1)+font_info->ascent;
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetClipRectangles(display,widget_context,0,0,&crop_info,1,Unsorted);
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawString(display,window_info->id,widget_context,x,y,text_info->text,
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Extent(text_info->text));
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetClipMask(display,widget_context,None);
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < text_info->x)
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XDrawLine(display,window_info->id,window_info->annotate_context,
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_info->x,text_info->y,text_info->x,text_info->y+text_info->height-1);
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X E d i t T e x t                                                         %
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XEditText() edits a text string as indicated by the key symbol.
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XEditText function is:
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XEditText(display,text_info,key_symbol,text,state)
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text_info: Specifies a pointer to a XWidgetInfo structure.  It
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      contains the extents of the text.
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o key_symbol:  A X11 KeySym that indicates what editing function to
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      perform to the text.
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text: A character string to insert into the text.
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1082bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%    o state:  An size_t that indicates whether the key symbol is a
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      control character or not.
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XEditText(Display *display,XWidgetInfo *text_info,
1087bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  const KeySym key_symbol,char *text,const size_t state)
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch ((int) key_symbol)
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case XK_BackSpace:
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case XK_Delete:
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (text_info->highlight)
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Erase the entire line of text.
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *text_info->text='\0';
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text_info->cursor=text_info->text;
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text_info->marker=text_info->text;
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text_info->highlight=MagickFalse;
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Erase one character.
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (text_info->cursor != text_info->text)
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text_info->cursor--;
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(text_info->cursor,text_info->cursor+1,
1111151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            MagickPathExtent);
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          text_info->highlight=MagickFalse;
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case XK_Left:
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case XK_KP_Left:
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Move cursor one position left.
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (text_info->cursor == text_info->text)
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_info->cursor--;
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case XK_Right:
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case XK_KP_Right:
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Move cursor one position right.
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (text_info->cursor == (text_info->text+Extent(text_info->text)))
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_info->cursor++;
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register char
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *p,
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *q;
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register int
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        i;
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (state & ControlState)
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*text == '\0')
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
1151151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      if ((Extent(text_info->text)+1) >= (int) MagickPathExtent)
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XBell(display,0);
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (text_info->highlight)
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Erase the entire line of text.
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *text_info->text='\0';
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              text_info->cursor=text_info->text;
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              text_info->marker=text_info->text;
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              text_info->highlight=MagickFalse;
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Insert a string into the text.
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q=text_info->text+Extent(text_info->text)+strlen(text);
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i <= Extent(text_info->cursor); i++)
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q=(*(q-Extent(text)));
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q--;
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p=text;
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < Extent(text); i++)
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *text_info->cursor++=(*p++);
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X G e t W i d g e t I n f o                                               %
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XGetWidgetInfo() initializes the XWidgetInfo structure.
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XGetWidgetInfo function is:
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XGetWidgetInfo(text,widget_info)
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o text: A string of characters associated with the widget.
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o widget_info: Specifies a pointer to a X11 XWidgetInfo structure.
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XGetWidgetInfo(const char *text,XWidgetInfo *widget_info)
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize widget info.
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->id=(~0);
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->bevel_width=3;
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->width=1;
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->height=1;
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->x=0;
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->y=0;
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->min_y=0;
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->max_y=0;
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->raised=MagickTrue;
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->active=MagickFalse;
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->center=MagickTrue;
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->trough=MagickFalse;
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->highlight=MagickFalse;
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->text=(char *) text;
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->cursor=(char *) text;
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text != (char *) NULL)
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    widget_info->cursor+=Extent(text);
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  widget_info->marker=(char *) text;
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X H i g h l i g h t W i d g e t                                           %
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XHighlightWidget() draws a highlighted border around a window.
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XHighlightWidget function is:
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XHighlightWidget(display,window_info,x,y)
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o x: Specifies an integer representing the rectangle offset in the
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      x-direction.
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o y: Specifies an integer representing the rectangle offset in the
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      y-direction.
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XHighlightWidget(Display *display,const XWindowInfo *window_info,
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const int x,const int y)
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw the widget highlighting rectangle.
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,MagickTrue);
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window_info->id,window_info->widget_context,x,y,
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->width-(x << 1),window_info->height-(y << 1));
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x-1,y-1,window_info->width-(x << 1)+1,window_info->height-(y << 1)+1);
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetBevelColor(display,window_info,MagickFalse);
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XDrawRectangle(display,window_info->id,window_info->widget_context,
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x-1,y-1,window_info->width-(x << 1),window_info->height-(y << 1));
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XSetFillStyle(display,window_info->widget_context,FillSolid);
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X S c r e e n E v e n t                                                   %
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XScreenEvent() returns MagickTrue if the any event on the X server queue is
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  associated with the widget window.
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XScreenEvent function is:
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int XScreenEvent(Display *display,XEvent *event,char *data)
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o event: Specifies a pointer to a X11 XEvent structure.
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o data: Specifies a pointer to a XWindows structure.
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int XScreenEvent(Display *display,XEvent *event,char *data)
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindows
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *windows;
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows=(XWindows *) data;
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (event->xany.window == windows->popup.id)
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->type == MapNotify)
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->popup.mapped=MagickTrue;
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->type == UnmapNotify)
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->popup.mapped=MagickFalse;
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (event->xany.window == windows->widget.id)
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->type == MapNotify)
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.mapped=MagickTrue;
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->type == UnmapNotify)
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.mapped=MagickFalse;
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (event->type)
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case ButtonPress:
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((event->xbutton.button == Button3) &&
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (event->xbutton.state & Mod1Mask))
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Convert Alt-Button3 to Button2.
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event->xbutton.button=Button2;
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event->xbutton.state&=(~Mod1Mask);
13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case Expose:
13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->xexpose.window == windows->image.id)
13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XRefreshWindow(display,&windows->image,event);
13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->xexpose.window == windows->magnify.id)
13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xexpose.count == 0)
13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (windows->magnify.mapped)
13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
13616710d8414f0ed06e4eaf9346366be72e2b4719efcristy              ExceptionInfo
13626710d8414f0ed06e4eaf9346366be72e2b4719efcristy                *exception;
13636710d8414f0ed06e4eaf9346366be72e2b4719efcristy
13646710d8414f0ed06e4eaf9346366be72e2b4719efcristy              exception=AcquireExceptionInfo();
13656710d8414f0ed06e4eaf9346366be72e2b4719efcristy              XMakeMagnifyImage(display,windows,exception);
13666710d8414f0ed06e4eaf9346366be72e2b4719efcristy              exception=DestroyExceptionInfo(exception);
13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->xexpose.window == windows->command.id)
13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xexpose.count == 0)
13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XCommandWidget(display,windows,(const char **) NULL,event);
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case FocusOut:
13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Set input focus for backdrop window.
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (event->xfocus.window == windows->image.id)
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSetInputFocus(display,windows->image.id,RevertToNone,
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          CurrentTime);
13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case ButtonRelease:
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case KeyPress:
13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case KeyRelease:
13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case MotionNotify:
13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case SelectionNotify:
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(MagickTrue);
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X S e t B e v e l C o l o r                                               %
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetBevelColor() sets the graphic context for drawing a beveled border.
14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSetBevelColor function is:
14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XSetBevelColor(display,window_info,raised)
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o raised: A value other than zero indicates the color show be a
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      "highlight" color, otherwise the "shadow" color is set.
14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XSetBevelColor(Display *display,const XWindowInfo *window_info,
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickStatusType raised)
14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->depth == 1)
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Pixmap
14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stipple;
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Monochrome window.
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetBackground(display,window_info->widget_context,
14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XBlackPixel(display,window_info->screen));
14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetForeground(display,window_info->widget_context,
14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XWhitePixel(display,window_info->screen));
14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetFillStyle(display,window_info->widget_context,
14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        FillOpaqueStippled);
14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      stipple=window_info->highlight_stipple;
14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (raised == MagickFalse)
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stipple=window_info->shadow_stipple;
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetStipple(display,window_info->widget_context,stipple);
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (raised)
14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetForeground(display,window_info->widget_context,
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->pixel_info->highlight_color.pixel);
14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetForeground(display,window_info->widget_context,
14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->pixel_info->shadow_color.pixel);
14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X S e t M a t t e C o l o r                                               %
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetMatteColor() sets the graphic context for drawing the matte.
14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSetMatteColor function is:
14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XSetMatteColor(display,window_info,raised)
14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o raised: A value other than zero indicates the matte is active.
14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XSetMatteColor(Display *display,const XWindowInfo *window_info,
14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickStatusType raised)
14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->depth == 1)
14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Monochrome window.
14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (raised)
14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSetForeground(display,window_info->widget_context,
14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XWhitePixel(display,window_info->screen));
15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSetForeground(display,window_info->widget_context,
15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XBlackPixel(display,window_info->screen));
15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (raised)
15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetForeground(display,window_info->widget_context,
1507a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk        window_info->pixel_info->alpha_color.pixel);
15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XSetForeground(display,window_info->widget_context,
15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->pixel_info->depth_color.pixel);
15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy+   X S e t T e x t C o l o r                                                 %
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XSetTextColor() sets the graphic context for drawing text on a matte.
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XSetTextColor function is:
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XSetTextColor(display,window_info,raised)
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a pointer to the Display structure;  returned from
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window_info: Specifies a pointer to a X11 XWindowInfo structure.
15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o raised: A value other than zero indicates the color show be a
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      "highlight" color, otherwise the "shadow" color is set.
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void XSetTextColor(Display *display,const XWindowInfo *window_info,
15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickStatusType raised)
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1544bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    foreground,
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    matte;
15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->depth == 1)
15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Monochrome window.
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (raised)
15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSetForeground(display,window_info->widget_context,
15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XBlackPixel(display,window_info->screen));
15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSetForeground(display,window_info->widget_context,
15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XWhitePixel(display,window_info->screen));
15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
156149e2d862ad0faa61d99d9d252f75913ad3976750cristy  foreground=(ssize_t) XPixelIntensity(
156249e2d862ad0faa61d99d9d252f75913ad3976750cristy    &window_info->pixel_info->foreground_color);
1563a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk  matte=(ssize_t) XPixelIntensity(&window_info->pixel_info->alpha_color);
156449e2d862ad0faa61d99d9d252f75913ad3976750cristy  if (MagickAbsoluteValue((int) (foreground-matte)) > (65535L >> 3))
15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetForeground(display,window_info->widget_context,
15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->pixel_info->foreground_color.pixel);
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XSetForeground(display,window_info->widget_context,
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_info->pixel_info->background_color.pixel);
15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o l o r B r o w s e r W i d g e t                                     %
15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XColorBrowserWidget() displays a Color Browser widget with a color query
15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to the user.  The user keys a reply and presses the Action or Cancel button
15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to exit.  The typed text is returned as the reply function parameter.
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XColorBrowserWidget method is:
15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XColorBrowserWidget(Display *display,XWindows *windows,
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *action,char *reply)
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o action: Specifies a pointer to the action of this widget.
16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reply: the response from the user is returned in this parameter.
16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1604bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XColorBrowserWidget(Display *display,XWindows *windows,
16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *action,char *reply)
16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ColornameText  "Name:"
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ColorPatternText  "Pattern:"
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define GrabButtonText  "Grab"
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ResetButtonText  "Reset"
16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **colorlist,
1615151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    primary_selection[MagickPathExtent],
1616151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    reset_pattern[MagickPathExtent],
1617151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    text[MagickPathExtent];
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static char
1630151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    glob_pattern[MagickPathExtent] = "*";
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static MagickStatusType
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_width,
16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visible_colors,
16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1644bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colors,
16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delay,
16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XColor
16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    color;
16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
16563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    action_info,
16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    expose_info,
16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    grab_info,
16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list_info,
16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mode_info,
16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    north_info,
16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reply_info,
16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reset_info,
16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scroll_info,
16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info,
16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    slider_info,
16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    south_info,
16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info;
16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get color list and sort in ascending order.
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(action != (char *) NULL);
16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reply != (char *) NULL);
16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",action);
16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
1690151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(reset_pattern,"*",MagickPathExtent);
16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  colorlist=GetColorList(glob_pattern,&colors,exception);
16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (colorlist == (char **) NULL)
16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Pattern failed, obtain all the colors.
16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1698151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) CopyMagickString(glob_pattern,"*",MagickPathExtent);
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      colorlist=GetColorList(glob_pattern,&colors,exception);
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (colorlist == (char **) NULL)
17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XNoticeWidget(display,windows,"Unable to obtain colors names:",
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            glob_pattern);
17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XDialogWidget(display,windows,action,"Enter color name:",
17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply);
17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Color Browser widget attributes.
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_width=0;
171449e2d862ad0faa61d99d9d252f75913ad3976750cristy  for (i=0; i < (int) colors; i++)
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,colorlist[i]) > text_width)
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_width=WidgetTextWidth(font_info,colorlist[i]);
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) action);
17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,CancelButtonText) > width)
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,CancelButtonText);
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,ResetButtonText) > width)
17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,ResetButtonText);
17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,GrabButtonText) > width)
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,GrabButtonText);
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=QuantumMargin;
17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,ColorPatternText) > width)
17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,ColorPatternText);
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,ColornameText) > width)
17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,ColornameText);
17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Color Browser widget.
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=(unsigned int)
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (width+MagickMin((int) text_width,(int) MaxTextWidth)+6*QuantumMargin);
17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=(unsigned int)
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (width+MinTextWidth+4*QuantumMargin);
17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int)
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((81*height) >> 2)+((13*QuantumMargin) >> 1)+4;
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int)
17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Color Browser widget.
17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(windows->widget.name,"Browse and Select a Color",
1750151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    MagickPathExtent);
17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask,&window_changes);
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
176954ebd8d7629c2faa0c8fb0dc97967f31c759d2d2cristy  XGetWidgetInfo((char *) NULL,&mode_info);
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&slider_info);
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&north_info);
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&south_info);
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&expose_info);
17749057376a5dad425c62fb6a46438f1f0bb879d009cristy  XGetWidgetInfo((char *) NULL,&selection_info);
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visible_colors=0;
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  delay=SuspendTime << 2;
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id;
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=width;
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) ((3*height) >> 1);
17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int)
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.width-cancel_info.width-QuantumMargin-2);
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int)
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.height-cancel_info.height-QuantumMargin);
17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(action,&action_info);
17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.width=width;
17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.height=(unsigned int) ((3*height) >> 1);
17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (action_info.bevel_width << 1));
18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.y=cancel_info.y;
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(GrabButtonText,&grab_info);
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        grab_info.width=width;
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        grab_info.height=(unsigned int) ((3*height) >> 1);
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        grab_info.x=QuantumMargin;
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        grab_info.y=((5*QuantumMargin) >> 1)+height;
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(ResetButtonText,&reset_info);
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.width=width;
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.height=(unsigned int) ((3*height) >> 1);
18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.x=QuantumMargin;
18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.y=grab_info.y+grab_info.height+QuantumMargin;
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize reply information.
18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(reply,&reply_info);
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.raised=MagickFalse;
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.bevel_width--;
18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.height=height << 1;
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.x=(int) (width+(QuantumMargin << 1));
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.y=action_info.y-reply_info.height-QuantumMargin;
18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize mode information.
18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&mode_info);
18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.active=MagickTrue;
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.bevel_width=0;
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.width=(unsigned int) (action_info.x-(QuantumMargin << 1));
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.height=action_info.height;
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.x=QuantumMargin;
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.y=action_info.y;
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize scroll information.
18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&scroll_info);
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.bevel_width--;
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.width=height;
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.height=(unsigned int) (reply_info.y-grab_info.y-
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (QuantumMargin >> 1));
18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.y=grab_info.y-reply_info.bevel_width;
18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.raised=MagickFalse;
18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.trough=MagickTrue;
18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info=scroll_info;
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.raised=MagickTrue;
18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.width-=(north_info.bevel_width << 1);
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.height=north_info.width-1;
18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.x+=north_info.bevel_width;
18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.y+=north_info.bevel_width;
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info=north_info;
18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          south_info.height;
18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=slider_info.id;
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info=north_info;
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=id;
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.width-=2;
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width+2;
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=scroll_info.height-((slider_info.min_y-
18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.y+1) << 1)+4;
18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visible_colors=scroll_info.height/(height+(height >> 3));
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (colors > visible_colors)
18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(unsigned int)
18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ((visible_colors*slider_info.height)/colors);
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.x=scroll_info.x+slider_info.bevel_width+1;
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info=scroll_info;
18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize list information.
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&list_info);
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.raised=MagickFalse;
18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.bevel_width--;
18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.width=(unsigned int)
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.height=scroll_info.height;
18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.x=reply_info.x;
18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.y=scroll_info.y;
18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state|=JumpListState;
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize text information.
18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *text='\0';
18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(text,&text_info);
18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.center=MagickFalse;
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.width=reply_info.width;
18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.height=height;
18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.x=list_info.x-(QuantumMargin >> 1);
18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.y=QuantumMargin;
18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize selection information.
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&selection_info);
18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.width=list_info.width;
18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.height=(unsigned int) ((9*height) >> 3);
19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.x=list_info.x;
19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Color Browser window.
19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=QuantumMargin;
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,ColorPatternText,
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Extent(ColorPatternText));
1913151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&grab_info);
19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&reset_info);
19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&list_info);
19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
19193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
19223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=QuantumMargin;
19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,ColornameText,
19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Extent(ColornameText));
19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&reply_info);
19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&action_info);
19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&cancel_info);
19313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
19333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawActionState;
19343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateListState)
19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        char
19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          **checklist;
19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1942bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        size_t
19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          number_colors;
19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XParseColor(display,windows->widget.map_info->colormap,
19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          glob_pattern,&color);
19473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((status != False) || (strchr(glob_pattern,'-') != (char *) NULL))
19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Reply is a single color name-- exit.
19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
1952151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(reply,glob_pattern,MagickPathExtent);
1953151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(glob_pattern,reset_pattern,MagickPathExtent);
19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update color list.
19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        checklist=GetColorList(glob_pattern,&number_colors,exception);
19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (number_colors == 0)
19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1964151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(glob_pattern,reset_pattern,MagickPathExtent);
19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XBell(display,0);
19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
196949e2d862ad0faa61d99d9d252f75913ad3976750cristy            for (i=0; i < (int) colors; i++)
19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              colorlist[i]=DestroyString(colorlist[i]);
19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (colorlist != (char **) NULL)
19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              colorlist=(char **) RelinquishMagickMemory(colorlist);
19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            colorlist=checklist;
19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            colors=number_colors;
19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Sort color list in ascending order.
19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=
19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (colors > visible_colors)
19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(unsigned int)
19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ((visible_colors*slider_info.height)/colors);
19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
19853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
19863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=0;
19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw color name & reply.
19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *reply_info.text='\0';
19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.cursor=reply_info.text;
1997151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateListState);
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & JumpListState)
20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Jump scroll to match user color.
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
201349e2d862ad0faa61d99d9d252f75913ad3976750cristy        for (i=0; i < (int) colors; i++)
20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(colorlist[i],reply) >= 0)
20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              list_info.id=LocaleCompare(colorlist[i],reply) == 0 ? i : ~0;
20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((i < slider_info.id) ||
20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (i >= (int) (slider_info.id+visible_colors)))
20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=i-(visible_colors >> 1);
20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~JumpListState);
20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawListState)
20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Determine slider id and position.
20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id >= (int) (colors-visible_colors))
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=(int) (colors-visible_colors);
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((slider_info.id < 0) || (colors <= visible_colors))
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=0;
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (colors != 0)
20378891f9ce489d3e61399b60436ea6c62f5ed9b887cristy          slider_info.y+=(int) (slider_info.id*(slider_info.max_y-
20388891f9ce489d3e61399b60436ea6c62f5ed9b887cristy            slider_info.min_y+1)/colors);
20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id != selection_info.id)
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Redraw scroll bar and file names.
20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=slider_info.id;
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=list_info.y+(height >> 3)+2;
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < (int) visible_colors; i++)
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.raised=(slider_info.id+i) != list_info.id ?
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                MagickTrue : MagickFalse;
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.text=(char *) NULL;
205149e2d862ad0faa61d99d9d252f75913ad3976750cristy              if ((slider_info.id+i) < (int) colors)
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                selection_info.text=colorlist[slider_info.id+i];
20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawWidgetText(display,&windows->widget,&selection_info);
20543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.y+=(int) selection_info.height;
20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
20563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
20573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Update slider.
20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > expose_info.y)
20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) slider_info.y-expose_info.y;
20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y-expose_info.height-
20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width-1;
20643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) expose_info.y-slider_info.y;
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y+slider_info.height+
20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width+1;
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatte(display,&windows->widget,&expose_info);
20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&slider_info);
20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
20753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            expose_info.y=slider_info.y;
20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawListState);
20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawActionState)
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
2082151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          colorname[MagickPathExtent];
20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Display the selected color in a drawing area.
20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
2087a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk        color=windows->widget.pixel_info->alpha_color;
20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XParseColor(display,windows->widget.map_info->colormap,
2089a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk          reply_info.text,&windows->widget.pixel_info->alpha_color);
20903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XBestPixel(display,windows->widget.map_info->colormap,(XColor *) NULL,
20913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned int) windows->widget.visual_info->colormap_size,
2092a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk          &windows->widget.pixel_info->alpha_color);
20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.text=colorname;
2094151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(mode_info.text,MagickPathExtent,"#%02x%02x%02x",
2095a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk          windows->widget.pixel_info->alpha_color.red,
2096a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk          windows->widget.pixel_info->alpha_color.green,
2097a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk          windows->widget.pixel_info->alpha_color.blue);
20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&mode_info);
2099a4f7ef3cc82591986ef2810b1f85a05d343ef686dirk        windows->widget.pixel_info->alpha_color=color;
21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawActionState);
21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (north_info.raised && south_info.raised)
21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Brief delay before advancing scroll bar.
21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDelay(display,delay);
21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        delay=SuspendTime;
21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCheckIfEvent(display,&event,XScreenEvent,(char *) windows);
21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
21213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
212549e2d862ad0faa61d99d9d252f75913ad3976750cristy          if (slider_info.id < (int) colors)
21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.type != ButtonRelease)
21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(slider_info,event.xbutton))
21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Track slider.
21443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickTrue;
21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(north_info,event.xbutton))
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              north_info.raised=MagickFalse;
21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(south_info,event.xbutton))
216049e2d862ad0faa61d99d9d252f75913ad3976750cristy          if (slider_info.id < (int) colors)
21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              south_info.raised=MagickFalse;
21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(scroll_info,event.xbutton))
21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
21743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.y < slider_info.y)
21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id-=(visible_colors-1);
21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id+=(visible_colors-1);
21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(list_info,event.xbutton))
21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              id;
21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
21883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed list matte.
21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            id=slider_info.id+(event.xbutton.y-(list_info.y+(height >> 1))+1)/
21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.height;
21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id >= (int) colors)
21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
21943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(reply_info.text,colorlist[id],
2195151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              MagickPathExtent);
21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.highlight=MagickFalse;
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.marker=reply_info.text;
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.text+Extent(reply_info.text);
21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawActionState;
22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id == list_info.id)
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(glob_pattern,reply_info.text,
2204151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=UpdateListState;
22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=(~0);
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            list_info.id=id;
22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
22103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
22123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(grab_info,event.xbutton))
22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Grab button.
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            grab_info.raised=MagickFalse;
22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&grab_info);
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reset_info,event.xbutton))
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Reset button.
22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reset_info.raised=MagickFalse;
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&reset_info);
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(mode_info,event.xbutton))
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed mode button.
22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
22359a7df36bb436fe340138d7eea39c974b45c9344ccristy            if (mode_info.text != (char *) NULL)
22369a7df36bb436fe340138d7eea39c974b45c9344ccristy              (void) CopyMagickString(reply_info.text,mode_info.text,
2237151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                MagickPathExtent);
22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(primary_selection,reply_info.text,
2239151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              MagickPathExtent);
22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              event.xbutton.time);
22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
22433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              windows->widget.id ? MagickTrue : MagickFalse;
22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.marker=reply_info.text;
22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.text+Extent(reply_info.text);
22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(action_info,event.xbutton))
22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed action button.
22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cancel button.
22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.button != Button2)
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            static Time
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              click_time;
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move text cursor to position of button press.
22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=1; i <= Extent(reply_info.marker); i++)
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (XTextWidth(font_info,reply_info.marker,i) > x)
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.marker+i-1;
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.time > (click_time+DoubleClick))
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Become the XA_PRIMARY selection owner.
22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(primary_selection,reply_info.text,
2290151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  event.xbutton.time);
22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  windows->widget.id ? MagickTrue : MagickFalse;
22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            click_time=event.xbutton.time;
22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Request primary selection.
23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.id,event.xbutton.time);
23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released up button.
23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            north_info.raised=MagickTrue;
23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
23213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released down button.
23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            south_info.raised=MagickTrue;
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Stop tracking slider.
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickFalse;
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (grab_info.raised == MagickFalse)
23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(grab_info,event.xbutton))
23413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  /*
2343fd706f930f397221c6ba26f112e96e262fb0ba2eanthony                    Select a fill color from the X server.
23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  */
23456710d8414f0ed06e4eaf9346366be72e2b4719efcristy                  (void) XGetWindowColor(display,windows,reply_info.text,
23466710d8414f0ed06e4eaf9346366be72e2b4719efcristy                    exception);
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  reply_info.marker=reply_info.text;
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  reply_info.cursor=reply_info.text+Extent(reply_info.text);
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  XDrawMatteText(display,&windows->widget,&reply_info);
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=RedrawActionState;
23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
23523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            grab_info.raised=MagickTrue;
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&grab_info);
23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reset_info.raised == MagickFalse)
23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(reset_info,event.xbutton))
23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(glob_pattern,reset_pattern,
2361151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    MagickPathExtent);
23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=UpdateListState;
23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reset_info.raised=MagickTrue;
23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&reset_info);
23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MagickFalse)
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (MatteIsActive(action_info,event.xbutton))
23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*reply_info.text == '\0')
23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (void) XBell(display,0);
23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      state|=ExitState;
23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickTrue;
23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *reply_info.text='\0';
23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *reply_info.text='\0';
24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
2456151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static int
24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
24683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=XLookupString((XKeyEvent *) &event.xkey,command,
24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *(command+length)='\0';
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (AreaIsActive(scroll_info,event.xkey))
24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            switch ((int) key_symbol)
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Home:
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Home:
24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
24823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=0;
24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Up:
24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Up:
24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id--;
24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Down:
24923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Down:
24933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
24943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id++;
24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
24963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
24973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Prior:
24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Prior:
24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id-=visible_colors;
25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Next:
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Next:
25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id+=visible_colors;
25073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
25083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
25093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_End:
25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_End:
25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=(int) colors;
25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
25163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
25183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
25203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
25223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Read new color or glob patterm.
25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
25243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*reply_info.text == '\0')
25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
2526151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(glob_pattern,reply_info.text,MagickPathExtent);
25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=UpdateListState;
25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ControlState;
25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & ControlState)
25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch ((int) key_symbol)
25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_u:
25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_U:
25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Erase the entire line of text.
25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *reply_info.text='\0';
25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.cursor=reply_info.text;
25463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.marker=reply_info.text;
25473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
25493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XEditText(display,&reply_info,key_symbol,command,state);
25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=JumpListState;
25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XParseColor(display,windows->widget.map_info->colormap,
25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reply_info.text,&color);
25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status != False)
25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state|=RedrawActionState;
25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyRelease:
25633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
2565151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key release.
25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
25773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state&=(~ControlState);
25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MapNotify:
25893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWX);
25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWY);
25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
25983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
26023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider matte.
26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
26053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.y=event.xmotion.y-
26063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((slider_info.height+slider_info.bevel_width) >> 1)+1;
26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y < slider_info.min_y)
26083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.min_y;
26093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > slider_info.max_y)
26103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.max_y;
26113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id=0;
26123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y != slider_info.min_y)
26133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id=(int) ((colors*(slider_info.y-
26143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
26153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
26163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
26173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
26183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
26193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
26203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (grab_info.raised == MatteIsActive(grab_info,event.xmotion))
26213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
26223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
26233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Grab button status changed.
26243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
26253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            grab_info.raised=!grab_info.raised;
26263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&grab_info);
26273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
26283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
26293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
26303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
26313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
26323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Reset button status changed.
26333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
26343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reset_info.raised=!reset_info.raised;
26353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&reset_info);
26363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
26373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
26383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MatteIsActive(action_info,event.xmotion))
26393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
26403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
26413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Action button status changed.
26423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
26433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=action_info.raised == MagickFalse ?
26443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
26453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
26473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
26483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
26493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
26503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
26513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
26523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
26533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=cancel_info.raised == MagickFalse ?
26543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
26553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
26563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
26573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
26583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
26593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
26603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionClear:
26613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
26623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.highlight=MagickFalse;
26633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
26643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
26653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
26663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionNotify:
26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
26683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Atom
26693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          type;
26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          format;
26733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char
26753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *data;
26763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2677f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        unsigned long
26783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          after,
26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
26803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
26813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
26823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Obtain response from primary selection.
26833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
26843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xselection.property == (Atom) None)
26853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
26863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XGetWindowProperty(display,event.xselection.requestor,
26873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
26883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &format,&length,&after,&data);
26893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((status != Success) || (type != XA_STRING) || (format == 32) ||
26903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (length == 0))
26913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
2692151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XBell(display,0);
26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Insert primary selection in reply text.
26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
26993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *(data+length)='\0';
27003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XEditText(display,&reply_info,(KeySym) XK_Insert,(char *) data,
27013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state);
27023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
27033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=JumpListState;
27043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawActionState;
27053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
27063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFree((void *) data);
27073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
27083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
27093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionRequest:
27103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
27113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionEvent
27123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify;
27133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionRequestEvent
27153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *request;
27163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reply_info.highlight == MagickFalse)
27183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
27193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
27203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Set primary selection.
27213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
27223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        request=(&(event.xselectionrequest));
27233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XChangeProperty(request->display,request->requestor,
27243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          request->property,request->target,8,PropModeReplace,
27253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned char *) primary_selection,Extent(primary_selection));
27263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.type=SelectionNotify;
27273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.send_event=MagickTrue;
27283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.display=request->display;
27293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.requestor=request->requestor;
27303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.selection=request->selection;
27313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.target=request->target;
27323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.time=request->time;
27333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (request->property == None)
27343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->target;
27353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
27363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->property;
27373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSendEvent(request->display,request->requestor,False,
27383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          NoEventMask,(XEvent *) &notify);
27393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
27403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
27413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
27423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
27433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
27443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
27453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
27463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
27473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
27483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free color list.
27493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
275049e2d862ad0faa61d99d9d252f75913ad3976750cristy  for (i=0; i < (int) colors; i++)
27513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colorlist[i]=DestroyString(colorlist[i]);
27523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (colorlist != (char **) NULL)
27533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colorlist=(char **) RelinquishMagickMemory(colorlist);
27543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception);
27553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((*reply == '\0') || (strchr(reply,'-') != (char *) NULL))
27563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
27573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XParseColor(display,windows->widget.map_info->colormap,reply,&color);
27583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
27593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
27603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XNoticeWidget(display,windows,"Color is unknown to X server:",reply);
2761151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(reply,"gray",MagickPathExtent);
27623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
27633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
27653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o m m a n d W i d g e t                                               %
27703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
27733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XCommandWidget() maps a menu and returns the command pointed to by the user
27763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  when the button is released.
27773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XCommandWidget method is:
27793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int XCommandWidget(Display *display,XWindows *windows,
27813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char **selections,XEvent *event)
27823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
27843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o selection_number: Specifies the number of the selection that the
27863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      user choose.
27873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
27893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
27903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
27923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o selections: Specifies a pointer to one or more strings that comprise
27943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the choices in the menu.
27953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o event: Specifies a pointer to a X11 XEvent structure.
27973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
27983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2799bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate int XCommandWidget(Display *display,XWindows *windows,
28003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char **selections,XEvent *event)
28013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
28023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define tile_width 112
28033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define tile_height 70
28043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const unsigned char
28063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tile_bits[]=
28073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
28083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
28123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
28133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
28143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x1e, 0x38, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x1e, 0xbc, 0x9f, 0x03, 0x00, 0x3e, 0x00, 0xc0,
28183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1f, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x0f, 0x80, 0x3f,
28193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xf0, 0x1f, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0x1f,
28203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xe0, 0x3f, 0x00, 0xfc, 0x1f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0xfc,
28213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xff, 0x1f, 0xf0, 0x3f, 0x00, 0xfe, 0x1f, 0xf8, 0x0f, 0x00, 0x00, 0x00,
28223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1e, 0xfc, 0xfc, 0x3f, 0xf8, 0x3f, 0x00, 0xff, 0x1e, 0xfc, 0x0f, 0x00,
28233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x1e, 0x7c, 0xfc, 0x3e, 0xf8, 0x3c, 0x80, 0x1f, 0x1e, 0x7c,
28243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c, 0xc0, 0x0f,
28253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c, 0x7c, 0x3c,
28263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc0, 0x07, 0x1e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x78, 0x78, 0x3c,
28273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x7c, 0x7c, 0xc0, 0x0f, 0x1e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x78,
28283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x78, 0x3c, 0xfc, 0x7c, 0x80, 0x7f, 0x1e, 0x7c, 0x00, 0x00, 0x00, 0x00,
28293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1e, 0xf8, 0x78, 0x7c, 0xf8, 0xff, 0x00, 0xff, 0x1f, 0xf8, 0xff, 0x00,
28303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xfe, 0x1f, 0xf8,
28313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xff, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xf0, 0xff, 0x07, 0xf8,
28323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0xf8, 0x78, 0x7c, 0xc0, 0xef,
28333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x07, 0xe0, 0x1f, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x1e, 0x70, 0x40, 0x78,
28343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xc7, 0x07, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x00,
28353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
28363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
28373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
28383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
28393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
28433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00,
28443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
28453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
28463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00,
28483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07,
28493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x60, 0x00, 0xc0, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
28533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xc0, 0x8f, 0x3f, 0x00, 0x00, 0x00,
28543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0x9f, 0x7f, 0x00,
28553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, 0xdf,
28563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x78, 0x00,
28573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xe0, 0xdf, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0c,
28583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x78, 0x30, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
28593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x0f, 0xf8, 0x70, 0xf0, 0xff, 0x7b, 0x00, 0x00, 0x1f, 0x00, 0xe0,
28603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x0f, 0x1e, 0x80, 0x0f, 0xf8, 0x78, 0xf0, 0xfd, 0xf9, 0x00, 0xc0, 0x1f,
28613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xf8, 0x0f, 0x00, 0xe0, 0x1f, 0xf8, 0x7c, 0xf0, 0xfc, 0xf9, 0x00,
28623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xf0, 0x1f, 0x00, 0xfe, 0x0f, 0x00, 0xf0, 0x07, 0xf8, 0x3e, 0xf8, 0xfc,
28633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xf0, 0x01, 0xf8, 0x1f, 0x00, 0xff, 0x0f, 0x1e, 0xf0, 0x03, 0xf8, 0x3f,
28643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xf8, 0xf8, 0xf0, 0x01, 0xfc, 0x1f, 0x80, 0x7f, 0x0f, 0x1e, 0xf8, 0x00,
28653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xf8, 0x1f, 0x78, 0x18, 0xf0, 0x01, 0x7c, 0x1e, 0xc0, 0x0f, 0x0f, 0x1e,
28663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x7c, 0x00, 0xf0, 0x0f, 0x78, 0x00, 0xf0, 0x01, 0x3e, 0x1e, 0xe0, 0x07,
28673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x0f, 0x1e, 0x7c, 0x00, 0xf0, 0x07, 0x7c, 0x00, 0xe0, 0x01, 0x3e, 0x1e,
28683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xe0, 0x03, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x0f, 0x7c, 0x00, 0xe0, 0x03,
28693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x3e, 0x3e, 0xe0, 0x07, 0x0f, 0x1e, 0x1e, 0x00, 0xf0, 0x1f, 0x3c, 0x00,
28703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xe0, 0x03, 0x7e, 0x3e, 0xc0, 0x3f, 0x0f, 0x1e, 0x3e, 0x00, 0xf0, 0x1f,
28713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x3e, 0x00, 0xe0, 0x03, 0xfc, 0x7f, 0x80, 0xff, 0x0f, 0x1e, 0xfc, 0x00,
28723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xf0, 0x3e, 0x3e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xff, 0x0f, 0x1e,
28733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xfc, 0x07, 0xf0, 0x7c, 0x1e, 0x00, 0xc0, 0x03, 0xf8, 0xff, 0x03, 0xfc,
28743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x0f, 0x1e, 0xf8, 0x1f, 0xf0, 0xf8, 0x1e, 0x00, 0xc0, 0x03, 0xe0, 0xf7,
28753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x03, 0xf0, 0x0f, 0x1e, 0xe0, 0x3f, 0xf0, 0x78, 0x1c, 0x00, 0x80, 0x03,
28763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x80, 0xe3, 0x03, 0x00, 0x0f, 0x1e, 0xc0, 0x3f, 0xf0, 0x30, 0x00, 0x00,
28773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x3e, 0x00, 0x00,
28783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x10,
28793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00,
28803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
28813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
28853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00,
28863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
28873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
28883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
28903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
28913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
28933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id,
28943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
28953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
28973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
28983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static unsigned int
29003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_selections;
29013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
29033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height;
29043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2905bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
29063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
29073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
29093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
29103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
29123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
29133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
29143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->command.font_info;
29153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
29163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  id=(~0);
29173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=DefaultState;
29183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (event == (XEvent *) NULL)
29193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned int
29213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width;
29223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XTextProperty
29243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_name;
29253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XWindowChanges
29273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_changes;
29283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
29303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine command window attributes.
29313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
29323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      assert(selections != (const char **) NULL);
29333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->command.width=0;
29343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; selections[i] != (char *) NULL; i++)
29353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
29363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width=WidgetTextWidth(font_info,(char *) selections[i]);
29373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (width > windows->command.width)
29383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->command.width=width;
29393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
29403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      number_selections=(unsigned int) i;
29413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->command.width+=3*QuantumMargin+10;
29423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((int) windows->command.width < (tile_width+QuantumMargin+10))
29433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.width=(unsigned  int) (tile_width+QuantumMargin+10);
29443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->command.height=(unsigned  int) (number_selections*
29453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (((3*height) >> 1)+10)+tile_height+20);
29463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->command.min_width=windows->command.width;
29473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->command.min_height=windows->command.height;
29483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XConstrainWindowPosition(display,&windows->command);
29493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->command.id != (Window) NULL)
29503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
29513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Status
29523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status;
29533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
29543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
29553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Reconfigure command window.
29563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
29573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=XStringListToTextProperty(&windows->command.name,1,
29583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            &window_name);
29593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (status != False)
29603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
29613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XSetWMName(display,windows->command.id,&window_name);
29623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XSetWMIconName(display,windows->command.id,&window_name);
29633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XFree((void *) window_name.value);
29643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
29653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_changes.width=(int) windows->command.width;
29663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_changes.height=(int) windows->command.height;
29673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XReconfigureWMWindow(display,windows->command.id,
29683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->command.screen,(unsigned int) (CWWidth | CWHeight),
29693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            &window_changes);
29703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
29713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
29723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Allocate selection info memory.
29733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
29743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (selection_info != (XWidgetInfo *) NULL)
29753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info=(XWidgetInfo *) RelinquishMagickMemory(selection_info);
29763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      selection_info=(XWidgetInfo *) AcquireQuantumMemory(number_selections,
29773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*selection_info));
29783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (selection_info == (XWidgetInfo *) NULL)
29793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2980beb1a6beff37a76105c2f7a95845c2c75d8a2ff5cristy          ThrowXWindowFatalException(ResourceLimitFatalError,
29813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "MemoryAllocationFailed","...");
29823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return(id);
29833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
29843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      state|=UpdateConfigurationState | RedrawWidgetState;
29853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
29863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
29873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Wait for next event.
29883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
29893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (event != (XEvent *) NULL)
29903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event->type)
29913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
29923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
29933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
29943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < (int) number_selections; i++)
29953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
29963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
29973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
29983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (i >= (int) windows->command.data)
29993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
30003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info[i].raised=MagickFalse;
30013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawBeveledButton(display,&windows->command,&selection_info[i]);
30023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
30033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
30043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          submenu_info=selection_info[i];
30053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          submenu_info.active=MagickTrue;
300658a749ec1fc5d48a2ea305d892aa6004454bb5eacristy          toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
300758a749ec1fc5d48a2ea305d892aa6004454bb5eacristy            (toggle_info.height >> 1);
30083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id=i;
30093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XCheckWindowEvent(display,windows->widget.id,LeaveWindowMask,
30103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            event);
30113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
30133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
30143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
30153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
30163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
30173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < (int) number_selections; i++)
30183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
30193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (MatteIsActive(selection_info[i],event->xbutton) == MagickFalse)
30203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
30213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id=i;
30223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (id >= (int) windows->command.data)
30233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
30243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info[id].raised=MagickTrue;
30253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawBeveledButton(display,&windows->command,&selection_info[id]);
30263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
30273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
30283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
30303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
30313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
30323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
30333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
30343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
30353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, withdraw command widget.
30363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
30373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xclient.message_type != windows->wm_protocols)
30383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event->xclient.data.l != (int) windows->wm_delete_window)
30403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XWithdrawWindow(display,windows->command.id,
30423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->command.screen);
30433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
30443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
30453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
30463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
30473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
30483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
30493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
30503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xconfigure.window != windows->command.id)
30513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xconfigure.send_event != 0)
30533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
30543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->command.x=event->xconfigure.x;
30553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->command.y=event->xconfigure.y;
30563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
30573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event->xconfigure.width == (int) windows->command.width) &&
30583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event->xconfigure.height == (int) windows->command.height))
30593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.width=(unsigned int)
30613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event->xconfigure.width,(int) windows->command.min_width);
30623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.height=(unsigned int)
30633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event->xconfigure.height,(int) windows->command.min_height);
30643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
30653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
30663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
30673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
30683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
30693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xexpose.window != windows->command.id)
30703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event->xexpose.count != 0)
30723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
30733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
30743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
30753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
30763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
30773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
30783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
30793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Return the ID of the highlighted menu entry.
30803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
30813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for ( ; ; )
30823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
30833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < (int) number_selections; i++)
30843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
30853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (i >= (int) windows->command.data)
30863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
30873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (selection_info[i].raised ==
30883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    MatteIsActive(selection_info[i],event->xmotion))
30893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
30903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    /*
30913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Button status changed.
30923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    */
30933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    selection_info[i].raised=!selection_info[i].raised;
30943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    XDrawBeveledButton(display,&windows->command,
30953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      &selection_info[i]);
30963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
30973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                continue;
30983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
30993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (MatteIsActive(selection_info[i],event->xmotion) == MagickFalse)
31003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              continue;
31013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            submenu_info=selection_info[i];
31023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            submenu_info.active=MagickTrue;
31033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            toggle_info.raised=MagickTrue;
31043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            toggle_info.y=submenu_info.y+(submenu_info.height >> 1)-
31053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (toggle_info.height >> 1);
31063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleEast(display,&windows->command,&toggle_info);
31073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            id=i;
31083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
31093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XDelay(display,SuspendTime);
31103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (XCheckMaskEvent(display,ButtonMotionMask,event) == MagickFalse)
31113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
31123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          while (XCheckMaskEvent(display,ButtonMotionMask,event)) ;
31133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          toggle_info.raised=MagickFalse;
31143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (windows->command.data != 0)
31153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleEast(display,&windows->command,&toggle_info);
31163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
31173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
31183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
31193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MapNotify:
31203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
31213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.mapped=MagickTrue;
31223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
31243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case UnmapNotify:
31253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
31263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.mapped=MagickFalse;
31273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
31283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
31303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
31313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (state & UpdateConfigurationState)
31333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
31343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize button information.
31363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
31373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      assert(selections != (const char **) NULL);
31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y=tile_height+20;
31393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < (int) number_selections; i++)
31403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
31413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(selections[i],&selection_info[i]);
31423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info[i].center=MagickFalse;
31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info[i].bevel_width--;
31443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info[i].height=(unsigned int) ((3*height) >> 1);
31453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info[i].x=(QuantumMargin >> 1)+4;
314658a749ec1fc5d48a2ea305d892aa6004454bb5eacristy        selection_info[i].width=(unsigned int) (windows->command.width-
314758a749ec1fc5d48a2ea305d892aa6004454bb5eacristy          (selection_info[i].x << 1));
31483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info[i].y=y;
31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y+=selection_info[i].height+(selection_info[i].bevel_width << 1)+6;
31503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
31513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XGetWidgetInfo((char *) NULL,&toggle_info);
31523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      toggle_info.bevel_width--;
315358a749ec1fc5d48a2ea305d892aa6004454bb5eacristy      toggle_info.width=(unsigned int) (((5*height) >> 3)-
315458a749ec1fc5d48a2ea305d892aa6004454bb5eacristy        (toggle_info.bevel_width << 1));
31553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      toggle_info.height=toggle_info.width;
31563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      toggle_info.x=selection_info[0].x+selection_info[0].width-
31573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        toggle_info.width-(QuantumMargin >> 1);
31583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (windows->command.mapped)
31593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XClearWindow(display,windows->command.id);
31603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
31613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (state & RedrawWidgetState)
31623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
31633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Pixmap
31643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        tile_pixmap;
31653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
31663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
31673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Draw command buttons.
31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
31693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      tile_pixmap=XCreatePixmapFromBitmapData(display,windows->command.id,
31703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (char *) tile_bits,tile_width,tile_height,1L,0L,1);
31713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (tile_pixmap != (Pixmap) NULL)
31723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
31733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XCopyPlane(display,tile_pixmap,windows->command.id,
31743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->command.annotate_context,0,0,tile_width,tile_height,
31753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (int) ((windows->command.width-tile_width) >> 1),10,1L);
31763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XFreePixmap(display,tile_pixmap);
31773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
31783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < (int) number_selections; i++)
31793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
31803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->command,&selection_info[i]);
31813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (i >= (int) windows->command.data)
31823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
318376d2c94c9542343414bacbd8a5f7ff4f62a70723cristy        toggle_info.raised=MagickFalse;
318458a749ec1fc5d48a2ea305d892aa6004454bb5eacristy        toggle_info.y=selection_info[i].y+(selection_info[i].height >> 1)-
318558a749ec1fc5d48a2ea305d892aa6004454bb5eacristy          (toggle_info.height >> 1);
31863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleEast(display,&windows->command,&toggle_info);
31873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
31883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XHighlightWidget(display,&windows->command,BorderOffset,BorderOffset);
31893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
31903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(id);
31913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
31923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
31933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
31943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
31963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
31973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
31983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X C o n f i r m W i d g e t                                               %
31993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
32023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XConfirmWidget() displays a Confirm widget with a notice to the user. The
32053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  function returns -1 if Dismiss is pressed, 0 for Cancel, and 1 for Yes.
32063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XConfirmWidget method is:
32083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int XConfirmWidget(Display *display,XWindows *windows,
32103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reason,const char *description)
32113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
32133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
32153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
32163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
32183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reason: Specifies the message to display before terminating the
32203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      program.
32213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o description: Specifies any description to the message.
32233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
32243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3225bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate int XConfirmWidget(Display *display,XWindows *windows,
32263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reason,const char *description)
32273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
32283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
32293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DismissButtonText  "Dismiss"
32303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define YesButtonText  "Yes"
32313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
32333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    confirm,
32343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
32353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
32363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
32383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
32393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
32413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
32423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
32433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3244bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
32453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
32463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
32483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
32493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
32513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
32523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
32543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
32553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
32573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
32583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dismiss_info,
32593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    yes_info;
32603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
32623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
32633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
32653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Confirm widget attributes.
32663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
32673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
32683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
32693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reason != (char *) NULL);
32703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(description != (char *) NULL);
32713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",reason);
32723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
32733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
32743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,CancelButtonText);
32753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,DismissButtonText) > width)
32763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,DismissButtonText);
32773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,YesButtonText) > width)
32783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,YesButtonText);
32793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width<<=1;
32803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (description != (char *) NULL)
32813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,(char *) description) > width)
32823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=WidgetTextWidth(font_info,(char *) description);
32833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
32843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
32853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Confirm widget.
32863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
32873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=(unsigned int) (width+9*QuantumMargin);
32883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=(unsigned int) (9*QuantumMargin+
32893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    WidgetTextWidth(font_info,CancelButtonText)+
32903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    WidgetTextWidth(font_info,DismissButtonText)+
32913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    WidgetTextWidth(font_info,YesButtonText));
32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
32933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
32943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int) (12*height);
32953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int) (7*height);
32963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
32973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
32983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
32993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Confirm widget.
33013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3302151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(windows->widget.name,"Confirm",MagickPathExtent);
33033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
33043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
33063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
33073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
33083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
33093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
33103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
33113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
33123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
33143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
33153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
33163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
33173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
33193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
33203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
33213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  confirm=0;
33223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
33233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
33243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
33253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
33273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
33283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
33293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
33303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
33313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
33323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=(unsigned int) QuantumMargin+
33333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          WidgetTextWidth(font_info,CancelButtonText);
33343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) ((3*height) >> 1);
33353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int) (windows->widget.width-cancel_info.width-
33363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          QuantumMargin);
33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int) (windows->widget.height-(cancel_info.height << 1));
33383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info=cancel_info;
33393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.text=(char *) DismissButtonText;
33403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(description,"Do you want to save it") == 0)
33413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          dismiss_info.text=(char *) "Don't Save";
33423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.width=(unsigned int) QuantumMargin+
33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          WidgetTextWidth(font_info,dismiss_info.text);
33443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.x=(int)
33453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
33463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        yes_info=cancel_info;
33473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        yes_info.text=(char *) YesButtonText;
33483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(description,"Do you want to save it") == 0)
33493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          yes_info.text=(char *) "Save";
33503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        yes_info.width=(unsigned int) QuantumMargin+
33513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          WidgetTextWidth(font_info,yes_info.text);
33523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (yes_info.width < cancel_info.width)
33533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          yes_info.width=cancel_info.width;
33543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        yes_info.x=QuantumMargin;
33553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
33563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
33573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
33583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
33593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
33603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Confirm widget.
33613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
33623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width=WidgetTextWidth(font_info,(char *) reason);
33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=(int) ((windows->widget.width >> 1)-(width >> 1));
33643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=(int) ((windows->widget.height >> 1)-(height << 1));
33653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
33663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,(char *) reason,Extent(reason));
33673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (description != (char *) NULL)
33683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
33693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            char
3370151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              question[MagickPathExtent];
33713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3372151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(question,description,MagickPathExtent);
3373151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) ConcatenateMagickString(question,"?",MagickPathExtent);
33743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=WidgetTextWidth(font_info,question);
33753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=(int) ((windows->widget.width >> 1)-(width >> 1));
33763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y+=height;
33773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XDrawString(display,windows->widget.id,
33783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              windows->widget.annotate_context,x,y,question,Extent(question));
33793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
33803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&cancel_info);
33813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&dismiss_info);
33823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&yes_info);
33833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
33843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
33853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
33863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
33873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
33883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
33893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
33903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
33913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
33923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
33933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
33943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
33953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
33963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
33973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed No button.
33983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
33993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
34003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
34013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
34023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(dismiss_info,event.xbutton))
34043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
34063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Dismiss button.
34073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
34083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickFalse;
34093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
34103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
34113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(yes_info,event.xbutton))
34133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
34153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Yes button.
34163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
34173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            yes_info.raised=MagickFalse;
34183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&yes_info);
34193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
34203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
34233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
34243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
34263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
34283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
34303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
34313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
34323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  confirm=0;
34333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
34343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
34353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
34363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
34373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dismiss_info.raised == MagickFalse)
34393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
34413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(dismiss_info,event.xbutton))
34423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
34433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  confirm=(-1);
34443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
34453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
34463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickTrue;
34473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
34483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (yes_info.raised == MagickFalse)
34503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
34523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(yes_info,event.xbutton))
34533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
34543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  confirm=1;
34553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
34563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
34573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            yes_info.raised=MagickTrue;
34583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&yes_info);
34593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
34613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
34623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
34633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
34643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
34653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
34663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
34673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
34683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
34703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
34723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
34733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
34743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
34763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
34783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
34793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
34803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
34823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
34833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
34853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
34863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
34873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
34883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
34893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
34903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
34923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
34933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
34953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
34963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
34983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
34993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
35013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
35023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
35033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
35063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
35083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
35093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
35103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
35173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
35183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
35193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
3520151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
35233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
35253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
35263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
35273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
35283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
35293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
35313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
35323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
35333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
35343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            yes_info.raised=MagickFalse;
35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&yes_info);
35363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            confirm=1;
35373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
35383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
35393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
35423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
35433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
35443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
35453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
35473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
35493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
35503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
35513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
35523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
35533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
35543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
35553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
35563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
35583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
35593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
35603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
35613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
35623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=cancel_info.raised == MagickFalse ?
35633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
35643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
35653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
35663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
35673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
35683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
35693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
35703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Dismiss button status changed.
35713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
35724d0ca34912f861b25e5ed95e3f624048cb180358cristy            dismiss_info.raised=dismiss_info.raised == MagickFalse ?
35733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
35743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
35753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
35763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
35773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (yes_info.raised == MatteIsActive(yes_info,event.xmotion))
35783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
35793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
35803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Yes button status changed.
35813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
35823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            yes_info.raised=yes_info.raised == MagickFalse ?
35833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
35843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&yes_info);
35853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
35863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
35873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
35893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
35903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
35913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
35933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
35943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
35953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
35963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(confirm);
35973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
35983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
35993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
36003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X D i a l o g W i d g e t                                                 %
36053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
36083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XDialogWidget() displays a Dialog widget with a query to the user.  The user
36113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  keys a reply and presses the Ok or Cancel button to exit.  The typed text is
36123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returned as the reply function parameter.
36133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XDialogWidget method is:
36153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int XDialogWidget(Display *display,XWindows *windows,const char *action,
36173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *query,char *reply)
36183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
36203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
36223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
36233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
36253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o action: Specifies a pointer to the action of this widget.
36273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o query: Specifies a pointer to the query to present to the user.
36293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reply: the response from the user is returned in this parameter.
36313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
36323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3633bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate int XDialogWidget(Display *display,XWindows *windows,
36343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *action,const char *query,char *reply)
36353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
36363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
36373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
3639151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    primary_selection[MagickPathExtent];
36403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
36423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
36433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
36463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static MagickBooleanType
36483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    raised = MagickFalse;
36493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
36513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
36523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
36543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    anomaly,
36553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
36573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3658bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
36593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
36603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
36623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
36633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
36653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
36663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
36683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
36693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
36713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    action_info,
36723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
36733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reply_info,
36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    special_info,
36753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info;
36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
36783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
36793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
36813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Dialog widget attributes.
36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
36833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
36843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
36853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(action != (char *) NULL);
36863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(query != (char *) NULL);
36873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reply != (char *) NULL);
36883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",action);
36893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
36903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) action);
36923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,CancelButtonText) > width)
36933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,CancelButtonText);
36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=(3*QuantumMargin) >> 1;
36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Dialog widget.
36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
369949e2d862ad0faa61d99d9d252f75913ad3976750cristy  windows->widget.width=(unsigned int) MagickMax((int) (2*width),(int)
370049e2d862ad0faa61d99d9d252f75913ad3976750cristy    WidgetTextWidth(font_info,(char *) query));
37013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < WidgetTextWidth(font_info,reply))
37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=WidgetTextWidth(font_info,reply);
37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width+=6*QuantumMargin;
37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=(unsigned int)
37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (width+28*XTextWidth(font_info,"#",1)+4*QuantumMargin);
37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
37083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int) (7*height+(QuantumMargin << 1));
37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=windows->widget.height;
37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
37133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Dialog widget.
37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3716151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(windows->widget.name,"Dialog",MagickPathExtent);
37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
37233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
37253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
37273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
37303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
37333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
37343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  anomaly=(LocaleCompare(action,"Background") == 0) ||
37363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (LocaleCompare(action,"New") == 0) ||
37373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (LocaleCompare(action,"Quantize") == 0) ||
37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (LocaleCompare(action,"Resize") == 0) ||
37393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (LocaleCompare(action,"Save") == 0) ||
37403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (LocaleCompare(action,"Shade") == 0);
37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
37423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
37433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
37443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
37453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
37463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
37483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
37513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=width;
37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) ((3*height) >> 1);
37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int)
37543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.width-cancel_info.width-((3*QuantumMargin) >> 1));
37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int)
37563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.height-cancel_info.height-((3*QuantumMargin) >> 1));
37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(action,&action_info);
37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.width=width;
37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.height=(unsigned int) ((3*height) >> 1);
37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.x=cancel_info.x-(cancel_info.width+QuantumMargin+
37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (action_info.bevel_width << 1));
37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.y=cancel_info.y;
37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize reply information.
37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
37663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(reply,&reply_info);
37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.raised=MagickFalse;
37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.bevel_width--;
37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.width=windows->widget.width-(3*QuantumMargin);
37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.height=height << 1;
37713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.x=(3*QuantumMargin) >> 1;
37723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.y=action_info.y-reply_info.height-QuantumMargin;
37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize option information.
37753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
37763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo("Dither",&special_info);
37773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.raised=raised;
37783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.bevel_width--;
37793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.width=(unsigned int) QuantumMargin >> 1;
37803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.height=(unsigned int) QuantumMargin >> 1;
37813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.x=reply_info.x;
37823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.y=action_info.y+action_info.height-special_info.height;
37833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(action,"Background") == 0)
37843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          special_info.text=(char *) "Backdrop";
37853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(action,"New") == 0)
37863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          special_info.text=(char *) "Gradation";
37873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(action,"Resize") == 0)
37883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          special_info.text=(char *) "Constrain ratio";
37893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(action,"Save") == 0)
37903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          special_info.text=(char *) "Non-progressive";
37913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(action,"Shade") == 0)
37923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          special_info.text=(char *) "Color shading";
37933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
37943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize text information.
37953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
37963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(query,&text_info);
37973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.width=reply_info.width;
37983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.height=height;
37993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.x=reply_info.x-(QuantumMargin >> 1);
38003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.y=QuantumMargin;
38013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.center=MagickFalse;
38023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
38033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
38043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
38053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
38063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
38073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Dialog widget.
38083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
38093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
38103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&reply_info);
38113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
38123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (anomaly)
38133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XDrawBeveledButton(display,&windows->widget,&special_info);
38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&action_info);
38153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&cancel_info);
38163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
38173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
38183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
38203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
38213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
38233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
38243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
38253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
38263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
38273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (anomaly)
38283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (MatteIsActive(special_info,event.xbutton))
38293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
38303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Option button status changed.
38323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              special_info.raised=!special_info.raised;
38343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawBeveledButton(display,&windows->widget,&special_info);
38353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
38373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(action_info,event.xbutton))
38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
38393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
38403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Action button.
38413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
38423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
38433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
38443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
38453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
38463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
38473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
38493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cancel button.
38503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
38513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
38523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
38533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
38543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
38553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
38573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.button != Button2)
38583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
38593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            static Time
38603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              click_time;
38613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
38623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
38633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move text cursor to position of button press.
38643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
38653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
38663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=1; i <= Extent(reply_info.marker); i++)
38673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (XTextWidth(font_info,reply_info.marker,i) > x)
38683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
38693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.marker+i-1;
38703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.time > (click_time+DoubleClick))
38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
38723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
38743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
38753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Become the XA_PRIMARY selection owner.
38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
38773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(primary_selection,reply_info.text,
3878151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
38793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
38803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  event.xbutton.time);
38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
38823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  windows->widget.id ? MagickTrue : MagickFalse;
38833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
38843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
38853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            click_time=event.xbutton.time;
38863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
38873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
38893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Request primary selection.
38903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
38913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
38923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.id,event.xbutton.time);
38933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
38943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
38953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
38963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
38973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
38983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
38993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MagickFalse)
39003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
39013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
39023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(action_info,event.xbutton))
39033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=ExitState;
39043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickTrue;
39053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
39063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
39073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
39083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
39093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
39103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
39113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
39123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *reply_info.text='\0';
39133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
39143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
39173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
39183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
39193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
39203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
39223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
39233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
39253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
39283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
39313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
39323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
39333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
39363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *reply_info.text='\0';
39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
39433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
39443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
39523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
39603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
39653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
39673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
39683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
39693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
39723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
39743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
39753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
39763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
3979151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static int
39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
39833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
39873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
39883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
39893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
39903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
39913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=XLookupString((XKeyEvent *) &event.xkey,command,
39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *(command+length)='\0';
39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
39973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
39983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
40013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
40023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
40033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ControlState;
40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & ControlState)
40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch ((int) key_symbol)
40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_u:
40113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_U:
40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
40133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Erase the entire line of text.
40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *reply_info.text='\0';
40173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.cursor=reply_info.text;
40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.marker=reply_info.text;
40193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
40203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
40223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
40233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
40243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XEditText(display,&reply_info,key_symbol,command,state);
40263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
40273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
40283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
40293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyRelease:
40303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
40313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
4032151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
40333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
40353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
40363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
40383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key release.
40393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
40403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
40413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
40423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
40433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
40443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state&=(~ControlState);
40463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
40473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
40483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
40493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
40503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
40513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
40523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
40533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
40543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
40553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
40573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
40583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
40593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
40603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
40613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
40623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
40633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MatteIsActive(action_info,event.xmotion))
40643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
40653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
40663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Action button status changed.
40673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
40683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=action_info.raised == MagickFalse ?
40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
40713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
40743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
40753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
40763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
40773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=cancel_info.raised == MagickFalse ?
40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
40833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
40843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionClear:
40863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
40873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.highlight=MagickFalse;
40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
40893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionNotify:
40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Atom
40943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          type;
40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
40973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          format;
40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char
41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *data;
41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4102f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        unsigned long
41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          after,
41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Obtain response from primary selection.
41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xselection.property == (Atom) None)
41103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XGetWindowProperty(display,event.xselection.requestor,
41123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &format,&length,&after,&data);
41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((status != Success) || (type != XA_STRING) || (format == 32) ||
41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (length == 0))
41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4117151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
41183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XBell(display,0);
41193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
41203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
41213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Insert primary selection in reply text.
41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *(data+length)='\0';
41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XEditText(display,&reply_info,(KeySym) XK_Insert,(char *) data,
41263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state);
41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFree((void *) data);
41303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
41323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionRequest:
41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
41343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionEvent
41353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify;
41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionRequestEvent
41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *request;
41393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reply_info.highlight == MagickFalse)
41413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Set primary selection.
41443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        request=(&(event.xselectionrequest));
41463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XChangeProperty(request->display,request->requestor,
41473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          request->property,request->target,8,PropModeReplace,
41483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned char *) primary_selection,Extent(primary_selection));
41493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.type=SelectionNotify;
41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.display=request->display;
41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.requestor=request->requestor;
41523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.selection=request->selection;
41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.target=request->target;
41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.time=request->time;
41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (request->property == None)
41563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->target;
41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
41583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->property;
41593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSendEvent(request->display,request->requestor,False,0,
41603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (XEvent *) &notify);
41613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
41633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
41663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
41693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (anomaly)
41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (special_info.raised)
41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (*reply != '\0')
41723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        raised=MagickTrue;
41733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(raised == MagickFalse);
41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
41753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
41763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
41773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
41793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
41803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
41813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X F i l e B r o w s e r W i d g e t                                       %
41823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
41843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
41853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XFileBrowserWidget() displays a File Browser widget with a file query to the
41883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  user.  The user keys a reply and presses the Action or Cancel button to
41893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  exit.  The typed text is returned as the reply function parameter.
41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
41913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XFileBrowserWidget method is:
41923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XFileBrowserWidget(Display *display,XWindows *windows,
41943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *action,char *reply)
41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
41963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
41983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
42003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
42013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
42033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o action: Specifies a pointer to the action of this widget.
42043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reply: the response from the user is returned in this parameter.
42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
42073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4208bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XFileBrowserWidget(Display *display,XWindows *windows,
42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *action,char *reply)
42103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
42123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DirectoryText  "Directory:"
42133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define FilenameText  "File name:"
42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define GrabButtonText  "Grab"
42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define FormatButtonText  "Format"
42163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define HomeButtonText  "Home"
42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define UpButtonText  "Up"
42183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
422000976d8abcff7a3bc7b986b8105dde8d091dee61cristy    *directory,
42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **filelist,
4222151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    home_directory[MagickPathExtent],
4223151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    primary_selection[MagickPathExtent],
4224151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    text[MagickPathExtent],
4225151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    working_path[MagickPathExtent];
42263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
42283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
42303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4231ecd0ab5350482e4a2ea003705e3e0b2120b66384cristy  register ssize_t
42323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
42333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static char
4235151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    glob_pattern[MagickPathExtent] = "*",
4236151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    format[MagickPathExtent] = "miff";
42373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static MagickStatusType
42393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
42403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
42423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
42433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
42453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    anomaly,
42463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
42473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_width,
42483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visible_files,
42493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
42503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4251bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delay,
42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    files,
42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
42553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
42573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
42583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
42603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
42633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
42643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    action_info,
42673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
42683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    expose_info,
42693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    special_info,
42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list_info,
42713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    home_info,
42723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    north_info,
42733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reply_info,
42743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scroll_info,
42753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info,
42763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    slider_info,
42773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    south_info,
42783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info,
42793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    up_info;
42803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
42823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
42833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
42853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Read filelist from current directory.
42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
42873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
42883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(action != (char *) NULL);
42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reply != (char *) NULL);
42913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",action);
42923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
42933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
4294151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  directory=getcwd(home_directory,MagickPathExtent);
429500976d8abcff7a3bc7b986b8105dde8d091dee61cristy  (void) directory;
4296151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(working_path,home_directory,MagickPathExtent);
42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  filelist=ListFiles(working_path,glob_pattern,&files);
42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (filelist == (char **) NULL)
42993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
43003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Directory read failed.
43023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
43033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"Unable to read directory:",working_path);
43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XDialogWidget(display,windows,action,"Enter filename:",reply);
43053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine File Browser widget attributes.
43093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
43103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_width=0;
4312bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) files; i++)
43133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,filelist[i]) > text_width)
43143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_width=WidgetTextWidth(font_info,filelist[i]);
43153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) action);
43163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,GrabButtonText) > width)
43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,GrabButtonText);
43183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,FormatButtonText) > width)
43193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,FormatButtonText);
43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,CancelButtonText) > width)
43213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,CancelButtonText);
43223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,HomeButtonText) > width)
43233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,HomeButtonText);
43243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,UpButtonText) > width)
43253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,UpButtonText);
43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=QuantumMargin;
43273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,DirectoryText) > width)
43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,DirectoryText);
43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,FilenameText) > width)
43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,FilenameText);
43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
43323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
43333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position File Browser widget.
43343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
43353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=width+MagickMin((int) text_width,(int) MaxTextWidth)+
43363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    6*QuantumMargin;
43373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
43383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
43403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int)
43413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int)
43433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
43443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
43453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
43463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
43473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
43483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map File Browser widget.
43493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
43503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(windows->widget.name,"Browse and Select a File",
4351151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    MagickPathExtent);
43523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
43563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
43573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
43583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
43593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
43603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
43613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
43623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,
43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.screen,mask,&window_changes);
43653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
43663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
43683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
43693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
43703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&slider_info);
43713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&north_info);
43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&south_info);
43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&expose_info);
43743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visible_files=0;
43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  anomaly=(LocaleCompare(action,"Composite") == 0) ||
43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (LocaleCompare(action,"Open") == 0) || (LocaleCompare(action,"Map") == 0);
43773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *reply='\0';
43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  delay=SuspendTime << 2;
43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
43803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
43833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
43853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id;
43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
43913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=width;
43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) ((3*height) >> 1);
43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int)
43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.width-cancel_info.width-QuantumMargin-2);
43953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int)
43963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.height-cancel_info.height-QuantumMargin);
43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(action,&action_info);
43983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.width=width;
43993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.height=(unsigned int) ((3*height) >> 1);
44003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
44013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (action_info.bevel_width << 1));
44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.y=cancel_info.y;
44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(GrabButtonText,&special_info);
44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.width=width;
44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.height=(unsigned int) ((3*height) >> 1);
44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.x=action_info.x-(action_info.width+(QuantumMargin >> 1)+
44073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (special_info.bevel_width << 1));
44083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        special_info.y=action_info.y;
44093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (anomaly == MagickFalse)
44103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
44113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            register char
44123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p;
44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            special_info.text=(char *) FormatButtonText;
44153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=reply+Extent(reply)-1;
44163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            while ((p > (reply+1)) && (*(p-1) != '.'))
44173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              p--;
44183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((p > (reply+1)) && (*(p-1) == '.'))
4419151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) CopyMagickString(format,p,MagickPathExtent);
44203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
44213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(UpButtonText,&up_info);
44223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        up_info.width=width;
44233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        up_info.height=(unsigned int) ((3*height) >> 1);
44243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        up_info.x=QuantumMargin;
44253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        up_info.y=((5*QuantumMargin) >> 1)+height;
44263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(HomeButtonText,&home_info);
44273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        home_info.width=width;
44283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        home_info.height=(unsigned int) ((3*height) >> 1);
44293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        home_info.x=QuantumMargin;
44303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        home_info.y=up_info.y+up_info.height+QuantumMargin;
44313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize reply information.
44333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
44343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(reply,&reply_info);
44353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.raised=MagickFalse;
44363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.bevel_width--;
44373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
44383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.height=height << 1;
44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.x=(int) (width+(QuantumMargin << 1));
44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.y=action_info.y-reply_info.height-QuantumMargin;
44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
44423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize scroll information.
44433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
44443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&scroll_info);
44453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.bevel_width--;
44463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.width=height;
44473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.height=(unsigned int)
44483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (reply_info.y-up_info.y-(QuantumMargin >> 1));
44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
44503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.y=up_info.y-reply_info.bevel_width;
44513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.raised=MagickFalse;
44523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.trough=MagickTrue;
44533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info=scroll_info;
44543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.raised=MagickTrue;
44553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.width-=(north_info.bevel_width << 1);
44563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.height=north_info.width-1;
44573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.x+=north_info.bevel_width;
44583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.y+=north_info.bevel_width;
44593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info=north_info;
44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          south_info.height;
44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=slider_info.id;
44633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info=north_info;
44643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=id;
44653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.width-=2;
44663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
44673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width+2;
44683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=scroll_info.height-((slider_info.min_y-
44693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.y+1) << 1)+4;
44703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visible_files=scroll_info.height/(height+(height >> 3));
44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (files > visible_files)
44723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(unsigned int)
44733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ((visible_files*slider_info.height)/files);
44743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
44753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
44763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.x=scroll_info.x+slider_info.bevel_width+1;
44773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
44783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info=scroll_info;
44793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
44803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize list information.
44823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
44833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&list_info);
44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.raised=MagickFalse;
44853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.bevel_width--;
44863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.width=(unsigned int)
44873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
44883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.height=scroll_info.height;
44893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.x=reply_info.x;
44903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.y=scroll_info.y;
44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
44923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state|=JumpListState;
44933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
44943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize text information.
44953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
44963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *text='\0';
44973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(text,&text_info);
44983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.center=MagickFalse;
44993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.width=reply_info.width;
45003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.height=height;
45013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.x=list_info.x-(QuantumMargin >> 1);
45023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.y=QuantumMargin;
45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize selection information.
45053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&selection_info);
45073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
45083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.width=list_info.width;
45093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.height=(unsigned int) ((9*height) >> 3);
45103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.x=list_info.x;
45113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
45123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
45133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
45143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
45153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw File Browser window.
45173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=QuantumMargin;
45193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
45213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,DirectoryText,
45223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Extent(DirectoryText));
4523151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(text_info.text,working_path,MagickPathExtent);
45243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4525151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          MagickPathExtent);
45263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ConcatenateMagickString(text_info.text,glob_pattern,
4527151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          MagickPathExtent);
45283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&up_info);
45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&home_info);
45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&list_info);
45323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
45343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
45353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
45363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=QuantumMargin;
45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,FilenameText,
45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Extent(FilenameText));
45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&reply_info);
45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
45433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&special_info);
45443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&action_info);
45453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&cancel_info);
45463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateListState)
45523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
45533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        char
45543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          **checklist;
45553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4556bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        size_t
45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          number_files;
45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
45593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update file list.
45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        checklist=ListFiles(working_path,glob_pattern,&number_files);
45633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (checklist == (char **) NULL)
45643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Reply is a filename, exit.
45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
45683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
45693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
45713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4572bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) files; i++)
45733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          filelist[i]=DestroyString(filelist[i]);
45743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (filelist != (char **) NULL)
45753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          filelist=(char **) RelinquishMagickMemory(filelist);
45763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        filelist=checklist;
45773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        files=number_files;
45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update file list.
45803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=
45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
45833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (files > visible_files)
45843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(unsigned int)
45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ((visible_files*slider_info.height)/files);
45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
45873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
45883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=0;
45893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
45903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
45913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
45923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
45933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
45953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw directory name & reply.
45963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (IsGlob(reply_info.text) == MagickFalse)
45983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
45993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *reply_info.text='\0';
46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.text;
46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4602151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(text_info.text,working_path,MagickPathExtent);
46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ConcatenateMagickString(text_info.text,DirectorySeparator,
4604151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          MagickPathExtent);
46053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ConcatenateMagickString(text_info.text,glob_pattern,
4606151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          MagickPathExtent);
46073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
46083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
46093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
46103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
46123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
46133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
46143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateListState);
46153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
46163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & JumpListState)
46173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
46183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
46193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Jump scroll to match user filename.
46203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
46213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
4622bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (i=0; i < (ssize_t) files; i++)
46233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(filelist[i],reply) >= 0)
46243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
462549e2d862ad0faa61d99d9d252f75913ad3976750cristy              list_info.id=(int)
462649e2d862ad0faa61d99d9d252f75913ad3976750cristy                (LocaleCompare(filelist[i],reply) == 0 ? i : ~0);
46273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
46283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
462949e2d862ad0faa61d99d9d252f75913ad3976750cristy        if ((i < (ssize_t) slider_info.id) ||
463049e2d862ad0faa61d99d9d252f75913ad3976750cristy            (i >= (ssize_t) (slider_info.id+visible_files)))
463149e2d862ad0faa61d99d9d252f75913ad3976750cristy          slider_info.id=(int) i-(visible_files >> 1);
46323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
46333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
46343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~JumpListState);
46353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawListState)
46373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
46383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
46393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Determine slider id and position.
46403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
46413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id >= (int) (files-visible_files))
46423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=(int) (files-visible_files);
46433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((slider_info.id < 0) || (files <= visible_files))
46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=0;
46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
46463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (files > 0)
4647dfe2b6658f367de8f84405263f62768fb853adafcristy          slider_info.y+=(int) (slider_info.id*(slider_info.max_y-
46488891f9ce489d3e61399b60436ea6c62f5ed9b887cristy            slider_info.min_y+1)/files);
46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id != selection_info.id)
46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
46513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
46523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Redraw scroll bar and file names.
46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
46543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=slider_info.id;
46553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=list_info.y+(height >> 3)+2;
465649e2d862ad0faa61d99d9d252f75913ad3976750cristy            for (i=0; i < (ssize_t) visible_files; i++)
46573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
465849e2d862ad0faa61d99d9d252f75913ad3976750cristy              selection_info.raised=(int) (slider_info.id+i) != list_info.id ?
46593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                MagickTrue : MagickFalse;
46603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.text=(char *) NULL;
4661bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              if ((slider_info.id+i) < (ssize_t) files)
46623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                selection_info.text=filelist[slider_info.id+i];
46633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawWidgetText(display,&windows->widget,&selection_info);
46643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.y+=(int) selection_info.height;
46653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
46673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Update slider.
46683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
46693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > expose_info.y)
46703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
46713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) slider_info.y-expose_info.y;
46723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y-expose_info.height-
46733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width-1;
46743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
46753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
46763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
46773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) expose_info.y-slider_info.y;
46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y+slider_info.height+
46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width+1;
46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
46813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
46823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatte(display,&windows->widget,&expose_info);
46833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&slider_info);
46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
46853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            expose_info.y=slider_info.y;
46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
46873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawListState);
46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
46893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
46903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
46923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (north_info.raised && south_info.raised)
46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
46943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
46963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Brief delay before advancing scroll bar.
46983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDelay(display,delay);
47003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        delay=SuspendTime;
47013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCheckIfEvent(display,&event,XScreenEvent,(char *) windows);
47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
47033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
47043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
47053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
47063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
47073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
47083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
47093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
47103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
47113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
471249e2d862ad0faa61d99d9d252f75913ad3976750cristy          if (slider_info.id < (int) files)
47133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
47143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
47153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
47163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
47173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
47183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
47193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
47203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.type != ButtonRelease)
47213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
47223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
47233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
47243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
47263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(slider_info,event.xbutton))
47283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
47293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
47303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Track slider.
47313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
47323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickTrue;
47333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
47343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(north_info,event.xbutton))
47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
47393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
47403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
47413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              north_info.raised=MagickFalse;
47423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
47433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
47443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
47453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
47463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(south_info,event.xbutton))
474749e2d862ad0faa61d99d9d252f75913ad3976750cristy          if (slider_info.id < (int) files)
47483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
47493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
47503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
47513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
47523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              south_info.raised=MagickFalse;
47533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
47543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
47553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
47563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
47573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(scroll_info,event.xbutton))
47583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
47593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
47613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
47623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.y < slider_info.y)
47633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id-=(visible_files-1);
47643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
47653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id+=(visible_files-1);
47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
47673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
47683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
47693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(list_info,event.xbutton))
47703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
47713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
47723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              id;
47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
47743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
47753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed file matte.
47763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
47773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            id=slider_info.id+(event.xbutton.y-(list_info.y+(height >> 1))+1)/
47783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.height;
477949e2d862ad0faa61d99d9d252f75913ad3976750cristy            if (id >= (int) files)
47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
4781151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(reply_info.text,filelist[id],MagickPathExtent);
47823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.highlight=MagickFalse;
47833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.marker=reply_info.text;
47843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.text+Extent(reply_info.text);
47853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
47863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id == list_info.id)
47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register char
47893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *p;
47903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
47913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                p=reply_info.text+strlen(reply_info.text)-1;
47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (*p == *DirectorySeparator)
47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ChopPathComponents(reply_info.text,1);
47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ConcatenateMagickString(working_path,DirectorySeparator,
4795151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ConcatenateMagickString(working_path,reply_info.text,
4797151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *reply='\0';
47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=UpdateListState;
48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
48013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=(~0);
48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            list_info.id=id;
48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(up_info,event.xbutton))
48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Up button.
48103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            up_info.raised=MagickFalse;
48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&up_info);
48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(home_info,event.xbutton))
48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Home button.
48193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
48203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            home_info.raised=MagickFalse;
48213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&home_info);
48223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(special_info,event.xbutton))
48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Special button.
48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
48293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            special_info.raised=MagickFalse;
48303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&special_info);
48313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(action_info,event.xbutton))
48343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed action button.
48373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
48393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
48403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
48433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cancel button.
48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
48473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
48483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
48493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
48523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
48533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.button != Button2)
48543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            static Time
48563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              click_time;
48573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
48583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move text cursor to position of button press.
48603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
48613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
486249e2d862ad0faa61d99d9d252f75913ad3976750cristy            for (i=1; i <= (ssize_t) Extent(reply_info.marker); i++)
486349e2d862ad0faa61d99d9d252f75913ad3976750cristy              if (XTextWidth(font_info,reply_info.marker,(int) i) > x)
48643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
48653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.marker+i-1;
48663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.time > (click_time+DoubleClick))
48673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
48683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
48693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
48703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Become the XA_PRIMARY selection owner.
48723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(primary_selection,reply_info.text,
4874151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
48753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
48763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  event.xbutton.time);
48773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
48783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  windows->widget.id ? MagickTrue : MagickFalse;
48793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
48803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
48813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            click_time=event.xbutton.time;
48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
48833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Request primary selection.
48863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
48873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
48883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.id,event.xbutton.time);
48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
48903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
48923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
48933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
48943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
48963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
48973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released up button.
48993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
49003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
49013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            north_info.raised=MagickTrue;
49023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
49033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
49073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released down button.
49083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
49093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
49103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            south_info.raised=MagickTrue;
49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
49123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
49143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
49163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Stop tracking slider.
49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickFalse;
49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
49203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (up_info.raised == MagickFalse)
49223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(up_info,event.xbutton))
49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
49263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ChopPathComponents(working_path,1);
49273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (*working_path == '\0')
49283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    (void) CopyMagickString(working_path,DirectorySeparator,
4929151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                      MagickPathExtent);
49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=UpdateListState;
49313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            up_info.raised=MagickTrue;
49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&up_info);
49343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (home_info.raised == MagickFalse)
49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(home_info,event.xbutton))
49393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
49403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(working_path,home_directory,
4941151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    MagickPathExtent);
49423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=UpdateListState;
49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            home_info.raised=MagickTrue;
49453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&home_info);
49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (special_info.raised == MagickFalse)
49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (anomaly == MagickFalse)
49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                char
49523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  **formats;
49533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ExceptionInfo
49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *exception;
49563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4957bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                size_t
49583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  number_formats;
49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Let user select image format.
49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
49633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                exception=AcquireExceptionInfo();
49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                formats=GetMagickList("*",&number_formats,exception);
49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                exception=DestroyExceptionInfo(exception);
49663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XCheckDefineCursor(display,windows->widget.id,
49673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  windows->widget.busy_cursor);
49683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                windows->popup.x=windows->widget.x+60;
49693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                windows->popup.y=windows->widget.y+60;
49703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XListBrowserWidget(display,windows,&windows->popup,
49713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (const char **) formats,"Select","Select image format type:",
49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  format);
49733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XSetCursorState(display,windows,MagickTrue);
49743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XCheckDefineCursor(display,windows->widget.id,
49753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  windows->widget.cursor);
49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                LocaleLower(format);
49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                AppendImageFormat(format,reply_info.text);
49783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                reply_info.cursor=reply_info.text+Extent(reply_info.text);
49793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDrawMatteText(display,&windows->widget,&reply_info);
49803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                special_info.raised=MagickTrue;
49813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDrawBeveledButton(display,&windows->widget,&special_info);
498249e2d862ad0faa61d99d9d252f75913ad3976750cristy                for (i=0; i < (ssize_t) number_formats; i++)
49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  formats[i]=DestroyString(formats[i]);
49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                formats=(char **) RelinquishMagickMemory(formats);
49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
49863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
49873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
49883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(special_info,event.xbutton))
49893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
4990151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  (void) CopyMagickString(working_path,"x:",MagickPathExtent);
49913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
49923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            special_info.raised=MagickTrue;
49943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&special_info);
49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
49963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MagickFalse)
49973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
49983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
49993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (MatteIsActive(action_info,event.xbutton))
50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
50023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*reply_info.text == '\0')
50033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (void) XBell(display,0);
50043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
50053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      state|=ExitState;
50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
50073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickTrue;
50093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
50103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
50113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
50123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
50133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
50153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
50163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *reply_info.text='\0';
50173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *reply='\0';
50183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
50203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
50223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
50233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
50243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
50253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
50263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
50283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
50293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
50303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
50313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
50333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
50343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
50363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
50373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
50393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
50413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *reply_info.text='\0';
50433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
50453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
50463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
50483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
50493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
50503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
50533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
50543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
50573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
50603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
50643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
50673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
50713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
50723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
50753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
50773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
50803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
5084151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
50853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static int
50873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
50883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
50903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
50913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
50933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
50943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
50953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
50963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
50973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=XLookupString((XKeyEvent *) &event.xkey,command,
50983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
50993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *(command+length)='\0';
51003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (AreaIsActive(scroll_info,event.xkey))
51013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
51023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
51033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
51043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
51053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            switch ((int) key_symbol)
51063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Home:
51083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Home:
51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=0;
51113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
51123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Up:
51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Up:
51153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id--;
51173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
51183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Down:
51203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Down:
51213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id++;
51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
51243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Prior:
51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Prior:
51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id-=visible_files;
51293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Next:
51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Next:
51333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id+=visible_files;
51353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_End:
51383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_End:
51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=(int) files;
51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
51423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
51443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
51463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
51483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
51493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
51503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Read new directory or glob patterm.
51513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*reply_info.text == '\0')
51533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
51543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (IsGlob(reply_info.text))
51553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) CopyMagickString(glob_pattern,reply_info.text,
5156151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                MagickPathExtent);
51573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
51583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
51593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ConcatenateMagickString(working_path,DirectorySeparator,
5160151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
51613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ConcatenateMagickString(working_path,reply_info.text,
5162151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
51633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (*working_path == '~')
51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ExpandFilename(working_path);
51653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *reply='\0';
51663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=UpdateListState;
51683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
51693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
51703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
51713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
51723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ControlState;
51733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
51743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
51753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & ControlState)
51763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch ((int) key_symbol)
51773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
51783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_u:
51793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_U:
51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
51813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
51823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Erase the entire line of text.
51833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
51843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *reply_info.text='\0';
51853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.cursor=reply_info.text;
51863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.marker=reply_info.text;
51873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
51893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
51903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
51913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
51923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
51933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XEditText(display,&reply_info,key_symbol,command,state);
51943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
51953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=JumpListState;
51963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
51973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
51983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyRelease:
51993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
52003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
5201151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
52023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
52033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
52043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
52053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
52073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key release.
52083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
52093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
52103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
52123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
52133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state&=(~ControlState);
52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
52163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
52183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
52203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
52213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
52223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
52233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
52243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MapNotify:
52253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
52263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWX);
52273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWY);
52283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
52303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
52313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
52333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
52343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
52353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
52363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
52373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
52393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider matte.
52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
52413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.y=event.xmotion.y-
52423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((slider_info.height+slider_info.bevel_width) >> 1)+1;
52433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y < slider_info.min_y)
52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.min_y;
52453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > slider_info.max_y)
52463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.max_y;
52473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id=0;
52483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y != slider_info.min_y)
52493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id=(int) ((files*(slider_info.y-slider_info.min_y+1))/
52503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (slider_info.max_y-slider_info.min_y+1));
52513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
52533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
52543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
52553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
52563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (up_info.raised == MatteIsActive(up_info,event.xmotion))
52573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
52583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Up button status changed.
52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
52613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            up_info.raised=!up_info.raised;
52623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&up_info);
52633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
52643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (home_info.raised == MatteIsActive(home_info,event.xmotion))
52663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Home button status changed.
52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
52703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            home_info.raised=!home_info.raised;
52713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&home_info);
52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
52743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (special_info.raised == MatteIsActive(special_info,event.xmotion))
52753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
52763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
52773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Grab button status changed.
52783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
52793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            special_info.raised=!special_info.raised;
52803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&special_info);
52813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
52833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MatteIsActive(action_info,event.xmotion))
52843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
52853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Action button status changed.
52873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
52883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=action_info.raised == MagickFalse ?
52893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
52903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
52913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
52923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
52933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
52943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
52953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
52963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
52973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
52983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=cancel_info.raised == MagickFalse ?
52993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
53013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
53043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
53053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionClear:
53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
53073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.highlight=MagickFalse;
53083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
53103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
53113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionNotify:
53123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Atom
53143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          type;
53153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
53173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          format;
53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char
53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *data;
53213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5322f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        unsigned long
53233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          after,
53243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
53253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Obtain response from primary selection.
53283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xselection.property == (Atom) None)
53303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
53313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XGetWindowProperty(display,event.xselection.requestor,
53323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &format,&length,&after,&data);
53343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((status != Success) || (type != XA_STRING) || (format == 32) ||
53353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (length == 0))
53363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
5337151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
53383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XBell(display,0);
53393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
53423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Insert primary selection in reply text.
53433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
53443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *(data+length)='\0';
53453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XEditText(display,&reply_info,(KeySym) XK_Insert,(char *) data,
53463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state);
53473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
53483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=JumpListState;
53493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawActionState;
53503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
53513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFree((void *) data);
53523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
53533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
53543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionRequest:
53553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
53563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionEvent
53573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify;
53583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionRequestEvent
53603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *request;
53613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
53623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reply_info.highlight == MagickFalse)
53633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Set primary selection.
53663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
53673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        request=(&(event.xselectionrequest));
53683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XChangeProperty(request->display,request->requestor,
53693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          request->property,request->target,8,PropModeReplace,
53703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned char *) primary_selection,Extent(primary_selection));
53713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.type=SelectionNotify;
53723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.display=request->display;
53733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.requestor=request->requestor;
53743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.selection=request->selection;
53753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.target=request->target;
53763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.time=request->time;
53773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (request->property == None)
53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->target;
53793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
53803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->property;
53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSendEvent(request->display,request->requestor,False,0,
53823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (XEvent *) &notify);
53833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
53843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
53853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
53863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
53873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
53883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
53893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
53903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
53923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free file list.
53933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5394bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) files; i++)
53953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filelist[i]=DestroyString(filelist[i]);
53963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (filelist != (char **) NULL)
53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filelist=(char **) RelinquishMagickMemory(filelist);
53983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*reply != '\0')
53993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
54003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ConcatenateMagickString(working_path,DirectorySeparator,
5401151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
5402151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(working_path,reply,MagickPathExtent);
54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5404151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(reply,working_path,MagickPathExtent);
54053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*reply == '~')
54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ExpandFilename(reply);
54073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
54083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X F o n t B r o w s e r W i d g e t                                       %
54153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
54183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XFontBrowserWidget() displays a Font Browser widget with a font query to the
54213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  user.  The user keys a reply and presses the Action or Cancel button to
54223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  exit.  The typed text is returned as the reply function parameter.
54233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XFontBrowserWidget method is:
54253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XFontBrowserWidget(Display *display,XWindows *windows,
54273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *action,char *reply)
54283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
54323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
54333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
54353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o action: Specifies a pointer to the action of this widget.
54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reply: the response from the user is returned in this parameter.
54393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
54413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
54443ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
54453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
54463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54473ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int FontCompare(const void *x,const void *y)
54483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
54493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register char
54503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
54513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
54523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=(char *) *((char **) x);
54543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=(char *) *((char **) y);
54553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while ((*p != '\0') && (*q != '\0') && (*p == *q))
54563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p++;
54583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q++;
54593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(*p-(*q));
54613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
54623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
54643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
54663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5467bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XFontBrowserWidget(Display *display,XWindows *windows,
54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *action,char *reply)
54693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BackButtonText  "Back"
54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
54723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define FontnameText  "Name:"
54733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define FontPatternText  "Pattern:"
54743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ResetButtonText  "Reset"
54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
5477151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    back_pattern[MagickPathExtent],
54783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **fontlist,
54793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **listhead,
5480151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    primary_selection[MagickPathExtent],
5481151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    reset_pattern[MagickPathExtent],
5482151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    text[MagickPathExtent];
54833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
54853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fonts,
54863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
54873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
54903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
54913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static char
5493151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    glob_pattern[MagickPathExtent] = "*";
54943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static MagickStatusType
54963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
54983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
55003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
55023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
55033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_width,
55043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visible_fonts,
55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
55063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5507bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
55083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delay,
55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
55103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
55123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
55133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
55163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
55183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
55193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
55213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    action_info,
55223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    back_info,
55233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
55243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    expose_info,
55253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list_info,
55263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mode_info,
55273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    north_info,
55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reply_info,
55293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reset_info,
55303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scroll_info,
55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info,
55323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    slider_info,
55333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    south_info,
55343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info;
55353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
55373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
55393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Get font list and sort in ascending order.
55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
55433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
55443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(action != (char *) NULL);
55453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reply != (char *) NULL);
55463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",action);
55473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
5549151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(back_pattern,glob_pattern,MagickPathExtent);
5550151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(reset_pattern,"*",MagickPathExtent);
55513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist=XListFonts(display,glob_pattern,32767,&fonts);
55523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (fonts == 0)
55533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
55543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
55553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Pattern failed, obtain all the fonts.
55563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
55573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"Unable to obtain fonts names:",
55583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        glob_pattern);
5559151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) CopyMagickString(glob_pattern,"*",MagickPathExtent);
55603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fontlist=XListFonts(display,glob_pattern,32767,&fonts);
55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (fontlist == (char **) NULL)
55623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
55633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XNoticeWidget(display,windows,"Unable to obtain fonts names:",
55643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            glob_pattern);
55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return;
55663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
55673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
55683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Sort font list in ascending order.
55703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  listhead=fontlist;
55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist=(char **) AcquireQuantumMemory((size_t) fonts,sizeof(*fontlist));
55733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (fontlist == (char **) NULL)
55743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
55753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"MemoryAllocationFailed",
55763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        "UnableToViewFonts");
55773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
55783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
55793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < fonts; i++)
55803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fontlist[i]=listhead[i];
55813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  qsort((void *) fontlist,(size_t) fonts,sizeof(*fontlist),FontCompare);
55823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
55833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Font Browser widget attributes.
55843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
55853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
55863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_width=0;
55873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < fonts; i++)
55883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,fontlist[i]) > text_width)
55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_width=WidgetTextWidth(font_info,fontlist[i]);
55903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) action);
55913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,CancelButtonText) > width)
55923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,CancelButtonText);
55933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,ResetButtonText) > width)
55943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,ResetButtonText);
55953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,BackButtonText) > width)
55963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,BackButtonText);
55973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=QuantumMargin;
55983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,FontPatternText) > width)
55993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,FontPatternText);
56003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,FontnameText) > width)
56013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,FontnameText);
56023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
56033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
56043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Font Browser widget.
56053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
56063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=width+MagickMin((int) text_width,(int) MaxTextWidth)+
56073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    6*QuantumMargin;
56083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=width+MinTextWidth+4*QuantumMargin;
56093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
56113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int)
56123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((85*height) >> 2)+((13*QuantumMargin) >> 1)+4);
56133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int)
56143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((27*height) >> 1)+((13*QuantumMargin) >> 1)+4);
56153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
56163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
56173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
56183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
56193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Font Browser widget.
56203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(windows->widget.name,"Browse and Select a Font",
5622151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    MagickPathExtent);
56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
56243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
56253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
56263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
56273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
56283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
56293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
56303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
56313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,
56353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.screen,mask,&window_changes);
56363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
56373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
56383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
56393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
56403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
56413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&slider_info);
56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&north_info);
56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&south_info);
56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&expose_info);
564501220742d150e5f10a5cdcfd1e7283daddea241bCristy  XGetWidgetInfo((char *) NULL,&selection_info);
56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visible_fonts=0;
56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  delay=SuspendTime << 2;
56483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
56493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
56503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
56523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
56533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
56543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id;
56553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
56563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
56573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
56583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
56593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=width;
56613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) ((3*height) >> 1);
56623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int)
56633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.width-cancel_info.width-QuantumMargin-2);
56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int)
56653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.height-cancel_info.height-QuantumMargin);
56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(action,&action_info);
56673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.width=width;
56683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.height=(unsigned int) ((3*height) >> 1);
56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
56703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (action_info.bevel_width << 1));
56713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.y=cancel_info.y;
56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(BackButtonText,&back_info);
56733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        back_info.width=width;
56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        back_info.height=(unsigned int) ((3*height) >> 1);
56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        back_info.x=QuantumMargin;
56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        back_info.y=((5*QuantumMargin) >> 1)+height;
56773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(ResetButtonText,&reset_info);
56783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.width=width;
56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.height=(unsigned int) ((3*height) >> 1);
56803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.x=QuantumMargin;
56813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reset_info.y=back_info.y+back_info.height+QuantumMargin;
56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
56833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize reply information.
56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(reply,&reply_info);
56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.raised=MagickFalse;
56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.bevel_width--;
56883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.width=windows->widget.width-width-((6*QuantumMargin) >> 1);
56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.height=height << 1;
56903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.x=(int) (width+(QuantumMargin << 1));
56913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.y=action_info.y-(action_info.height << 1)-QuantumMargin;
56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
56933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize mode information.
56943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
56953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(reply,&mode_info);
56963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.bevel_width=0;
56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.width=(unsigned int)
56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (action_info.x-reply_info.x-QuantumMargin);
56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.height=action_info.height << 1;
57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.x=reply_info.x;
57013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mode_info.y=action_info.y-action_info.height+action_info.bevel_width;
57023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize scroll information.
57043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&scroll_info);
57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.bevel_width--;
57073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.width=height;
57083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.height=(unsigned int)
57093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (reply_info.y-back_info.y-(QuantumMargin >> 1));
57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.y=back_info.y-reply_info.bevel_width;
57123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.raised=MagickFalse;
57133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.trough=MagickTrue;
57143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info=scroll_info;
57153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.raised=MagickTrue;
57163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.width-=(north_info.bevel_width << 1);
57173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.height=north_info.width-1;
57183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.x+=north_info.bevel_width;
57193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.y+=north_info.bevel_width;
57203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info=north_info;
57213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
57223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          south_info.height;
57233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=slider_info.id;
57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info=north_info;
57253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=id;
57263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.width-=2;
57273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
57283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width+2;
57293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=scroll_info.height-((slider_info.min_y-
57303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.y+1) << 1)+4;
57313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visible_fonts=scroll_info.height/(height+(height >> 3));
57323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (fonts > (int) visible_fonts)
57333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(visible_fonts*slider_info.height)/fonts;
57343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
57353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
57363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.x=scroll_info.x+slider_info.bevel_width+1;
57373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
57383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info=scroll_info;
57393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
57403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize list information.
57423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&list_info);
57443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.raised=MagickFalse;
57453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.bevel_width--;
57463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.width=(unsigned int)
57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
57483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.height=scroll_info.height;
57493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.x=reply_info.x;
57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.y=scroll_info.y;
57513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state|=JumpListState;
57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize text information.
57553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *text='\0';
57573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(text,&text_info);
57583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.center=MagickFalse;
57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.width=reply_info.width;
57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.height=height;
57613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.x=list_info.x-(QuantumMargin >> 1);
57623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.y=QuantumMargin;
57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize selection information.
57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&selection_info);
57673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.width=list_info.width;
57693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.height=(unsigned int) ((9*height) >> 3);
57703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.x=list_info.x;
57713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
57723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
57733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
57763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Font Browser window.
57773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
57783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=QuantumMargin;
57793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=text_info.y+((text_info.height-height) >> 1)+font_info->ascent;
57803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
57813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,FontPatternText,
57823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Extent(FontPatternText));
5783151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
57843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
57853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&back_info);
57863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&reset_info);
57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&list_info);
57883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
57893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
57903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
57913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
57923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=QuantumMargin;
57933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=reply_info.y+((reply_info.height-height) >> 1)+font_info->ascent;
57943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
57953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,FontnameText,
57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Extent(FontnameText));
57973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&reply_info);
57983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
57993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&action_info);
58003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&cancel_info);
58013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
58023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
58033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawActionState;
58043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
58053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
58063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
58073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateListState)
58083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
58093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        char
58103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          **checklist;
58113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
58133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          number_fonts;
58143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
58153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
58163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update font list.
58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
58183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        checklist=XListFonts(display,glob_pattern,32767,&number_fonts);
58193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (checklist == (char **) NULL)
58203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
58213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((strchr(glob_pattern,'*') == (char *) NULL) &&
58223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (strchr(glob_pattern,'?') == (char *) NULL))
58233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
58243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
58253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Might be a scaleable font-- exit.
58263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
5827151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                (void) CopyMagickString(reply,glob_pattern,MagickPathExtent);
5828151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                (void) CopyMagickString(glob_pattern,back_pattern,MagickPathExtent);
58293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                action_info.raised=MagickFalse;
58303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDrawBeveledButton(display,&windows->widget,&action_info);
58313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
58323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
5833151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(glob_pattern,back_pattern,MagickPathExtent);
58343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XBell(display,0);
58353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
58363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
58373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (number_fonts == 1)
58383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
58393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
58403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Reply is a single font name-- exit.
58413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
5842151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) CopyMagickString(reply,checklist[0],MagickPathExtent);
5843151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) CopyMagickString(glob_pattern,back_pattern,MagickPathExtent);
58443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XFreeFontNames(checklist);
58453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              action_info.raised=MagickFalse;
58463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawBeveledButton(display,&windows->widget,&action_info);
58473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
58483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
58493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
58503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
58513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XFreeFontNames(listhead);
58523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              fontlist=(char **) RelinquishMagickMemory(fontlist);
58533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              fontlist=checklist;
58543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              fonts=number_fonts;
58553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
58563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
58573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Sort font list in ascending order.
58583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
58593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        listhead=fontlist;
58603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fontlist=(char **) AcquireQuantumMemory((size_t) fonts,
58613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sizeof(*fontlist));
58623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (fontlist == (char **) NULL)
58633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
58643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XNoticeWidget(display,windows,"MemoryAllocationFailed",
58653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              "UnableToViewFonts");
58663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return;
58673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
58683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < fonts; i++)
58693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          fontlist[i]=listhead[i];
58703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        qsort((void *) fontlist,(size_t) fonts,sizeof(*fontlist),FontCompare);
58713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=
58723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.height-((slider_info.min_y-scroll_info.y+1) << 1)+1;
58733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (fonts > (int) visible_fonts)
58743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(visible_fonts*slider_info.height)/fonts;
58753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
58763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
58773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=0;
58783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
58793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
58803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
58813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
58823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
58833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
58843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw font name & reply.
58853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
58863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *reply_info.text='\0';
58873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.cursor=reply_info.text;
5888151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(text_info.text,glob_pattern,MagickPathExtent);
58893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&text_info);
58903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
58913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
58923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
58933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
58943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
58953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
58963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateListState);
58973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
58983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & JumpListState)
58993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
59003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
59013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Jump scroll to match user font.
59023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
59033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
59043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < fonts; i++)
59053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (LocaleCompare(fontlist[i],reply) >= 0)
59063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
59073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              list_info.id=LocaleCompare(fontlist[i],reply) == 0 ? i : ~0;
59083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
59093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
59103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((i < slider_info.id) || (i >= (int) (slider_info.id+visible_fonts)))
59113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=i-(visible_fonts >> 1);
59123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
59133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
59143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~JumpListState);
59153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
59163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawListState)
59173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
59183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
59193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Determine slider id and position.
59203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
59213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id >= (int) (fonts-visible_fonts))
59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=fonts-visible_fonts;
59233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((slider_info.id < 0) || (fonts <= (int) visible_fonts))
59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=0;
59253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
59263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (fonts > 0)
59273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.y+=
59283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id*(slider_info.max_y-slider_info.min_y+1)/fonts;
59293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id != selection_info.id)
59303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
59313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Redraw scroll bar and file names.
59333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
59343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=slider_info.id;
59353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=list_info.y+(height >> 3)+2;
59363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < (int) visible_fonts; i++)
59373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
59383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.raised=(slider_info.id+i) != list_info.id ?
59393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                MagickTrue : MagickFalse;
59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.text=(char *) NULL;
59413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if ((slider_info.id+i) < fonts)
59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                selection_info.text=fontlist[slider_info.id+i];
59433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawWidgetText(display,&windows->widget,&selection_info);
59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.y+=(int) selection_info.height;
59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
59463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
59473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Update slider.
59483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
59493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > expose_info.y)
59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) slider_info.y-expose_info.y;
59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y-expose_info.height-
59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width-1;
59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
59553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
59563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
59573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) expose_info.y-slider_info.y;
59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y+slider_info.height+
59593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width+1;
59603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
59623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatte(display,&windows->widget,&expose_info);
59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&slider_info);
59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            expose_info.y=slider_info.y;
59663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
59673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawListState);
59683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
59693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawActionState)
59703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
59713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XFontStruct
59723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *save_info;
59733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
59743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
59753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Display the selected font in a drawing area.
59763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        save_info=windows->widget.font_info;
59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        font_info=XLoadQueryFont(display,reply_info.text);
59793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (font_info != (XFontStruct *) NULL)
59803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
59813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->widget.font_info=font_info;
59823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFont(display,windows->widget.widget_context,
59833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              font_info->fid);
59843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
59853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&mode_info);
59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.font_info=save_info;
59873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (font_info != (XFontStruct *) NULL)
59883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFont(display,windows->widget.widget_context,
59903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              windows->widget.font_info->fid);
59913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XFreeFont(display,font_info);
59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
59933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
59943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawActionState);
59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
59973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
59983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
59993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (north_info.raised && south_info.raised)
60013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
60023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
60033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Brief delay before advancing scroll bar.
60063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDelay(display,delay);
60083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        delay=SuspendTime;
60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCheckIfEvent(display,&event,XScreenEvent,(char *) windows);
60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
60113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
60123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
60143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
60153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
60163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
60173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
60203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id < fonts)
60213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
60243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
60263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
60273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.type != ButtonRelease)
60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
60303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
60323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
60333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
60343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
60353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(slider_info,event.xbutton))
60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
60373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
60383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Track slider.
60393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
60403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickTrue;
60413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
60423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
60433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(north_info,event.xbutton))
60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
60453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
60473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              north_info.raised=MagickFalse;
60503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
60513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
60523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(south_info,event.xbutton))
60553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id < fonts)
60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
60573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              south_info.raised=MagickFalse;
60613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
60643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
60653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(scroll_info,event.xbutton))
60663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
60673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
60683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
60693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
60703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.y < slider_info.y)
60713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id-=(visible_fonts-1);
60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
60733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id+=(visible_fonts-1);
60743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
60753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
60763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
60773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(list_info,event.xbutton))
60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
60803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              id;
60813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
60823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed list matte.
60843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            id=slider_info.id+(event.xbutton.y-(list_info.y+(height >> 1))+1)/
60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.height;
60873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id >= (int) fonts)
60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6089151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(reply_info.text,fontlist[id],MagickPathExtent);
60903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.highlight=MagickFalse;
60913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.marker=reply_info.text;
60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.text+Extent(reply_info.text);
60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawActionState;
60953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id == list_info.id)
60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(glob_pattern,reply_info.text,
6098151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=UpdateListState;
61003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=(~0);
61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            list_info.id=id;
61033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
61043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
61053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(back_info,event.xbutton))
61073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Back button.
61103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
61113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            back_info.raised=MagickFalse;
61123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&back_info);
61133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reset_info,event.xbutton))
61163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Reset button.
61193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reset_info.raised=MagickFalse;
61213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&reset_info);
61223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(action_info,event.xbutton))
61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed action button.
61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
61293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
61313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
61323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
61343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cancel button.
61373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
61383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
61393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
61403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
61433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
61443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.button != Button2)
61453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            static Time
61473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              click_time;
61483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
61493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move text cursor to position of button press.
61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
61523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
61533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=1; i <= Extent(reply_info.marker); i++)
61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (XTextWidth(font_info,reply_info.marker,i) > x)
61553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
61563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.marker+i-1;
61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.time > (click_time+DoubleClick))
61583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
61593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
61623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Become the XA_PRIMARY selection owner.
61633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(primary_selection,reply_info.text,
6165151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
61663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  event.xbutton.time);
61683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
61693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  windows->widget.id ? MagickTrue : MagickFalse;
61703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
61713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
61723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            click_time=event.xbutton.time;
61733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
61743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
61763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Request primary selection.
61773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
61783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
61793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.id,event.xbutton.time);
61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
61823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
61833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
61843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
61873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released up button.
61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
61913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            north_info.raised=MagickTrue;
61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
61943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
61963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
61973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released down button.
61993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
62003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            south_info.raised=MagickTrue;
62023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
62033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
62073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Stop tracking slider.
62083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
62093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickFalse;
62103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
62113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (back_info.raised == MagickFalse)
62133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(back_info,event.xbutton))
62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CopyMagickString(glob_pattern,back_pattern,
6218151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                    MagickPathExtent);
62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=UpdateListState;
62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            back_info.raised=MagickTrue;
62223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&back_info);
62233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reset_info.raised == MagickFalse)
62253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
62273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(reset_info,event.xbutton))
62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6229151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  (void) CopyMagickString(back_pattern,glob_pattern,MagickPathExtent);
6230151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  (void) CopyMagickString(glob_pattern,reset_pattern,MagickPathExtent);
62313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=UpdateListState;
62323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reset_info.raised=MagickTrue;
62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&reset_info);
62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MagickFalse)
62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
62393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
62403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (MatteIsActive(action_info,event.xbutton))
62413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*reply_info.text == '\0')
62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (void) XBell(display,0);
62443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
62453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      state|=ExitState;
62463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
62473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
62483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickTrue;
62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
62523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
62543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
62553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
62563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *reply_info.text='\0';
62573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
62583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
62593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
62613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
62633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
62643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
62653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
62673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
62683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
62693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
62703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
62743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
62753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
62763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
62783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
62803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
62813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *reply_info.text='\0';
62823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
62853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
62863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
62933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
62953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
62963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
62983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
62993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
63003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
63013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
63023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
63053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
63063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
63073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
63083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
63093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
63103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
63113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
63123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
63133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
63143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
63153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
63163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
63173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
63183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
63193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
63203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
63213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
63223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
6323151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
63243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static int
63263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
63273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
63293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
63303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
63313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
63323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
63333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
63343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
63353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
63363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=XLookupString((XKeyEvent *) &event.xkey,command,
63373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
63383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *(command+length)='\0';
63393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (AreaIsActive(scroll_info,event.xkey))
63403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
63413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
63423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
63433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            switch ((int) key_symbol)
63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Home:
63473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Home:
63483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=0;
63503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
63513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Up:
63533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Up:
63543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id--;
63563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
63573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Down:
63593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Down:
63603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id++;
63623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
63633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Prior:
63653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Prior:
63663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id-=visible_fonts;
63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
63693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Next:
63713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Next:
63723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id+=visible_fonts;
63743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
63753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_End:
63773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_End:
63783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
63793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=fonts;
63803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
63813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
63823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
63843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
63853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
63863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
63873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
63883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
63893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Read new font or glob patterm.
63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
63913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*reply_info.text == '\0')
63923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6393151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(back_pattern,glob_pattern,MagickPathExtent);
6394151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(glob_pattern,reply_info.text,MagickPathExtent);
63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=UpdateListState;
63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
63973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
63983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
63993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
64003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ControlState;
64013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
64023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & ControlState)
64043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch ((int) key_symbol)
64053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
64063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_u:
64073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_U:
64083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
64093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
64103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Erase the entire line of text.
64113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
64123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *reply_info.text='\0';
64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.cursor=reply_info.text;
64143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.marker=reply_info.text;
64153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
64163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
64173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
64183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
64193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
64203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
64213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XEditText(display,&reply_info,key_symbol,command,state);
64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
64233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=JumpListState;
64243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
64253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyRelease:
64273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
64283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
6429151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
64303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
64323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
64333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
64343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key release.
64363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
64373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
64383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
64403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
64413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
64423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state&=(~ControlState);
64433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
64443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
64463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
64473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
64503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
64513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MapNotify:
64533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
64543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWX);
64553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWY);
64563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
64573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
64583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
64593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
64603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
64613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
64623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
64633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
64643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
64653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
64663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
64673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider matte.
64683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
64693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.y=event.xmotion.y-
64703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((slider_info.height+slider_info.bevel_width) >> 1)+1;
64713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y < slider_info.min_y)
64723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.min_y;
64733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > slider_info.max_y)
64743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.max_y;
64753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id=0;
64763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y != slider_info.min_y)
64773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id=(fonts*(slider_info.y-slider_info.min_y+1))/
64783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (slider_info.max_y-slider_info.min_y+1);
64793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
64803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
64813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
64823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
64833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
64843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (back_info.raised == MatteIsActive(back_info,event.xmotion))
64853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
64863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
64873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Back button status changed.
64883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
64893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            back_info.raised=!back_info.raised;
64903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&back_info);
64913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
64923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
64933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reset_info.raised == MatteIsActive(reset_info,event.xmotion))
64943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
64953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
64963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Reset button status changed.
64973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
64983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reset_info.raised=!reset_info.raised;
64993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&reset_info);
65003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
65013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
65023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MatteIsActive(action_info,event.xmotion))
65033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
65043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
65053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Action button status changed.
65063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
65073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=action_info.raised == MagickFalse ?
65083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
65093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&action_info);
65103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
65113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
65123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
65133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
65143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
65153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
65163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
65173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=cancel_info.raised == MagickFalse ?
65183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
65193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
65203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
65213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
65223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
65233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
65243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionClear:
65253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
65263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.highlight=MagickFalse;
65273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,&windows->widget,&reply_info);
65283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
65303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionNotify:
65313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
65323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Atom
65333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          type;
65343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
65363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          format;
65373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char
65393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *data;
65403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6541f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        unsigned long
65423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          after,
65433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
65443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
65463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Obtain response from primary selection.
65473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
65483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xselection.property == (Atom) None)
65493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
65503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XGetWindowProperty(display,event.xselection.requestor,
65513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xselection.property,0L,2047L,MagickTrue,XA_STRING,&type,
65523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          &format,&length,&after,&data);
65533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((status != Success) || (type != XA_STRING) || (format == 32) ||
65543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (length == 0))
65553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
6556151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
65573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XBell(display,0);
65583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
65593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
65603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
65613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Insert primary selection in reply text.
65623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
65633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *(data+length)='\0';
65643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XEditText(display,&reply_info,(KeySym) XK_Insert,(char *) data,
65653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state);
65663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,&windows->widget,&reply_info);
65673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=JumpListState;
65683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawActionState;
65693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
65703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFree((void *) data);
65713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
65723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
65733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionRequest:
65743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
65753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionEvent
65763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify;
65773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionRequestEvent
65793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *request;
65803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
65813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
65823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Set XA_PRIMARY selection.
65833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
65843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        request=(&(event.xselectionrequest));
65853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XChangeProperty(request->display,request->requestor,
65863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          request->property,request->target,8,PropModeReplace,
65873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned char *) primary_selection,Extent(primary_selection));
65883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.type=SelectionNotify;
65893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.display=request->display;
65903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.requestor=request->requestor;
65913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.selection=request->selection;
65923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.target=request->target;
65933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.time=request->time;
65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (request->property == None)
65953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->target;
65963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
65973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->property;
65983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSendEvent(request->display,request->requestor,False,0,
65993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (XEvent *) &notify);
66003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
66013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
66023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
66033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
66053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
66063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
66073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
66083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
66093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free font list.
66103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
66113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeFontNames(listhead);
66123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fontlist=(char **) RelinquishMagickMemory(fontlist);
66133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
66143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
66163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
66183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
66193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
66203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X I n f o W i d g e t                                                     %
66213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
66223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
66233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
66243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XInfoWidget() displays text in the Info widget.  The purpose is to inform
66273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the user that what activity is currently being performed (e.g. reading
66283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  an image, rotating an image, etc.).
66293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XInfoWidget method is:
66313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XInfoWidget(Display *display,XWindows *windows,const char *activity)
66333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
66353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
66373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
66383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
66403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o activity: This character string reflects the current activity and is
66423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      displayed in the Info widget.
66433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
66443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6645bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XInfoWidget(Display *display,XWindows *windows,
66463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *activity)
66473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
66483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
66493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
66503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    margin,
66513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
66523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
66543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
66553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
66573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
66583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
66603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Info widget.
66613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
66623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
66633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
66643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
66653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(activity != (char *) NULL);
66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->info.font_info;
66673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) activity)+((3*QuantumMargin) >> 1)+4;
66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (((6*(font_info->ascent+font_info->descent)) >> 2)+4);
66693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->info.width != width) || (windows->info.height != height))
66703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
66713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
66723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Size Info widget to accommodate the activity text.
66733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
66743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->info.width=width;
66753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->info.height=height;
66763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.width=(int) width;
66773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      window_changes.height=(int) height;
66783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XReconfigureWMWindow(display,windows->info.id,windows->info.screen,
66793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (unsigned int) (CWWidth | CWHeight),&window_changes);
66803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
66813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->info.mapped == MagickFalse)
66823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
66833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XMapRaised(display,windows->info.id);
66843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->info.mapped=MagickTrue;
66853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
66863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
66873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize Info matte information.
66883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
66893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
66903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo(activity,&monitor_info);
66913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.bevel_width--;
66923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  margin=monitor_info.bevel_width+((windows->info.height-height) >> 1)-2;
66933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.center=MagickFalse;
66943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.x=(int) margin;
66953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.y=(int) margin;
66963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.width=windows->info.width-(margin << 1);
66973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.height=windows->info.height-(margin << 1)+1;
66983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
66993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw Info widget.
67003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
67013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.raised=MagickFalse;
67023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawBeveledMatte(display,&windows->info,&monitor_info);
67033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.raised=MagickTrue;
67043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawWidgetText(display,&windows->info,&monitor_info);
67053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
67063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
67083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X L i s t B r o w s e r W i d g e t                                       %
67133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
67163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XListBrowserWidget() displays a List Browser widget with a query to the
67193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  user.  The user keys a reply or select a reply from the list.  Finally, the
67203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  user presses the Action or Cancel button to exit.  The typed text is
67213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returned as the reply function parameter.
67223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XListBrowserWidget method is:
67243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XListBrowserWidget(Display *display,XWindows *windows,
67263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XWindowInfo *window_info,const char **list,const char *action,
67273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *query,char *reply)
67283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
67303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
67323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
67333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
67353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o list: Specifies a pointer to an array of strings.  The user can
67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      select from these strings as a possible reply value.
67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o action: Specifies a pointer to the action of this widget.
67403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o query: Specifies a pointer to the query to present to the user.
67423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reply: the response from the user is returned in this parameter.
67443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6746bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XListBrowserWidget(Display *display,XWindows *windows,
67473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowInfo *window_info,const char **list,const char *action,
67483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *query,char *reply)
67493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
67503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
67513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6753151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    primary_selection[MagickPathExtent];
67543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
67563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
67573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
67593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
67603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static MagickStatusType
67623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
67633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
67653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
67663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
67683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entries,
67693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
67703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_width,
67713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visible_entries,
67723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
67733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6774bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
67753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delay,
67763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
67773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
67793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
67803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
67823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
67833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
67853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
67863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
67873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
67883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    action_info,
67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    expose_info,
67913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list_info,
67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    north_info,
67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reply_info,
67943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scroll_info,
67953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info,
67963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    slider_info,
67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    south_info,
67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info;
67993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
68003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
68013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
68023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
68033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
68043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Count the number of entries in the list.
68053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
68063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
68073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
68083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(window_info != (XWindowInfo *) NULL);
68093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(list != (const char **) NULL);
68103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(action != (char *) NULL);
68113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(query != (char *) NULL);
68123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reply != (char *) NULL);
68133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",action);
68143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
68153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
68163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (list == (const char **) NULL)
68173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
68183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"No text to browse:",(char *) NULL);
68193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
68203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
68213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (entries=0; ; entries++)
68223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (list[entries] == (char *) NULL)
68233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
68243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
68253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Font Browser widget attributes.
68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
68273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=window_info->font_info;
68283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_width=WidgetTextWidth(font_info,(char *) query);
68293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) entries; i++)
68303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,(char *) list[i]) > text_width)
68313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_width=WidgetTextWidth(font_info,(char *) list[i]);
68323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) action);
68333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,CancelButtonText) > width)
68343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,CancelButtonText);
68353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=QuantumMargin;
68363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
68373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
68383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position List Browser widget.
68393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
68403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->width=(unsigned int) MagickMin((int) text_width,(int)
68413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MaxTextWidth)+((9*QuantumMargin) >> 1);
68423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->min_width=(unsigned int) (MinTextWidth+4*QuantumMargin);
68433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->width < window_info->min_width)
68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->width=window_info->min_width;
68453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->height=(unsigned int)
68463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((81*height) >> 2)+((13*QuantumMargin) >> 1)+4);
68473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->min_height=(unsigned int)
68483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (((23*height) >> 1)+((13*QuantumMargin) >> 1)+4);
68493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (window_info->height < window_info->min_height)
68503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_info->height=window_info->min_height;
68513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,window_info);
68523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
68533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map List Browser widget.
68543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6855151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(window_info->name,"Browse",MagickPathExtent);
68563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&window_info->name,1,&window_name);
68573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
68583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
68593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,window_info->id,&window_name);
68603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
68613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
68623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
68633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) window_info->width;
68643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) window_info->height;
68653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=window_info->x;
68663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=window_info->y;
68673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,window_info->id,window_info->screen,mask,
68683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    &window_changes);
68693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,window_info->id);
68703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_info->mapped=MagickFalse;
68713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
68723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
68733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
68743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&slider_info);
68753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&north_info);
68763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&south_info);
68773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&expose_info);
6878ca0aa658e700b82fdcfc65c359301fd089271911cristy  XGetWidgetInfo((char *) NULL,&selection_info);
68793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visible_entries=0;
68803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  delay=SuspendTime << 2;
68813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
68823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
68833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
68843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
68853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
68863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
68873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id;
68883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
68893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
68903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
68913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
68923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
68933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=width;
68943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) ((3*height) >> 1);
68953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int)
68963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (window_info->width-cancel_info.width-QuantumMargin-2);
68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int)
68983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (window_info->height-cancel_info.height-QuantumMargin);
68993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(action,&action_info);
69003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.width=width;
69013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.height=(unsigned int) ((3*height) >> 1);
69023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.x=cancel_info.x-(cancel_info.width+(QuantumMargin >> 1)+
69033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (action_info.bevel_width << 1));
69043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        action_info.y=cancel_info.y;
69053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
69063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize reply information.
69073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
69083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(reply,&reply_info);
69093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.raised=MagickFalse;
69103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.bevel_width--;
69113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.width=window_info->width-((4*QuantumMargin) >> 1);
69123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.height=height << 1;
69133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.x=QuantumMargin;
69143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.y=action_info.y-reply_info.height-QuantumMargin;
69153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
69163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize scroll information.
69173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
69183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&scroll_info);
69193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.bevel_width--;
69203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.width=height;
69213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.height=(unsigned int)
69223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (reply_info.y-((6*QuantumMargin) >> 1)-height);
69233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.x=reply_info.x+(reply_info.width-scroll_info.width);
69243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.y=((5*QuantumMargin) >> 1)+height-reply_info.bevel_width;
69253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.raised=MagickFalse;
69263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.trough=MagickTrue;
69273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info=scroll_info;
69283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.raised=MagickTrue;
69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.width-=(north_info.bevel_width << 1);
69303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.height=north_info.width-1;
69313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.x+=north_info.bevel_width;
69323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.y+=north_info.bevel_width;
69333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info=north_info;
69343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
69353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          south_info.height;
69363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=slider_info.id;
69373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info=north_info;
69383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=id;
69393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.width-=2;
69403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
69413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width+2;
69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=scroll_info.height-((slider_info.min_y-
69433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.y+1) << 1)+4;
69443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visible_entries=scroll_info.height/(height+(height >> 3));
69453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (entries > visible_entries)
69463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(visible_entries*slider_info.height)/entries;
69473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
69483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
69493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.x=scroll_info.x+slider_info.bevel_width+1;
69503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
69513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info=scroll_info;
69523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
69533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
69543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize list information.
69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
69563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&list_info);
69573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.raised=MagickFalse;
69583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.bevel_width--;
69593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.width=(unsigned int)
69603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (scroll_info.x-reply_info.x-(QuantumMargin >> 1));
69613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.height=scroll_info.height;
69623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.x=reply_info.x;
69633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.y=scroll_info.y;
69643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (window_info->mapped == MagickFalse)
69653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (i=0; i < (int) entries; i++)
69663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (LocaleCompare(list[i],reply) == 0)
69673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
69683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                list_info.id=i;
69693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=i-(visible_entries >> 1);
69703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (slider_info.id < 0)
69713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.id=0;
69723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
69733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize text information.
69753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
69763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(query,&text_info);
69773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.width=reply_info.width;
69783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.height=height;
69793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.x=list_info.x-(QuantumMargin >> 1);
69803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        text_info.y=QuantumMargin;
69813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
69823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize selection information.
69833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
69843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&selection_info);
69853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.width=list_info.width;
69873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.height=(unsigned int) ((9*height) >> 3);
69883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.x=list_info.x;
69893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
69903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
69913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
69943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw List Browser window.
69953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
69963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,window_info,&text_info);
69973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,window_info,&list_info);
69983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,window_info,&scroll_info);
69993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,window_info,&north_info);
70003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,window_info,&slider_info);
70013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,window_info,&south_info);
70023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,window_info,&reply_info);
70033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,window_info,&reply_info);
70043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,window_info,&action_info);
70053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,window_info,&cancel_info);
70063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,window_info,BorderOffset,BorderOffset);
70073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
70083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawActionState;
70093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
70103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
70113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawListState)
70133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
70143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Determine slider id and position.
70163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id >= (int) (entries-visible_entries))
70183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=(int) (entries-visible_entries);
70193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((slider_info.id < 0) || (entries <= visible_entries))
70203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=0;
70213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (entries > 0)
70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.y+=
70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id*(slider_info.max_y-slider_info.min_y+1)/entries;
70253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id != selection_info.id)
70263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
70273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
70283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Redraw scroll bar and file names.
70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
70303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=slider_info.id;
70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=list_info.y+(height >> 3)+2;
70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < (int) visible_entries; i++)
70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.raised=(slider_info.id+i) != list_info.id ?
70353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                MagickTrue : MagickFalse;
70363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.text=(char *) NULL;
70373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if ((slider_info.id+i) < (int) entries)
70383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                selection_info.text=(char *) list[slider_info.id+i];
70393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawWidgetText(display,window_info,&selection_info);
70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.y+=(int) selection_info.height;
70413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Update slider.
70443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
70453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > expose_info.y)
70463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) slider_info.y-expose_info.y;
70483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y-expose_info.height-
70493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width-1;
70503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
70513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
70523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
70533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) expose_info.y-slider_info.y;
70543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y+slider_info.height+
70553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width+1;
70563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
70573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,window_info,&north_info);
70583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatte(display,window_info,&expose_info);
70593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&slider_info);
70603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,window_info,&south_info);
70613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            expose_info.y=slider_info.y;
70623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
70633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawListState);
70643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
70663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
70673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
70683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (north_info.raised && south_info.raised)
70693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
70703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
70713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
70723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
70733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Brief delay before advancing scroll bar.
70743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
70753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDelay(display,delay);
70763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        delay=SuspendTime;
70773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCheckIfEvent(display,&event,XScreenEvent,(char *) windows);
70783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
70793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
70803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
70813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
70823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
70833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
70843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
70853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
70863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
70873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
70883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id < (int) entries)
70893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
70903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
70923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
70933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
70943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
70963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.type != ButtonRelease)
70973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
70983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
70993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
71003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
71013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
71023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
71033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(slider_info,event.xbutton))
71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
71053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Track slider.
71073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickTrue;
71093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
71103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
71113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(north_info,event.xbutton))
71123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
71133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
71153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
71173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              north_info.raised=MagickFalse;
71183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
71203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
71213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
71223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(south_info,event.xbutton))
71233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id < (int) entries)
71243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
71253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
71263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
71273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
71283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              south_info.raised=MagickFalse;
71293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
71313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
71323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
71333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(scroll_info,event.xbutton))
71343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
71353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
71363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
71373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
71383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.y < slider_info.y)
71393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id-=(visible_entries-1);
71403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id+=(visible_entries-1);
71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
71433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
71443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
71453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(list_info,event.xbutton))
71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
71473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
71483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              id;
71493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
71513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed list matte.
71523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            id=slider_info.id+(event.xbutton.y-(list_info.y+(height >> 1))+1)/
71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.height;
71553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id >= (int) entries)
71563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7157151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) CopyMagickString(reply_info.text,list[id],MagickPathExtent);
71583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.highlight=MagickFalse;
71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.marker=reply_info.text;
71603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.text+Extent(reply_info.text);
71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,window_info,&reply_info);
71623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=(~0);
71633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id == list_info.id)
71643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
71653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                action_info.raised=MagickFalse;
71663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                XDrawBeveledButton(display,window_info,&action_info);
71673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=ExitState;
71683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            list_info.id=id;
71703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
71713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
71723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
71733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(action_info,event.xbutton))
71743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
71753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
71763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed action button.
71773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
71783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&action_info);
71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
71823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
71833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
71843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
71853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cancel button.
71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
71883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&cancel_info);
71893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
71933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.button != Button2)
71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
71953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            static Time
71963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              click_time;
71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
71993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move text cursor to position of button press.
72003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
72013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=event.xbutton.x-reply_info.x-(QuantumMargin >> 2);
72023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=1; i <= Extent(reply_info.marker); i++)
72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (XTextWidth(font_info,reply_info.marker,i) > x)
72043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            reply_info.cursor=reply_info.marker+i-1;
72063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.time > (click_time+DoubleClick))
72073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
72083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
72093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
72103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*
72113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  Become the XA_PRIMARY selection owner.
72123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                */
72133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CopyMagickString(primary_selection,reply_info.text,
7214151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy                  MagickPathExtent);
72153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) XSetSelectionOwner(display,XA_PRIMARY,window_info->id,
72163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  event.xbutton.time);
72173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                reply_info.highlight=XGetSelectionOwner(display,XA_PRIMARY) ==
72183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  window_info->id ? MagickTrue : MagickFalse;
72193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
72203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,window_info,&reply_info);
72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            click_time=event.xbutton.time;
72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
72233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Request primary selection.
72263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
72273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XConvertSelection(display,XA_PRIMARY,XA_STRING,XA_STRING,
72283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          window_info->id,event.xbutton.time);
72293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
72303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
72313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
72323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
72333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (window_info->mapped == MagickFalse)
72343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
72353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released up button.
72393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
72413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            north_info.raised=MagickTrue;
72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,window_info,&north_info);
72433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
72473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released down button.
72483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            south_info.raised=MagickTrue;
72513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,window_info,&south_info);
72523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
72563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Stop tracking slider.
72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
72583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickFalse;
72593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MagickFalse)
72623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == window_info->id)
72643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
72653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (MatteIsActive(action_info,event.xbutton))
72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (*reply_info.text == '\0')
72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      (void) XBell(display,0);
72693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
72703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      state|=ExitState;
72713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
72723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
72733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickTrue;
72743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&action_info);
72753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
72773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
72783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == window_info->id)
72793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  *reply_info.text='\0';
72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  state|=ExitState;
72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&cancel_info);
72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
72873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(reply_info,event.xbutton) == MagickFalse)
72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
72903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
72923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
72943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
72983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
73013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
73043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
73053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == window_info->id)
73073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
73083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *reply_info.text='\0';
73093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
73103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
73113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
73133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
73143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
73153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
73163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
73173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
73183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
73193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != window_info->id)
73203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) window_info->width) &&
73223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) window_info->height))
73233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->width=(unsigned int)
73253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) window_info->min_width);
73263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        window_info->height=(unsigned int)
73273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) window_info->min_height);
73283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
73293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
73303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
73313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
73323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
73333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != window_info->id)
73343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
73363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
73383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
73393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != window_info->id)
73413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
73463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
73473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
73493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
7350151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
73513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
73523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static int
73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
73543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
73553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
73563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
73573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
73583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
73593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
73603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
73613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != window_info->id)
73623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=XLookupString((XKeyEvent *) &event.xkey,command,
73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *(command+length)='\0';
73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (AreaIsActive(scroll_info,event.xkey))
73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
73703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            switch ((int) key_symbol)
73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
73733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Home:
73743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Home:
73753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
73763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=0;
73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Up:
73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Up:
73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id--;
73833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Down:
73863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Down:
73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id++;
73893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Prior:
73923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Prior:
73933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
73943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id-=visible_entries;
73953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Next:
73983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Next:
73993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
74003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id+=visible_entries;
74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
74023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
74033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_End:
74043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_End:
74053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
74063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=(int) entries;
74073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
74093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
74103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
74113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
74123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
74143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
74163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Read new entry.
74173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
74183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*reply_info.text == '\0')
74193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
74203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=MagickFalse;
74213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&action_info);
74223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
74233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
74243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
74263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ControlState;
74283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
74293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & ControlState)
74313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch ((int) key_symbol)
74323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_u:
74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case XK_U:
74353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
74363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Erase the entire line of text.
74383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
74393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *reply_info.text='\0';
74403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.cursor=reply_info.text;
74413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.marker=reply_info.text;
74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              reply_info.highlight=MagickFalse;
74433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
74443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
74473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
74483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XEditText(display,&reply_info,key_symbol,command,state);
74493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,window_info,&reply_info);
74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyRelease:
74533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
7455151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
74563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
74573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
74583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
74603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
74613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key release.
74623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
74633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != window_info->id)
74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
74653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
74663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
74673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (key_symbol == XK_Control_L)
74683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          state&=(~ControlState);
74693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != window_info->id)
74743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
74763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MapNotify:
74793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWX);
74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWY);
74823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
74833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
74843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
74853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
74863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
74873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
74883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
74893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
74903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
74923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
74933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider matte.
74943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
74953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.y=event.xmotion.y-
74963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((slider_info.height+slider_info.bevel_width) >> 1)+1;
74973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y < slider_info.min_y)
74983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.min_y;
74993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > slider_info.max_y)
75003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.max_y;
75013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id=0;
75023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y != slider_info.min_y)
75033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id=(int) ((entries*(slider_info.y-
75043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.min_y+1))/(slider_info.max_y-slider_info.min_y+1));
75053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
75063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
75073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
75083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
75093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
75103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (action_info.raised == MatteIsActive(action_info,event.xmotion))
75113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
75123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
75133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Action button status changed.
75143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
75153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            action_info.raised=action_info.raised == MagickFalse ?
75163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
75173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&action_info);
75183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
75193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
75203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
75213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
75223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
75233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
75243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
75253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=cancel_info.raised == MagickFalse ?
75263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              MagickTrue : MagickFalse;
75273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,window_info,&cancel_info);
75283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
75293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
75303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
75313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
75323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionClear:
75333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
75343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reply_info.highlight=MagickFalse;
75353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawMatteText(display,window_info,&reply_info);
75363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
75373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
75383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionNotify:
75393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
75403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Atom
75413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          type;
75423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
75443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          format;
75453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char
75473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *data;
75483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7549f2faecf9facdbbb14fcba373365f9f691a9658e0cristy        unsigned long
75503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          after,
75513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
75523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
75543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Obtain response from primary selection.
75553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
75563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xselection.property == (Atom) None)
75573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=XGetWindowProperty(display,
75593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          event.xselection.requestor,event.xselection.property,0L,2047L,
75603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickTrue,XA_STRING,&type,&format,&length,&after,&data);
75613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((status != Success) || (type != XA_STRING) || (format == 32) ||
75623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (length == 0))
75633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7564151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        if ((Extent(reply_info.text)+length) >= (MagickPathExtent-1))
75653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) XBell(display,0);
75663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
75673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
75683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
75693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Insert primary selection in reply text.
75703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
75713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *(data+length)='\0';
75723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XEditText(display,&reply_info,(KeySym) XK_Insert,(char *) data,
75733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state);
75743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatteText(display,window_info,&reply_info);
75753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawActionState;
75763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
75773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XFree((void *) data);
75783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
75793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
75803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionRequest:
75813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
75823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionEvent
75833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify;
75843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionRequestEvent
75863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *request;
75873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
75883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (reply_info.highlight == MagickFalse)
75893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
75903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
75913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Set primary selection.
75923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
75933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        request=(&(event.xselectionrequest));
75943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XChangeProperty(request->display,request->requestor,
75953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          request->property,request->target,8,PropModeReplace,
75963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned char *) primary_selection,Extent(primary_selection));
75973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.type=SelectionNotify;
75983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.send_event=MagickTrue;
75993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.display=request->display;
76003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.requestor=request->requestor;
76013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.selection=request->selection;
76023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.target=request->target;
76033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.time=request->time;
76043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (request->property == None)
76053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->target;
76063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->property;
76083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
76093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (XEvent *) &notify);
76103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
76113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
76153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
76163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,window_info->id,window_info->screen);
76173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
76183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
76193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
76213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X M e n u W i d g e t                                                     %
76263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
76293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XMenuWidget() maps a menu and returns the command pointed to by the user
76323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  when the button is released.
76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XMenuWidget method is:
76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      int XMenuWidget(Display *display,XWindows *windows,const char *title,
76373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char **selections,char *item)
76383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
76403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o selection_number: Specifies the number of the selection that the
76423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      user choose.
76433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
76453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
76463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o title: Specifies a character string that describes the menu selections.
76503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o selections: Specifies a pointer to one or more strings that comprise
76523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the choices in the menu.
76533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o item: Specifies a character array.  The item selected from the menu
76553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      is returned here.
76563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
76573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7658bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate int XMenuWidget(Display *display,XWindows *windows,
76593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *title,const char **selections,char *item)
76603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
76613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Cursor
76623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cursor;
76633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
76653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    id,
76663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
76673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
76683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
76703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
76713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_selections,
76723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    title_height,
76733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    top_offset,
76743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
76753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7676bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
76773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
76783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
76803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
76813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
76833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
76843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetWindowAttributes
76863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_attributes;
76873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
76893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    highlight_info,
76903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    menu_info,
76913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info;
76923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
76943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
76953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
76963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
76973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Menu widget attributes.
76983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
76993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
77003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
77013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(title != (char *) NULL);
77023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(selections != (const char **) NULL);
77033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(item != (char *) NULL);
77043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",title);
77053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
77063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=submenu_info.active == 0 ?
77073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    WidgetTextWidth(font_info,(char *) title) : 0;
77083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (id=0; selections[id] != (char *) NULL; id++)
77093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
77103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,(char *) selections[id]);
77113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (width > windows->widget.width)
77123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->widget.width=width;
77133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
77143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  number_selections=(unsigned int) id;
77153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&menu_info);
77163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  title_height=(unsigned int) (submenu_info.active == 0 ?
77173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (3*(font_info->descent+font_info->ascent) >> 1)+5 : 2);
77183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,(char *) title);
77193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) ((3*(font_info->ascent+font_info->descent)) >> 1);
77203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
77213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Menu widget.
77223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
77233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width+=QuantumMargin+(menu_info.bevel_width << 1);
77243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  top_offset=title_height+menu_info.bevel_width-1;
77253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=top_offset+number_selections*height+4;
77263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=windows->widget.width;
77273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=windows->widget.height;
77283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XQueryPosition(display,windows->widget.root,&x,&y);
77293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.x=x-(QuantumMargin >> 1);
77303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (submenu_info.active != 0)
77313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
77323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      windows->widget.x=
77333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->command.x+windows->command.width-QuantumMargin;
77343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      toggle_info.raised=MagickTrue;
77353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDrawTriangleEast(display,&windows->command,&toggle_info);
77363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
773749e2d862ad0faa61d99d9d252f75913ad3976750cristy  windows->widget.y=submenu_info.active == 0 ? y-(int)
77383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ((3*title_height) >> 2) : y;
77393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (submenu_info.active != 0)
77403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.y=windows->command.y+submenu_info.y;
77413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
77423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
77433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Menu widget.
77443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
77453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_attributes.override_redirect=MagickTrue;
77463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XChangeWindowAttributes(display,windows->widget.id,
7747bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    (size_t) CWOverrideRedirect,&window_attributes);
77483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
77493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
77503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
77513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
77523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
77533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
77543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
77553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
77563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
77573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
77583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
77593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  selection_info.height=height;
77603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  cursor=XCreateFontCursor(display,XC_right_ptr);
77613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,windows->image.id,cursor);
77623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,windows->command.id,cursor);
77633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XCheckDefineCursor(display,windows->widget.id,cursor);
77643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
77653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
77663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
77673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
77683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
77693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
77703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize selection information.
77713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
77723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&menu_info);
77733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        menu_info.bevel_width--;
77743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        menu_info.width=windows->widget.width-((menu_info.bevel_width) << 1);
77753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        menu_info.height=windows->widget.height-((menu_info.bevel_width) << 1);
77763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        menu_info.x=(int) menu_info.bevel_width;
77773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        menu_info.y=(int) menu_info.bevel_width;
77783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&selection_info);
77793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
77803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.width=menu_info.width;
77813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.height=height;
77823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.x=menu_info.x;
77833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info=selection_info;
77843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.bevel_width--;
77853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.width-=(highlight_info.bevel_width << 1);
77863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.height-=(highlight_info.bevel_width << 1);
77873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.x+=highlight_info.bevel_width;
77883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
77893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
77903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
77913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
77923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
77933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Menu widget.
77943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
77953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (submenu_info.active == 0)
77963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
77973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y=(int) title_height;
77983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XSetBevelColor(display,&windows->widget,MagickFalse);
77993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XDrawLine(display,windows->widget.id,
78003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              windows->widget.widget_context,selection_info.x,y-1,
78013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (int) selection_info.width,y-1);
78023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XSetBevelColor(display,&windows->widget,MagickTrue);
78033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XDrawLine(display,windows->widget.id,
78043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              windows->widget.widget_context,selection_info.x,y,
78053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (int) selection_info.width,y);
78063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFillStyle(display,windows->widget.widget_context,
78073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              FillSolid);
78083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
78093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
78103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Draw menu selections.
78113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
78123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickTrue;
78133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.y=(int) menu_info.bevel_width;
78143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.text=(char *) title;
78153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (submenu_info.active == 0)
78163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XDrawWidgetText(display,&windows->widget,&selection_info);
78173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
78183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.y=(int) top_offset;
78193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (id=0; id < (int) number_selections; id++)
78203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
78213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          selection_info.text=(char *) selections[id];
78223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XDrawWidgetText(display,&windows->widget,&selection_info);
78233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          highlight_info.y=selection_info.y+highlight_info.bevel_width;
78243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (id == selection_info.id)
78253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBevel(display,&windows->widget,&highlight_info);
78263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          selection_info.y+=(int) selection_info.height;
78273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
78283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBevel(display,&windows->widget,&menu_info);
78293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
78303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
78313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (number_selections > 2)
78323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
78343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Menu line.
78353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
78363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=(int) (top_offset+selection_info.height*(number_selections-1));
78373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSetBevelColor(display,&windows->widget,MagickFalse);
78383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawLine(display,windows->widget.id,
78393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.widget_context,selection_info.x,y-1,
78403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) selection_info.width,y-1);
78413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSetBevelColor(display,&windows->widget,MagickTrue);
78423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawLine(display,windows->widget.id,
78433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.widget_context,selection_info.x,y,
78443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) selection_info.width,y);
78453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSetFillStyle(display,windows->widget.widget_context,FillSolid);
78463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
78473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
78483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
78493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
78503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
78513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
78523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
78533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
78543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.window != windows->widget.id)
78563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
78573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
78583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              exit menu.
78593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
78603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->command.id)
78613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) XPutBackEvent(display,&event);
78623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=(~0);
78633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *item='\0';
78643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
78653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
78663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
78673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
78683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=(event.xbutton.y-top_offset)/(int) selection_info.height;
78693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=id;
78703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((id < 0) || (id >= (int) number_selections))
78713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
78723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
78733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Highlight this selection.
78743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
78753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.y=(int) (top_offset+id*selection_info.height);
78763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.text=(char *) selections[id];
78773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&selection_info);
78783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.y=selection_info.y+highlight_info.bevel_width;
78793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBevel(display,&windows->widget,&highlight_info);
78803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
78813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
78823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
78833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
78853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
78863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xbutton.window == windows->command.id)
78873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((state & InactiveWidgetState) == 0)
78883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
78893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
78903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          exit menu.
78913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
78923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSetCursorState(display,windows,MagickFalse);
78933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *item='\0';
78943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=ExitState;
78953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
78963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
78973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
78983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
78993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
79003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
79013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
79023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
79033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
79053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
79063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
79083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
79093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
79103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
79113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
79123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
79133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
79143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
79153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
79163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
79173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.state == 0)
79193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
79213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=((event.xcrossing.y-top_offset)/(int) selection_info.height);
79223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((selection_info.id >= 0) &&
79233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (selection_info.id < (int) number_selections))
79243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
79253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
79263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Unhighlight last selection.
79273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
79283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id == selection_info.id)
79293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
79303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=(int)
79313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (top_offset+selection_info.id*selection_info.height);
79323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.text=(char *) selections[selection_info.id];
79333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawWidgetText(display,&windows->widget,&selection_info);
79343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
79353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((id < 0) || (id >= (int) number_selections))
79363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
79383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Highlight this selection.
79393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
79403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=id;
79413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.y=(int)
79423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (top_offset+selection_info.id*selection_info.height);
79433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.text=(char *) selections[selection_info.id];
79443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&selection_info);
79453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.y=selection_info.y+highlight_info.bevel_width;
79463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBevel(display,&windows->widget,&highlight_info);
79473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
79483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
79493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
79503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
79513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
79523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
79543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
79563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
79573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
79583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
79593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
79603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
79613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
79633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=selection_info.id;
79643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((id < 0) || (id >= (int) number_selections))
79653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
79663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
79673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Unhighlight last selection.
79683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
79693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.y=(int) (top_offset+id*selection_info.height);
79703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
79713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.text=(char *) selections[id];
79723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&selection_info);
79733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
79743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
79753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
79763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
79773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
79783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
79793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
79803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
79813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (submenu_info.active != 0)
79823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (event.xmotion.window == windows->command.id)
79833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
79843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if ((state & InactiveWidgetState) == 0)
79853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
79863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (MatteIsActive(submenu_info,event.xmotion) == MagickFalse)
79873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
79883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      selection_info.id=(~0);
79893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        *item='\0';
79903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      state|=ExitState;
79913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      break;
79923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
79933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
79943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
79953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (WindowIsActive(windows->command,event.xmotion))
79963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
79973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    selection_info.id=(~0);
79983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *item='\0';
79993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    state|=ExitState;
80003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    break;
80013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
80023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
80033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xmotion.window != windows->widget.id)
80043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
80053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
80063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
80073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=(event.xmotion.y-top_offset)/(int) selection_info.height;
80083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((selection_info.id >= 0) &&
80093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (selection_info.id < (int) number_selections))
80103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
80113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
80123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Unhighlight last selection.
80133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
80143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id == selection_info.id)
80153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
80163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=(int)
80173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (top_offset+selection_info.id*selection_info.height);
80183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.text=(char *) selections[selection_info.id];
80193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawWidgetText(display,&windows->widget,&selection_info);
80203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
80213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=id;
80223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((id < 0) || (id >= (int) number_selections))
80233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
80243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
80253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Highlight this selection.
80263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
80273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.y=(int) (top_offset+id*selection_info.height);
80283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.text=(char *) selections[id];
80293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawWidgetText(display,&windows->widget,&selection_info);
80303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        highlight_info.y=selection_info.y+highlight_info.bevel_width;
80313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBevel(display,&windows->widget,&highlight_info);
80323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
80333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
80343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
80353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
80363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
80373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
80383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFreeCursor(display,cursor);
80393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_attributes.override_redirect=MagickFalse;
80403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XChangeWindowAttributes(display,windows->widget.id,
8041bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    (size_t) CWOverrideRedirect,&window_attributes);
80423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
80433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
80443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (submenu_info.active != 0)
80453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
80463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      submenu_info.active=MagickFalse;
80473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      toggle_info.raised=MagickFalse;
80483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDrawTriangleEast(display,&windows->command,&toggle_info);
80493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
80503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((selection_info.id < 0) || (selection_info.id >= (int) number_selections))
80513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(~0);
8052151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(item,selections[selection_info.id],MagickPathExtent);
80533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(selection_info.id);
80543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
80553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
80573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
80593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
80603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
80613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X N o t i c e W i d g e t                                                 %
80623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
80633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
80643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
80653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XNoticeWidget() displays a Notice widget with a notice to the user.  The
80683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  function returns when the user presses the "Dismiss" button.
80693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XNoticeWidget method is:
80713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XNoticeWidget(Display *display,XWindows *windows,
80733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reason,const char *description)
80743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
80763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
80783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
80793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
80813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reason: Specifies the message to display before terminating the
80833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      program.
80843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o description: Specifies any description to the message.
80863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
80873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8088bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XNoticeWidget(Display *display,XWindows *windows,
80893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reason,const char *description)
80903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
80913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DismissButtonText  "Dismiss"
80923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define Timeout  8
80933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
80953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text;
80963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
80983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
80993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
81003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
81023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
81033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  time_t
81053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timer;
81063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
81083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
81093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
81103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8111bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
81123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
81133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
81153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
81163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
81183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
81193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
81213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
81223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
81243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dismiss_info;
81253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
81273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
81283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
81303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Notice widget attributes.
81313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
81323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
81333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
81343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(reason != (char *) NULL);
81353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",reason);
81363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDelay(display,SuspendTime << 3);  /* avoid surpise with delay */
81373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
81383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
81393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
81403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,DismissButtonText);
81413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text=GetLocaleExceptionMessage(XServerError,reason);
81423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text != (char *) NULL)
81433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,(char *) text) > width)
81443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      width=WidgetTextWidth(font_info,(char *) text);
81453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (description != (char *) NULL)
81463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
81473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text=GetLocaleExceptionMessage(XServerError,description);
81483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (text != (char *) NULL)
81493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (WidgetTextWidth(font_info,(char *) text) > width)
81503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          width=WidgetTextWidth(font_info,(char *) text);
81513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
81523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
81533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
81543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Notice widget.
81553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
81563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=width+4*QuantumMargin;
81573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=width+QuantumMargin;
81583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
81593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
81603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int) (12*height);
81613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int) (7*height);
81623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
81633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
81643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
81653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
81663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Notice widget.
81673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8168151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(windows->widget.name,"Notice",MagickPathExtent);
81693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
81703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
81713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
81723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
81733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
81743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
81753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
81763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
81773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
81783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
81793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
81803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
81813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
81823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
81833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
81843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XBell(display,0);
81853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
81863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
81873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
81883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  timer=time((time_t *) NULL)+Timeout;
81893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
81903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
81913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
81923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (time((time_t *) NULL) > timer)
81933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
81943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
81953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
81963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
81973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize Dismiss button information.
81983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
81993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(DismissButtonText,&dismiss_info);
82003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.width=(unsigned int) QuantumMargin+
82013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          WidgetTextWidth(font_info,DismissButtonText);
82023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.height=(unsigned int) ((3*height) >> 1);
82033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.x=(int)
82043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((windows->widget.width >> 1)-(dismiss_info.width >> 1));
82053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.y=(int)
82063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (windows->widget.height-(dismiss_info.height << 1));
82073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
82083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
82093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
82103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
82123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Notice widget.
82133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
82143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        width=WidgetTextWidth(font_info,(char *) reason);
82153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x=(int) ((windows->widget.width >> 1)-(width >> 1));
82163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=(int) ((windows->widget.height >> 1)-(height << 1));
82173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XDrawString(display,windows->widget.id,
82183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          windows->widget.annotate_context,x,y,(char *) reason,Extent(reason));
82193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (description != (char *) NULL)
82203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
82213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=WidgetTextWidth(font_info,(char *) description);
82223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=(int) ((windows->widget.width >> 1)-(width >> 1));
82233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y+=height;
82243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XDrawString(display,windows->widget.id,
82253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              windows->widget.annotate_context,x,y,(char *) description,
82263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Extent(description));
82273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
82283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&dismiss_info);
82293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
82303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
82313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
82323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
82333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
82343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
82353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (XCheckIfEvent(display,&event,XScreenEvent,(char *) windows) == MagickFalse)
82363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
82383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Do not block if delay > 0.
82393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
82403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDelay(display,SuspendTime << 2);
82413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
82423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
82433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
82443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
82453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
82463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(dismiss_info,event.xbutton))
82483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
82493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
82503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Dismiss button.
82513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
82523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickFalse;
82533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
82543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
82553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
82563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
82573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
82583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
82593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
82613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
82623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dismiss_info.raised == MagickFalse)
82633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
82643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
82653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(dismiss_info,event.xbutton))
82663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=ExitState;
82673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickTrue;
82683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
82693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
82703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
82713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
82723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
82733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
82753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
82763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
82773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
82783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
82793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
82803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
82813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
82823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
82833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
82843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
82853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
82863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
82873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
82883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
82893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
82903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
82913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
82923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
82933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
82943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
82953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
82963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
82973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
82983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
82993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
83003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
83023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
83033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
83053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
83063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
83073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
83083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
83093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
83113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
83123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
83133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
83143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
83163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
83183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
83193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
83203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
83213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
83233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
83253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
83273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
83283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
83293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
8330151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
83313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
83333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
83343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
83363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
83373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
83383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
83393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
83413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
83423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
83433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
83443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickFalse;
83453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
83463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
83473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
83483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
83493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
83513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
83523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
83533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
83543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
83563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
83583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
83593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
83603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
83613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
83623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
83633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
83643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
83653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
83663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
83673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
83683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
83693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Dismiss button status changed.
83703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
83713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=
83723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
83733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
83743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
83753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
83763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
83783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
83793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
83803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
83813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
83823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
83833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
83843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
83853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
83863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
83873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
83883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X P r e f e r e n c e s W i d g e t                                       %
83933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
83963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
83983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XPreferencesWidget() displays a Preferences widget with program preferences.
83993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  If the user presses the Apply button, the preferences are stored in a
84003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  configuration file in the users' home directory.
84013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XPreferencesWidget method is:
84033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType XPreferencesWidget(Display *display,
84053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XResourceInfo *resource_info,XWindows *windows)
84063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
84083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
84103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
84113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
84133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
84153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8417bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate MagickBooleanType XPreferencesWidget(Display *display,
84183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XResourceInfo *resource_info,XWindows *windows)
84193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
84203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ApplyButtonText  "Apply"
84213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CacheButtonText  "%lu mega-bytes of memory in the undo edit cache   "
84223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CancelButtonText  "Cancel"
84233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define NumberPreferences  8
84243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
84263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *Preferences[] =
84273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
84283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "display image centered on a backdrop",
84293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "confirm on program exit",
84303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "confirm on image edits",
84313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "correct image for display gamma",
84323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "display warning messages",
84333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "apply Floyd/Steinberg error diffusion to image",
84343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "use a shared colormap for colormapped X visuals",
84353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "display images as an X server pixmap"
84363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
84373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
8439151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    cache[MagickPathExtent];
84403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
84423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
84433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
84443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
84463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
84473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
84493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
84503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
84523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
84533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_width,
84543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
84553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8456bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
84573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
84583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
84603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
84613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
84633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info;
84643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
84663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
84673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
84693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    apply_info,
84703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cache_info,
84713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    cancel_info,
84723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_info[NumberPreferences];
84733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
84753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
84763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
84773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
84783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Preferences widget attributes.
84793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
84803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
84813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
84823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
84833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
84843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
84853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
84863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_width=WidgetTextWidth(font_info,CacheButtonText);
84873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < NumberPreferences; i++)
84883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(font_info,(char *) Preferences[i]) > text_width)
84893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_width=WidgetTextWidth(font_info,(char *) Preferences[i]);
84903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,ApplyButtonText);
84913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (WidgetTextWidth(font_info,CancelButtonText) > width)
84923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=WidgetTextWidth(font_info,CancelButtonText);
84933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=(unsigned int) QuantumMargin;
84943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
84953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
84963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Preferences widget.
84973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
84983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=(unsigned int) (MagickMax((int) (width << 1),
84993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) text_width)+6*QuantumMargin);
85003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=(width << 1)+QuantumMargin;
85013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
85023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
85033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int)
85043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
85053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int)
85063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (7*height+NumberPreferences*(height+(QuantumMargin >> 1)));
85073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
85083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
85093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
85103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
85113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Preferences widget.
85123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8513151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(windows->widget.name,"Preferences",MagickPathExtent);
85143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
85153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
85163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
85173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
85183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
85193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
85203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
85223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
85233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
85243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
85253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,windows->widget.screen,
85263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (unsigned int) (CWWidth | CWHeight | CWX | CWY),&window_changes);
85273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
85283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
85293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
85303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
85313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
85323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
85333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
85343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
85353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
85363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
85373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
85383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
85393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
85403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
85413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(CancelButtonText,&cancel_info);
85423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.width=width;
85433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.height=(unsigned int) (3*height) >> 1;
85443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.x=(int) windows->widget.width-cancel_info.width-
85453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (QuantumMargin << 1);
85463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cancel_info.y=(int) windows->widget.height-
85473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          cancel_info.height-QuantumMargin;
85483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(ApplyButtonText,&apply_info);
85493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        apply_info.width=width;
85503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        apply_info.height=(unsigned int) (3*height) >> 1;
85513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        apply_info.x=QuantumMargin << 1;
85523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        apply_info.y=cancel_info.y;
85533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y=(int) (height << 1);
85543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < NumberPreferences; i++)
85553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
85563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XGetWidgetInfo(Preferences[i],&preferences_info[i]);
85573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          preferences_info[i].bevel_width--;
85583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          preferences_info[i].width=(unsigned int) QuantumMargin >> 1;
85593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          preferences_info[i].height=(unsigned int) QuantumMargin >> 1;
85603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          preferences_info[i].x=QuantumMargin << 1;
85613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          preferences_info[i].y=y;
85623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          y+=height+(QuantumMargin >> 1);
85633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
85643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[0].raised=resource_info->backdrop ==
85653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickFalse ? MagickTrue : MagickFalse;
85663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[1].raised=resource_info->confirm_exit ==
85673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickFalse ? MagickTrue : MagickFalse;
85683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[2].raised=resource_info->confirm_edit ==
85693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickFalse ? MagickTrue : MagickFalse;
85703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[3].raised=resource_info->gamma_correct ==
85713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickFalse ? MagickTrue : MagickFalse;
85723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[4].raised=resource_info->display_warnings ==
85733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickFalse ? MagickTrue : MagickFalse;
8574cbda611068350bf4459f2dda1951f8823702e129cristy        preferences_info[5].raised=
8575cbda611068350bf4459f2dda1951f8823702e129cristy          resource_info->quantize_info->dither_method == NoDitherMethod ?
8576cbda611068350bf4459f2dda1951f8823702e129cristy          MagickTrue : MagickFalse;
85773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[6].raised=resource_info->colormap !=
85783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          SharedColormap ? MagickTrue : MagickFalse;
85793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        preferences_info[7].raised=resource_info->use_pixmap ==
85803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickFalse ? MagickTrue : MagickFalse;
8581151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(cache,MagickPathExtent,CacheButtonText,
8582f2faecf9facdbbb14fcba373365f9f691a9658e0cristy          (unsigned long) resource_info->undo_cache);
85833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(cache,&cache_info);
85843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cache_info.bevel_width--;
85853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cache_info.width=(unsigned int) QuantumMargin >> 1;
85863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cache_info.height=(unsigned int) QuantumMargin >> 1;
85873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cache_info.x=QuantumMargin << 1;
85883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        cache_info.y=y;
85893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
85903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
85913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
85923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
85933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
85943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Preferences widget.
85953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
85963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&apply_info);
85973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&cancel_info);
85983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < NumberPreferences; i++)
85993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
86003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleEast(display,&windows->widget,&cache_info);
86013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
86023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
86033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
86043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
86053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
86063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
86073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
86083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
86093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
86103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
86113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
86123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(apply_info,event.xbutton))
86133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
86143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
86153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Apply button.
86163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
86173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            apply_info.raised=MagickFalse;
86183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&apply_info);
86193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
86203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
86213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cancel_info,event.xbutton))
86223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
86233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
86243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cancel button.
86253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
86263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickFalse;
86273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
86283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
86293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
86303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; i < NumberPreferences; i++)
86313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (MatteIsActive(preferences_info[i],event.xbutton))
86323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
86333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
86343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                User pressed a Preferences button.
86353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
86363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              preferences_info[i].raised=preferences_info[i].raised ==
86373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                MagickFalse ? MagickTrue : MagickFalse;
86383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawBeveledButton(display,&windows->widget,&preferences_info[i]);
86393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
86403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
86413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(cache_info,event.xbutton))
86423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
86433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
86443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Cache button.
86453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
86463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=cache_info.x+cache_info.width+cache_info.bevel_width+
86473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (QuantumMargin >> 1);
86483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y=cache_info.y+((cache_info.height-height) >> 1);
86493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=WidgetTextWidth(font_info,cache);
86503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XClearArea(display,windows->widget.id,x,y,width,height,
86513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              False);
86523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            resource_info->undo_cache<<=1;
86533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (resource_info->undo_cache > 256)
86543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              resource_info->undo_cache=1;
8655151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) FormatLocaleString(cache,MagickPathExtent,CacheButtonText,
8656f2faecf9facdbbb14fcba373365f9f691a9658e0cristy              (unsigned long) resource_info->undo_cache);
86573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cache_info.raised=MagickFalse;
86583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleEast(display,&windows->widget,&cache_info);
86593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
86603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
86613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
86623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
86633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
86643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
86653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
86663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
86673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (apply_info.raised == MagickFalse)
86683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
86693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
86703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(apply_info,event.xbutton))
86713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=ExitState;
86723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            apply_info.raised=MagickTrue;
86733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&apply_info);
86743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            apply_info.raised=MagickFalse;
86753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
86763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MagickFalse)
86773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
86783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
86793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(cancel_info,event.xbutton))
86803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=ExitState;
86813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=MagickTrue;
86823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
86833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
86843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cache_info.raised == MagickFalse)
86853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
86863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cache_info.raised=MagickTrue;
86873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleEast(display,&windows->widget,&cache_info);
86883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
86893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
86903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
86913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
86923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
86933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
86943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
86953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
86963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
86973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
86983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
86993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
87003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
87013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
87023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
87033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
87043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
87053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
87073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
87083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
87093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
87103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
87113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
87123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
87133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
87143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
87163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
87173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
87183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
87193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
87213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
87223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
87243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
87253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
87263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
87273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
87283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
87293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
87303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
87313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
87333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
87353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
87363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
87373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
87383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
87403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
87423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
87443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
87453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
87463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
87473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
8749151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
87503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
87523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
87533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
87543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
87553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
87563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
87573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
87583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XLookupString((XKeyEvent *) &event.xkey,command,
87603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
87613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
87623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
87633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            apply_info.raised=MagickFalse;
87643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&apply_info);
87653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
87663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
87673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
87683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
87693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
87703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
87713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
87733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
87753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
87763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
87773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
87783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
87803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
87813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
87823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
87833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
87843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
87853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (apply_info.raised == MatteIsActive(apply_info,event.xmotion))
87863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
87873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
87883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Apply button status changed.
87893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
87903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            apply_info.raised=
87913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              apply_info.raised == MagickFalse ? MagickTrue : MagickFalse;
87923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&apply_info);
87933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
87943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
87953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (cancel_info.raised == MatteIsActive(cancel_info,event.xmotion))
87963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
87973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
87983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Cancel button status changed.
87993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
88003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            cancel_info.raised=
88013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              cancel_info.raised == MagickFalse ? MagickTrue : MagickFalse;
88023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&cancel_info);
88033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
88043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
88053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
88063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
88073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
88083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
88093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
88103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
88113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
88123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
88133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
88143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (apply_info.raised)
88153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
88163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
88173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Save user preferences to the client configuration file.
88183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
88193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->backdrop=
88203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_info[0].raised == MagickFalse ? MagickTrue : MagickFalse;
88213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->confirm_exit=
88223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_info[1].raised == MagickFalse ? MagickTrue : MagickFalse;
88233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->confirm_edit=
88243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_info[2].raised == MagickFalse ? MagickTrue : MagickFalse;
88253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->gamma_correct=
88263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_info[3].raised == MagickFalse ? MagickTrue : MagickFalse;
88273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->display_warnings=
88283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     preferences_info[4].raised == MagickFalse ? MagickTrue : MagickFalse;
8829cbda611068350bf4459f2dda1951f8823702e129cristy  resource_info->quantize_info->dither_method=
8830cbda611068350bf4459f2dda1951f8823702e129cristy    preferences_info[5].raised == MagickFalse ?
8831cbda611068350bf4459f2dda1951f8823702e129cristy    RiemersmaDitherMethod : NoDitherMethod;
88323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->colormap=SharedColormap;
88333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (preferences_info[6].raised)
88343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resource_info->colormap=PrivateColormap;
88353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  resource_info->use_pixmap=
88363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    preferences_info[7].raised == MagickFalse ? MagickTrue : MagickFalse;
88373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XUserPreferences(resource_info);
88383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
88393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
88403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
88423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X P r o g r e s s M o n i t o r W i d g e t                               %
88473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
88503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
88513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XProgressMonitorWidget() displays the progress a task is making in
88533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  completing a task.  A span of zero toggles the active status.  An inactive
88543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  state disables the progress monitor.
88553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XProgressMonitorWidget method is:
88573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XProgressMonitorWidget(Display *display,XWindows *windows,
88593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *task,const MagickOffsetType offset,
88603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const MagickSizeType span)
88613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
88633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
88653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
88663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
88683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o task: Identifies the task in progress.
88703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o offset: Specifies the offset position within the span which represents
88723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      how much progress has been made in completing a task.
88733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o span: Specifies the span relative to completing a task.
88753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
88763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8877bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XProgressMonitorWidget(Display *display,XWindows *windows,
88783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *task,const MagickOffsetType offset,const MagickSizeType span)
88793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
88803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
88813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
88823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
88843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
88853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
88873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
88883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(task != (const char *) NULL);
88893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",task);
88903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (span == 0)
88913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return;
88923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
88933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Update image windows if there is a pending expose event.
88943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
88953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,windows->command.id,Expose,&event))
88963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XCommandWidget(display,windows,(const char **) NULL,&event);
88973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,windows->image.id,Expose,&event))
88983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XRefreshWindow(display,&windows->image,&event);
88993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (XCheckTypedWindowEvent(display,windows->info.id,Expose,&event))
89003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (monitor_info.text != (char *) NULL)
89013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XInfoWidget(display,windows,monitor_info.text);
89023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
89033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw progress monitor bar to represent percent completion of a task.
89043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
89053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((windows->info.mapped == MagickFalse) || (task != monitor_info.text))
89063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    XInfoWidget(display,windows,task);
89073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=(unsigned int) (((offset+1)*(windows->info.width-
89083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (2*monitor_info.x)))/span);
89093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (width < monitor_info.width)
89103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
89113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      monitor_info.raised=MagickTrue;
89123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XDrawWidgetText(display,&windows->info,&monitor_info);
89133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      monitor_info.raised=MagickFalse;
89143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
89153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  monitor_info.width=width;
89163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XDrawWidgetText(display,&windows->info,&monitor_info);
89173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XFlush(display);
89183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
89193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
89213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   X T e x t V i e w W i d g e t                                             %
89263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
89293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  XTextViewWidget() displays text in a Text View widget.
89323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the XTextViewWidget method is:
89343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void XTextViewWidget(Display *display,const XResourceInfo *resource_info,
89363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        XWindows *windows,const MagickBooleanType mono,const char *title,
89373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char **textlist)
89383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
89403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o display: Specifies a connection to an X server;  returned from
89423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      XOpenDisplay.
89433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o resource_info: Specifies a pointer to a X11 XResourceInfo structure.
89453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o window: Specifies a pointer to a XWindows structure.
89473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o mono:  Use mono-spaced font when displaying text.
89493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o title: This character string is displayed at the top of the widget
89513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      window.
89523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o textlist: This string list is displayed within the Text View widget.
89543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
89553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8956bcbda3fd7d9f3084869f5cebabceb0324c3b2cd7cristyMagickPrivate void XTextViewWidget(Display *display,
89573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const XResourceInfo *resource_info,XWindows *windows,
89583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickBooleanType mono,const char *title,const char **textlist)
89593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
89603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DismissButtonText  "Dismiss"
89613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
8963151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    primary_selection[MagickPathExtent];
89643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register int
89663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
89673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static MagickStatusType
89693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    mask = (MagickStatusType) (CWWidth | CWHeight | CWX | CWY);
89703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Status
89723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
89733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
89753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height,
89763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    lines,
89773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_width,
89783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    visible_lines,
89793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width;
89803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8981bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
89823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delay,
89833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    state;
89843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XEvent
89863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    event;
89873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XFontStruct
89893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *font_info,
89903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *text_info;
89913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XTextProperty
89933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_name;
89943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
89953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWidgetInfo
89963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dismiss_info,
89973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    expose_info,
89983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    list_info,
89993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    north_info,
90003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scroll_info,
90013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    selection_info,
90023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    slider_info,
90033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    south_info;
90043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XWindowChanges
90063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    window_changes;
90073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert text string to a text list.
90103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
90113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(display != (Display *) NULL);
90123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(resource_info != (XResourceInfo *) NULL);
90133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(windows != (XWindows *) NULL);
90143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(title != (const char *) NULL);
90153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(textlist != (const char **) NULL);
90163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",title);
90173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickTrue);
90183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
90193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (textlist == (const char **) NULL)
90203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
90213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XNoticeWidget(display,windows,"No text to view:",(char *) NULL);
90223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return;
90233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
90243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine Text View widget attributes.
90263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
90273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  font_info=windows->widget.font_info;
90283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_info=(XFontStruct *) NULL;
90293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (mono != MagickFalse)
90303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info=XBestFont(display,resource_info,MagickTrue);
90313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info == (XFontStruct *) NULL)
90323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_info=windows->widget.font_info;
90333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  text_width=0;
90343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; textlist[i] != (char *) NULL; i++)
90353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (WidgetTextWidth(text_info,(char *) textlist[i]) > text_width)
90363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      text_width=(unsigned int) XTextWidth(text_info,(char *) textlist[i],
90373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickMin(Extent(textlist[i]),160));
90383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lines=(unsigned int) i;
90393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width=WidgetTextWidth(font_info,DismissButtonText);
90403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  width+=QuantumMargin;
90413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (text_info->ascent+text_info->descent);
90423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Position Text View widget.
90443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
90453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.width=(unsigned int) (MagickMin((int) text_width,
90463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (int) MaxTextWidth)+5*QuantumMargin);
90473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_width=(unsigned int) (MinTextWidth+4*QuantumMargin);
90483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.width < windows->widget.min_width)
90493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.width=windows->widget.min_width;
90503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.height=(unsigned int) (MagickMin(MagickMax((int) lines,3),32)*
90513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height+((13*height) >> 1)+((9*QuantumMargin) >> 1));
90523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.min_height=(unsigned int) (3*height+((13*height) >> 1)+((9*
90533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    QuantumMargin) >> 1));
90543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (windows->widget.height < windows->widget.min_height)
90553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.height=windows->widget.min_height;
90563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XConstrainWindowPosition(display,&windows->widget);
90573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Map Text View widget.
90593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9060151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(windows->widget.name,title,MagickPathExtent);
90613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=XStringListToTextProperty(&windows->widget.name,1,&window_name);
90623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status != False)
90633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
90643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMName(display,windows->widget.id,&window_name);
90653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      XSetWMIconName(display,windows->widget.id,&window_name);
90663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XFree((void *) window_name.value);
90673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
90683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.width=(int) windows->widget.width;
90693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.height=(int) windows->widget.height;
90703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.x=windows->widget.x;
90713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  window_changes.y=windows->widget.y;
90723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XReconfigureWMWindow(display,windows->widget.id,
90733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    windows->widget.screen,(unsigned int) mask,&window_changes);
90743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XMapRaised(display,windows->widget.id);
90753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  windows->widget.mapped=MagickFalse;
90763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
90773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Respond to X events.
90783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
90793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&slider_info);
90803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&north_info);
90813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&south_info);
90823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XGetWidgetInfo((char *) NULL,&expose_info);
9083f170e1240316e694f7f6464842c83a8f1bb71011cristy  XGetWidgetInfo((char *) NULL,&selection_info);
90843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  visible_lines=0;
90853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  delay=SuspendTime << 2;
90863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  height=(unsigned int) (font_info->ascent+font_info->descent);
90873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  state=UpdateConfigurationState;
90883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
90893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
90903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & UpdateConfigurationState)
90913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
90923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int
90933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          id;
90943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
90953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
90963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize button information.
90973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
90983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo(DismissButtonText,&dismiss_info);
90993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.width=width;
91003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.height=(unsigned int) ((3*height) >> 1);
91013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.x=(int) windows->widget.width-dismiss_info.width-
91023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          QuantumMargin-2;
91033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dismiss_info.y=(int) windows->widget.height-dismiss_info.height-
91043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          QuantumMargin;
91053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize scroll information.
91073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&scroll_info);
91093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.bevel_width--;
91103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.width=height;
91113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.height=(unsigned int) (dismiss_info.y-((5*QuantumMargin) >>
91123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          1));
91133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.x=(int) windows->widget.width-QuantumMargin-
91143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.width;
91153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.y=(3*QuantumMargin) >> 1;
91163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.raised=MagickFalse;
91173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        scroll_info.trough=MagickTrue;
91183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info=scroll_info;
91193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.raised=MagickTrue;
91203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.width-=(north_info.bevel_width << 1);
91213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.height=north_info.width-1;
91223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.x+=north_info.bevel_width;
91233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        north_info.y+=north_info.bevel_width;
91243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info=north_info;
91253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        south_info.y=scroll_info.y+scroll_info.height-scroll_info.bevel_width-
91263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          south_info.height;
91273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        id=slider_info.id;
91283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info=north_info;
91293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.id=id;
91303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.width-=2;
91313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.min_y=north_info.y+north_info.height+north_info.bevel_width+
91323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width+2;
91333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.height=scroll_info.height-((slider_info.min_y-
91343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          scroll_info.y+1) << 1)+4;
91353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        visible_lines=scroll_info.height/(text_info->ascent+text_info->descent+
91363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ((text_info->ascent+text_info->descent) >> 3));
91373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lines > visible_lines)
91383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.height=(unsigned int) (visible_lines*slider_info.height)/
91393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            lines;
91403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.max_y=south_info.y-south_info.bevel_width-
91413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.bevel_width-2;
91423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.x=scroll_info.x+slider_info.bevel_width+1;
91433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
91443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info=scroll_info;
91453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        expose_info.y=slider_info.y;
91463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize list information.
91483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&list_info);
91503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.raised=MagickFalse;
91513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.bevel_width--;
91523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.width=(unsigned int) scroll_info.x-((3*QuantumMargin) >> 1);
91533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.height=scroll_info.height;
91543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.x=QuantumMargin;
91553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.y=scroll_info.y;
91563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Initialize selection information.
91583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XGetWidgetInfo((char *) NULL,&selection_info);
91603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.center=MagickFalse;
91613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.width=list_info.width;
91623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.height=(unsigned int)
91633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (9*(text_info->ascent+text_info->descent)) >> 3;
91643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.x=list_info.x;
91653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~UpdateConfigurationState);
91663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
91673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawWidgetState)
91683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
91693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Redraw Text View window.
91713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&list_info);
91733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledMatte(display,&windows->widget,&scroll_info);
91743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleNorth(display,&windows->widget,&north_info);
91753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&slider_info);
91763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawTriangleSouth(display,&windows->widget,&south_info);
91773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDrawBeveledButton(display,&windows->widget,&dismiss_info);
91783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XHighlightWidget(display,&windows->widget,BorderOffset,BorderOffset);
91793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
91803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
91813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawWidgetState);
91823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
91833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (state & RedrawListState)
91843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
91853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
91863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Determine slider id and position.
91873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
91883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id >= (int) (lines-visible_lines))
91893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=(int) lines-visible_lines;
91903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((slider_info.id < 0) || (lines <= visible_lines))
91913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.id=0;
91923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        slider_info.y=slider_info.min_y;
91933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lines != 0)
91943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          slider_info.y+=
91953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id*(slider_info.max_y-slider_info.min_y+1)/lines;
91963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.id != selection_info.id)
91973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
91983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
91993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Redraw scroll bar and text.
92003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
92013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->widget.font_info=text_info;
92023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFont(display,windows->widget.annotate_context,
92033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              text_info->fid);
92043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFont(display,windows->widget.highlight_context,
92053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              text_info->fid);
92063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=slider_info.id;
92073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.y=list_info.y+(height >> 3)+2;
92083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < (int) visible_lines; i++)
92093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
92103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.raised=
92113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (slider_info.id+i) != list_info.id ? MagickTrue : MagickFalse;
92123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.text=(char *) NULL;
92133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if ((slider_info.id+i) < (int) lines)
92143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                selection_info.text=(char *) textlist[slider_info.id+i];
92153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              XDrawWidgetText(display,&windows->widget,&selection_info);
92163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.y+=(int) selection_info.height;
92173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
92183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            windows->widget.font_info=font_info;
92193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFont(display,windows->widget.annotate_context,
92203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              font_info->fid);
92213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetFont(display,windows->widget.highlight_context,
92223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              font_info->fid);
92233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
92243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Update slider.
92253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
92263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > expose_info.y)
92273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
92283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) slider_info.y-expose_info.y;
92293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y-expose_info.height-
92303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width-1;
92313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
92323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
92333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
92343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.height=(unsigned int) expose_info.y-slider_info.y;
92353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                expose_info.y=slider_info.y+slider_info.height+
92363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  slider_info.bevel_width+1;
92373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
92383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
92393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawMatte(display,&windows->widget,&expose_info);
92403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&slider_info);
92413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
92423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            expose_info.y=slider_info.y;
92433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
92443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~RedrawListState);
92453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
92463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
92473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Wait for next event.
92483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
92493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (north_info.raised && south_info.raised)
92503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) XIfEvent(display,&event,XScreenEvent,(char *) windows);
92513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
92523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
92533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
92543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Brief delay before advancing scroll bar.
92553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
92563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XDelay(display,delay);
92573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        delay=SuspendTime;
92583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XCheckIfEvent(display,&event,XScreenEvent,(char *) windows);
92593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
92603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
92613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
92623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
92633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
92643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
92653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
92663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
92673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
92683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
92693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id < (int) lines)
92703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
92713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
92723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
92733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
92743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
92753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
92763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
92773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.type != ButtonRelease)
92783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
92793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
92803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (event.type)
92813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
92823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonPress:
92833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
92843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(slider_info,event.xbutton))
92853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
92863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
92873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Track slider.
92883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
92893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickTrue;
92903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
92913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
92923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(north_info,event.xbutton))
92933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id > 0)
92943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
92953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
92963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider up.
92973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
92983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              north_info.raised=MagickFalse;
92993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id--;
93003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
93013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
93023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
93033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(south_info,event.xbutton))
93043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (slider_info.id < (int) lines)
93053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
93063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
93073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Move slider down.
93083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
93093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              south_info.raised=MagickFalse;
93103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id++;
93113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              state|=RedrawListState;
93123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
93133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
93143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(scroll_info,event.xbutton))
93153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
93163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
93173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
93183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
93193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.y < slider_info.y)
93203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id-=(visible_lines-1);
93213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
93223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id+=(visible_lines-1);
93233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
93243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
93253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
93263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(dismiss_info,event.xbutton))
93273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
93283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
93293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed Dismiss button.
93303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
93313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickFalse;
93323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
93333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
93343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
93353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (MatteIsActive(list_info,event.xbutton))
93363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
93373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
93383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              id;
93393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            static Time
93413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              click_time;
93423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
93443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User pressed list matte.
93453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
93463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            id=slider_info.id+(event.xbutton.y-(list_info.y+(height >> 1))+1)/
93473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              selection_info.height;
93483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id >= (int) lines)
93493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
93503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (id != list_info.id)
93513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
93523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                list_info.id=id;
93533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                click_time=event.xbutton.time;
93543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
93553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
93563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            list_info.id=id;
93573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.time >= (click_time+DoubleClick))
93583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
93593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                click_time=event.xbutton.time;
93603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
93613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
93623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            click_time=event.xbutton.time;
93633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
93643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Become the XA_PRIMARY selection owner.
93653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
93663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) CopyMagickString(primary_selection,textlist[list_info.id],
9367151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              MagickPathExtent);
93683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetSelectionOwner(display,XA_PRIMARY,windows->widget.id,
93693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              event.xbutton.time);
93703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (XGetSelectionOwner(display,XA_PRIMARY) != windows->widget.id)
93713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
93723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            selection_info.id=(~0);
93733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            list_info.id=id;
93743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
93753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
93763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
93773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
93783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
93793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ButtonRelease:
93803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
93813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (windows->widget.mapped == MagickFalse)
93823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
93833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (north_info.raised == MagickFalse)
93843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
93853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
93863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released up button.
93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
93883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
93893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            north_info.raised=MagickTrue;
93903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleNorth(display,&windows->widget,&north_info);
93913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
93923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (south_info.raised == MagickFalse)
93933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
93943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
93953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              User released down button.
93963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
93973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            delay=SuspendTime << 2;
93983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            south_info.raised=MagickTrue;
93993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawTriangleSouth(display,&windows->widget,&south_info);
94003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
94013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
94023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
94033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
94043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Stop tracking slider.
94053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
94063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.active=MagickFalse;
94073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
94083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
94093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dismiss_info.raised == MagickFalse)
94103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
94113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (event.xbutton.window == windows->widget.id)
94123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (MatteIsActive(dismiss_info,event.xbutton))
94133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                state|=ExitState;
94143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickTrue;
94153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
94163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
94173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
94183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
94193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ClientMessage:
94203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
94213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
94223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          If client window delete message, exit.
94233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
94243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.message_type != windows->wm_protocols)
94253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l == (int) windows->wm_take_focus)
94273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
94283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) XSetInputFocus(display,event.xclient.window,RevertToParent,
94293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (Time) event.xclient.data.l[1]);
94303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
94313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
94323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (*event.xclient.data.l != (int) windows->wm_delete_window)
94333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xclient.window == windows->widget.id)
94353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
94363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
94373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
94383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
94393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
94403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
94413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case ConfigureNotify:
94423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
94433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
94443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Update widget configuration.
94453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
94463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xconfigure.window != windows->widget.id)
94473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((event.xconfigure.width == (int) windows->widget.width) &&
94493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (event.xconfigure.height == (int) windows->widget.height))
94503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.width=(unsigned int)
94523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.width,(int) windows->widget.min_width);
94533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        windows->widget.height=(unsigned int)
94543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MagickMax(event.xconfigure.height,(int) windows->widget.min_height);
94553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=UpdateConfigurationState;
94563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
94573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
94583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case EnterNotify:
94593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
94603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
94613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state&=(~InactiveWidgetState);
94633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
94643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
94653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case Expose:
94663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
94673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.window != windows->widget.id)
94683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xexpose.count != 0)
94703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawWidgetState;
94723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
94733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
94743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyPress:
94753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
94763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static char
9477151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          command[MagickPathExtent];
94783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static int
94803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
94813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        static KeySym
94833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          key_symbol;
94843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
94853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
94863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Respond to a user key press.
94873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
94883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xkey.window != windows->widget.id)
94893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
94903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=XLookupString((XKeyEvent *) &event.xkey,command,
94913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) sizeof(command),&key_symbol,(XComposeStatus *) NULL);
94923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *(command+length)='\0';
94933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((key_symbol == XK_Return) || (key_symbol == XK_KP_Enter))
94943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
94953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=MagickFalse;
94963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
94973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=ExitState;
94983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
94993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
95003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (AreaIsActive(scroll_info,event.xkey))
95013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
95023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
95033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider.
95043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
95053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            switch ((int) key_symbol)
95063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
95073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Home:
95083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Home:
95093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
95103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=0;
95113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
95123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
95133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Up:
95143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Up:
95153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
95163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id--;
95173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
95183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
95193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Down:
95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Down:
95213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
95223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id++;
95233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
95243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
95253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Prior:
95263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Prior:
95273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
95283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id-=visible_lines;
95293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
95303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
95313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_Next:
95323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_Next:
95333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
95343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id+=visible_lines;
95353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
95363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
95373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_End:
95383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              case XK_KP_End:
95393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
95403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                slider_info.id=(int) lines;
95413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
95423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
95433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
95443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
95453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
95463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
95473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
95483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
95493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case KeyRelease:
95503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
95513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case LeaveNotify:
95523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
95533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (event.xcrossing.window != windows->widget.id)
95543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
95553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=InactiveWidgetState;
95563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
95573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
95583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MapNotify:
95593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
95603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWX);
95613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        mask&=(~CWY);
95623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
95633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
95643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case MotionNotify:
95653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
95663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
95673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Discard pending button motion events.
95683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
95693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (XCheckMaskEvent(display,ButtonMotionMask,&event)) ;
95703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (slider_info.active)
95713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
95723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
95733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Move slider matte.
95743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
95753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.y=event.xmotion.y-
95763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ((slider_info.height+slider_info.bevel_width) >> 1)+1;
95773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y < slider_info.min_y)
95783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.min_y;
95793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y > slider_info.max_y)
95803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.y=slider_info.max_y;
95813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            slider_info.id=0;
95823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (slider_info.y != slider_info.min_y)
95833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              slider_info.id=(int) (lines*(slider_info.y-slider_info.min_y+1))/
95843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (slider_info.max_y-slider_info.min_y+1);
95853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            state|=RedrawListState;
95863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
95873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
95883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (state & InactiveWidgetState)
95893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
95903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dismiss_info.raised == MatteIsActive(dismiss_info,event.xmotion))
95913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
95923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
95933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Dismiss button status changed.
95943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
95953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dismiss_info.raised=
95963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              dismiss_info.raised == MagickFalse ? MagickTrue : MagickFalse;
95973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            XDrawBeveledButton(display,&windows->widget,&dismiss_info);
95983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
95993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
96003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
96013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
96023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionClear:
96033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
96043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        list_info.id=(~0);
96053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        selection_info.id=(~0);
96063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        state|=RedrawListState;
96073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
96083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
96093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case SelectionRequest:
96103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
96113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionEvent
96123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify;
96133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        XSelectionRequestEvent
96153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *request;
96163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
96173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (list_info.id == (~0))
96183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
96193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
96203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Set primary selection.
96213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
96223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        request=(&(event.xselectionrequest));
96233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XChangeProperty(request->display,request->requestor,
96243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          request->property,request->target,8,PropModeReplace,
96253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (unsigned char *) primary_selection,Extent(primary_selection));
96263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.type=SelectionNotify;
96273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.send_event=MagickTrue;
96283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.display=request->display;
96293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.requestor=request->requestor;
96303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.selection=request->selection;
96313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.target=request->target;
96323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        notify.time=request->time;
96333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (request->property == None)
96343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->target;
96353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
96363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          notify.property=request->property;
96373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) XSendEvent(request->display,request->requestor,False,NoEventMask,
96383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (XEvent *) &notify);
96393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
96403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
96413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
96423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
96433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((state & ExitState) == 0);
96443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (text_info != windows->widget.font_info)
96453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) XFreeFont(display,text_info);
96463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XSetCursorState(display,windows,MagickFalse);
96473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) XWithdrawWindow(display,windows->widget.id,windows->widget.screen);
96483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  XCheckRefreshWindows(display,windows);
96493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
96503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9651