SYSMOUSE(4)

명칭
sysmouse - 가상화 된 마우스 드라이버

서식
#include <machine/mouse.h> #include <machine/console.h>

해설
마우스 demon moused(8) (와)과 함께 사용하는 것으로, 콘솔 드라이버는, sysmouse 드라이버를 통해, 유저 프로세스에 표준적인 방법으로 마우스의 데이터를 제공합니다. 이와 같이 정리하는 것으로, ( X Window System 등이 같은) 유저 프로세스와 콘솔로 마우스를 공유할 수가 있게 됩니다.

유저 프로세스가 마우스 기능을 이용하려고 하는 경우, 단지 open(2) 시스템 콜로 /dev/sysmouse (을)를 오픈해, read(2) 시스템 콜을 이용해 마우스 데이터를 읽어들이는 것만으로 좋습니다. 여기서, 확실히 moused(8) (을)를 실행해 두어 주세요. 그렇지 않으면, 유저 프로세스는 마우스로부터 데이터를 일절 받을 수가 없을 것입니다.

  기능 레벨
sysmouse 드라이버에는 2 개의 기능 레벨이 있습니다. 현재의 기능 레벨은 ioctl 시스템 콜에 의해 참조, 변경할 수가 있습니다.

레벨 0 은 가장 낮은 레벨로, 기본적인 레벨이기도 합니다. 이 레벨에서는, 드라이버는, 유저 프로그램에 대해서 기본적인 서비스를 제공합니다. sysmouse 드라이버는, 마우스의 수평 수직의 움직임과 최대로 3 개까지의 버튼 상태를, 이하에 나타낸다 MouseSystems 형식에서 통지합니다.

Byte 1
    bit 7
        항상 1 입니다.
    bit 6..3
        항상 0 입니다.
    bit 2
        왼쪽 버튼 상태입니다. 눌러 내릴 수 있고 있는 상태로 비트 클리어, 그렇지 않으면 비트 세트입니다.
    bit 1
        안버튼 상태입니다. 눌러 내릴 수 있고 있는 상태로 비트 클리어, 그렇지 않으면 비트 세트. 안버튼을 가지지 않는 기기의 경우는 항상 1 입니다.
    bit 0
        오른쪽 버튼 상태입니다. 눌러 내릴 수 있고 있는 상태로 비트 클리어, 그렇지 않으면 비트 세트입니다.
Byte 2
    수평의 움직임의 카운트를 2 의 보수 형식에서 나타낸 값의 선두 반입니다. -128 (으)로부터 127 까지의 값.
Byte 3
    수직의 움직임의 카운트를 2 의 보수 형식에서 나타낸 값의 선두 반입니다. -128 (으)로부터 127 까지의 값.
Byte 4
    수평의 움직임의 카운트를 2 의 보수 형식에서 나타낸 값의 뒤반입니다. -128 (으)로부터 127 까지의 값. 수평의 움직임의 카운트를 얻으려면 , byte 2 로 byte 4 를 더해 주세요.
Byte 5
    수직의 움직임의 카운트를 2 의 보수 형식에서 나타낸 값의 뒤반입니다. -128 (으)로부터 127 까지의 값. 수직의 움직임의 카운트를 얻으려면 , byte 3 으로 byte 5 를 더해 주세요.

레벨 1 은 확장 레벨로, 마우스의 데이터는 mouse(4) 그리고 정의된 표준 형식 MOUSE_PROTO_SYSMOUSE 그리고 코드화 됩니다.

IOCTL
이 마디에서는, 2 종류의 ioctl(2) 명령에 대해 설명합니다. 1 개(살)은, sysmouse 드라이버 그 자체에 대한 명령로, 이제(벌써) 1 개(살)은, 콘솔과 콘솔 제어 드라이버에 대한 명령입니다.

  Sysmouse Ioctl
마우스 드라이버에 대한 명령이 몇개인가 있습니다. 이 커멘드 일반의 설명은, mouse(4) 에 있습니다. 이하에서는, sysmouse 드라이버 고유의 기능을 설명합니다.

MOUSE_GETLEVEL int *level
MOUSE_SETLEVEL int *level
    이러한 명령은, 마우스 드라이버의 기능 레벨을 조작합니다.

MOUSE_GETHWINFO mousehw_t *hw
    이하의 구조체로, 접속된 기기의 하드웨어 정보를 돌려줍니다. 현재의 버젼의 sysmouse 드라이버에서는, iftype 필드만이 올바른 값이 차 있는 것이 프로텍션되고 있습니다.

        typedef struct mousehw {
            int buttons;    /* 버튼의 수 */
            int iftype;     /* I/F 타입 */
            int type;       /* 마우스/트랙볼/패드... */
            int model;      /* I/F 의존의 모델 ID */
            int hwid;       /* I/F 의존의 하드웨어 ID */
        } mousehw_t;

    buttons 필드에는, 드라이버가 검출한 버튼의 수가 보관 유지되고 있습니다.

    iftype (은)는 항상 MOUSE_IF_SYSMOUSE 입니다.

    type (은)는 기기의 형태: MOUSE_MOUSE, MOUSE_TRACKBALL, MOUSE_STICK, MOUSE_PAD, MOUSE_UNKNOWN (을)를 나타냅니다.

    model (은)는, 기능 레벨 0 에서는 항상 MOUSE_MODEL_GENERIC 입니다. 이것은, 보다 높은 레벨에서는, MOUSE_MODEL_GENERIC 또는, MOUSE_MODEL_XXX 중 1 개가 됩니다.

    hwid (은)는 항상 0 입니다.

MOUSE_GETMODE mousemode_t *mode
    이 명령은, 마우스 드라이버의 현재의 기능 파라미터를 돌려줍니다.

        typedef struct mousemode {
            int protocol;    /* MOUSE_PROTO_XXX */
            int rate;        /* 통지 레이트 (초단위) */
            int resolution;  /* MOUSE_RES_XXX, 불명의 경우는 -1 */
            int accelfactor; /* 가속율 */
            int level;       /* 드라이버의 기능 레벨 */
            int packetsize;  /* 데이터 패킷의 길이 */
            unsigned char syncmask[2]; /* 동기 비트 */
        } mousemode_t;

    protocol 필드는, 유저 프로그램이 마우스 데이터를 읽어낼 때에, 그 기기 상태를 돌려주는 형식을 나타냅니다. 기능 레벨 0 에서는, MOUSE_PROTO_MSC (이어)여, 기능 레벨 1 에서는, MOUSE_PROTO_SYSMOUSE 입니다.

    rate 필드는, 항상 -1 입니다.

    resolution 필드는, 항상 -1 입니다.

    accelfactor 필드는, 항상 0 입니다.

    packetsize 필드는, 데이터 패킷의 길이를 나타냅니다. 이것은 기능 레벨에 따라서 바뀝니다.

    레벨 0
        5 바이트
    레벨 1
        8 바이트

    배열 syncmask (은)는, 데이터 패킷의 선두 바이트를 검출하기 위한 , 비트 마스크와 패턴을 보관 유지합니다. syncmask[0] (은)는 비트 마스크로, 조사하는 바이트와 AND 를 취합니다. 이 결과가 syncmask[1] (와)과 동일한 경우, 그 바이트는 데이터 패킷의 선두 아르바이트인것 같다고 말할 수 있습니다. 이 방법으로 선두 바이트를 검출하는 방식은 100% 확실하다고는 말할 수 없습니다. 따라서, 이것은 참고 취급으로 해야 하는 것 주의를 해 둡니다.

MOUSE_SETMODE mousemode_t *mode
    이 명령은, 마우스 드라이버의 현재의 기능 파라미터를 mode 그리고 지정한 값으로 변경합니다. level 만이 변경 가능합니다. 다른 필드에 값을 설정해도 에러는 나오지 않습니다만, 어떤 효과도 미치지 않습니다.

MOUSE_READDATA mousedata_t *data
MOUSE_READSTATE mousedata_t *state
    이러한 명령은 sysmouse 드라이버에서는 서포트되지 않습니다.

MOUSE_GETSTATE mousestatus_t *status
    이 명령은 버튼의 현재 상태와 움직임의 카운트를 mouse(4) 그리고 정의된 구조체로 돌려줍니다.

  콘솔과 콘솔 제어 Ioctl
유저 프로그램은, 현재의 가상 콘솔에 대해서 콘솔 ioctl() 시스템 콜을 발행해, 마우스 포인터를 제어합니다. 콘솔 ioctl() (은)는 또, 버튼이 밀렸을 때에 signal(3) (을)를 받는 수단을 유저 프로세스에 제공합니다.

마우스 demon moused(8) (은)는, 콘솔 제어 디바이스 /dev/consolectl 에 대해서 ioctl() 시스템 콜을 이용하는 것으로, 마우스의 움직임과 버튼 상태를 포함한 마우스의 동작을 콘솔에 통지합니다.

양쪽 모두의 클래스의 ioctl() 명령와도, 이하의 인수를 취한다 CONS_MOUSECTL (으)로서 정의되고 있습니다.

    struct mouse_info {
        int operation;
        union {
            struct mouse_data data;
            struct mouse_mode mode;
            struct mouse_event event;
        } u;
    };

operation
    이것은 이하의 어떤 것이나 1 개를 취합니다.

    MOUSE_SHOW
        마우스 커서를 유효하게 해 표시합니다.
    MOUSE_HIDE
        마우스 커서를 무효로 해 숨깁니다.
    MOUSE_MOVEABS
        마우스 커서를 u.data 그리고 준 위치에 이동시킵니다.
    MOUSE_MOVEREL
        현재의 위치에, u.data 그리고 준 값을 더한 위치에 이동시킵니다.
    MOUSE_GETINFO
        현재의 가상 콘솔에 있어서의 마우스의 현재의 위치와 버튼 상태를 u.data 에 거두어 돌려줍니다.
    MOUSE_MODE
        이것은, signal(3) (을)를 설정해, 현재의 프로세스에 버튼이 밀린 것을 통지합니다. 시그널은 u.mode 에 거둘 수 있어 통지됩니다.

    여기까지의 기능은 가상 콘솔에 대하는 것입니다. 이것 이후에 정의하는 기능은 콘솔 제어 드라이버에 대하는 것으로, moused(8) 하지만 마우스 데이터를 콘솔 드라이버에 건네주기 위해서(때문에) 이용합니다.

    MOUSE_ACTION
    MOUSE_MOTIONEVENT
        이러한 기능은 u.data 에 정보를 취해, 게다가로 동작합니다. sysmouse 드라이버가 오픈되고 있는 경우, 마우스 데이터는 sysmouse 드라이버에 보내집니다. MOUSE_ACTION (은)는 버튼 눌러 인하 동작을 함께 행해, 요구가 있는 경우는 시그널을 보냅니다. 현재의 콘솔이 텍스트 인터페이스를 가지는 경우, 컷 앤드 페이스트 처리를 행합니다.
    MOUSE_BUTTONEVENT
        u.data 그리고, 버튼의 종류와 그 클릭 카운트수를 지정합니다. 콘솔 드라이버는 그 정보를 이용해 요구가 있는 경우는 시그널을 보내, 콘솔이 텍스트 인터페이스를 가지는 경우는, 컷 앤드 페이스트 처리를 행합니다.

    MOUSE_MOTIONEVENT (와)과 MOUSE_BUTTONEVENT (은)는, 새로운 인터페이스로, 이 2 개(살)을 함께 사용하는 것을 상정해 만들어지고 있습니다. 이것들은 MOUSE_ACTION 하나로 행해지고 있는 기능을 옮겨놓기 위한 것입니다.

u   이 공용체는, 이하의 머지않아인가입니다.

    data

            struct mouse_data {
                int x;
                int y;
                int z;
                int buttons;
            };

        x, y, z (은)는, 각각의 방향에 대한 마우스의 이동을 나타냅니다. buttons (은)는 버튼 상태를 나타냅니다. 비트 0 으로부터 비트 30 까지로 최대 31 개의 버튼 상태를 나타낼 수가 있습니다. 버튼이 밀리고 있으면(자), 대응한다 비트가 세트 됩니다.

    mode

            struct mouse_mode {
                int mode;
                int signal;
            };

        signal 필드는, 프로세스에 보내는 시그널을 지정합니다. 이 값은 <signal.h> 그리고 정의된 값 중 하나일 필요가 있습니다. mode 필드는 현재는 사용되고 있지 않습니다.

    event

            struct mouse_event {
                int id;
                int value;
            };

        id 필드는, u.data.buttons (와)과 같이, 버튼 번호를 지정합니다. 1 비트/버튼만을 설정할 수 있습니다. value 필드는, 클릭수를 보관 유지하고 있습니다. 이것은, 유저가 버튼을 연속해 누른 회수입니다.

관련 파일
/dev/consolectl
    콘솔을 제어하는 디바이스
/dev/sysmouse
    가상화 된 마우스 드라이버
/dev/ttyv%d
    가상 콘솔

관련 항목
vidcontrol(1), ioctl(2), signal(3), mouse(4), moused(8)

역사
sysmouse 메뉴얼 페이지는, FreeBSD 2.2 그리고 처음으로 나타났습니다.

저자
이 메뉴얼은 John-Mark Gurney <gurney_j@efn.org> (와)과 Kazutaka Yokota <yokota@FreeBSD.org> 하지만 썼습니다.