Subversion Repositories factorylink.pvb_util

Rev

Blame | Last modification | View Log | Download

/**************************************************************
 *
 * Object  : pvb_util.dll
 *
 * File    : mouse.c
 *
 * Purpose : Mouse handling for FactoyyLink, usage of functions
 *           with PVB.
 *
 **************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <resource.h>
#include <time.h>


/* 
 * Global variables 
 */
short         pvb_mouse_init = 0;

HINSTANCE     pvb_mouse_lib = NULL;
HWND          cur_hwnd = NULL;
short         act_cur_type = 0,   /* actual cursor type */
              prev_cur_type = 0;  /* previous cursor type */

HCURSOR       pvb_mouse_cur[ 20] = {NULL, NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL, NULL};

extern HINSTANCE    hinstDLL;                                     



/**************************************************************
 *
 * Function: short WINAPI pvb_init_cursor( char *title)
 *
 * Purpose : Initialise handling of the mouse cursor, first
 *           save the default cursor. Load the default OS 
 *           cursors.
 *
 * Return  : 0  - Success
 *           -1 - Failure
 **************************************************************/
short WINAPI pvb_init_cursor( char *title)
{

  short      ret = 0;
  short      t = 1;


  /* check if init is already done */
  if (pvb_mouse_init)
    return ret;

  /* mark initialisation */
  pvb_mouse_init = 1;

  /* actual cursor type */
  act_cur_type = 0;

  /* previous cursor type */  
  prev_cur_type = 0;

  /* save the deafult cursor for the window class */

  /* check if a window title is specified */
  if (title == NULL)
    t = 0;
  else
  {

    if (!strlen( title))
      t = 0;
  }

  if (!t)
    cur_hwnd = GetActiveWindow();
  else
    cur_hwnd = FindWindow( NULL, title);

  if (cur_hwnd != NULL)
  {
    if ((pvb_mouse_cur[ 0] = (HCURSOR)(GetClassLong( cur_hwnd, GCL_HCURSOR))) == NULL)
      pvb_mouse_cur[  0] = LoadCursor( NULL, IDC_ARROW);
  }
  else 
    pvb_mouse_cur[  0] = LoadCursor( NULL, IDC_ARROW);
 
  /* load all the standard mouse cursors */
  pvb_mouse_cur[  1] = LoadCursor( NULL, IDC_ARROW);
  pvb_mouse_cur[  2] = LoadCursor( NULL, IDC_APPSTARTING);
  pvb_mouse_cur[  3] = LoadCursor( NULL, IDC_SIZEALL);
  pvb_mouse_cur[  4] = LoadCursor( NULL, IDC_WAIT);
  pvb_mouse_cur[  5] = LoadCursor( NULL, IDC_HELP);
  pvb_mouse_cur[  6] = LoadCursor( NULL, IDC_CROSS);
  pvb_mouse_cur[  7] = LoadCursor( NULL, IDC_NO);
  pvb_mouse_cur[  8] = LoadCursor( NULL, IDC_SIZENESW);
  pvb_mouse_cur[  9] = LoadCursor( NULL, IDC_SIZENS);
  pvb_mouse_cur[ 10] = LoadCursor( NULL, IDC_SIZENWSE);
  pvb_mouse_cur[ 11] = LoadCursor( NULL, IDC_SIZEWE);
  pvb_mouse_cur[ 12] = LoadCursor( NULL, IDC_UPARROW);
  pvb_mouse_cur[ 13] = LoadCursor( NULL, IDC_IBEAM);
  pvb_mouse_cur[ 14] = LoadCursor( NULL, IDC_SIZE);
  pvb_mouse_cur[ 15] = LoadCursor( NULL, IDC_ICON);
  
  pvb_mouse_cur[ 16] = LoadCursor( hinstDLL, MAKEINTRESOURCE( IDC_CURSOR1));
  pvb_mouse_cur[ 17] = LoadCursor( hinstDLL, MAKEINTRESOURCE( IDC_CURSOR2));
  pvb_mouse_cur[ 18] = LoadCursor( hinstDLL, MAKEINTRESOURCE( IDC_CURSOR3));
  pvb_mouse_cur[ 19] = LoadCursor( hinstDLL, MAKEINTRESOURCE( IDC_CURSOR4));

  return ret;
} /* pvb_init_cursor */


/**************************************************************
 *
 * Function: short WINAPI pvb_set_cursor( short type)
 *
 * Purpose : Set a new cursor type.
 *            0 = default
 *            1 = IDC_ARROW
 *            2 = IDC_APPSTARTING
 *            3 = IDC_SIZEALL
 *            4 = IDC_WAIT
 *            5 = IDC_CROSS
 *            6 = IDC_NO
 *            7 = IDC_SIZENESW
 *            8 = IDC_SIZENS
 *            9 = IDC_SIZENWSE
 *           10 = IDC_SIZEWE
 *           11 = IDC_UPARROW
 *           12 = IDC_IBEAM
 *           13 = IDC_SIZE
 *           14 = IDC_ICON
 *
 * Return  : 0  - Success
 *           -1 - Failure
 **************************************************************/
short WINAPI pvb_set_cursor( short type)
{

  HCURSOR       hcur = NULL;
  short         ret = 0;
  short         old = 0;


  /* check for initialisation */
  if (!pvb_mouse_init)
  {

    if (pvb_init_cursor( NULL))
      return -1;
  }

  /* restore previous setting */
  if (type == -1)
    type = prev_cur_type;

  /* set new previous type */
  old = act_cur_type;

  /* set the desired cursor, as the default for the window class */
  switch (type)
  {

    case 0:

      /* default cursor */
      if (pvb_mouse_cur[ 0] != NULL)
        hcur = pvb_mouse_cur[ 0];
      else
      {

        if ((hcur = LoadCursor( NULL, IDC_ARROW)) == NULL)
          ret = -1;
      }

      act_cur_type = type;
      break;

    case  1:
    case  2:
    case  3:
    case  4:
    case  5:
    case  6:
    case  7:
    case  8:
    case  9:
    case 10:
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:

    case 16:
    case 17:
    case 18:
    case 19:

      /* user defined cursor */
      if ((pvb_mouse_cur[ type]) != NULL)
      {

        hcur = pvb_mouse_cur[ type];
        act_cur_type = type;
      }
      else
        ret = -1;
      break;

    default:

      ret = -1;
      break;
  }

  /* if we have succes, do the actual change of cursor shape */
  if (!ret)
  {
 
    //assume that all windows are created with th esame class
    SetClassLong( cur_hwnd, GCL_HCURSOR, (LONG)hcur);
    SetCursor( hcur);

    prev_cur_type = old;
  }

  return ret;
} /* pvb_set_cursor */


/**************************************************************
 *
 * Function: short WINAPI pvb_get_cursor( void)
 *
 * Purpose : Get the actul cursor type, zero is returned, if
 *           not set by 'pvb_set_cursor'.
 *
 * Return:    0 = default
 *            1 = IDC_ARROW
 *            2 = IDC_APPSTARTING
 *            3 = IDC_SIZEALL
 *            4 = IDC_WAIT
 *            5 = IDC_CROSS
 *            6 = IDC_NO
 *            7 = IDC_SIZENESW
 *            8 = IDC_SIZENS
 *            9 = IDC_SIZENWSE
 *           10 = IDC_SIZEWE
 *           11 = IDC_UPARROW
 *           12 = IDC_IBEAM
 *           13 = IDC_SIZE
 *           14 = IDC_ICON
 **************************************************************/
short WINAPI pvb_get_cursor( void)
{


  /* return the last type set */
  return act_cur_type;
} /* pvb_get_cursor */


/**************************************************************
 *
 * Function: short WINAPI pvb_exit_cursor( void)
 *
 * Purpose : Exitst the handing of the mouse cursor.
 *
 * Return  : 0  - Success
 *           -1 - Failure
 **************************************************************/
short WINAPI pvb_exit_cursor( void)
{


  /* restore default cursor */
  pvb_set_cursor( 0);

  memset( pvb_mouse_cur, 0, sizeof( HCURSOR) * 20);

  cur_hwnd = NULL;

  pvb_mouse_init = 0;

  return 0;
}


void force_mouse_position( HWND hWnd)
{

  //retrieve mouse position

  //send mouse position
  //LRESULT SendMessage( hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
 
 
 



}