netscape-revival
sun-java/awt/x/awt_Frame.c
/*
* @(#)awt_Frame.c 1.64 95/12/08 Sami Shaio
*
* Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
#include "awt_p.h"
#include <X11/Shell.h>
#include <X11/cursorfont.h>
#include <Xm/VendorS.h>
#include <Xm/DialogS.h>
#include <Xm/AtomMgr.h>
#include <Xm/Protocols.h>
#include <Xm/MwmUtil.h>
#include <X11/IntrinsicP.h>
#include "java_awt_MenuBar.h"
#include "sun_awt_motif_MMenuBarPeer.h"
#include "java_awt_Frame.h"
#include "sun_awt_motif_MFramePeer.h"
#include "java_awt_Color.h"
#include "java_awt_Component.h"
#include "java_awt_Insets.h"
#include "sun_awt_motif_MComponentPeer.h"
#include "java_awt_Image.h"
#include "java_awt_Font.h"
#include "canvas.h"
#include "image.h"
#include "awt_util.h"
#include "ustring.h"
#ifdef NETSCAPE
#undef Bool
#include "netscape_applet_MozillaAppletContext.h"
#include "netscape_applet_EmbeddedAppletFrame.h"
#include <java.h> /* for LJAppletData */
#include <structs.h> /* XXX remove later */
#include <shist.h> /* XXX remove later */
#endif /* NETSCAPE */
static int inreshape = 0;
static void
Window_resize(Widget wd, XtPointer client_data, XtPointer call_data)
{
if (!inreshape) {
Dimension width;
Dimension height;
Hjava_awt_Component *target = unhand((struct Hsun_awt_motif_MComponentPeer*)client_data)->target;
Classjava_awt_Component *targetPtr = unhand(target);
XtVaGetValues(wd,
XmNwidth, &width,
XmNheight, &height,
NULL);
targetPtr->width = width;
targetPtr->height = height;
JAVA_UPCALL((EE(), (void *)client_data, "handleResize","(II)V",
width, height));
}
}
static void
Frame_event_handler(Widget w, XtPointer data, XEvent *event, Boolean *cont)
{
struct Hsun_awt_motif_MFramePeer *this = (struct Hsun_awt_motif_MFramePeer *)data;
struct FrameData *wdata;
Classjava_awt_Component *targetPtr;
wdata = PDATA(FrameData,this);
if (wdata == 0) {
return;
}
switch (event->xany.type) {
case MapNotify:
if (wdata->mappedOnce == 0) {
wdata->mappedOnce = 1;
} else {
JAVA_UPCALL((EE(),
(void *)data,
"handleDeiconify","()V"));
}
break;
case UnmapNotify:
JAVA_UPCALL((EE(),
(void *)data,
"handleIconify","()V"));
break;
case ConfigureNotify:
targetPtr = unhand(unhand(this)->target);
targetPtr->x = event->xconfigure.x;
targetPtr->y = event->xconfigure.y;
JAVA_UPCALL((EE(),
(void *)data,
"handleMoved","(II)V", targetPtr->x, targetPtr->y));
break;
default:
break;
}
}
static void
Frame_quit(Widget w,
XtPointer client_data,
XtPointer call_data)
{
JAVA_UPCALL((EE(), (void *)client_data,"handleQuit","()V"));
}
static void
setDeleteCallback(struct Hsun_awt_motif_MFramePeer *this, struct FrameData *wdata)
{
Atom xa_WM_DELETE_WINDOW;
Atom xa_WM_PROTOCOLS;
XtVaSetValues(wdata->winData.shell,
XmNdeleteResponse, XmDO_NOTHING,
NULL);
xa_WM_DELETE_WINDOW = XmInternAtom(XtDisplay(wdata->winData.shell),
"WM_DELETE_WINDOW", False);
xa_WM_PROTOCOLS = XmInternAtom(XtDisplay(wdata->winData.shell),
"WM_PROTOCOLS", False);
XmAddProtocolCallback(wdata->winData.shell,
xa_WM_PROTOCOLS,
xa_WM_DELETE_WINDOW,
Frame_quit, (XtPointer)this);
}
static void
changeInsets(struct Hsun_awt_motif_MFramePeer *this,
struct FrameData *wdata)
{
Classjava_awt_Insets *insetsPtr;
if (unhand(this)->insets == 0) {
return;
}
insetsPtr = unhand(unhand(this)->insets);
insetsPtr->top = wdata->top;
insetsPtr->left = wdata->left;
insetsPtr->bottom = wdata->bottom;
insetsPtr->right = wdata->right;
}
void
sun_awt_motif_MFramePeer_create(struct Hsun_awt_motif_MFramePeer *this,
struct Hsun_awt_motif_MComponentPeer *parent,
struct Hjava_lang_Object *arg)
{
Arg args[40];
int argc;
struct FrameData *wdata;
Classjava_awt_Frame *targetPtr;
Classjava_awt_Insets *insetsPtr;
#ifdef NETSCAPE
ClassClass *cb;
int isEmbedded;
#endif
AWT_LOCK();
if (unhand(this)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
targetPtr = unhand((struct Hjava_awt_Frame *)unhand(this)->target);
unhand(this)->insets = (struct Hjava_awt_Insets *)arg;
insetsPtr = unhand(unhand(this)->insets);
wdata = ZALLOC(FrameData);
SET_PDATA(this, wdata);
if (wdata == 0) {
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
AWT_UNLOCK();
return;
}
wdata->cursorSet = 1;
wdata->cursor = 0;
#ifdef NETSCAPE
cb = FindClass(0, "netscape/applet/EmbeddedAppletFrame", FALSE);
isEmbedded = cb && is_instance_of((JHandle*)unhand(this)->target, cb, EE());
if (isEmbedded) {
wdata->winData.flags |= W_IS_EMBEDDED;
wdata->top = insetsPtr->top = 0;
wdata->left = insetsPtr->left = 0;
wdata->bottom = insetsPtr->bottom = 0;
wdata->right = insetsPtr->right = 0;
} else {
wdata->top = insetsPtr->top;
wdata->left = insetsPtr->left;
wdata->bottom = insetsPtr->bottom;
wdata->right = insetsPtr->right;
}
#else
wdata->top = insetsPtr->top;
wdata->left = insetsPtr->left;
wdata->bottom = insetsPtr->bottom;
wdata->right = insetsPtr->right;
#endif /* NETSCAPE */
wdata->isModal = 0;
wdata->mappedOnce = 0;
/* create a top-level shell */
argc = 0;
XtSetArg(args[argc], XmNsaveUnder, False); argc++;
XtSetArg(args[argc], XmNx, (XtArgVal)targetPtr->x); argc++;
XtSetArg(args[argc], XmNy, (XtArgVal)targetPtr->y); argc++;
XtSetArg(args[argc], XmNwidth, (XtArgVal)targetPtr->width); argc++;
XtSetArg(args[argc], XmNheight, (XtArgVal)targetPtr->height); argc++;
if (targetPtr->resizable) {
XtSetArg(args[argc], XmNallowShellResize, True); argc++;
} else {
XtSetArg(args[argc], XmNallowShellResize, False); argc++;
}
XtSetArg(args[argc], XmNmarginWidth, 0); argc++;
XtSetArg(args[argc], XmNmarginHeight, 0); argc++;
XtSetArg(args[argc], XmNvisual, awt_visual); argc++;
XtSetArg(args[argc], XmNcolormap, awt_cmap); argc++;
XtSetArg(args[argc], XmNdepth, awt_depth); argc++;
XtSetArg(args[argc], XmNnoResize, targetPtr->resizable ? False : True); argc++;
XtSetArg(args[argc], XmNmappedWhenManaged, False); argc++;
wdata->winData.shell = XtAppCreateShell("AWTapp","XApplication",
vendorShellWidgetClass,
awt_display,
args,
argc);
setDeleteCallback(this, wdata);
XtAddEventHandler(wdata->winData.shell, StructureNotifyMask,
FALSE, Frame_event_handler, this);
argc = 0;
XtSetArg(args[argc], XmNwidth,
(XtArgVal)targetPtr->width - (wdata->left + wdata->right)); argc++;
XtSetArg(args[argc], XmNheight,
(XtArgVal)targetPtr->height - (wdata->top + wdata->bottom)); argc++;
XtSetArg(args[argc], XmNmainWindowMarginHeight, 0); argc++;
XtSetArg(args[argc], XmNmainWindowMarginWidth, 0); argc++;
XtSetArg(args[argc], XmNmarginWidth, 0); argc++;
XtSetArg(args[argc], XmNmarginHeight, 0); argc++;
XtSetArg(args[argc], XmNspacing, 0); argc++;
#ifdef NETSCAPE
XtSetArg(args[argc], XmNcommandWindowLocation, XmCOMMAND_BELOW_WORKSPACE); argc++;
#endif /* NETSCAPE */
wdata->mainWindow = XmCreateMainWindow(wdata->winData.shell, "main", args, argc);
wdata->winData.comp.widget = awt_canvas_create((XtPointer)this,
wdata->mainWindow,
targetPtr->width,
targetPtr->height,
wdata);
#ifdef NETSCAPE
if (targetPtr->warningString && !isEmbedded)
#else
if (targetPtr->warningString)
#endif
{
Dimension hoffset;
wdata->warningWindow = awt_util_createWarningWindow(wdata->mainWindow,
makeCString(targetPtr->warningString));
XtVaGetValues(wdata->warningWindow, XmNheight, &hoffset, NULL);
wdata->top += hoffset;
changeInsets(this, wdata);
} else {
wdata->warningWindow = NULL;
}
XtVaSetValues(wdata->winData.comp.widget, XmNy, 0, NULL);
XmMainWindowSetAreas(wdata->mainWindow,
NULL,
wdata->warningWindow,
NULL,
NULL,
XtParent(wdata->winData.comp.widget));
XtAddCallback(wdata->winData.comp.widget,
XmNresizeCallback,
Window_resize,
this);
wdata->menuBar = NULL;
awt_util_show(wdata->winData.comp.widget);
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pSetIconImage(struct Hsun_awt_motif_MFramePeer *this,
struct Hsun_awt_image_ImageRepresentation *ir)
{
struct FrameData *wdata;
IRData *ird;
unsigned int width, height, border_width, depth;
Window win;
Window root;
int x,y;
unsigned long mask;
XSetWindowAttributes attrs;
if (ir == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return;
}
AWT_LOCK();
wdata = PDATA(FrameData,this);
ird = (IRData *)unhand(ir)->pData;
if (wdata == 0 || ird == 0 || ird->pixmap == 0 ||
wdata->winData.shell==0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
XtVaGetValues(wdata->winData.shell,
XmNiconWindow, &win,
NULL);
if (!win) {
mask = CWBorderPixel | CWColormap;
attrs.border_pixel = XFOREGROUND;
attrs.colormap = XCOLORMAP;
if (!XGetGeometry(awt_display,
ird->pixmap,
&root,
&x,
&y,
&width,
&height,
&border_width,
&depth) ||
! (win = XCreateWindow(awt_display,
root,
0, 0, width, height,
(unsigned)0, depth,
InputOutput,
awt_visual,
mask, &attrs))) {
XtVaSetValues(wdata->winData.shell,
XmNiconPixmap, ird->pixmap,
NULL);
AWT_FLUSH_UNLOCK();
return;
}
}
XtVaSetValues(wdata->winData.shell,
XmNiconWindow, win,
NULL);
XSetWindowBackgroundPixmap(awt_display, win, ird->pixmap);
XClearWindow(awt_display, win);
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pSetMenuBar(struct Hsun_awt_motif_MFramePeer *this,
struct Hjava_awt_MenuBar *mb)
{
struct FrameData *wdata;
struct ComponentData *mdata;
Classjava_awt_Frame *thisPtr;
Dimension hoffset;
if (mb == 0) {
return;
}
AWT_LOCK();
if (unhand(this)->target == 0 ||
(wdata = PDATA(FrameData, this)) == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
mdata = PEER_PDATA(ComponentData,Hsun_awt_motif_MMenuBarPeer, mb);
if (mdata == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
/* if the frame has a menubar, unmanage it and install the current */
/* one instead. */
if (wdata->menuBar != 0) {
thisPtr = unhand((Hjava_awt_Frame *)(unhand(this)->target));
if (thisPtr != 0) {
if (wdata->menuBar == mdata->widget) {
AWT_UNLOCK();
return;
}
XtSetMappedWhenManaged(wdata->menuBar, False);
}
}
XtVaSetValues(mdata->widget, XmNresizeHeight, True, NULL);
XmMainWindowSetAreas(wdata->mainWindow,
mdata->widget,
wdata->warningWindow,
NULL,
NULL,
XtParent(wdata->winData.comp.widget));
XtSetMappedWhenManaged(mdata->widget, True);
if (wdata->menuBar == 0) {
XtVaGetValues(mdata->widget, XmNheight, &hoffset, NULL);
hoffset += 15;
wdata->top += hoffset;
changeInsets(this, wdata);
awt_canvas_reconfigure(wdata);
}
wdata->menuBar = mdata->widget;
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pShow(struct Hsun_awt_motif_MFramePeer *this)
{
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 || wdata->winData.comp.widget==0 || wdata->winData.shell==0 ||
wdata->mainWindow == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
XtVaSetValues(wdata->winData.comp.widget,
XmNx, -(wdata->left),
XmNy, -(wdata->top), NULL);
if (wdata->menuBar != 0) {
awt_util_show(wdata->menuBar);
}
XtManageChild(wdata->mainWindow);
if (XtWindow(wdata->winData.shell) == 0) {
XtRealizeWidget(wdata->winData.shell);
}
#ifdef NETSCAPE
if (wdata->winData.flags & W_IS_EMBEDDED) {
struct Hjava_awt_Frame *target =
(struct Hjava_awt_Frame *) unhand(this)->target;
Hnetscape_applet_EmbeddedAppletFrame* appletFrame =
(Hnetscape_applet_EmbeddedAppletFrame*)target;
LJAppletData* ad = (LJAppletData*)unhand(appletFrame)->pData;
/*
** Squirrel away the shell widget that was created by awt. We'll
** reparent this back to the root window when a grid cell is
** destroyed, and reparent it back to the ad->window again when
** the grid cell is recreated.
*/
if (ad) {
ad->awtWindow = wdata->winData.shell;
if (ad->window) {
/*
** Only reparent the shell widget on the context widget if
** the context hasn't been destroyed. If it did get
** destroyed, our ad->window is null.
*/
XReparentWindow(XtDisplay(wdata->winData.shell),
XtWindow(wdata->winData.shell),
XtWindow((Widget)ad->window), 0, 0);
}
else {
/*
** If we did get destroyed, don't reparent the shell on the
** desktop.
*/
goto done;
}
}
}
#endif /* NETSCAPE */
XtMapWidget(wdata->winData.shell);
XRaiseWindow(awt_display, XtWindow(wdata->winData.shell));
done:
if (wdata->cursorSet == 0) {
unsigned long valuemask = 0;
XSetWindowAttributes attributes;
valuemask = CWCursor;
attributes.cursor = wdata->cursor;
XChangeWindowAttributes(awt_display,
XtWindow(wdata->winData.shell),
valuemask,
&attributes);
}
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pHide(struct Hsun_awt_motif_MFramePeer *this)
{
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 || wdata->winData.comp.widget==0 || wdata->winData.shell==0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
if (XtWindow(wdata->winData.shell) != 0) {
XtUnmapWidget(wdata->winData.shell);
}
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_toBack(struct Hsun_awt_motif_MFramePeer *this)
{
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 || wdata->winData.shell==0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
if (XtWindow(wdata->winData.shell) != 0) {
XLowerWindow(awt_display, XtWindow(wdata->winData.shell));
}
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pSetTitle(struct Hsun_awt_motif_MFramePeer *this,
struct Hjava_lang_String *title)
{
char *ctitle;
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 || wdata->winData.shell == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
ctitle = makeLocalizedCString( title );
if( ctitle == NULL ) {
AWT_UNLOCK();
return;
}
XtVaSetValues(wdata->winData.shell,
XmNtitle, ctitle,
XmNiconName, ctitle,
XmNname, ctitle,
NULL);
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pDispose(struct Hsun_awt_motif_MFramePeer *this)
{
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 || wdata->mainWindow==0 || wdata->winData.shell==0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
#ifdef NETSCAPE
if (wdata->winData.flags & W_IS_EMBEDDED) {
struct Hjava_awt_Frame *target;
Hnetscape_applet_EmbeddedAppletFrame* appletFrame;
LJAppletData* ad;
target = (struct Hjava_awt_Frame *) unhand(this)->target;
appletFrame = (Hnetscape_applet_EmbeddedAppletFrame*)target;
if (appletFrame) {
ad = (LJAppletData*)unhand(appletFrame)->pData;
if (ad) {
ad->awtWindow = NULL;
}
}
}
#endif /* NETSCAPE */
if (wdata->cursor != 0 && wdata->cursor != None) {
XFreeCursor(awt_display, wdata->cursor);
}
XtUnmanageChild(wdata->mainWindow);
XtDestroyWidget(wdata->mainWindow);
XtDestroyWidget(wdata->winData.shell);
sysFree((void *)wdata);
SET_PDATA(this,0);
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_pReshape(struct Hsun_awt_motif_MFramePeer *this,
long x, long y,
long w, long h)
{
struct FrameData *wdata;
Dimension woffset, hoffset;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 ||
wdata->winData.comp.widget==0 ||
wdata->winData.shell==0 ||
unhand(this)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
inreshape = 1;
hoffset = 0;
if (wdata->menuBar != 0) {
XtVaGetValues(wdata->menuBar, XmNheight, &hoffset, NULL);
hoffset += 15;
}
if (wdata->warningWindow != 0) {
XtVaGetValues(wdata->warningWindow, XmNheight, &woffset, NULL);
hoffset += woffset;
}
XtVaSetValues(wdata->winData.shell,
XtNx, (XtArgVal) x,
XtNy, (XtArgVal) y,
XtNwidth, (XtArgVal) w - (wdata->left + wdata->right),
XtNheight, (XtArgVal) h + hoffset - (wdata->top + wdata->bottom),
NULL);
XtVaSetValues(XtParent(wdata->winData.comp.widget),
XtNx, (XtArgVal) x,
XtNy, (XtArgVal) y,
XtNwidth, (XtArgVal) w - (wdata->left + wdata->right),
XtNheight, (XtArgVal) h + hoffset - (wdata->top + wdata->bottom),
NULL);
XtVaSetValues(wdata->winData.comp.widget,
XtNx, (XtArgVal) x - wdata->left,
XtNy, (XtArgVal) y - wdata->top,
XtNwidth, (XtArgVal) w,
XtNheight, (XtArgVal) h,
NULL);
inreshape = 0;
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_setResizable(struct Hsun_awt_motif_MFramePeer *this,
long resizable)
{
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 ||
wdata->winData.comp.widget==0 ||
wdata->winData.shell==0 ||
unhand(this)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
XtVaSetValues(wdata->winData.shell,
XmNallowShellResize, resizable ? False : True,
XmNnoResize, resizable ? False : True,
NULL);
AWT_FLUSH_UNLOCK();
}
void
sun_awt_motif_MFramePeer_setCursor(struct Hsun_awt_motif_MFramePeer *this,
long cursorType)
{
Cursor cursor;
struct FrameData *wdata;
AWT_LOCK();
wdata = PDATA(FrameData,this);
if (wdata == 0 || wdata->winData.shell==0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
switch (cursorType) {
case java_awt_Frame_DEFAULT_CURSOR:
cursorType = -1;
break;
case java_awt_Frame_CROSSHAIR_CURSOR:
cursorType = XC_crosshair;
break;
case java_awt_Frame_TEXT_CURSOR:
cursorType = XC_xterm;
break;
case java_awt_Frame_WAIT_CURSOR:
cursorType = XC_watch;
break;
case java_awt_Frame_SW_RESIZE_CURSOR:
cursorType = XC_bottom_left_corner;
break;
case java_awt_Frame_NW_RESIZE_CURSOR:
cursorType = XC_top_left_corner;
break;
case java_awt_Frame_SE_RESIZE_CURSOR:
cursorType = XC_bottom_right_corner;
break;
case java_awt_Frame_NE_RESIZE_CURSOR:
cursorType = XC_top_right_corner;
break;
case java_awt_Frame_S_RESIZE_CURSOR:
cursorType = XC_bottom_side;
break;
case java_awt_Frame_N_RESIZE_CURSOR:
cursorType = XC_top_side;
break;
case java_awt_Frame_W_RESIZE_CURSOR:
cursorType = XC_left_side;
break;
case java_awt_Frame_E_RESIZE_CURSOR:
cursorType = XC_right_side;
break;
case java_awt_Frame_HAND_CURSOR:
cursorType = XC_hand2;
break;
case java_awt_Frame_MOVE_CURSOR:
cursorType = XC_fleur;
break;
default:
AWT_UNLOCK();
return;
}
if (cursorType != -1) {
cursor = XCreateFontCursor(awt_display, cursorType);
} else {
cursor = None;
}
if (wdata->cursor != 0 && wdata->cursor != None) {
XFreeCursor(awt_display, wdata->cursor);
}
wdata->cursor = cursor;
wdata->cursorSet = 0;
if (XtWindow(wdata->winData.shell)) {
unsigned long valuemask = 0;
XSetWindowAttributes attributes;
valuemask = CWCursor;
attributes.cursor = wdata->cursor;
XChangeWindowAttributes(awt_display,
XtWindow(wdata->winData.shell),
valuemask,
&attributes);
wdata->cursorSet = 1;
}
AWT_FLUSH_UNLOCK();
}