aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-08-13 20:18:05 +0200
committerMattias Andrée <maandree@operamail.com>2014-08-13 20:18:05 +0200
commit74a3e551c96367bf81c021a1b52f803e69e1412e (patch)
tree55f85686d6e015102d4ab03227f5f5570585db4b /src
parentm (diff)
downloadmds-74a3e551c96367bf81c021a1b52f803e69e1412e.tar.gz
mds-74a3e551c96367bf81c021a1b52f803e69e1412e.tar.bz2
mds-74a3e551c96367bf81c021a1b52f803e69e1412e.tar.xz
implement keycode mapping query
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r--src/mds-kkbd.c67
1 files changed, 57 insertions, 10 deletions
diff --git a/src/mds-kkbd.c b/src/mds-kkbd.c
index 094a4f9..9444f7d 100644
--- a/src/mds-kkbd.c
+++ b/src/mds-kkbd.c
@@ -606,7 +606,7 @@ int handle_enumerate_keyboards(const char* recv_client_id, const char* recv_mess
sprintf(send_buffer,
"Modify: no\n"
"Modify ID: %s\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"\n",
recv_modify_id, msgid);
@@ -629,14 +629,14 @@ int handle_enumerate_keyboards(const char* recv_client_id, const char* recv_mess
sprintf(send_buffer,
"Modify: yes\n"
"Modify ID: %s\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"\n"
/* NEXT MESSAGE */
"Command: keyboard-enumeration\n"
"To: %s\n"
"In response to: %s\n"
"Length: %lu\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"\n"
KEYBOARD_ID "\n",
recv_modify_id, msgid,
@@ -709,7 +709,7 @@ int handle_keyboard_enumeration(const char* recv_modify_id)
sprintf(send_buffer,
"Modify ID: %s\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"Length: %lu\n",
recv_modify_id, msgid, n);
top = strlen(send_buffer) + 1;
@@ -857,7 +857,7 @@ int handle_get_keyboard_leds(const char* recv_client_id, const char* recv_messag
sprintf(send_buffer,
"To: %s\n"
"In response to: %s\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"Active:%s%s%s%s%s\n"
"Present: " PRESENT_LEDS "\n"
"\n",
@@ -1005,8 +1005,55 @@ static int remap(char* table, size_t n)
*/
static int mapping_query(const char* recv_client_id, const char* recv_message_id)
{
- /* FIXME */
- return 0;
+ size_t top = 64 + 3 * sizeof(size_t), n = 0, off, i;
+ int greatest = (int)mapping_size, r;
+ int32_t msgid;
+
+ for (i = 0; i < mapping_size; i++)
+ if (mapping[i] != (int)i)
+ {
+ greatest = max(greatest, mapping[i]);
+ n++;
+ }
+
+ n *= 3 + (greatest > 0xFFFF ? (3 * sizeof(int)) :
+ greatest > 0x00FF ? 5 : 3);
+
+ if (ensure_send_buffer_size(top + n + 2) < 0)
+ return -1;
+
+ with_mutex (send_mutex,
+ msgid = message_id;
+ message_id = message_id == INT32_MAX ? 0 : (message_id + 1);
+ );
+
+ off = top + 1;
+ for (i = 0; i < mapping_size; i++)
+ if (mapping[i] != (int)i)
+ {
+ sprintf(send_buffer + off, "%i %i\n", i, mapping[i]);
+ off += strlen(send_buffer + off);
+ }
+
+ n = (size_t)(off - (top + 1));
+
+ sprintf(send_buffer,
+ "To: %s\n"
+ "In response to: %s\n"
+ "Message ID: %" PRIi32 "\n"
+ "Length: %lu\n"
+ "\n",
+ recv_client_id, recv_message_id, msgid, n);
+
+ off = top + 1;
+ off -= top = strlen(send_buffer);
+ memmove(send_buffer + off, send_buffer, top * sizeof(char));
+
+ with_mutex (send_mutex,
+ r = full_send(send_buffer + off, top + n);
+ );
+
+ return r;
}
@@ -1254,7 +1301,7 @@ int send_key(int* restrict scancode, int trio)
"Keycode: %i\n"
"Released: %s\n"
"Keyboard: " KEYBOARD_ID "\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"\n",
scancode[0], scancode[1], scancode[2], keycode,
released ? "yes" : "no", msgid);
@@ -1265,7 +1312,7 @@ int send_key(int* restrict scancode, int trio)
"Keycode: %i\n"
"Released: %s\n"
"Keyboard: " KEYBOARD_ID "\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"\n",
scancode[0], keycode,
released ? "yes" : "no", msgid);
@@ -1372,7 +1419,7 @@ int send_errno(int error, const char* recv_client_id, const char* recv_message_i
"Command: error\n"
"To: %s\n"
"In response to: %s\n"
- "Message ID: " PRIi32 "\n"
+ "Message ID: %" PRIi32 "\n"
"Error: %i\n"
"\n",
recv_client_id, recv_message_id, message_id, error);