Platon Technologies
neprihlásený Prihlásiť Registrácia
SlovakEnglish
open source software development oslavujeme 10 rokov vývoja otvoreného softvéru! Nedeľa, 27. apríl 2025

Súbor: [Platon] / games / _shared / mouse-svgalib.c (stiahnutie)

Revízia 1.6, Tue Apr 6 09:54:15 2004 UTC (21 years ago) by nepto


Zmeny od 1.5: +12 -5 [lines]

Headers update:
    - switch to standard/classic Platon SDG source header
    - bumped copyright year to 2004
    - changelog dates reformatted to new format YYYY-MM-DD

/*
 * games/_shared/ - shared routines for games
 *
 * mouse-svgalib.c - SVGAlib mouse handler
 * ____________________________________________________________
 *
 * Developed by Ondrej Jombik <nepto@platon.sk>
 * Copyright (c) 2003-2004 Platon SDG, http://platon.sk/
 * All rights reserved.
 *
 * See README file for more information about this software.
 * See COPYING file for license information.
 *
 * Download the latest version from
 * http://platon.sk/projects/games/
 *
 * Changelog:
 * 2003-05-04 - created
 */

/* $Platon: games/_shared/mouse-svgalib.c,v 1.5 2003/10/07 12:22:43 nepto Exp $ */

#include <vga.h>
#include <vgagl.h>
#include <vgamouse.h>

#include <dos2linux.h>
#include <macros.h>

#include "mouse.h"

static int mouse_showed, mousex, mousey, mouse_bstat;
static int pressed_count[3], released_count[3];
static char mouse_bitmap[11 * 11 * 4]; /* big enough for 11x11 bitmap
                                          in any mode */

void mouse_status_update(void) /* {{{ */
{
    while (mouse_update()) {
        register int svgalib_mouse_bstat;
        int tmpx, tmpy, tmp_bstat;
        /* int wheel = 0, rx = 0; // TODO: support for wheel */

        /* The RX axis represents the wheel on an wheel mouse */
        mouse_getposition_6d(&tmpx, &tmpy, NULL, NULL /* &rx */, NULL, NULL);
        if (tmpx != mousex || tmpy != mousey) {
            hidemouse();
            mousex = tmpx;
            mousey = tmpy;
            showmouse();
        }
        svgalib_mouse_bstat = mouse_getbutton();
        tmp_bstat  = 0;
        if (svgalib_mouse_bstat & MOUSE_LEFTBUTTON) {
            pressed_count[0] += mouse_bstat & 1 ? 0 : 1;
            pressed_count[1] += mouse_bstat & 1 ? 0 : 1;
            tmp_bstat += 1;
        } else {
            released_count[0] += mouse_bstat & 1 ? 1 : 0;
            released_count[1] += mouse_bstat & 1 ? 1 : 0;
        }
        if (svgalib_mouse_bstat & MOUSE_RIGHTBUTTON) {
            pressed_count[0] += mouse_bstat & 2 ? 0 : 1;
            pressed_count[2] += mouse_bstat & 2 ? 0 : 1;
            tmp_bstat += 2;
        } else {
            released_count[0] += mouse_bstat & 2 ? 1 : 0;
            released_count[2] += mouse_bstat & 2 ? 1 : 0;
        }

        mouse_bstat = tmp_bstat;

#if 0 /* {{{ */
        if (wheel && rx) {
            /* For clarity - wipe the old location out
               so we can redraw with the new box size */
            gl_fillbox(ox, oy, boxsize, boxsize, 0);

            /* Interpret wheel turns; we care only about direction,
               not amount, for our purposes */
            boxsize += (rx / abs(rx));
            (boxsize < 1)?(boxsize = 1):((boxsize > 10)?(boxsize = 10):0);

            /* Zero the wheel position */
            mouse_setposition_6d(0,0,0, 0,0,0, MOUSE_RXDIM);
        }
#endif /* }}} */
    }
} /* }}} */

BYTE initmouse(void) /* {{{ */
{
    /* Enable automatic mouse setup at mode set. */
    vga_setmousesupport(1);
    mouse_showed = 0;
    mousex       = 0;
    mousey       = 0;
    mouse_bstat  = 0;
    pressed_count [0] = pressed_count [1] = pressed_count [2] = 0;
    released_count[0] = released_count[1] = released_count[2] = 0;
    return 2;
} /* }}} */

void showmouse(void) /* {{{ */
{
    if (! mouse_showed) {
        register int x, y, x2, y2;
        x = mousex > 5 ? mousex - 5 : 0;
        y = mousey > 5 ? mousey - 5 : 0;
        x2 = x + 5;
        y2 = y + 5;
        gl_getbox(x, y, 11, 11, mouse_bitmap);
        gl_line(x, y2, x + 10, y2, WHITE);
        gl_line(x2, y, x2, y + 10, WHITE);
        mouse_showed = 1;
    }
} /* }}} */

void hidemouse(void) /* {{{ */
{
    if (mouse_showed) {
        register int x, y;
        x = mousex > 5 ? mousex - 5 : 0;
        y = mousey > 5 ? mousey - 5 : 0;
        gl_putbox(x, y, 11, 11, mouse_bitmap);
        mouse_showed = 0;
    }
} /* }}} */

BYTE getmousepos(WORD*x,WORD*y) /* {{{ */
{
    mouse_status_update();
    if (x != NULL) *x = (WORD) mousex;
    if (y != NULL) *y = (WORD) mousey;
    return mouse_bstat;
} /* }}} */

void setmousepos(WORD x,WORD y) /* {{{ */
{
    if (mousex != x || mousey != y) {
        hidemouse();
        mouse_setposition(x, y);
        mousex = x;
        mousey = y;
        showmouse();
    }
} /* }}} */

BYTE pressbutton(BYTE but,WORD*x,WORD*y) /* {{{ */
{
    register BYTE ret;
    mouse_status_update();
    if (but > 2) {
        ret = 0;
    } else {
        ret = pressed_count[but];
        pressed_count[but] = 0;
    }
    if (x != NULL) *x = mousex;
    if (y != NULL) *y = mousey;
    return ret;
} /* }}} */

BYTE releasebutton(BYTE but,WORD*x,WORD*y) /* {{{ */
{
    register BYTE ret;
    mouse_status_update();
    if (but > 2) {
        ret = 0;
    } else {
        ret = released_count[but];
        released_count[but] = 0;
    }
    if (x != NULL) *x = mousex;
    if (y != NULL) *y = mousey;
    return ret;
} /* }}} */

void rangex(WORD a_min,WORD a_max) /* {{{ */
{
    register int new_mousex = mousex;
    new_mousex = max(a_min, new_mousex);
    new_mousex = min(a_max, new_mousex);
    mouse_setxrange(a_min, a_max);
    if (new_mousex != mousex) {
        hidemouse();
        mousex = new_mousex;
        showmouse();
    }
} /* }}} */

void rangey(WORD a_min,WORD a_max) /* {{{ */
{
    register int new_mousey = mousey;
    new_mousey = max(a_min, new_mousey);
    new_mousey = min(a_max, new_mousey);
    mouse_setyrange(a_min, a_max);
    if (new_mousey != mousey) {
        hidemouse();
        mousey = new_mousey;
        showmouse();
    }
} /* }}} */

void setmousecur(WORD x,WORD y,void*p) /* {{{ */
{
    return;
} /* }}} */

void exclude(WORD x1,WORD y1,WORD x2,WORD y2) /* {{{ */
{
    return;
} /* }}} */

void mousesensitive(WORD x,WORD y) /* {{{ */
{
    return;
} /* }}} */

void setmousespeed(WORD speed) /* {{{ */
{
    return;
} /* }}} */

/* Modeline for ViM {{{
 * vim: set ts=4:
 * vim600: fdm=marker fdl=0 fdc=0:
 * }}} */


Platon Group <platon@platon.sk> http://platon.sk/
Copyright © 2002-2006 Platon Group
Stránka používa redakčný systém Metafox
Na začiatok