• Jeffrey Lee's avatar
    Implement scroll mouse configuration · 74600d0d
    Jeffrey Lee authored
    Support configuring the WindowScroll module, via a settings Obey file at
    Choices:Boot.Tasks.WimpScroll
    
    Version 0.17. Tagged as 'MousSetup-0_17'
    74600d0d
Main 5.25 KB
/* Copyright 1998 Acorn Computers Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/******	Main.c ************************************************************\

Project:	Ursula (RISC OS for Risc PC II)
Component:	Mouse configuration plug-in
This file:	Overall control

History:
Date		Who	Change
----------------------------------------------------------------------------
09/12/1997	BJGA	Split into Main, Settings, ToolboxE, WimpE & WimpM
			Added these headers

\**************************************************************************/

/* CLib */
#include <stdlib.h>
/* Toolbox */
#include "event.h"
#include "toolbox.h"
#include "window.h"
/* Common */
#include "error.h"
#include "misc.h"
#include "message.h"
/* Local headers */
#include "Main.h"  /* includes prototypes for this file */
#include "ToolboxE.h"
#include "WimpE.h"
#include "WimpM.h"
#include "Settings.h"
#include "ScrollTypes.h"

#define	WimpVersion	((int) 310)

/* Global variables */

	BOOL		quit = FALSE;
	ObjectId	mainwindow_id;
	MessagesFD	messages;
	const _kernel_oserror err_alloc = { 0, "Err_Alloc" };
	BOOL		wheel_supported;

/* Static global variables */

static	WimpPollBlock	poll_block;
static	IdBlock		id_block;

static ObjectId auto_scrollbar(const char *windowname)
{
  int  screeny;
  ObjectTemplateHeader *objtemplate;
  WindowTemplate       *wintemplate;
  WimpWindow           *windef;
  ObjectId              window_id;

  /* Read the window object in by hand */
  throw (toolbox_template_lookup (0, windowname, &objtemplate));
  if (objtemplate->object_class != Window_ObjectClass) {
    static const _kernel_oserror e = { 0, "Err_BadClass" };
    message_error(messages, e);
  }
  wintemplate = objtemplate->body;
  windef = &wintemplate->window;
  screeny = _swi (OS_ReadModeVariable, _INR(0,1) | _RETURN(2), -1, 12) <<
            _swi (OS_ReadModeVariable, _INR(0,1) | _RETURN(2), -1, 5);

  /* Calculate the window height compared with the screen and
   * turn the vertical scrollbar on if it doesn't fit
   */
  if ((windef->visible_area.ymax - windef->visible_area.ymin) >= screeny) {
    windef->flags |= WimpWindow_VScroll;
  }
  else {
    windef->flags &= ~WimpWindow_VScroll;
  }
  throw (toolbox_create_object (Toolbox_CreateObject_InCore, objtemplate, &window_id));
  return window_id;
}

/*---------------------------------------------------------------------------*
 * grey_gadget                                                               *
 *                                                                           *
 * Grey a a gadget.                                                          *
 *                                                                           *
 * In: objectid = ID of the object containing the gadget.                    *
 *     gadgetid = ID of the gadget.                                          *
 *---------------------------------------------------------------------------*/

static void grey_gadget(int objectid, int gadgetid)
{
  unsigned int flags;

  throw(gadget_get_flags(0, objectid, gadgetid, &flags));
  flags=flags | Gadget_Faded;
  throw(gadget_set_flags(0, objectid, gadgetid, flags));
}

/******	main() ************************************************************\

In:		Command line option:
		  -openat x y
		    specifies initial position to open window at

\**************************************************************************/

int main (int argc, char *argv[])
{
  error_initialise ();
  throw (toolbox_initialise (0, WimpVersion, wimpm_messages, toolboxe_events,
    "<MousSetup$Dir>", &messages, &id_block, NULL, NULL, NULL));
  misc_parsearguments (argc, argv);
  throw (event_initialise (&id_block));
  throw (event_set_mask (wimpe_mask));

  /* Disable the scroll wheel settings if the OS/Wimp doesn't support scrolling
     (no WindowScroll module loaded). No need to read/write a config file which
     will have no effect. */
  wheel_supported = (_swix(OS_CLI,_IN(0),"RMEnsure WindowScroll 0") == NULL);

  /* Register for messages and events */
  wimpm_register ();
  wimpe_register ();
  toolboxe_register ();

  /* Create & initialise window */
  mainwindow_id = auto_scrollbar("Mouse");
  scrolltypes_init ();
  if (!wheel_supported)
  {
    grey_gadget(mainwindow_id, mainwindow_wheelspeedlabel);
    grey_gadget(mainwindow_id, mainwindow_wheelspeedslow);
    grey_gadget(mainwindow_id, mainwindow_wheelspeed);
    grey_gadget(mainwindow_id, mainwindow_wheelspeedfast);
    grey_gadget(mainwindow_id, mainwindow_linescroll);
    grey_gadget(mainwindow_id, mainwindow_wheeltarget);
    grey_gadget(mainwindow_id, mainwindow_wheeltargetlabel);
  }
  misc_openwindow (mainwindow_id, TRUE);
  settings_read (cmos_read);
  choices_read ();

  /* Go */
  error_recover_point();
  while (!quit) {
    throw (event_poll (NULL, &poll_block, NULL));
  }
  exit (EXIT_SUCCESS);
}