[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 2/3] vterm: Tastaturbelegung aenderbar machen



+ vterm: Ueber die Datei vterm:/keymap kann die Tastaturbelegung
  veraendert werden

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/vterm/include/keymap.h |   18 +++++++++++++
 src/modules/vterm/keymap.c         |   50 ++++++++++++++++++++++++++++++++++++
 src/modules/vterm/lostio.c         |   10 +++++++
 src/modules/vterm/vterm.c          |    4 +++
 src/modules/vterm/vterm.h          |    1 +
 5 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/src/modules/vterm/include/keymap.h b/src/modules/vterm/include/keymap.h
index 668067e..dcbc0ba 100644
--- a/src/modules/vterm/include/keymap.h
+++ b/src/modules/vterm/include/keymap.h
@@ -37,6 +37,7 @@
 #define _KEYMAP_H_
 #include <stdint.h>
 #include <stddef.h>
+#include <lostio.h>
 
 /**
  * Eintrag in der Keymap
@@ -55,5 +56,22 @@ typedef struct keymap_entry {
  */
 keymap_entry_t* keymap_get(uint8_t keycode);
 
+/**
+ * Legt die vterm:/keymap im Verzeichnisbaum an
+ */
+void keymap_init(void);
+
+/**
+ * LostIO-Handller um die Tastaturbelegung zu lesen
+ */
+size_t keymap_read(lostio_filehandle_t* file, void* buf,
+    size_t blocksize, size_t blockcount);
+
+/**
+ * LostIO-Handler um die Tastaturbelegung zu aendern
+ */
+size_t keymap_write(lostio_filehandle_t* file, size_t blocksize,
+    size_t blockcount, void* data);
+
 #endif // ifndef _KEYMAP_H_
 
diff --git a/src/modules/vterm/keymap.c b/src/modules/vterm/keymap.c
index 4b5846f..c1881bd 100644
--- a/src/modules/vterm/keymap.c
+++ b/src/modules/vterm/keymap.c
@@ -33,6 +33,10 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <io.h>
+#include <string.h>
+
+#include "vterm.h"
 #include "keymap.h"
 
 keymap_entry_t keymap[] = {
@@ -176,3 +180,49 @@ keymap_entry_t* keymap_get(uint8_t keycode)
     return &keymap[keycode];
 }
 
+/**
+ * Legt die vterm:/keymap im Verzeichnisbaum an
+ */
+void keymap_init(void)
+{
+    stdout = NULL;
+    vfstree_create_node("/keymap", LOSTIO_TYPES_KEYMAP, 0, NULL, 0);
+}
+
+/**
+ * LostIO-Handller um die Tastaturbelegung zu lesen
+ */
+size_t keymap_read(lostio_filehandle_t* file, void* buf,
+    size_t blocksize, size_t blockcount)
+{
+    size_t size = blocksize * blockcount;
+
+    if (file->pos + size >= sizeof(keymap)) {
+        size = sizeof(keymap) - file->pos;
+        file->flags |= LOSTIO_FLAG_EOF;
+    }
+
+    memcpy(buf, ((uint8_t*) keymap) + file->pos, size);
+    file->pos += size;
+
+    return size;
+}
+
+/**
+ * LostIO-Handler um die Tastaturbelegung zu aendern
+ */
+size_t keymap_write(lostio_filehandle_t* file, size_t blocksize,
+    size_t blockcount, void* buf)
+{
+    size_t size = blocksize * blockcount;
+
+    if (file->pos + size >= sizeof(keymap)) {
+        size = sizeof(keymap) - file->pos;
+        file->flags |= LOSTIO_FLAG_EOF;
+    }
+
+    memcpy(((uint8_t*) keymap) + file->pos, buf, size);
+    file->pos += size;
+
+    return size;
+}
diff --git a/src/modules/vterm/lostio.c b/src/modules/vterm/lostio.c
index a835d6a..1470fa7 100644
--- a/src/modules/vterm/lostio.c
+++ b/src/modules/vterm/lostio.c
@@ -35,8 +35,11 @@
 #include <stdlib.h>
 #include <syscall.h>
 #include <string.h>
+
 #include "vterm.h"
 #include "lostio.h"
+#include "keymap.h"
+
 /// Handler fuer Lesen aus in
 size_t terminal_read(lostio_filehandle_t* handle, void* buf,
     size_t blocksize, size_t blockcount);
@@ -83,6 +86,13 @@ void init_lostio_interface()
     typehandle->link        = NULL;
     typehandle->unlink      = NULL;
     lostio_register_typehandle(typehandle);
+
+    // Typehandle fuer Keymaps
+    typehandle = calloc(1, sizeof(typehandle_t));
+    typehandle->id          = LOSTIO_TYPES_KEYMAP;
+    typehandle->read        = &keymap_read;
+    typehandle->write       = &keymap_write;
+    lostio_register_typehandle(typehandle);
 }
 
 /**
diff --git a/src/modules/vterm/vterm.c b/src/modules/vterm/vterm.c
index d3fcd7f..d27fbc6 100644
--- a/src/modules/vterm/vterm.c
+++ b/src/modules/vterm/vterm.c
@@ -41,6 +41,7 @@
 #include "vterm.h"
 #include "sleep.h"
 #include "init.h"
+#include "keymap.h"
 
 
 /// Hier kommen die Eingaben fuer all die virtuellen Terminals her
@@ -67,6 +68,9 @@ int main(int argc, char* argv[])
         return -1;
     }
 
+    // Tastaturbelegung konfigurierbar machen
+    keymap_init();
+
     // Auf Anfragen warten
     while(TRUE) {
         wait_for_rpc();
diff --git a/src/modules/vterm/vterm.h b/src/modules/vterm/vterm.h
index d5149da..0871db9 100644
--- a/src/modules/vterm/vterm.h
+++ b/src/modules/vterm/vterm.h
@@ -39,6 +39,7 @@
 
 #define LOSTIO_TYPES_OUT 255
 #define LOSTIO_TYPES_IN 254
+#define LOSTIO_TYPES_KEYMAP 253
 
 #define SCREEN_WIDTH_MAX 80
 #define SCREEN_HEIGHT_MAX 25
-- 
1.6.0.2