2 Copyright 1999, Be Incorporated. All Rights Reserved.
3 This file may be used under the terms of the Be Sample Code License.
7 Rudolf Cornelissen 4/2003-6/2008
10 #define MODULE_BIT 0x20000000
14 status_t
SET_CURSOR_SHAPE(uint16 width
, uint16 height
, uint16 hot_x
, uint16 hot_y
, uint8
*andMask
, uint8
*xorMask
)
16 LOG(4,("SET_CURSOR_SHAPE: width %d, height %d, hot_x %d, hot_y %d\n",
17 width
, height
, hot_x
, hot_y
));
19 if ((width
!= 16) || (height
!= 16))
23 else if ((hot_x
>= width
) || (hot_y
>= height
))
29 head1_cursor_define(andMask
,xorMask
);
30 if ((si
->dm
.flags
& DUALHEAD_BITS
) != DUALHEAD_OFF
)
31 head2_cursor_define(andMask
,xorMask
);
33 /* Update cursor variables appropriately. */
34 si
->cursor
.width
= width
;
35 si
->cursor
.height
= height
;
36 si
->cursor
.hot_x
= hot_x
;
37 si
->cursor
.hot_y
= hot_y
;
43 /* Move the cursor to the specified position on the desktop, taking account of virtual/dual issues */
44 void MOVE_CURSOR(uint16 x
, uint16 y
)
46 uint16 hds
= si
->dm
.h_display_start
; /* the current horizontal starting pixel */
47 uint16 vds
= si
->dm
.v_display_start
; /* the current vertical starting line */
50 /* clamp cursor to display */
51 if (x
>= si
->dm
.virtual_width
) x
= si
->dm
.virtual_width
- 1;
52 if (y
>= si
->dm
.virtual_height
) y
= si
->dm
.virtual_height
- 1;
54 /* store, for our info */
58 /* setting up minimum amount to scroll not needed:
59 * Nvidia cards can always do pixelprecise panning on both heads */
62 /* adjust h/v_display_start to move cursor onto screen */
63 switch (si
->dm
.flags
& DUALHEAD_BITS
)
67 if (x
>= ((si
->dm
.timing
.h_display
* 2) + hds
))
69 hds
= ((x
- (si
->dm
.timing
.h_display
* 2)) + 1 + h_adjust
) & ~h_adjust
;
70 /* make sure we stay within the display! */
71 if ((hds
+ (si
->dm
.timing
.h_display
* 2)) > si
->dm
.virtual_width
)
72 hds
-= (h_adjust
+ 1);
78 if (x
>= (si
->dm
.timing
.h_display
+ hds
))
80 hds
= ((x
- si
->dm
.timing
.h_display
) + 1 + h_adjust
) & ~h_adjust
;
81 /* make sure we stay within the display! */
82 if ((hds
+ si
->dm
.timing
.h_display
) > si
->dm
.virtual_width
)
83 hds
-= (h_adjust
+ 1);
90 if (y
>= (si
->dm
.timing
.v_display
+ vds
))
91 vds
= y
- si
->dm
.timing
.v_display
+ 1;
95 /* reposition the desktop _and_ the overlay on the display if required */
96 if ((hds
!=si
->dm
.h_display_start
) || (vds
!=si
->dm
.v_display_start
))
98 MOVE_DISPLAY(hds
,vds
);
101 /* put cursor in correct physical position, so stay onscreen (rel. to CRTC) */
102 if (x
> (hds
+ si
->cursor
.hot_x
)) x
-= (hds
+ si
->cursor
.hot_x
);
104 if (y
> (vds
+ si
->cursor
.hot_y
)) y
-= (vds
+ si
->cursor
.hot_y
);
107 /* position the cursor on the display */
108 switch (si
->dm
.flags
& DUALHEAD_BITS
)
111 head1_cursor_position(x
,y
);
112 head2_cursor_position(x
,y
);
115 case DUALHEAD_SWITCH
:
116 if (x
< si
->dm
.timing
.h_display
)
118 if (si
->cursor
.dh_right
)
120 LOG(4,("MOVE_CURSOR: now on left side\n"));
123 si
->cursor
.dh_right
= false;
125 head1_cursor_position(x
, y
);
129 if (!si
->cursor
.dh_right
)
131 LOG(4,("MOVE_CURSOR: now on right side\n"));
134 si
->cursor
.dh_right
= true;
136 head2_cursor_position((x
- si
->dm
.timing
.h_display
), y
);
139 default: /* singlehead mode */
140 head1_cursor_position(x
,y
);
145 void SHOW_CURSOR(bool is_visible
)
147 /* record for our info */
148 si
->cursor
.is_visible
= is_visible
;
150 switch (si
->dm
.flags
& DUALHEAD_BITS
)
165 case DUALHEAD_SWITCH
:
168 if (!si
->cursor
.dh_right
)
183 default: /* singlehead mode */