1/*
2 * Copyright 2004-2006, the Haiku project. All rights reserved.
3 * Distributed under the terms of the Haiku License.
4 *
5 * Authors in chronological order:
6 *  mccall@digitalparadise.co.uk
7 *  Jérôme Duval
8 *  Marcus Overhagen
9*/
10#include <FindDirectory.h>
11#include <File.h>
12#include <Path.h>
13#include <stdio.h>
14#include "KeyboardSettings.h"
15
16// Keyboard setting file layout is like this:
17// struct {
18//    struct kb_settings; // managed by input server
19//    BPoint corner;      // used by pref app
20// }
21
22KeyboardSettings::KeyboardSettings()
23{
24	if (get_key_repeat_rate(&fSettings.key_repeat_rate) != B_OK)
25		fSettings.key_repeat_rate = kb_default_key_repeat_rate;
26
27	if (get_key_repeat_delay(&fSettings.key_repeat_delay) != B_OK)
28		fSettings.key_repeat_delay = kb_default_key_repeat_delay;
29
30	fOriginalSettings = fSettings;
31
32	BPath path;
33	BFile file;
34
35	fCorner.x = 150;
36	fCorner.y = 100;
37
38	status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path);
39	if (status == B_OK) {
40		status = path.Append(kb_settings_file);
41		if (status == B_OK) {
42			status = file.SetTo(path.Path(), B_READ_ONLY);
43			if (status == B_OK) {
44				if (file.ReadAt(sizeof(kb_settings), &fCorner, sizeof(fCorner)) != sizeof(fCorner)) {
45					fCorner.x = 150;
46					fCorner.y = 100;
47				}
48			}
49		}
50	}
51}
52
53
54KeyboardSettings::~KeyboardSettings()
55{
56	BPath path;
57	BFile file;
58
59	if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) < B_OK)
60		return;
61
62	if (path.Append(kb_settings_file) < B_OK)
63		return;
64
65	// be careful: don't create the file if it doesn't already exist
66	if (file.SetTo(path.Path(), B_WRITE_ONLY) < B_OK)
67		return;
68
69	file.WriteAt(sizeof(kb_settings), &fCorner, sizeof(fCorner));
70}
71
72
73void
74KeyboardSettings::SetWindowCorner(BPoint corner)
75{
76	fCorner = corner;
77}
78
79
80void
81KeyboardSettings::SetKeyboardRepeatRate(int32 rate)
82{
83	if (set_key_repeat_rate(rate) != B_OK)
84		fprintf(stderr, "error while set_key_repeat_rate!\n");
85	fSettings.key_repeat_rate = rate;
86}
87
88
89void
90KeyboardSettings::SetKeyboardRepeatDelay(bigtime_t delay)
91{
92	if (set_key_repeat_delay(delay) != B_OK)
93		fprintf(stderr, "error while set_key_repeat_delay!\n");
94	fSettings.key_repeat_delay = delay;
95}
96
97
98void
99KeyboardSettings::Dump()
100{
101	printf("repeat rate: %" B_PRId32 "\n", fSettings.key_repeat_rate);
102	printf("repeat delay: %" B_PRId64 "\n", fSettings.key_repeat_delay);
103}
104
105
106void
107KeyboardSettings::Revert()
108{
109	SetKeyboardRepeatDelay(fOriginalSettings.key_repeat_delay);
110	SetKeyboardRepeatRate(fOriginalSettings.key_repeat_rate);
111}
112
113
114void
115KeyboardSettings::Defaults()
116{
117	SetKeyboardRepeatDelay(kb_default_key_repeat_delay);
118	SetKeyboardRepeatRate(kb_default_key_repeat_rate);
119}
120
121
122bool
123KeyboardSettings::IsDefaultable()
124{
125	return fSettings.key_repeat_delay != kb_default_key_repeat_delay
126		|| fSettings.key_repeat_rate != kb_default_key_repeat_rate;
127}
128