richard@unipalm.co.uk (02/12/91)
OSF Problem Report
=================================
Submitter Name: Richard Nuttall
Organization: Unipalm Limited
Email Address: richard@unipalm.co.uk
Phone: +44 954 211797
OSF License Number: 845-F-S-90
Hardware/Software Configuration
- -------------------------------
Offering and Version: Motif 1.1.0.2
Component (Module): Xm Sash.c
Client Hardware: SPARCstation 1+
Client Software: SunOS 4.1
Server Hardware: SPARCstation 1/GX, Sun3/60
Server Software: Unipalm XTech X11R4 + 1-18.
Compiler: SunOS 4.1 cc
Problem Description
- -------------------
Severity Level: Fatal
Date of First Occurrence: 12-Feb-91
One Line Description:
Sash caches the crosshair cursor, which doesn't work for multiple displays.
Full Description:
The crosshair cursor used by the Sash is created only once
and then the same cursor is returned for future Sashes.
Since the cursor created is display specific, A protocol
error results when trying to realise a Sash on more than
one display from the same application.
Repeat By:
(edited fragments from large program)
[...]
dpy1 = XtOpenDisplay(...,"machine1:0",....);
dpy2 = XtOpenDisplay(...,"machine2:0",....);
top1 = XtAppCreateShell("Shell1", "Xapp",
applicationShellWidgetClass, dpy1, NULL, 0);
top2 = XtAppCreateShell("Shell2", "Xapp",
applicationShellWidgetClass, dpy2, NULL, 0);
[...]
PW1 = XmCreatePanedWindow(top1, "PW1", NULL, 0);
PW2 = XmCreatePanedWindow(top2, "PW2", NULL, 0);
[...]
XtRealizeWidget(top1);
XtRealizeWidget(top2); /* error occurs here */
Proposed Solution:
(Quick hack)
*** /bold/files/motif/sun4/lib/Xm/Sash.c Mon Oct 9 10:50:01 1989
--- Sash.c Tue Feb 12 14:08:32 1991
***************
*** 254,261 ****
}
- static Cursor SashCursor=NULL;
-
static void Realize(w, p_valueMask, attributes)
register Widget w;
Mask *p_valueMask;
--- 254,259 ----
***************
*** 262,270 ****
XSetWindowAttributes *attributes;
{
Mask valueMask = *p_valueMask;
- if (SashCursor==NULL)
- SashCursor=XCreateFontCursor(XtDisplay(w), XC_crosshair);
attributes->cursor = SashCursor;
valueMask |= CWCursor;
--- 260,267 ----
XSetWindowAttributes *attributes;
{
Mask valueMask = *p_valueMask;
+ Cursor SashCursor = XCreateFontCursor(XtDisplay(w), XC_crosshair);
attributes->cursor = SashCursor;
valueMask |= CWCursor;
A better solution would be to check the display and cache one cursor
per display.
I have not considered any memory leaks that might be caused by creating
lots of cursors but not destroying them.