version 0.3.1
[expresskeys.git] / src-expresskeys / config_write.c
1 /*
2  config_write.c -- Support ExpressKeys & Touch Strips on a Wacom Intuos3 tablet.
3
4  Copyright (C) 2005-2006 - Mats Johannesson
5
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
19 */
20
21 #include "globals.h"
22
23 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24  Function writes a header in a new file, including config file version
25  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
26
27 int write_file_config_header(FILE *fp)
28 {
29
30         fprintf(fp, "\n%s %s\n", configstring, configversion);
31         if (pad1_name) {
32                 fprintf(fp, "%s %s\n", pad1idstring, pad1_name);
33         } else {
34                 fprintf(fp, "%s %s\n", pad1idstring, "LACKING");
35         }
36         if (stylus1_name) {
37                 fprintf(fp, "%s %s\n", stylus1idstring, stylus1_name);
38         } else {
39                 fprintf(fp, "%s %s\n", stylus1idstring, "LACKING");
40         }
41         fprintf(fp, "\n# ***************** Please do not remove the above header! ****************\n\n");
42         fprintf(fp, "# Blank lines and everything following a comment \"#\" sign are ignored.\n\n");
43         fprintf(fp, "# This file will be re-created whenever missing, but the name and layout depend\n");
44         fprintf(fp, "# on which devices that are detected at the very moment of program execution.\n\n");
45         if ((pad1_info) && (!is_graphire4)) {
46                 fprintf(fp, "# Some ASCII art showing the \"default\" program record:\n");
47                 fprintf(fp, "#\n");
48                 fprintf(fp, "# Left ExpressKey Pad\n");
49                 fprintf(fp, "# ------------\n");
50                 fprintf(fp, "# |  |   |   |             Wacom Intuos3 defaults are:\n");
51                 fprintf(fp, "# |  | 9 | T |\n");
52                 fprintf(fp, "# |11|---| O |             Button 9  = (left) Shift        = keycode 50\n");
53                 fprintf(fp, "# |  |10 | U |             Button 10 = (left) Alt          = keycode 64\n");
54                 fprintf(fp, "# |------| C |             Button 11 = (left) Control      = keycode 37\n");
55                 fprintf(fp, "# |  12  | H |             Button 12 = Space               = keycode 65\n");
56                 fprintf(fp, "# ------------\n");
57                 fprintf(fp, "#\n");
58                 fprintf(fp, "# Right ExpressKey Pad\n");
59                 fprintf(fp, "# ------------\n");
60                 fprintf(fp, "# |   |   |  |             Wacom Intuos3 defaults are:\n");
61                 fprintf(fp, "# | T |13 |  |\n");
62                 fprintf(fp, "# | O |---|15|             Button 13 = (left) Shift        = keycode 50\n");
63                 fprintf(fp, "# | U |14 |  |             Button 14 = (left) Alt          = keycode 64\n");
64                 fprintf(fp, "# | C |------|             Button 15 = (left) Control      = keycode 37\n");
65                 fprintf(fp, "# | H |  16  |             Button 16 = Space               = keycode 65\n");
66                 fprintf(fp, "# ------------\n");
67                 fprintf(fp, "#\n");
68         }
69         if ((pad1_info) || (is_graphire4)) {
70                 fprintf(fp, "# Use the value 999 as a keycode to enable pen mode toggling. To be able\n");
71                 fprintf(fp, "# to switch mode anywhere each program block must then contain one 999\n");
72                 fprintf(fp, "# definition.\n\n");
73                 fprintf(fp, "# Use the values 991 to 997 for simulating mouse buttons 1 to 7. Only existing\n");
74                 fprintf(fp, "# mouse buttons, defined through the driver of the active core pointer, can be\n");
75                 fprintf(fp, "# simulated.\n\n");
76         }
77         fprintf(fp, "# Values for the stylus 'PressCurve' ie 'sensitivity' can be chosen the easy\n");
78         fprintf(fp, "# way - copying from how the wacomcpl program writes them, or the hard way -\n");
79         fprintf(fp, "# by experimenting... The seven curves picked by wacomcpl are (Soft to Firm):\n");
80         fprintf(fp, "# 1               2               3               4 (default)\n");
81         fprintf(fp, "# \"0 75 25 100\" | \"0 50 50 100\" | \"0 25 75 100\" | \"0 0 100 100\"\n");
82         fprintf(fp, "# 5               6               7\n");
83         fprintf(fp, "# \"25 0 100 75\" | \"50 0 100 50\" | \"75 0 100 25\"\n\n");
84         fprintf(fp, "# OBSERVE: The \"default\" program record must exist _somewhere_ in the file!\n");
85         fprintf(fp, "# Each program record is separated by one set of double percentage signs: %s\n", "%%");
86         fprintf(fp, "# Each program field begins after a case sensitive keyword, eg: ProgramName\n");
87         fprintf(fp, "# Whitespace (tabs and spaces) are ignored in the keycode fields, but spaces\n");
88         fprintf(fp, "# are recorded when in a ProgramName or Stylus1PressCurve field (between the\n");
89         fprintf(fp, "# double quotes).\n\n");
90         if (is_graphire4) {
91                 fprintf(fp, "# Graphire4 user: Sorry about the automatic keycodes written here. They are\n");
92                 fprintf(fp, "# not optimal, to say the least, but picked from a larger set intended for\n");
93                 fprintf(fp, "# an Intuos3 (with its different button order). Perhaps we can write out a\n");
94                 fprintf(fp, "# more correct initial configuration file in a later version... Also, to you\n");
95                 fprintf(fp, "# BlueTooth users, the Scroll Wheel entries will disappear when a finer\n");
96                 fprintf(fp, "# grained configuration file can be written.\n\n");
97         }
98
99         return 0;
100
101 }
102
103 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
104  Function writes out a short configuration file if none exists. It takes
105  the info from a global memory structure whose only purpose is this initial
106  write moment. The file should then be read back immediately to populate a
107  memory structure that other functions rely on for their proper operation.
108  Returns nothing useful. Write errors are checked in the calling function.
109  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
110
111 int write_file_config(int *ip, FILE *fp)
112 {
113
114         struct program *p;
115         struct configstrings *hp;
116 /* Convert to long for x86_64 systems */
117         p = (void *)(long)*ip;
118
119         if (is_graphire4) {
120                 hp = gr4_human_readable;
121         } else {
122                 hp = human_readable;
123         }
124
125         fprintf(fp, "%s                 # <---  ********** BEGIN NEW PROGRAM RECORD **********\n\n", "%%");
126         if (!is_graphire4) {
127                 fprintf(fp, "%s         \"%s\" # Name must be within double quotes \"\"\n\n", hp->h_class_name, p->class_name);
128                 fprintf(fp, "%s \"%s\" # PressCurve must be within double quotes \"\"\n\n", hp->h_stylus1_presscurve, p->stylus1_presscurve);
129                 if (pad1_info) {
130                         fprintf(fp, "%s %d      # Main switch. Use 1 to enable the Touch Strips\n\n", hp->h_handle_touch, p->handle_touch);
131                         fprintf(fp, "%s         %d      # First keycode\n", hp->h_l_touch_up, p->l_touch_up);
132                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_l_touch_up_plus, p->l_touch_up_plus);
133                         fprintf(fp, "%s %d      # First keycode\n", hp->h_l_touch_down, p->l_touch_down);
134                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_l_touch_down_plus, p->l_touch_down_plus);
135                         fprintf(fp, "%s         %d      # First keycode\n", hp->h_r_touch_up, p->r_touch_up);
136                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_r_touch_up_plus, p->r_touch_up_plus);
137                         fprintf(fp, "%s %d      # First keycode\n", hp->h_r_touch_down, p->r_touch_down);
138                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_r_touch_down_plus, p->r_touch_down_plus);
139                         fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_9, p->key_9);
140                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_9_plus, p->key_9_plus);
141                         fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_10, p->key_10);
142                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_10_plus, p->key_10_plus);
143                         fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_11, p->key_11);
144                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_11_plus, p->key_11_plus);
145                         fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_12, p->key_12);
146                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_12_plus, p->key_12_plus);
147                         fprintf(fp, "%s %d      # First keycode\n", hp->h_key_13, p->key_13);
148                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_13_plus, p->key_13_plus);
149                         fprintf(fp, "%s %d      # First keycode\n", hp->h_key_14, p->key_14);
150                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_14_plus, p->key_14_plus);
151                         fprintf(fp, "%s %d      # First keycode\n", hp->h_key_15, p->key_15);
152                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_15_plus, p->key_15_plus);
153                         fprintf(fp, "%s %d      # First keycode\n", hp->h_key_16, p->key_16);
154                         fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_key_16_plus, p->key_16_plus);
155                 }
156         } else {
157                 fprintf(fp, "%s         \"%s\" # Name must be within double quotes \"\"\n\n", hp->h_class_name, p->class_name);
158                 fprintf(fp, "%s \"%s\" # PressCurve must be within double quotes \"\"\n\n", hp->h_stylus1_presscurve, p->stylus1_presscurve);
159                 fprintf(fp, "%s %d      # Main switch. Use 1 to enable the Scroll Wheel\n\n", hp->h_handle_touch, p->handle_touch);
160                 fprintf(fp, "%s         %d      # First keycode\n", hp->h_l_touch_up, p->l_touch_up);
161                 fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_l_touch_up_plus, p->l_touch_up_plus);
162                 fprintf(fp, "%s         %d      # First keycode\n", hp->h_l_touch_down, p->l_touch_down);
163                 fprintf(fp, "%s %d      # Extra keycode\n\n", hp->h_l_touch_down_plus, p->l_touch_down_plus);
164                 fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_9, p->key_9);
165                 fprintf(fp, "%s         %d      # Extra keycode\n\n", hp->h_key_9_plus, p->key_9_plus);
166                 fprintf(fp, "%s         %d      # First keycode\n", hp->h_key_13, p->key_13);
167                 fprintf(fp, "%s         %d      # Extra keycode\n\n", hp->h_key_13_plus, p->key_13_plus);
168         }
169         return 0;
170 }
171
172 /* End Code */
173