[comp.windows.x] Multiscreen Cursor Display Problem

chip@alex.pcs.COM (Edward E Fraser Jr.) (03/08/91)

	I'm having a couple problems with server porting involving a machine with
	2 frame buffers.  One frame buffer has a hardware cursor and the 2nd has
	a software (misprite)cursor.
	
	Problem 1:
	----------
		My Server comes up with the cursor on the
	hardware-cursored-frame-buffer and then I move it to the
	software-cursored-frame-buffer which is handled by the misprite.c 
	and mipointer.c software-cursor code. My mouse server code detects that
	a screen change needs to take place and calls NewCurrentScreen in dix
	with the new screen. The software-cursored-frame-buffer has not yet had to 
	display a cursor up until this point.
	I would expect either :
		a) the NewCurrentScreen procedure to at some time call
		newScreen->DisplayCursor because until this occurs the misprite
		code has no cursor to display. (by the way - If I move the
		"not displayed" cursor  into a window then the first DisplayCursor
		procedure gets called and the cursor functions ok).

		or

		b) to ultimately get a DisplayCursor call in dix from

static void
ChangeToCursor(cursor)
CursorPtr cursor;
{
    if (cursor != sprite.current)
    {
        if ((sprite.current->bits->xhot != cursor->bits->xhot) ||
                    (sprite.current->bits->yhot != cursor->bits->yhot))
             CheckPhysLimits(cursor, FALSE, (ScreenPtr)NULL);
        (*sprite.hotPhys.pScreen->DisplayCursor) (sprite.hotPhys.pScreen,
                                                       cursor);
        sprite.current = cursor;
    }
}

		but this does not always work if the old screen cursor equals the 
		new screen cursor. if (cursor != sprite.current)


	I know that in dix/events.c/DefineInitialRootWindow() the
	DisplayCursor procedure is called but why not on the call of
	dix/events.c/NewCurrentScreen() ?.


	Problem 2:
	----------
	This problem exists also when one framebuffer is a
	hardware-cursored-frame-buffer and the 2nd is a
	software-cursored-frame-buffer with misprite.c and mipointer.c
	cursor-code. If the cursor is on the hardware-cursored-frame-buffer
	and moves to the software-cursored-frame-buffer  how should I tell the
	software-cursored-frame-buffer with misprite.c and mipointer.c cursor_code
	to UndisplayCursor ?. 

	It seems to me that there should be a UndisplayCursor in the Screen 
	structure so that

		(*oldScreen->UndisplayCursor) (oldScreen);
		(*newScreen->DisplayCursor) (newScreen, newRootWindowDefaultCursor);

    in dix/events.c/NewCurrentScreen() can be called.


	This might also solve the 1st problem as well.


	Chip Fraser			Munich Germany.