Support for the input_server (R5 style) instead of using the (old) keyboard driver

directly, done by Jerome Duval.
When the USE_INPUT_SERVER constant is defined, it will try to get its input from
there. Currently disabled since it's not yet working.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11297 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-02-09 17:53:16 +00:00
parent 29ad57a6c0
commit b885799ce7
+81 -12
View File
@@ -1,6 +1,6 @@
/*
* Copyright 2004, The Haiku Team. All rights reserved.
* Distributed under the terms of the Haiku License.
* Copyright 2004-2005, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Copyright 2002, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
@@ -9,7 +9,9 @@
#include <OS.h>
#include <image.h>
#include <syscalls.h>
#include <Message.h>
#include <AppDefs.h>
#include <TypeConstants.h>
#include <termios.h>
#include <unistd.h>
@@ -18,6 +20,9 @@
#include <stdio.h>
#include <stdlib.h>
//#define USE_INPUT_SERVER
// define this if consoled should use the input_server to
// get to its keyboard input
struct console {
int console_fd;
@@ -30,13 +35,74 @@ struct console {
sem_id wait_sem;
};
struct console theconsole;
struct console gConsole;
static int32
keyboard_reader(void *arg)
{
struct console *con = (struct console *)arg;
#ifdef USE_INPUT_SERVER
area_id appArea;
void *cursorAddr;
sem_id cursorSem = 0; // not initialized?
thread_id isThread;
port_id isAsPort;
port_id isPort;
appArea = create_area("isCursor", &cursorAddr, B_ANY_ADDRESS, B_PAGE_SIZE, B_FULL_LOCK, B_READ_AREA);
int32 arg_c = 1;
char **arg_v = (char **)malloc(sizeof(char *) * (arg_c + 1));
arg_v[0] = strdup("/system/servers/input_server");
arg_v[1] = NULL;
isThread = load_image(arg_c, (const char**)arg_v, (const char **)environ);
free(arg_v[0]);
int32 tmpbuf[2] = {cursorSem, appArea};
int32 code = 0;
send_data(isThread, code, (void *)tmpbuf, sizeof(tmpbuf));
resume_thread(isThread);
setpgid(isThread, 0);
thread_id sender;
code = receive_data(&sender, (void *)tmpbuf, sizeof(tmpbuf));
isAsPort = tmpbuf[0];
isPort = tmpbuf[1];
ssize_t length;
status_t err;
const char *string;
for (;;) {
length = port_buffer_size(isAsPort);
char buffer[length];
err = read_port(isAsPort, &code, buffer, length);
if(err != length) {
if (err > 0)
fprintf(stderr, "consoled: failed to read full packet (read %lu of %lu)\n", err, length);
else
fprintf(stderr, "consoled: read_port error: (0x%lx) %s\n", err, strerror(err));
continue;
}
BMessage event;
if ((err = event.Unflatten(buffer)) < 0) {
fprintf(stderr, "consoled: Unflatten() error: (0x%lx) %s\n", err, strerror(err));
continue;
}
if (event.what != B_KEY_DOWN)
continue;
event.FindData("bytes", B_STRING_TYPE, (const void**)&string, &length);
write(con->tty_master_fd, string, length);
}
#else // USE_INPUT_SERVER
char buffer[1024];
for (;;) {
@@ -46,6 +112,7 @@ keyboard_reader(void *arg)
write(con->tty_master_fd, buffer, length);
}
#endif // USE_INPUT_SERVER
release_sem(con->wait_sem);
return 0;
@@ -88,9 +155,11 @@ start_console(struct console *con)
if (con->console_fd < 0)
return -2;
#ifndef USE_INPUT_SERVER
con->keyboard_fd = open("/dev/keyboard", 0);
if (con->keyboard_fd < 0)
return -3;
#endif
dir = opendir("/dev/pt");
if (dir != NULL) {
@@ -182,7 +251,7 @@ main(void)
{
int err;
err = start_console(&theconsole);
err = start_console(&gConsole);
if (err < 0) {
printf("consoled: error %d starting console\n", err);
return err;
@@ -192,25 +261,25 @@ main(void)
setsid();
// move our stdin and stdout to the console
dup2(theconsole.tty_slave_fd, 0);
dup2(theconsole.tty_slave_fd, 1);
dup2(theconsole.tty_slave_fd, 2);
dup2(gConsole.tty_slave_fd, 0);
dup2(gConsole.tty_slave_fd, 1);
dup2(gConsole.tty_slave_fd, 2);
for (;;) {
pid_t shell_process;
status_t retcode;
status_t returnCode;
const char *argv[3];
argv[0] = "/bin/sh";
argv[1] = "--login";
shell_process = start_process(2, argv, &theconsole);
shell_process = start_process(2, argv, &gConsole);
wait_for_thread(shell_process, &retcode);
wait_for_thread(shell_process, &returnCode);
puts("Restart shell");
}
acquire_sem(theconsole.wait_sem);
acquire_sem(gConsole.wait_sem);
return 0;
}