view src/video/ataricommon/SDL_ataridevmouse.c @ 2202:98e76ba7d5a4

Merged fix for bug #457 from SDL 1.2
author Sam Lantinga <slouken@libsdl.org>
date Sun, 15 Jul 2007 21:54:16 +0000
parents c121d94672cb
children 99210400e8b9
line wrap: on
line source

/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2006 Sam Lantinga

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Sam Lantinga
    slouken@libsdl.org
*/
#include "SDL_config.h"

/*
	MiNT /dev/mouse driver

	Patrice Mandin
*/

#include <fcntl.h>
#include <unistd.h>

#include "../../events/SDL_events_c.h"
#include "SDL_ataridevmouse_c.h"

/* Defines */

#define DEVICE_NAME	"/dev/mouse"

/* Local variables */

static int handle = -1;
static int mouseb, prev_mouseb;

/* Functions */

int
SDL_AtariDevMouse_Open(void)
{
    int r;
    const char *mousedev;

    /*
       TODO: Fix the MiNT device driver, that locks mouse for other
       applications, so this is disabled till fixed
     */
    return 0;

    /* First, try SDL_MOUSEDEV device */
    mousedev = SDL_getenv("SDL_MOUSEDEV");
    if (!mousedev) {
        handle = open(mousedev, 0);
    }

    /* Failed, try default device */
    if (handle < 0) {
        handle = open(DEVICE_NAME, 0);
    }

    if (handle < 0) {
        handle = -1;
        return 0;
    }

    /* Set non blocking mode */
    r = fcntl(handle, F_GETFL, 0);
    if (r < 0) {
        close(handle);
        handle = -1;
        return 0;
    }

    r |= O_NDELAY;

    r = fcntl(handle, F_SETFL, r);
    if (r < 0) {
        close(handle);
        handle = -1;
        return 0;
    }

    prev_mouseb = 7;
    return 1;
}

void
SDL_AtariDevMouse_Close(void)
{
    if (handle > 0) {
        close(handle);
        handle = -1;
    }
}

static int
atari_GetButton(int button)
{
    switch (button) {
    case 0:
        return SDL_BUTTON_RIGHT;
    case 1:
        return SDL_BUTTON_MIDDLE;
    default:
        break;
    }

    return SDL_BUTTON_LEFT;
}

void
SDL_AtariDevMouse_PostMouseEvents(_THIS, SDL_bool buttonEvents)
{
    unsigned char buffer[3];
    int mousex, mousey;

    if (handle < 0) {
        return;
    }

    mousex = mousey = 0;
    while (read(handle, buffer, sizeof(buffer)) == sizeof(buffer)) {
        mouseb = buffer[0] & 7;
        mousex += (char) buffer[1];
        mousey += (char) buffer[2];

        /* Mouse button events */
        if (buttonEvents && (mouseb != prev_mouseb)) {
            int i;

            for (i = 0; i < 3; i++) {
                int curbutton, prevbutton;

                curbutton = mouseb & (1 << i);
                prevbutton = prev_mouseb & (1 << i);

                if (curbutton && !prevbutton) {
                    SDL_PrivateMouseButton(SDL_RELEASED,
                                           atari_GetButton(i), 0, 0);
                }
                if (!curbutton && prevbutton) {
                    SDL_PrivateMouseButton(SDL_PRESSED,
                                           atari_GetButton(i), 0, 0);
                }
            }

            prev_mouseb = mouseb;
        }
    }

    /* Mouse motion event */
    if (mousex || mousey) {
        SDL_PrivateMouseMotion(0, 1, mousex, -mousey);
    }
}

/* vi: set ts=4 sw=4 expandtab: */