r/**
 * projectM -- Milkdrop-esque visualisation SDK
 * Copyright (C)2003-2007 projectM Team
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * See 'LICENSE.txt' included within this release
 *
 */
/**
 * $Id: carbontoprojectM.hpp,v 1.2 2004/11/12 15:12:58 cvs Exp $
 *
 * Translates CARBON -> projectM variables
 *
 * $Log$
 */

#ifndef _CARBONTOPROJECTM_H
#define _CARBONTOPROJECTM_H

#include "event.h"

#ifdef WIN32
#else
#endif

projectMEvent carbon2pmEvent( EventRecord *event ) { 

    switch ( event->what ) { 
        case updateEvt: 
            return PROJECTM_VIDEORESIZE; 
        case keyUp: 
            return PROJECTM_KEYUP; 
        case keyDown: 
            return PROJECTM_KEYDOWN; 
        default:
            return PROJECTM_KEYUP; 
      } 
  } 

projectMKeycode carbon2pmKeycode( EventRecord *event ) { 
    projectMKeycode char_code = (projectMKeycode)(event->message & charCodeMask); 
    switch ( char_code ) { 
        case kFunctionKeyCharCode: { 
            switch ( ( event->message << 16 ) >> 24 ) { 
                case 111: { 
                    return PROJECTM_K_F12; 
                  } 
                case 103: { 
                    return PROJECTM_K_F11; 
                  } 
                case 109: { 
                    return PROJECTM_K_F10; 
                  } 
                case 101: { 
                    return PROJECTM_K_F9; 
                  } 
                case 100: { 
                    return PROJECTM_K_F8; 
                  } 
                case 98: { 
                    return PROJECTM_K_F7; 
                  } 
                case 97: { 
                    return PROJECTM_K_F6; 
                  } 
                case 96: { 
                    return PROJECTM_K_F5; 
                  } 
                case 118: { 
                    return PROJECTM_K_F4; 
                  } 
                case 99: { 
                    return PROJECTM_K_F3; 
                  } 
                case 120: { 
                    return PROJECTM_K_F2; 
                  } 
                case 122: { 
                    return PROJECTM_K_F1; 
                  } 
              } 
          } 
        default: { 
            return char_code; 
          } 
      } 
  } 

projectMModifier carbon2pmModifier( EventRecord *event ) { 
    return (projectMModifier)PROJECTM_K_LSHIFT; 
  } 

#endif /** _CARBONTOPROJECTM_H */
