aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/gki/gkigcur.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/gio/gki/gkigcur.x')
-rw-r--r--sys/gio/gki/gkigcur.x106
1 files changed, 106 insertions, 0 deletions
diff --git a/sys/gio/gki/gkigcur.x b/sys/gio/gki/gkigcur.x
new file mode 100644
index 00000000..e87e030e
--- /dev/null
+++ b/sys/gio/gki/gkigcur.x
@@ -0,0 +1,106 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <config.h>
+include <syserr.h>
+include <fset.h>
+include <fio.h>
+include <gki.h>
+
+# GKI_GETCURSOR -- Read the cursor position in device coordinates.
+#
+# BOI GKI_GETCURSOR L CN
+#
+# L(i) 4
+# CN(i) cursor number
+#
+# The kernel reads graphics cursor number CN and returns the
+# keystroke value (if any) and the cursor position in NDC
+# coordinates. The cursor attributes are returned in the
+# following format:
+#
+# BOI GKI_CURSORVALUE L CN KEY SX SY RN RX RY
+#
+# where
+#
+# L(i) 10
+# CN(i) cursor number
+# KEY(i) keystroke value (>= 0 or EOF)
+# SX(i) NDC X screen coordinate of cursor
+# SY(i) NDC Y screen coordinate of cursor
+# RN(i) raster number or zero
+# RX(i) NDC X raster coordinate of cursor
+# RY(i) NDC Y raster coordinate of cursor
+#
+# The screen or display window coordinates SX and SY of the cursor are
+# returned for all devices. Only some devices support multiple rasters.
+# If the device supports rasters and the cursor is in a rasters when read, the
+# rasters number and rasters coordinates are returned in RN,RX,RY. This is in
+# addition to the screen coordinates SX,SY. If rasters coordinates are not
+# returned, the rasters number will be set to zero and RX,RY will be the same
+# as SX,SY.
+
+procedure gki_getcursor (fd, cursor, cn, key, sx, sy, raster, rx, ry)
+
+int fd #I output file
+int cursor #I cursor to be read
+int cn #O cursor number actually read
+int key #O keystroke value or EOF
+int sx, sy #O screen coordinates of cursor
+int raster #O raster number
+int rx, ry #O raster coordinates of cursor
+
+int epa
+int nchars, read()
+short gki[GKI_GETCURSOR_LEN]
+short cur[GKI_CURSORVALUE_LEN]
+data gki[1] /BOI/, gki[2] /GKI_GETCURSOR/, gki[3] /GKI_GETCURSOR_LEN/
+include "gki.com"
+errchk write, flush, read
+
+begin
+ # If the kernel is inline it will return the cursor value in the
+ # graphics stream FIO buffer just as if the kernel were resident
+ # in another process. We rewind the buffer after the kernel writes
+ # into it in preparation for the read below.
+
+ if (IS_INLINE(fd)) {
+ call fseti (fd, F_CANCEL, OK)
+ epa = gk_dd[GKI_GETCURSOR]
+ if (epa != 0)
+ call zcall1 (epa, cursor)
+ call seek (fd, BOFL)
+
+ } else {
+ # Write cursor read instruction to the kernel.
+ gki[GKI_GETCURSOR_CN] = cursor
+ call write (gk_fd[fd], gki, GKI_GETCURSOR_LEN * SZ_SHORT)
+
+ # If the kernel is a subprocess we must call PR_PSIO to allow the
+ # kernel to read the instruction and return the cursor value.
+
+ if (IS_SUBKERNEL(fd)) {
+ call seek (fd, BOFL)
+ call zcall3 (gk_prpsio, KERNEL_PID(fd), fd, FF_READ)
+ call seek (fd, BOFL)
+ } else
+ call flush (gk_fd[fd])
+ }
+
+ # Read and decode the cursor value instruction.
+ nchars = GKI_CURSORVALUE_LEN * SZ_SHORT
+ if (read (fd, cur, nchars) < nchars)
+ key = EOF
+ else if (cur[1] != BOI || cur[2] != GKI_CURSORVALUE)
+ call syserr (SYS_GGCUR)
+ else {
+ cn = cur[GKI_CURSORVALUE_CN]
+ key = cur[GKI_CURSORVALUE_KEY]
+ sx = cur[GKI_CURSORVALUE_SX]
+ sy = cur[GKI_CURSORVALUE_SY]
+ raster = cur[GKI_CURSORVALUE_RN]
+ rx = cur[GKI_CURSORVALUE_RX]
+ ry = cur[GKI_CURSORVALUE_RY]
+ }
+
+ call fseti (fd, F_CANCEL, OK)
+end