siemens-rtl/drawwin_d.c
2023-07-11 14:40:13 +02:00

716 lines
20 KiB
C

#ifndef lint
static char sccs_id[] = "%W% %H%";
#endif
/*
* Copyright 1988 by Siemens Research and Technology Laboratories, Princeton, NJ
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Siemens Research and Technology
* Laboratories not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
*
*
* SIEMENS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* SIEMENS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include "copyright.h"
/* The Drawwin package manages Decorated client windows
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "basetype.h"
#include "userglobD.h"
#include "uwinD.h"
#include "uwinXD.h"
#include "draw.h"
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include "xio.h"
#define HEADER_FONT "6x12"
GC fillGC, clearGC, xorGC, invert_body_GC;
XFontStruct *fontp;
static void Drawwin_Config_Corners(Userwin *uwinp, int width, int height);
static int Drawwin_Draw_Corner_Lines(Window parent, GC gc, int width, int height);
static int Drawwin_Draw_Corners(Window parent, GC gc, int width, int height);
/*-----------------------------------------------------------------*/
/* Font and drawing function set-up
* ?? Could get foreground/background colors from interface/options
*/
void
Drawwin_Init()
{
XGCValues gcv;
unsigned long vmask;
if ( (fontp = XLoadQueryFont(dpy, HEADER_FONT)) == NULL )
{
fprintf(stderr, "XLoadFont failed\n");
exit(1);
}
vmask = GCForeground | GCFont;
gcv.foreground = BlackPixel(dpy, scrn);
gcv.font = fontp->fid;
fillGC = XCreateGC(dpy, root, vmask, &gcv);
gcv.foreground = WhitePixel(dpy, scrn);
clearGC = XCreateGC(dpy, root, vmask, &gcv);
gcv.foreground = 0xfd;
gcv.line_width = 0;
gcv.function = GXxor;
gcv.subwindow_mode = IncludeInferiors;
xorGC = XCreateGC(dpy, root,
GCForeground | GCLineWidth |
GCFunction | GCSubwindowMode,
&gcv);
gcv.function = GXxor;
gcv.foreground = BlackPixel(dpy, scrn) ^ WhitePixel(dpy,scrn);
invert_body_GC = XCreateGC(dpy, root,
GCForeground | GCFunction | GCSubwindowMode, &gcv);
}
/*-----------------------------------------------------------------*/
void
Drawwin_Config_Borders(uwinp, width, height)
Userwin *uwinp;
int width, height; /* dimensions of parent window */
{
Draw_ConfigWin(Userwin_XTopBorder(uwinp),
0,
0,
width,
BORDER_SIZE_VAL);
Draw_ConfigWin(Userwin_XLeftBorder(uwinp),
0,
BORDER_SIZE_VAL,
BORDER_SIZE_VAL,
height - (2 * BORDER_SIZE_VAL));
Draw_ConfigWin(Userwin_XRightBorder(uwinp),
width - BORDER_SIZE_VAL,
BORDER_SIZE_VAL,
BORDER_SIZE_VAL,
height - (2 * BORDER_SIZE_VAL));
Draw_ConfigWin(Userwin_XBottomBorder(uwinp),
0,
height - BORDER_SIZE_VAL,
width,
BORDER_SIZE_VAL);
if (UserGlobals_Get_Option(USE_CORNER_BORDERS) == TRUE)
{
Drawwin_Config_Corners(uwinp, width, height);
}
}
/* Draw the representation of the Border windows in the
* parent window
*/
void
Drawwin_Draw_Borders(uwinp, width, height)
Userwin *uwinp;
int width, height; /* dimensions of parent window */
{
XRectangle rects[4];
XRectangle *pr = rects;
Window parent = Userwin_XParentWin(uwinp);
/* Draw 4 FILLED rects to make the borders
* (top, left, right and bottom borders)
*/
pr -> x = 0;
pr -> y = 0;
pr -> width = width;
pr++ -> height = BORDER_SIZE_VAL;
pr -> x = 0;
pr -> y = BORDER_SIZE_VAL;
pr -> width = BORDER_SIZE_VAL;
pr++ -> height = height;
pr -> x = width - BORDER_SIZE_VAL;
pr -> y = 0;
pr -> width = BORDER_SIZE_VAL;
pr++ -> height = height;
pr -> x = 0;
pr -> y = height - BORDER_SIZE_VAL;
pr -> width = width;
pr++ -> height = BORDER_SIZE_VAL;
XFillRectangles(dpy, parent, fillGC, rects, pr - rects);
if ((UserGlobals_Get_Option(SHOW_FOCUS_IN_BORDERS) && uwinp->focus) ||
(UserGlobals_Get_Option(SHOW_LISTENER_IN_BORDERS) && uwinp->listener))
{
if (UserGlobals_Get_Option(DISTINGUISH_CORNER_BORDERS) == TRUE &&
UserGlobals_Get_Option(USE_CORNER_BORDERS) == TRUE)
{
if ( UserGlobals_Get_Option(DISTNGSH_CORNER_BORDERS_BY_INV))
{
Drawwin_Draw_Corners(parent, clearGC, width, height);
}
else
{
Drawwin_Draw_Corner_Lines(parent, clearGC, width, height);
}
}
}
else /* show border lines by CLEARing rects, offset by linewidths... */
{
pr = rects;
pr -> x = OUTER_BORDER_LINEWIDTH_VAL;
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = width - (2 * OUTER_BORDER_LINEWIDTH_VAL);
pr++ -> height = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr -> x = OUTER_BORDER_LINEWIDTH_VAL;
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = height - (2 * OUTER_BORDER_LINEWIDTH_VAL);
pr -> x = width - BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = height - (2 * OUTER_BORDER_LINEWIDTH_VAL);
pr -> x = OUTER_BORDER_LINEWIDTH_VAL;
pr -> y = height - BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
pr -> width = width - (2 * OUTER_BORDER_LINEWIDTH_VAL);
pr++ -> height = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
XFillRectangles(dpy, parent, clearGC, rects, pr - rects);
if (UserGlobals_Get_Option(DISTINGUISH_CORNER_BORDERS) == TRUE &&
UserGlobals_Get_Option(USE_CORNER_BORDERS) == TRUE)
{
if ( UserGlobals_Get_Option(DISTNGSH_CORNER_BORDERS_BY_INV))
{
Drawwin_Draw_Corners(parent, fillGC, width, height);
}
else /* just draw lines to highlight the corner borders */
{
Drawwin_Draw_Corner_Lines(parent, fillGC, width, height);
}
}
}
}
/* Remove (but don't destroy the resources associated with)
* all border windows
*/
void
Drawwin_Remove_Borders(uwinp)
Userwin *uwinp;
{
XUnmapWindow(dpy, Userwin_XTopBorder(uwinp));
XUnmapWindow(dpy, Userwin_XLeftBorder(uwinp));
XUnmapWindow(dpy, Userwin_XRightBorder(uwinp));
XUnmapWindow(dpy, Userwin_XBottomBorder(uwinp));
}
/*-----------------------------------------------------------------*/
/* Create the corner border windows, as part of the
* decorated-client window
*/
static void
Drawwin_Config_Corners(uwinp, width, height)
Userwin *uwinp;
int width, height;
{
Draw_ConfigWin(Userwin_XTopLeftCorner(uwinp),
0,
0,
2 * BORDER_SIZE_VAL,
2 * BORDER_SIZE_VAL);
Draw_ConfigWin(Userwin_XTopRightCorner(uwinp),
width - (2 * BORDER_SIZE_VAL),
0,
2 * BORDER_SIZE_VAL,
2 * BORDER_SIZE_VAL);
Draw_ConfigWin(Userwin_XBottomLeftCorner(uwinp),
0,
height - (2 * BORDER_SIZE_VAL),
2 * BORDER_SIZE_VAL,
2 * BORDER_SIZE_VAL);
Draw_ConfigWin(Userwin_XBottomRightCorner(uwinp),
width - (2 * BORDER_SIZE_VAL),
height - (2 * BORDER_SIZE_VAL),
2 * BORDER_SIZE_VAL,
2 * BORDER_SIZE_VAL);
}
static int
Drawwin_Draw_Corners(parent, gc, width, height)
Window parent;
GC gc;
int width, height;
{
XRectangle rects[8];
XRectangle *pr = rects;
pr -> x = OUTER_BORDER_LINEWIDTH_VAL; /* top left */
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = 2 * BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr -> x = OUTER_BORDER_LINEWIDTH_VAL;
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = 2 * BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
/* top right */
pr -> x = width - BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = 2 * BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr -> x = width - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
pr -> y = OUTER_BORDER_LINEWIDTH_VAL;
pr -> width = 2 * BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr -> x = OUTER_BORDER_LINEWIDTH_VAL; /* bottom left */
pr -> y = height - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
pr -> width = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = (2 * BORDER_SIZE_VAL) -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr -> x = OUTER_BORDER_LINEWIDTH_VAL;
pr -> y = height - BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
pr -> width = 2 * BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
/* bottom right */
pr -> x = width - BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
pr -> y = height - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
pr -> width = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = (2 * BORDER_SIZE_VAL) -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr -> x = width - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
pr -> y = height - BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
pr -> width = 2 * BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
pr++ -> height = BORDER_SIZE_VAL -
(OUTER_BORDER_LINEWIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
XFillRectangles(dpy, parent, gc, rects, pr - rects);
}
/* Draw distinguishing lines for Corner Borders.
*/
static int
Drawwin_Draw_Corner_Lines(parent, gc, width, height)
Window parent;
GC gc;
int width, height;
{
XGCValues gcv;
unsigned long vmask;
XSegment segments[8];
XSegment *psg = segments;
vmask = GCLineWidth;
gcv.line_width = INNER_BORDER_LINEWIDTH_VAL;
XChangeGC(dpy, gc, vmask, &gcv);
/* top left corner */
psg -> x1 = 0;
psg -> y1 = 2 * BORDER_SIZE_VAL - INNER_BORDER_LINEWIDTH_VAL;
psg -> x2 = BORDER_SIZE_VAL - 1;
psg++ -> y2 = 2 * BORDER_SIZE_VAL - INNER_BORDER_LINEWIDTH_VAL;
psg -> x1 = 2 * BORDER_SIZE_VAL - INNER_BORDER_LINEWIDTH_VAL;
psg -> y1 = 0;
psg -> x2 = 2 * BORDER_SIZE_VAL - INNER_BORDER_LINEWIDTH_VAL;
psg++ -> y2 = BORDER_SIZE_VAL - 1;
psg -> x1 = width - BORDER_SIZE_VAL; /* top right corner */
psg -> y1 = 2 * BORDER_SIZE_VAL - INNER_BORDER_LINEWIDTH_VAL;
psg -> x2 = width - 1;
psg++ -> y2 = 2 * BORDER_SIZE_VAL - INNER_BORDER_LINEWIDTH_VAL;
psg -> x1 = width - 2 * BORDER_SIZE_VAL + INNER_BORDER_LINEWIDTH_VAL;
psg -> y1 = 0;
psg -> x2 = width - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg++ -> y2 = BORDER_SIZE_VAL - 1;
psg -> x1 = 0; /* bottom left corner */
psg -> y1 = height - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg -> x2 = BORDER_SIZE_VAL - 1;
psg++ -> y2 = height - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg -> x1 = (2 * BORDER_SIZE_VAL) - INNER_BORDER_LINEWIDTH_VAL;
psg -> y1 = height - BORDER_SIZE_VAL;
psg -> x2 = (2 * BORDER_SIZE_VAL) - INNER_BORDER_LINEWIDTH_VAL;
psg++ -> y2 = height - 1;
psg -> x1 = width - BORDER_SIZE_VAL; /* bottom right corner */
psg -> y1 = height - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg -> x2 = width - 1;
psg++ -> y2 = height - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg -> x1 = width - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg -> y1 = height - BORDER_SIZE_VAL;
psg -> x2 = width - (2 * BORDER_SIZE_VAL) + INNER_BORDER_LINEWIDTH_VAL;
psg++ -> y2 = height - 1;
XDrawSegments(dpy, parent, gc, segments, psg - segments);
}
/*-----------------------------------------------------------------*/
/* Create the header window, as part of the
* decorated-client window
*/
void
Drawwin_Config_Header(uwinp, width, height)
Userwin *uwinp;
int width, height;
{
int left_x, top_y;
left_x = 0;
top_y = 0;
height = uwinp->header_height + INNER_BORDER_LINEWIDTH_VAL;
if (Userwin_Get_Window_Option( uwinp, USE_BORDERS ))
{
left_x += BORDER_SIZE_VAL;;
top_y += BORDER_SIZE_VAL;
width -= (2 * BORDER_SIZE_VAL);
}
Draw_ConfigWin(Userwin_XHeader(uwinp),
left_x, top_y,
width, height);
}
/* Draw the header and its contents (string)
*/
void
Drawwin_Draw_Header(uwinp, width, height)
Userwin *uwinp;
int width, height;
{
int left_x, top_y;
Window parent = Userwin_XParentWin(uwinp);
GC titleGC;
left_x = 0;
top_y = 0;
height = uwinp->header_height + INNER_BORDER_LINEWIDTH_VAL;
if (Userwin_Get_Window_Option(uwinp, USE_BORDERS))
{
left_x += BORDER_SIZE_VAL;
top_y += BORDER_SIZE_VAL;
width -= (2 * BORDER_SIZE_VAL);
}
if (Userwin_Get_Window_Option( uwinp, USE_GADGETS ))
{
left_x += (GADGET_WIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
width -= (GADGET_WIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
if (Userwin_Get_Window_Option(uwinp, USE_MOVE_GADGET))
{
width -= (GADGET_WIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL);
}
}
if ((UserGlobals_Get_Option(SHOW_FOCUS_IN_HEADER) && uwinp->focus) ||
(UserGlobals_Get_Option(SHOW_LISTENER_IN_HEADER) && uwinp->listener))
{
XFillRectangle(dpy, parent, fillGC, left_x, top_y,
(unsigned) width, (unsigned) height);
titleGC = clearGC;
}
else
{
/* create the Inner Border line in the header...
*/
XFillRectangle(dpy, parent, clearGC, left_x, top_y,
(unsigned) width,
(unsigned) height - INNER_BORDER_LINEWIDTH_VAL);
XFillRectangle(dpy, parent, fillGC,
left_x,
top_y + height - INNER_BORDER_LINEWIDTH_VAL,
(unsigned) width,
(unsigned) INNER_BORDER_LINEWIDTH_VAL);
titleGC = fillGC;
}
#define TITLE_NCHARS 100
if ( (uwinp->title != (char *) NULL) &&
Userwin_Get_Window_Option( uwinp, INCLUDE_TITLE_IN_HEADER ) )
{
char s[TITLE_NCHARS];
int nc;
nc = Draw_Num_Drawables(uwinp->title,
fontp,
width - fontp->max_bounds.width,
TITLE_NCHARS);
strncpy(s, uwinp->title, nc);
s[nc] = '\0';
/* Position title string at 1 char position from left of header,
* and "font-height" position from top of header.
* This positioning affects the above calcs...
*/
XDrawString(dpy, parent, titleGC,
left_x + fontp->max_bounds.width,
top_y + fontp->max_bounds.ascent,
s, nc);
}
}
/* Remove the Header window from the decorated client window
*/
void
Drawwin_Remove_Header(uwinp)
Userwin *uwinp;
{
XUnmapWindow(dpy, Userwin_XHeader(uwinp));
}
/*-----------------------------------------------------------------*/
/* Create the Gadget subwindows
*/
/*ARGSUSED*/
void
Drawwin_Config_Gadgets(uwinp, width, height)
Userwin *uwinp;
int width, height;
{
int left_x, top_y;
int g_width, g_height;
g_width = GADGET_WIDTH_VAL + INNER_BORDER_LINEWIDTH_VAL;
g_height = uwinp->header_height + INNER_BORDER_LINEWIDTH_VAL;
if (Userwin_Get_Window_Option( uwinp, USE_BORDERS )) /* zoom gadget */
{
left_x = top_y = BORDER_SIZE_VAL;
}
else
{
left_x = top_y = 0;
}
Draw_ConfigWin(Userwin_XZoomGadget(uwinp),
left_x, top_y,
g_width, g_height);
if (Userwin_Get_Window_Option(uwinp, USE_MOVE_GADGET)) /* move gadget */
{
left_x = (Userwin_Get_Window_Option( uwinp, USE_BORDERS )) ?
width - BORDER_SIZE_VAL - g_width + 1 :
width - g_width;
Draw_ConfigWin(Userwin_XMoveGadget(uwinp),
left_x, top_y,
g_width, g_height);
}
else
{
XUnmapWindow(dpy, Userwin_XMoveGadget(uwinp));
}
}
/* Draw the representation of the desired Gadgets
*/
/*ARGSUSED*/
void
Drawwin_Draw_Gadgets(uwinp, width, height)
Userwin *uwinp;
int width, height;
{
unsigned int border_width, inner_border_width;
Window parent = Userwin_XParentWin(uwinp);
border_width = (Userwin_Get_Window_Option( uwinp, USE_BORDERS )) ?
BORDER_SIZE_VAL : 0;
inner_border_width = (Userwin_Get_Window_Option( uwinp, USE_BORDERS )) ?
INNER_BORDER_LINEWIDTH_VAL : 0;
XFillRectangle(dpy, parent, fillGC, /* Zoom gadget */
0 + border_width,
0 + border_width,
(unsigned) (GADGET_WIDTH_VAL + inner_border_width),
(unsigned) (uwinp->header_height + inner_border_width));
XFillRectangle(dpy, parent, clearGC,
0 + border_width,
0 + border_width,
(unsigned) (GADGET_WIDTH_VAL),
(unsigned) (uwinp->header_height));
if (uwinp->zoomed)
{
XDrawRectangle(dpy, parent, fillGC,
0 + border_width + 2,
0 + border_width + 2,
(unsigned) (GADGET_WIDTH_VAL - 5),
(unsigned) (uwinp->header_height - 5));
}
else
{
XFillRectangle(dpy, parent, fillGC,
0 + border_width + (GADGET_WIDTH_VAL / 2) - 2,
0 + border_width + (uwinp->header_height / 2) - 2,
(unsigned) 4,
(unsigned) 4);
}
if (Userwin_Get_Window_Option(uwinp, LISTENER_TIED_TO_ZOOM) == TRUE)
{
XDrawLine(dpy, parent, fillGC,
0 + border_width,
0 + border_width + (uwinp->header_height / 2),
0 + border_width + GADGET_WIDTH_VAL - 1,
0 + border_width + (uwinp->header_height / 2));
}
if (Userwin_Get_Window_Option(uwinp, USE_MOVE_GADGET) == TRUE)
{
/* Clear Move Gadget's area.
*/
XFillRectangle(dpy, parent, clearGC,
width - GADGET_WIDTH_VAL - border_width - inner_border_width,
0 + border_width,
(unsigned) (GADGET_WIDTH_VAL + inner_border_width),
(unsigned) (uwinp->header_height + inner_border_width));
/* Draw left border of gadget.
*/
XFillRectangle(dpy, parent, fillGC,
width - GADGET_WIDTH_VAL - border_width - inner_border_width,
0 + border_width,
inner_border_width,
(unsigned) (uwinp->header_height + inner_border_width));
/* Draw bottom border of gadget/header.
*/
XFillRectangle(dpy, parent, fillGC,
width - GADGET_WIDTH_VAL - border_width - inner_border_width,
0 + border_width + uwinp->header_height,
(unsigned) GADGET_WIDTH_VAL,
inner_border_width);
}
}
/* Remove the Gadget windows from the decorated window
*/
void
Drawwin_Remove_Gadgets(uwinp)
Userwin *uwinp;
{
XUnmapWindow(dpy, Userwin_XZoomGadget(uwinp));
XUnmapWindow(dpy, Userwin_XMoveGadget(uwinp));
}