view src/joystick/amigaos/SDL_sysjoystick.c @ 1133:609c060fd2a2

The MacOSX Carbon/Cocoa/X11 all in one library patch. Relevant emails: To: SDL Developers <sdl@libsdl.org> From: =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb@algonet.se> Date: Mon, 30 May 2005 23:29:04 +0200 Subject: [SDL] Mac OS X Video Drivers [patch] I've updated/added the Carbon and X11 video drivers to the Mac OS X port of SDL 1.2 (the CVS version), and made the Cocoa driver and runtime *optional*. The default is still Cocoa, and the "Quartz" driver. But you can now also use "toolbox" for Carbon, and "x11" for running with Apple's (or other) X11 server: export SDL_VIDEODRIVER=x11 export SDL_VIDEO_GL_DRIVER=/usr/X11R6/lib/libGL.dylib It also checks if the frameworks are available, by a: #include <Carbon/Carbon.h> or #import <Cocoa/Cocoa.h> (this should make it configure on plain Darwin as well?) Here are the new configure targets: --enable-video-cocoa use Cocoa/Quartz video driver default=yes --enable-video-carbon use Carbon/QuickDraw video driver default=yes --enable-video-x11 use X11 video driver default=no ./configure --enable-video-cocoa --enable-video-carbon --enable-video-x11 \ --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib The Carbon version is just an updated version of the old SDL driver for Mac OS 9, and could probably be improved... (but it does work, including the Carbon version of SDLmain) If you disable cocoa, you can run with -framework Carbon only, and the C version of SDL_main.c. And if you disable carbon too, you can still use the X11 version which doesn't require SDLmain. I updated the DrawSprocket version, but did not include it. (no blitters or VRAM GWorlds etc. available on OS X anyway) Besides for Mac OS 9, I don't think there's any use for it ? And note that any performance on Mac OS X equals OpenGL anyway... You can get "fair" software SDL results on captured CG displays, but for decent frame rates you need to be using GL for rendering. Finally, here is the patch itself: http://www.algonet.se/~afb/SDL-12CVS-macvideo.patch --anders PS. It says "video", but as usual it applies to mouse/keyboard too. ------ To: A list for developers using the SDL library <sdl@libsdl.org> From: =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb@algonet.se> Date: Sun, 4 Sep 2005 10:02:15 +0200 Subject: [SDL] Updated Mac patch Updated the previous Mac patch to disable Carbon by default. Also "fixed" the SDL.spec again, so that it builds on Darwin. http://www.algonet.se/~afb/SDL-1.2.9-mac.patch Also applied fine to SDL12 CVS, when I tried it.
author Ryan C. Gordon <icculus@icculus.org>
date Thu, 08 Sep 2005 06:16:14 +0000 (2005-09-08)
parents b8d311d90021
children c9b51268668f
line wrap: on
line source
/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2004 Sam Lantinga

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    Sam Lantinga
    slouken@libsdl.org
*/


#ifdef SAVE_RCSID
static char rcsid =
 "@(#) $Id$";
#endif

/* This is the system specific header for the SDL joystick API */

#include <stdio.h>		/* For the definition of NULL */

#include <libraries/lowlevel.h>
#if defined(__SASC) || defined(STORMC4_WOS)
#include <proto/exec.h>
#include <proto/lowlevel.h>
#include <proto/graphics.h>
#else
#include <inline/exec.h>
#include <inline/lowlevel.h>
#include <inline/graphics.h>
#endif
#include "mydebug.h"

extern struct ExecBase *SysBase;
extern struct GfxBase *GfxBase;
#include <stdlib.h>

#include "SDL_error.h"
#include "SDL_joystick.h"
#include "SDL_sysjoystick.h"
#include "SDL_joystick_c.h"

/* Function to scan the system for joysticks.
 * This function should set SDL_numjoysticks to the number of available
 * joysticks.  Joystick 0 should be the system default joystick.
 * It should return 0, or -1 on an unrecoverable fatal error.
 */


/* Amiga specific datas */
struct Library *LowLevelBase=NULL;

ULONG joybut[]=
{
	JPF_BUTTON_RED,
	JPF_BUTTON_BLUE,
	JPF_BUTTON_PLAY,
	JPF_BUTTON_YELLOW,
	JPF_BUTTON_GREEN,
	JPF_BUTTON_FORWARD,
	JPF_BUTTON_REVERSE,
};

struct joystick_hwdata
{
	ULONG joystate;
};

int SDL_SYS_JoystickInit(void)
{
	if(!LowLevelBase)
	{
		if(LowLevelBase=OpenLibrary("lowlevel.library",37))
			return 2;
	}
	else
		return 2;

	D(bug("%ld joysticks available.\n",SDL_numjoysticks));

	return 0;
}

/* Function to get the device-dependent name of a joystick */
const char *SDL_SYS_JoystickName(int index)
{
	if(index<2&&LowLevelBase)
	{
		switch(index)
		{
			case 0:
				return "Port 1 Amiga Joystick/Joypad";
			case 1:
				return "Port 2 Amiga Joystick/Joypad";
		}
	}

	SDL_SetError("No joystick available with that index");
	return(NULL);
}

/* Function to open a joystick for use.
   The joystick to open is specified by the index field of the joystick.
   This should fill the nbuttons and naxes fields of the joystick structure.
   It returns 0, or -1 if there is an error.
 */

int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
{
	ULONG temp,i;
	D(bug("Opening joystick %ld\n",joystick->index));

	if(!(joystick->hwdata=malloc(sizeof(struct joystick_hwdata))))
		return -1;

/* This loop is to check if the controller is a joypad */

	for(i=0;i<20;i++)
	{
		temp=ReadJoyPort(joystick->index^1); // fix to invert amiga joyports
		WaitTOF();
	}

	if((temp&JP_TYPE_MASK)==JP_TYPE_GAMECTLR)
		joystick->nbuttons=7;
	else
		joystick->nbuttons=3;

	joystick->nhats=0;
	joystick->nballs=0;
	joystick->naxes=2;
	joystick->hwdata->joystate=0L;

	return 0;
}

/* Function to update the state of a joystick - called as a device poll.
 * This function shouldn't update the joystick structure directly,
 * but instead should call SDL_PrivateJoystick*() to deliver events
 * and update joystick device state.
 */
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
{
	ULONG data;
	int i;

	if(joystick->index<2)
	{
		data=ReadJoyPort(joystick->index);

		if(data&JP_DIRECTION_MASK)
		{
			if(data&JPF_JOY_DOWN)
			{
				if(!(joystick->hwdata->joystate&JPF_JOY_DOWN))
					SDL_PrivateJoystickAxis(joystick,0,127);
			}
			else if(data&JPF_JOY_UP)
			{
				if(!(joystick->hwdata->joystate&JPF_JOY_UP))
					SDL_PrivateJoystickAxis(joystick,0,-127);
			}
			else if(joystick->hwdata->joystate&(JPF_JOY_UP|JPF_JOY_DOWN))
				SDL_PrivateJoystickAxis(joystick,0,0);

			if(data&JPF_JOY_LEFT)
			{
				if(!(joystick->hwdata->joystate&JPF_JOY_LEFT))
					SDL_PrivateJoystickAxis(joystick,1,-127);
			}
			else if(data&JPF_JOY_RIGHT)
			{
				if(!(joystick->hwdata->joystate&JPF_JOY_RIGHT))
					SDL_PrivateJoystickAxis(joystick,1,127);
			}
			else if(joystick->hwdata->joystate&(JPF_JOY_LEFT|JPF_JOY_RIGHT))
				SDL_PrivateJoystickAxis(joystick,1,0);
		}
		else if(joystick->hwdata->joystate&(JPF_JOY_LEFT|JPF_JOY_RIGHT))
		{
				SDL_PrivateJoystickAxis(joystick,1,0);
		}
		else if(joystick->hwdata->joystate&(JPF_JOY_UP|JPF_JOY_DOWN))
		{
				SDL_PrivateJoystickAxis(joystick,0,0);
		}

		for(i=0;i<joystick->nbuttons;i++)
		{
			if( (data&joybut[i]) )
			{
				if(i==1)
					data&=(~(joybut[2]));

				if(!(joystick->hwdata->joystate&joybut[i]))
					SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED);
			}
			else if(joystick->hwdata->joystate&joybut[i])
				SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED);
		}

		joystick->hwdata->joystate=data;
	}

	return;
}

/* Function to close a joystick after use */
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
{
	if(joystick->hwdata)
		free(joystick->hwdata);
	return;
}

/* Function to perform any system-specific joystick related cleanup */

void SDL_SYS_JoystickQuit(void)
{
	if(LowLevelBase)
	{
		CloseLibrary(LowLevelBase);
		LowLevelBase=NULL;
		SDL_numjoysticks=0;
	}

	return;
}