## cursors.pkg
#
# Support for the X windows "standard cursors".
#
# This is the library-internal versio of this package;
# for the library client version see:
#
#
src/lib/x-kit/xclient/xclient.pkg# Compiled by:
#
src/lib/x-kit/xclient/xclient-internals.sublibstipulate
package xt = xtypes; # xtypes is from
src/lib/x-kit/xclient/src/wire/xtypes.pkg package xet = xevent_types; # xevent_types is from
src/lib/x-kit/xclient/src/wire/xevent-types.pkg package v2w = value_to_wire; # value_to_wire is from
src/lib/x-kit/xclient/src/wire/value-to-wire.pkg #
package sn = xsession_junk; # xsession_junk is from
src/lib/x-kit/xclient/src/window/xsession-junk.pkg package dy = display; # display is from
src/lib/x-kit/xclient/src/wire/display.pkg package fb = font_base; # font_base is from
src/lib/x-kit/xclient/src/window/font-base.pkgherein
package cursors {
# The names of the standard cursors
# predefined by every X server,
# taken from X11/cursorfont:h:
Standard_Xcursor
=
STANDARD_XCURSOR Int;
x_cursor = STANDARD_XCURSOR 0;
arrow = STANDARD_XCURSOR 2;
based_arrow_down = STANDARD_XCURSOR 4;
based_arrow_up = STANDARD_XCURSOR 6;
boat = STANDARD_XCURSOR 8;
bogosity = STANDARD_XCURSOR 10;
bottom_left_corner = STANDARD_XCURSOR 12;
bottom_right_corner = STANDARD_XCURSOR 14;
bottom_side = STANDARD_XCURSOR 16;
bottom_tee = STANDARD_XCURSOR 18;
box_spiral = STANDARD_XCURSOR 20;
center_ptr = STANDARD_XCURSOR 22;
circle = STANDARD_XCURSOR 24;
clock = STANDARD_XCURSOR 26;
coffee_mug = STANDARD_XCURSOR 28;
cross = STANDARD_XCURSOR 30;
cross_reverse = STANDARD_XCURSOR 32;
crosshair = STANDARD_XCURSOR 34;
diamond_cross = STANDARD_XCURSOR 36;
dot = STANDARD_XCURSOR 38;
dotbox = STANDARD_XCURSOR 40;
double_arrow = STANDARD_XCURSOR 42;
draft_large = STANDARD_XCURSOR 44;
draft_small = STANDARD_XCURSOR 46;
draped_box = STANDARD_XCURSOR 48;
exchange = STANDARD_XCURSOR 50;
fleur = STANDARD_XCURSOR 52;
gobbler = STANDARD_XCURSOR 54;
gumby = STANDARD_XCURSOR 56;
hand1 = STANDARD_XCURSOR 58;
hand2 = STANDARD_XCURSOR 60;
heart = STANDARD_XCURSOR 62;
icon = STANDARD_XCURSOR 64;
iron_cross = STANDARD_XCURSOR 66;
left_ptr = STANDARD_XCURSOR 68;
left_side = STANDARD_XCURSOR 70;
left_tee = STANDARD_XCURSOR 72;
leftbutton = STANDARD_XCURSOR 74;
ll_angle = STANDARD_XCURSOR 76;
lr_angle = STANDARD_XCURSOR 78;
man = STANDARD_XCURSOR 80;
middlebutton = STANDARD_XCURSOR 82;
mouse = STANDARD_XCURSOR 84;
pencil = STANDARD_XCURSOR 86;
pirate = STANDARD_XCURSOR 88;
plus = STANDARD_XCURSOR 90;
question_arrow = STANDARD_XCURSOR 92;
right_ptr = STANDARD_XCURSOR 94;
right_side = STANDARD_XCURSOR 96;
right_tee = STANDARD_XCURSOR 98;
rightbutton = STANDARD_XCURSOR 100;
rtl_logo = STANDARD_XCURSOR 102;
sailboat = STANDARD_XCURSOR 104;
sb_down_arrow = STANDARD_XCURSOR 106;
sb_h_double_arrow = STANDARD_XCURSOR 108;
sb_left_arrow = STANDARD_XCURSOR 110;
sb_right_arrow = STANDARD_XCURSOR 112;
sb_up_arrow = STANDARD_XCURSOR 114;
sb_v_double_arrow = STANDARD_XCURSOR 116;
shuttle = STANDARD_XCURSOR 118;
sizing = STANDARD_XCURSOR 120;
spider = STANDARD_XCURSOR 122;
spraycan = STANDARD_XCURSOR 124;
star = STANDARD_XCURSOR 126;
target = STANDARD_XCURSOR 128;
tcross = STANDARD_XCURSOR 130;
top_left_arrow = STANDARD_XCURSOR 132;
top_left_corner = STANDARD_XCURSOR 134;
top_right_corner = STANDARD_XCURSOR 136;
top_side = STANDARD_XCURSOR 138;
top_tee = STANDARD_XCURSOR 140;
trek = STANDARD_XCURSOR 142;
ul_angle = STANDARD_XCURSOR 144;
umbrella = STANDARD_XCURSOR 146;
ur_angle = STANDARD_XCURSOR 148;
watch = STANDARD_XCURSOR 150;
xterm = STANDARD_XCURSOR 152;
Xcursor
=
XCURSOR
{ id: xt::Cursor_Id,
xsession: sn::Xsession
};
# Identity test:
#
fun same_cursor
( XCURSOR { id=>id1, xsession=>xsession1 },
XCURSOR { id=>id2, xsession=>xsession2 }
)
=
(id1 == id2)
and
sn::same_xsession (xsession1, xsession2);
# Return the named standard cursor:
#
fun get_standard_xcursor
(xsession: sn::Xsession)
(STANDARD_XCURSOR cursor)
=
{ include package dy;
#
xsession -> { xdisplay => { next_xid, ... }, windowsystem_to_xserver, ... };
(sn::find_font xsession "cursor")
->
({ id=>font_id, ... }: fb::Font);
cursor_id = next_xid();
# The cursor font contains the shape glyph followed by the mask
# glyph; so character position 0 contains a shape, 1 the mask for 0,
# 2 a shape, etc.
#
windowsystem_to_xserver.xclient_to_sequencer.send_xrequest
(
v2w::encode_create_glyph_cursor
{
cursor => cursor_id,
src_font => font_id,
mask_font => THE font_id,
src_chr => cursor,
mask_chr => cursor+1,
foreground_rgb => rgb::black,
background_rgb => rgb::white
}
);
XCURSOR { id=>cursor_id, xsession };
};
# Change the color of a cursor.
# foreground_rgb is the foreground color,
# background_rgb is the background color:
#
fun recolor_cursor
{ cursor as XCURSOR { id, xsession as (x: sn::Xsession) },
foreground_rgb: rgb::Rgb,
background_rgb: rgb::Rgb
}
=
x.windowsystem_to_xserver.xclient_to_sequencer.send_xrequest
(
v2w::encode_recolor_cursor
{
cursor => id,
foreground_color => rgb::rgb_normalize foreground_rgb,
background_color => rgb::rgb_normalize background_rgb
}
);
# Change the cursor during
# an "active grab" of mouse:
#
fun change_active_grab_cursor (x: sn::Xsession) (XCURSOR cursor)
=
x.windowsystem_to_xserver.xclient_to_sequencer.send_xrequest
(
v2w::encode_change_active_pointer_grab
{
cursor => THE cursor.id,
time => xt::CURRENT_TIME,
#
event_mask => xet::mask_of_xevent_list
[
xet::n::POINTER_MOTION,
xet::n::BUTTON_PRESS,
xet::n::BUTTON_RELEASE
]
}
);
}; # package cursors
end;