From 00740cc502b4158b05917e6773cf949f9514106f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 29 Aug 2004 15:20:34 +0000 Subject: [PATCH] Integrated MouseSettings and KeyboardSettings update license info clean up removed node monitoring messages handling fixed several message handlers git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8710 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/input/AddOnManager.cpp | 8 +- src/servers/input/AddOnManager.h | 4 +- src/servers/input/DeviceManager.cpp | 4 +- src/servers/input/DeviceManager.h | 4 +- src/servers/input/InputServer.cpp | 393 +++--------------------- src/servers/input/InputServer.h | 32 +- src/servers/input/InputServerDevice.cpp | 9 +- src/servers/input/InputServerFilter.cpp | 8 +- src/servers/input/InputServerMethod.cpp | 9 +- src/servers/input/Jamfile | 3 + src/servers/input/KeyboardSettings.cpp | 67 ++++ src/servers/input/KeyboardSettings.h | 35 +++ src/servers/input/MouseSettings.cpp | 250 +++++++++++++++ src/servers/input/MouseSettings.h | 79 +++++ 14 files changed, 500 insertions(+), 405 deletions(-) create mode 100644 src/servers/input/KeyboardSettings.cpp create mode 100644 src/servers/input/KeyboardSettings.h create mode 100644 src/servers/input/MouseSettings.cpp create mode 100644 src/servers/input/MouseSettings.h diff --git a/src/servers/input/AddOnManager.cpp b/src/servers/input/AddOnManager.cpp index a0e9b2380c..4b1d515fd6 100644 --- a/src/servers/input/AddOnManager.cpp +++ b/src/servers/input/AddOnManager.cpp @@ -1,6 +1,6 @@ /* -** Copyright 2004, the OpenBeOS project. All rights reserved. -** Distributed under the terms of the OpenBeOS License. +** Copyright 2004, the Haiku project. All rights reserved. +** Distributed under the terms of the Haiku License. ** ** Author : Jérôme Duval ** Original authors: Marcus Overhagen, Axel Dörfler @@ -253,12 +253,12 @@ AddOnManager::RegisterAddOns() const directory_which directories[] = { B_USER_ADDONS_DIRECTORY, B_COMMON_ADDONS_DIRECTORY, - B_BEOS_ADDONS_DIRECTORY, +// B_BEOS_ADDONS_DIRECTORY }; const char subDirectories[][24] = { "input_server/devices", "input_server/filters", - "input_server/methods", + "input_server/methods" }; fHandler = new IAHandler(this); fAddOnMonitor = new AddOnMonitor(fHandler); diff --git a/src/servers/input/AddOnManager.h b/src/servers/input/AddOnManager.h index 960b7014fc..7c373736a2 100644 --- a/src/servers/input/AddOnManager.h +++ b/src/servers/input/AddOnManager.h @@ -1,6 +1,6 @@ /* -** Copyright 2004, the OpenBeOS project. All rights reserved. -** Distributed under the terms of the OpenBeOS License. +** Copyright 2004, the Haiku project. All rights reserved. +** Distributed under the terms of the Haiku License. ** ** Author : Jérôme Duval ** Original authors: Marcus Overhagen, Axel Dörfler diff --git a/src/servers/input/DeviceManager.cpp b/src/servers/input/DeviceManager.cpp index 2339da7dca..d0cfcea29f 100644 --- a/src/servers/input/DeviceManager.cpp +++ b/src/servers/input/DeviceManager.cpp @@ -1,6 +1,6 @@ /* -** Copyright 2004, the OpenBeOS project. All rights reserved. -** Distributed under the terms of the OpenBeOS License. +** Copyright 2004, the Haiku project. All rights reserved. +** Distributed under the terms of the Haiku License. ** ** Author : Jérôme Duval ** Original authors: Marcus Overhagen, Axel Dörfler diff --git a/src/servers/input/DeviceManager.h b/src/servers/input/DeviceManager.h index f6a0287371..2d4b64ad4b 100644 --- a/src/servers/input/DeviceManager.h +++ b/src/servers/input/DeviceManager.h @@ -1,6 +1,6 @@ /* -** Copyright 2004, the OpenBeOS project. All rights reserved. -** Distributed under the terms of the OpenBeOS License. +** Copyright 2004, the Haiku project. All rights reserved. +** Distributed under the terms of the Haiku License. ** ** Author : Jérôme Duval ** Original authors: Marcus Overhagen, Axel Dörfler diff --git a/src/servers/input/InputServer.cpp b/src/servers/input/InputServer.cpp index 63901f4792..febe9ce5c8 100644 --- a/src/servers/input/InputServer.cpp +++ b/src/servers/input/InputServer.cpp @@ -1,7 +1,5 @@ /*****************************************************************************/ -// OpenBeOS InputServer -// -// Version: [0.0.5] [Development Stage] +// Haiku InputServer // // [Description] // @@ -10,7 +8,7 @@ // where noted, are licensed under the MIT License, and have been written // and are: // -// Copyright (c) 2002 OpenBeOS Project +// Copyright (c) 2002-2004 Haiku Project // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), @@ -43,9 +41,6 @@ #include #include "InputServer.h" -#include "InputServerDeviceListEntry.h" -#include "InputServerFilterListEntry.h" -#include "InputServerMethodListEntry.h" #include "InputServerTypes.h" // include app_server headers for communication @@ -159,314 +154,6 @@ InputServer::InitKeyboardMouseStates(void) } -/*void -InputServer::InitTestDevice() -{ - CALLED(); - - const char* path = "/boot/home/Projects/InputServer/ISD/nervous/nervous"; - printf("InputServer::InitTestDevice - Loading add-on . . .\n"); - image_id addon_image = load_add_on(path); - if (B_ERROR != addon_image) - { - status_t isd_status = B_NO_INIT; - BInputServerDevice* (*func)() = NULL; - printf("InputServer::InitTestDevice - Resolving symbol . . .\n"); - if (B_OK == get_image_symbol(addon_image, "instantiate_input_device", B_SYMBOL_TYPE_TEXT, (void**)&func) ) - { - printf("Found instantiate_input_device.\n"); - if (NULL != func) - { - BInputServerDevice* isd = (*func)(); - if (NULL != isd) - { - printf("InputServer::InitTestDevice - Calling InitCheck . . .\n"); - isd_status = isd->InitCheck(); - mInputServerDeviceList.AddItem( - new InputServerDeviceListEntry(path, isd_status, isd) ); - if (B_OK == isd_status) - { - //printf("Starting Nervous . . .\n"); - //isd->Start("Nervous Device", NULL); - } - else - { - printf("InitCheck failed.\n"); - } - } - } - } - if (B_OK != isd_status) - { - // Free resources associated with ISD's - // that failed to initialize. - // - //unload_add_on(addon_image); - } - } - EXIT(); -}*/ - -/* - * Method: InputServer::InitDevices() - * Descr: - */ -/*void -InputServer::InitDevices(void) -{ - CALLED(); - - BDirectory dir; - BPath addon_dir; - BPath addon_path; - BEntry entry; - directory_which addon_dirs[] = - { - B_BEOS_ADDONS_DIRECTORY, - B_COMMON_ADDONS_DIRECTORY, - B_USER_ADDONS_DIRECTORY - }; - const int addon_dir_count = sizeof(addon_dirs) / sizeof(directory_which); - - // Find all Input Server Devices in each of the predefined - // addon directories. - // - for (int i = 0; i < addon_dir_count; i++) - { - if (B_OK == find_directory(addon_dirs[i], &addon_dir) ) - { - addon_dir.Append("input_server/devices"); - dir.SetTo(addon_dir.Path() ); - while (B_NO_ERROR == dir.GetNextEntry(&entry, false) ) - { - entry.GetPath(&addon_path); - printf("Adding %s . . .\n", addon_path.Path() ); - AddInputServerDevice(addon_path.Path() ); - } - } - } - EXIT(); -}*/ - - -/* - * Method: InputServer::AddInputServerDevice() - * Descr: - */ -/*status_t -InputServer::AddInputServerDevice(const char* path) -{ - image_id addon_image= load_add_on(path); - if (B_ERROR != addon_image) - { - status_t isd_status = B_NO_INIT; - BInputServerDevice* (*func)() = NULL; - if (B_OK == get_image_symbol(addon_image, "instantiate_input_device", B_SYMBOL_TYPE_TEXT, (void**)&func) ) - { - if (NULL != func) - { - /* - // :DANGER: Only reenable this section if this - // InputServer can start and manage the - // devices, otherwise the system will hang. - // - BInputServerDevice* isd = (*func)(); - if (NULL != isd) - { - isd_status = isd->InitCheck(); - mInputServerDeviceList.AddItem( - new InputServerDeviceListEntry(path, isd_status, isd) ); - } - */ - /*mInputServerDeviceList.AddItem( - new InputServerDeviceListEntry(path, B_NO_INIT, NULL) ); - } - } - if (B_OK != isd_status) - { - // Free resources associated with ISD's - // that failed to initialize. - // - unload_add_on(addon_image); - } - } - return 0; -}*/ - - -/* - * Method: InputServer::InitFilters() - * Descr: - */ -/*void -InputServer::InitFilters(void) -{ - CALLED(); - - BDirectory dir; - BPath addon_dir; - BPath addon_path; - BEntry entry; - directory_which addon_dirs[] = - { - B_BEOS_ADDONS_DIRECTORY, - B_COMMON_ADDONS_DIRECTORY, - B_USER_ADDONS_DIRECTORY - }; - const int addon_dir_count = sizeof(addon_dirs) / sizeof(directory_which); - - // Find all Input Filters in each of the predefined - // addon directories. - // - for (int i = 0; i < addon_dir_count; i++) - { - if (B_OK == find_directory(addon_dirs[i], &addon_dir) ) - { - addon_dir.Append("input_server/filters"); - dir.SetTo(addon_dir.Path() ); - while (B_NO_ERROR == dir.GetNextEntry(&entry, false) ) - { - entry.GetPath(&addon_path); - printf("Adding %s . . .\n", addon_path.Path() ); - AddInputServerFilter(addon_path.Path() ); - } - } - } - EXIT(); -}*/ - - -/* - * Method: InputServer::AddInputServerFilter() - * Descr: - */ -/*status_t -InputServer::AddInputServerFilter(const char* path) -{ - image_id addon_image= load_add_on(path); - if (B_ERROR != addon_image) - { - status_t isf_status = B_NO_INIT; - BInputServerFilter* (*func)() = NULL; - if (B_OK == get_image_symbol(addon_image, "instantiate_input_filter", B_SYMBOL_TYPE_TEXT, (void**)&func) ) - { - if (NULL != func) - { - /* - // :DANGER: Only reenable this section if this - // InputServer can start and manage the - // filters, otherwise the system will hang. - // - BInputFilter isf = (*func)(); - if (NULL != isf) - { - isf_status = isf->InitCheck(); - mInputServerFilterList.AddItem( - new InputServerFilterListEntry(path, isf_status, isf ); - } - */ - /*mInputServerFilterList.AddItem( - new InputServerFilterListEntry(path, B_NO_INIT, NULL) ); - } - } - if (B_OK != isf_status) - { - // Free resources associated with InputServerFilters - // that failed to initialize. - // - unload_add_on(addon_image); - } - } - return 0; -}*/ - - -/* - * Method: InputServer::InitMethods() - * Descr: - */ -/*void -InputServer::InitMethods(void) -{ - CALLED(); - - BDirectory dir; - BPath addon_dir; - BPath addon_path; - BEntry entry; - directory_which addon_dirs[] = - { - B_BEOS_ADDONS_DIRECTORY, - B_COMMON_ADDONS_DIRECTORY, - B_USER_ADDONS_DIRECTORY - }; - const int addon_dir_count = sizeof(addon_dirs) / sizeof(directory_which); - - // Find all Input Methods in each of the predefined - // addon directories. - // - for (int i = 0; i < addon_dir_count; i++) - { - if (B_OK == find_directory(addon_dirs[i], &addon_dir) ) - { - addon_dir.Append("input_server/methods"); - dir.SetTo(addon_dir.Path() ); - while (B_NO_ERROR == dir.GetNextEntry(&entry, false) ) - { - entry.GetPath(&addon_path); - printf("Adding %s . . .\n", addon_path.Path() ); - AddInputServerMethod(addon_path.Path() ); - } - } - } - EXIT(); -}*/ - - -/* - * Method: InputServer::AddInputServerMethod() - * Descr: - */ -/*status_t -InputServer::AddInputServerMethod(const char* path) -{ - image_id addon_image= load_add_on(path); - if (B_ERROR != addon_image) - { - status_t ism_status = B_NO_INIT; - BInputServerMethod* (*func)() = NULL; - if (B_OK == get_image_symbol(addon_image, "instantiate_input_method", B_SYMBOL_TYPE_TEXT, (void**)&func) ) - { - if (NULL != func) - { - /* - // :DANGER: Only reenable this section if this - // InputServer can start and manage the - // methods, otherwise the system will hang. - // - BInputServerMethod ism = (*func)(); - if (NULL != ism) - { - ism_status = ism->InitCheck(); - mInputServerMethodList.AddItem( - new InputServerMethodListEntry(path, ism_status, ism) ); - } - */ - /*mInputServerMethodList.AddItem( - new InputServerMethodListEntry(path, B_NO_INIT, NULL) ); - } - } - if (B_OK != ism_status) - { - // Free resources associated with InputServerMethods - // that failed to initialize. - // - unload_add_on(addon_image); - } - } - return 0; -}*/ - /* * Method: InputServer::QuitRequested() @@ -618,12 +305,6 @@ InputServer::MessageReceived(BMessage *message) case SYSTEM_SHUTTING_DOWN: status = HandleSystemShuttingDown(message, &reply); break; - case B_NODE_MONITOR: - status = HandleNodeMonitor(message); - break; - /*case B_QUIT_REQUESTED: - QuitRequested(); - break;*/ default: { PRINT(("Default message ... \n")); @@ -660,10 +341,12 @@ InputServer::HandleGetSetMouseType(BMessage* message, BMessage* reply) { status_t status; - if (message->FindInt32("mouse_type", &sMouseType)==B_OK) + int32 type; + if (message->FindInt32("mouse_type", &type)==B_OK) { + fMouseSettings.SetMouseType(type); status = ControlDevices(NULL, B_POINTING_DEVICE, B_MOUSE_TYPE_CHANGED, NULL); - else - status = reply->AddInt32("mouse_type", sMouseType); + } else + status = reply->AddInt32("mouse_type", fMouseSettings.MouseType()); return status; } @@ -677,10 +360,12 @@ InputServer::HandleGetSetMouseAcceleration(BMessage* message, BMessage* reply) { status_t status; - if (message->FindInt32("mouse_acceleration", &sMouseAcceleration) == B_OK) + int32 factor; + if (message->FindInt32("speed", &factor) == B_OK) { + fMouseSettings.SetAccelerationFactor(factor); status = ControlDevices(NULL, B_POINTING_DEVICE, B_MOUSE_ACCELERATION_CHANGED, NULL); - else - status = reply->AddInt32("mouse_acceleration", sMouseAcceleration); + } else + status = reply->AddInt32("speed", fMouseSettings.AccelerationFactor()); return status; } @@ -694,10 +379,12 @@ InputServer::HandleGetSetKeyRepeatDelay(BMessage* message, BMessage* reply) { status_t status; - if (message->FindInt64("key_repeat_delay", &sKeyRepeatDelay) == B_OK) + bigtime_t delay; + if (message->FindInt64("delay", &delay) == B_OK) { + fKeyboardSettings.SetKeyboardRepeatDelay(delay); status = ControlDevices(NULL, B_KEYBOARD_DEVICE, B_KEY_REPEAT_DELAY_CHANGED, NULL); - else - status = reply->AddInt64("key_repeat_delay", sKeyRepeatDelay); + } else + status = reply->AddInt64("delay", fKeyboardSettings.KeyboardRepeatDelay()); return status; } @@ -773,10 +460,12 @@ InputServer::HandleGetSetMouseSpeed(BMessage* message, BMessage* reply) { status_t status; - if (message->FindInt32("mouse_speed", &sMouseSpeed) == B_OK) + int32 speed; + if (message->FindInt32("speed", &speed) == B_OK) { + fMouseSettings.SetMouseSpeed(speed); status = ControlDevices(NULL, B_POINTING_DEVICE, B_MOUSE_SPEED_CHANGED, NULL); - else - status = reply->AddInt32("mouse_speed", sMouseSpeed); + } else + status = reply->AddInt32("speed", fMouseSettings.MouseSpeed()); return status; } @@ -836,11 +525,14 @@ InputServer::HandleGetSetMouseMap(BMessage* message, mouse_map *map; ssize_t size; - if (message->FindData("mouse_map", B_RAW_TYPE, (const void**)&map, &size) == B_OK) { - memcpy(&sMouseMap, map, sizeof(sMouseMap) ); + if (message->FindData("mousemap", B_RAW_TYPE, (const void**)&map, &size) == B_OK) { + fMouseSettings.SetMapping(*map); status = ControlDevices(NULL, B_POINTING_DEVICE, B_MOUSE_MAP_CHANGED, NULL); - } else - status = reply->AddData("mouse_map", B_RAW_TYPE, &sMouseMap, sizeof(sMouseMap) ); + } else { + mouse_map map; + fMouseSettings.Mapping(map); + status = reply->AddData("mousemap", B_RAW_TYPE, &map, sizeof(mouse_map) ); + } return status; } @@ -866,10 +558,12 @@ InputServer::HandleGetSetClickSpeed(BMessage *message, BMessage *reply) { status_t status = B_ERROR; - if (message->FindInt64("mouse_click_speed", &sMouseClickSpeed) == B_OK) + bigtime_t click_speed; + if (message->FindInt64("speed", &click_speed) == B_OK) { + fMouseSettings.SetClickSpeed(click_speed); status = ControlDevices(NULL, B_POINTING_DEVICE, B_CLICK_SPEED_CHANGED, NULL); - else - status = reply->AddInt64("mouse_click_speed", sMouseClickSpeed); + } else + status = reply->AddInt64("speed", fMouseSettings.ClickSpeed()); return status; } @@ -883,10 +577,12 @@ InputServer::HandleGetSetKeyRepeatRate(BMessage* message, BMessage* reply) { status_t status; - if (message->FindInt32("key_repeat_rate", &sKeyRepeatRate) == B_OK) + int32 key_repeat_rate; + if (message->FindInt32("rate", &key_repeat_rate) == B_OK) { + fKeyboardSettings.SetKeyboardRepeatRate(key_repeat_rate); status = ControlDevices(NULL, B_KEYBOARD_DEVICE, B_KEY_REPEAT_RATE_CHANGED, NULL); - else - status = reply->AddInt32("key_repeat_rate", sKeyRepeatRate); + } else + status = reply->AddInt32("rate", fKeyboardSettings.KeyboardRepeatRate()); return status; } @@ -994,17 +690,6 @@ InputServer::HandleSystemShuttingDown(BMessage *message, } -/* - * Method: InputServer::HandleNodeMonitor() - * Descr: - */ -status_t -InputServer::HandleNodeMonitor(BMessage *message) -{ - -} - - /* * Method: InputServer::EnqueueDeviceMessage() * Descr: diff --git a/src/servers/input/InputServer.h b/src/servers/input/InputServer.h index 181140b66e..670e9f8b39 100644 --- a/src/servers/input/InputServer.h +++ b/src/servers/input/InputServer.h @@ -1,10 +1,10 @@ /*****************************************************************************/ -// OpenBeOS input_server Backend Application +// Haiku input_server // -// This is the primary application class for the OpenBeOS input_server. +// This is the primary application class for the Haiku input_server. // // -// Copyright (c) 2001 OpenBeOS Project +// Copyright (c) 2001-2004 Haiku Project // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), @@ -36,6 +36,8 @@ #include #include "AddOnManager.h" #include "DeviceManager.h" +#include "MouseSettings.h" +#include "KeyboardSettings.h" #include #include @@ -107,10 +109,6 @@ public: virtual void ArgvReceived(long, char**); void InitKeyboardMouseStates(void); - - //void InitDevices(void); - //void InitFilters(void); - //void InitMethods(void); virtual bool QuitRequested(void); virtual void ReadyToRun(void); @@ -184,25 +182,15 @@ public: static DeviceManager gDeviceManager; private: - /*void InitTestDevice(); - - status_t AddInputServerDevice(const char* path); - status_t AddInputServerFilter(const char* path); - status_t AddInputServerMethod(const char* path);*/ - bool sEventLoopRunning; bool sSafeMode; port_id sEventPort; BPoint sMousePos; - int32 sMouseType; - int32 sMouseSpeed; - int32 sMouseAcceleration; - bigtime_t sMouseClickSpeed; - int32 sKeyRepeatRate; - bigtime_t sKeyRepeatDelay; int32 sKeyboardLocks; uint16 sKeyboardID; - mouse_map sMouseMap; + + KeyboardSettings fKeyboardSettings; + MouseSettings fMouseSettings; key_info s_key_info; // current key info key_map s_key_map; // current key_map @@ -217,10 +205,6 @@ private: static bool doStartStopDevice(void*, void*); - //static BList mInputServerDeviceList; - //static BList mInputServerFilterList; - //static BList mInputServerMethodList; - // added this to communicate via portlink BPortLink *serverlink; diff --git a/src/servers/input/InputServerDevice.cpp b/src/servers/input/InputServerDevice.cpp index 6af97b5287..4021e2711d 100644 --- a/src/servers/input/InputServerDevice.cpp +++ b/src/servers/input/InputServerDevice.cpp @@ -1,16 +1,13 @@ /*****************************************************************************/ -// OpenBeOS InputServer -// -// Version: [0.0.5] [Development Stage] -// -// [Description] +// Haiku InputServer // +// This is the InputServerDevice implementation // // This application and all source files used in its construction, except // where noted, are licensed under the MIT License, and have been written // and are: // -// Copyright (c) 2002 OpenBeOS Project +// Copyright (c) 2002-2004 Haiku Project // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), diff --git a/src/servers/input/InputServerFilter.cpp b/src/servers/input/InputServerFilter.cpp index b17a745384..102c6dfc6f 100644 --- a/src/servers/input/InputServerFilter.cpp +++ b/src/servers/input/InputServerFilter.cpp @@ -1,16 +1,14 @@ /*****************************************************************************/ -// OpenBeOS InputServer +// Haiku InputServer // -// Version: [0.0.5] [Development Stage] -// -// [Description] +// This is the InputServerFilter implementation // // // This application and all source files used in its construction, except // where noted, are licensed under the MIT License, and have been written // and are: // -// Copyright (c) 2002 OpenBeOS Project +// Copyright (c) 2002-2004 Haiku Project // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), diff --git a/src/servers/input/InputServerMethod.cpp b/src/servers/input/InputServerMethod.cpp index 8f406e21b0..3d56a4e901 100644 --- a/src/servers/input/InputServerMethod.cpp +++ b/src/servers/input/InputServerMethod.cpp @@ -1,16 +1,13 @@ /*****************************************************************************/ -// OpenBeOS InputServer -// -// Version: [0.0.5] [Development Stage] -// -// [Description] +// Haiku InputServer // +// This is the InputServerMethod implementation // // This application and all source files used in its construction, except // where noted, are licensed under the MIT License, and have been written // and are: // -// Copyright (c) 2002 OpenBeOS Project +// Copyright (c) 2002-2004 Haiku Project // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), diff --git a/src/servers/input/Jamfile b/src/servers/input/Jamfile index 7552abd2c1..1536827ad6 100644 --- a/src/servers/input/Jamfile +++ b/src/servers/input/Jamfile @@ -19,6 +19,9 @@ Server input_server : AddOnManager.cpp DeviceManager.cpp + MouseSettings.cpp + KeyboardSettings.cpp + # storage AddOnMonitor.cpp AddOnMonitorHandler.cpp diff --git a/src/servers/input/KeyboardSettings.cpp b/src/servers/input/KeyboardSettings.cpp new file mode 100644 index 0000000000..d92cb0dbd4 --- /dev/null +++ b/src/servers/input/KeyboardSettings.cpp @@ -0,0 +1,67 @@ +/* +** Copyright 2004, the Haiku project. All rights reserved. +** Distributed under the terms of the Haiku License. +** +** Author : Jérôme Duval +** Original authors: mccall@digitalparadise.co.uk +*/ + +#include +#include +#include +#include +#include +#include + +#include "KeyboardSettings.h" + +const char KeyboardSettings::kKeyboardSettingsFile[] = "Keyboard_settings"; + +KeyboardSettings::KeyboardSettings() +{ + fSettings.key_repeat_delay=200; + fSettings.key_repeat_rate=250000; + + BPath path; + + if (find_directory(B_USER_SETTINGS_DIRECTORY,&path) == B_OK) { + path.Append(kKeyboardSettingsFile); + BFile file(path.Path(), B_READ_ONLY); + if (file.InitCheck() == B_OK) { + // Now read in the data + if (file.Read(&fSettings, sizeof(kb_settings)) != sizeof(kb_settings)) { + fSettings.key_repeat_delay=200; + fSettings.key_repeat_rate=250000; + } + } + } +} + +KeyboardSettings::~KeyboardSettings() +{ + BPath path; + + if (find_directory(B_USER_SETTINGS_DIRECTORY,&path) < B_OK) + return; + + path.Append(kKeyboardSettingsFile); + + BFile file(path.Path(), B_WRITE_ONLY | B_CREATE_FILE); + if (file.InitCheck() == B_OK) { + file.Write(&fSettings, sizeof(kb_settings)); + } +} + + +void +KeyboardSettings::SetKeyboardRepeatRate(int32 rate) +{ + fSettings.key_repeat_rate = rate; +} + + +void +KeyboardSettings::SetKeyboardRepeatDelay(int32 rate) +{ + fSettings.key_repeat_delay = rate; +} diff --git a/src/servers/input/KeyboardSettings.h b/src/servers/input/KeyboardSettings.h new file mode 100644 index 0000000000..b1048250a3 --- /dev/null +++ b/src/servers/input/KeyboardSettings.h @@ -0,0 +1,35 @@ +/* +** Copyright 2004, the Haiku project. All rights reserved. +** Distributed under the terms of the Haiku License. +** +** Author : Jérôme Duval +** Original authors: mccall@digitalparadise.co.uk +*/ + +#ifndef KEYBOARD_SETTINGS_H_ +#define KEYBOARD_SETTINGS_H_ + +#include + +typedef struct { + bigtime_t key_repeat_delay; + int32 key_repeat_rate; +} kb_settings; + +class KeyboardSettings { +public : + KeyboardSettings(); + ~KeyboardSettings(); + + int32 KeyboardRepeatRate() const { return fSettings.key_repeat_rate; } + void SetKeyboardRepeatRate(int32 rate); + int32 KeyboardRepeatDelay() const { return fSettings.key_repeat_delay; } + void SetKeyboardRepeatDelay(int32 rate); + +private: + static const char kKeyboardSettingsFile[]; + BPoint fCorner; + kb_settings fSettings; +}; + +#endif diff --git a/src/servers/input/MouseSettings.cpp b/src/servers/input/MouseSettings.cpp new file mode 100644 index 0000000000..136f0bfa73 --- /dev/null +++ b/src/servers/input/MouseSettings.cpp @@ -0,0 +1,250 @@ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2004, Haiku +// +// This software is part of the Haiku distribution and is covered +// by the Haiku license. +// +// +// File: MouseSettings.h +// Authors: Jérôme Duval, +// Andrew McCall (mccall@digitalparadise.co.uk), +// Axel Dörfler (axeld@pinc-software.de) +// Description: Input Server +// Created: August 29, 2004 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + +#include +#include +#include +#include + +#include + +#include "MouseSettings.h" + +static const char kMouseSettingsFile[] = "Mouse_settings"; + +static const bigtime_t kDefaultClickSpeed = 500000; +static const int32 kDefaultMouseSpeed = 65536; +static const int32 kDefaultMouseType = 3; // 3 button mouse +static const int32 kDefaultAccelerationFactor = 65536; + + +MouseSettings::MouseSettings() +{ + RetrieveSettings(); + + fOriginalSettings = fSettings; + fOriginalMode = fMode; +} + + +MouseSettings::~MouseSettings() +{ + SaveSettings(); +} + + +status_t +MouseSettings::GetSettingsPath(BPath &path) +{ + status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path); + if (status < B_OK) + return status; + + path.Append(kMouseSettingsFile); + return B_OK; +} + + +void +MouseSettings::RetrieveSettings() +{ + // retrieve current values + + fMode = mouse_mode(); + + // also try to load the window position from disk + + BPath path; + if (GetSettingsPath(path) < B_OK) + return; + + BFile file(path.Path(), B_READ_ONLY); + if (file.InitCheck() < B_OK) + return; + +#ifdef COMPILE_FOR_R5 + // we have to do this because mouse_map counts 16 buttons in OBOS + + if ((file.Read(&fSettings.type, sizeof(int32)) != sizeof(int32)) + || (file.Read(&fSettings.map, sizeof(int32) * 3) != sizeof(int32) * 3) + || (file.Read(&fSettings.accel, sizeof(mouse_accel)) != sizeof(mouse_accel)) + || (file.Read(&fSettings.click_speed, sizeof(bigtime_t)) != sizeof(bigtime_t))) { + Defaults(); + } +#else + if (file.ReadAt(0, &fSettings, sizeof(mouse_settings)) != sizeof(mouse_settings)) { + Defaults(); + } +#endif + +#ifdef DEBUG + Dump(); +#endif +} + + +status_t +MouseSettings::SaveSettings() +{ +#ifdef DEBUG + Dump(); +#endif + + BPath path; + status_t status = GetSettingsPath(path); + if (status < B_OK) + return status; + + BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE); + if (status < B_OK) + return status; + + // we have to do this because mouse_map counts 16 buttons in OBOS +#ifdef COMPILE_FOR_R5 + file.Write(&fSettings.type, sizeof(fSettings.type)); + file.Write(&fSettings.map, 3*sizeof(int32)); + file.Write(&fSettings.accel, sizeof(fSettings.accel)); + file.Write(&fSettings.click_speed, sizeof(fSettings.click_speed)); +#else + file.Write(fSettings, sizeof(fSettings)); +#endif + + // who is responsible for saving the mouse mode? + + return B_OK; +} + + +#ifdef DEBUG +void +MouseSettings::Dump() +{ + printf("type:\t\t%ld button mouse\n", fSettings.type); + printf("map:\t\tleft = %lu : middle = %lu : right = %lu\n", fSettings.map.button[0], fSettings.map.button[2], fSettings.map.button[1]); + printf("click speed:\t%Ld\n", fSettings.click_speed); + printf("accel:\t\t%s\n", fSettings.accel.enabled ? "enabled" : "disabled"); + printf("accel factor:\t%ld\n", fSettings.accel.accel_factor); + printf("speed:\t\t%ld\n", fSettings.accel.speed); + + char *mode = "unknown"; + switch (fMode) { + case B_NORMAL_MOUSE: + mode = "normal"; + break; + case B_FOCUS_FOLLOWS_MOUSE: + mode = "focus follows mouse"; + break; + case B_WARP_MOUSE: + mode = "warp mouse"; + break; + case B_INSTANT_WARP_MOUSE: + mode = "instant warp mouse"; + break; + } + printf("mode:\t\t%s\n", mode); +} +#endif + + +/** Resets the settings to the system defaults + */ + +void +MouseSettings::Defaults() +{ + SetClickSpeed(kDefaultClickSpeed); + SetMouseSpeed(kDefaultMouseSpeed); + SetMouseType(kDefaultMouseType); + SetAccelerationFactor(kDefaultAccelerationFactor); + SetMouseMode(B_NORMAL_MOUSE); + + fSettings.map.button[0] = B_PRIMARY_MOUSE_BUTTON; + fSettings.map.button[1] = B_SECONDARY_MOUSE_BUTTON; + fSettings.map.button[2] = B_TERTIARY_MOUSE_BUTTON; + +} + + +void +MouseSettings::SetMouseType(int32 type) +{ + fSettings.type = type; +} + + +bigtime_t +MouseSettings::ClickSpeed() const +{ + return fSettings.click_speed; +} + + +void +MouseSettings::SetClickSpeed(bigtime_t clickSpeed) +{ + fSettings.click_speed = clickSpeed; +} + + +void +MouseSettings::SetMouseSpeed(int32 speed) +{ + fSettings.accel.speed = speed; +} + + +void +MouseSettings::SetAccelerationFactor(int32 factor) +{ + fSettings.accel.accel_factor = factor; +} + + +uint32 +MouseSettings::Mapping(int32 index) const +{ + return fSettings.map.button[index]; +} + + +void +MouseSettings::Mapping(mouse_map &map) const +{ + map = fSettings.map; +} + + +void +MouseSettings::SetMapping(int32 index, uint32 button) +{ + fSettings.map.button[index] = button; +} + + +void +MouseSettings::SetMapping(mouse_map &map) +{ + fSettings.map = map; +} + + +void +MouseSettings::SetMouseMode(mode_mouse mode) +{ + fMode = mode; +} + diff --git a/src/servers/input/MouseSettings.h b/src/servers/input/MouseSettings.h new file mode 100644 index 0000000000..690d5c753d --- /dev/null +++ b/src/servers/input/MouseSettings.h @@ -0,0 +1,79 @@ +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ +// +// Copyright (c) 2004, Haiku +// +// This software is part of the Haiku distribution and is covered +// by the Haiku license. +// +// +// File: MouseSettings.h +// Authors: Jérôme Duval, +// Andrew McCall (mccall@digitalparadise.co.uk), +// Axel Dörfler (axeld@pinc-software.de) +// Description: Input Server +// Created: August 29, 2004 +// +// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + +#ifndef MOUSE_SETTINGS_H_ +#define MOUSE_SETTINGS_H_ + +#include +#include + + +// ToDo: these should be defined somewhere else; the mouse +// input driver or add-on must read them as well + +typedef struct { + bool enabled; // Acceleration on / off + int32 accel_factor; // accel factor: 256 = step by 1, 128 = step by 1/2 + int32 speed; // speed accelerator (1=1X, 2 = 2x)... +} mouse_accel; + +typedef struct { + int32 type; + mouse_map map; + mouse_accel accel; + bigtime_t click_speed; +} mouse_settings; + + +class MouseSettings { + public: + MouseSettings(); + ~MouseSettings(); + + void Defaults(); + void Dump(); + + int32 MouseType() const { return fSettings.type; } + void SetMouseType(int32 type); + + bigtime_t ClickSpeed() const; + void SetClickSpeed(bigtime_t click_speed); + + int32 MouseSpeed() const { return fSettings.accel.speed; } + void SetMouseSpeed(int32 speed); + + int32 AccelerationFactor() const { return fSettings.accel.accel_factor; } + void SetAccelerationFactor(int32 factor); + + uint32 Mapping(int32 index) const; + void Mapping(mouse_map &map) const; + void SetMapping(int32 index, uint32 button); + void SetMapping(mouse_map &map); + + mode_mouse MouseMode() const { return fMode; } + void SetMouseMode(mode_mouse mode); + + private: + static status_t GetSettingsPath(BPath &path); + void RetrieveSettings(); + status_t SaveSettings(); + + mouse_settings fSettings, fOriginalSettings; + mode_mouse fMode, fOriginalMode; +}; + +#endif