Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 335138 Details for
Bug 450156
media-gfx/splashutils-1.5.4.4-r2 unable to switch from silent mode to verbose using F2 with the 2nd keyboard
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
splashutils-1.5.4.4-multi-keyboard.patch
splashutils-1.5.4.4-multi-keyboard.patch (text/plain), 9.92 KB, created by
Asaf Gery
on 2013-01-11 05:05:40 UTC
(
hide
)
Description:
splashutils-1.5.4.4-multi-keyboard.patch
Filename:
MIME Type:
Creator:
Asaf Gery
Created:
2013-01-11 05:05:40 UTC
Size:
9.92 KB
patch
obsolete
>diff -ru a/core/src/common.h b/core/src/common.h >--- a/core/src/common.h 2013-01-11 06:35:35.000000000 +0200 >+++ b/core/src/common.h 2013-01-11 06:34:08.000000000 +0200 >@@ -34,6 +34,10 @@ > #define PATH_PROC FBSPLASH_DIR"/proc" > #endif > >+/* Maximum number of keyboard connected to a machine. >+ * The number is big (8) to be on the safe side */ >+#define MAX_KBDS 8 >+ > /* Useful short-named types */ > typedef u_int8_t u8; > typedef u_int16_t u16; >diff -ru a/core/src/daemon.c b/core/src/daemon.c >--- a/core/src/daemon.c 2013-01-11 06:35:35.000000000 +0200 >+++ b/core/src/daemon.c 2013-01-11 06:34:08.000000000 +0200 >@@ -20,6 +20,7 @@ > #include <sys/ioctl.h> > #include <sys/wait.h> > #include <sys/mman.h> >+#include <sys/select.h> > #include <pthread.h> > #include <errno.h> > #include <dirent.h> >@@ -29,6 +30,8 @@ > #include "common.h" > #include "daemon.h" > >+#define EV_BUF_SIZE 8 >+ > /* Threading structures */ > pthread_mutex_t mtx_tty = PTHREAD_MUTEX_INITIALIZER; > pthread_mutex_t mtx_paint = PTHREAD_MUTEX_INITIALIZER; >@@ -41,7 +44,8 @@ > int ctty = CTTY_VERBOSE; > > /* File descriptors */ >-int fd_evdev = -1; >+int fd_evdevs[MAX_KBDS]; >+int evdev_count = 0; > #ifdef CONFIG_GPM > int fd_gpm = -1; > #endif >@@ -51,7 +55,6 @@ > > /* Misc settings */ > char *notify[2]; >-char *evdev = NULL; > > /* Service list */ > list svcs = { NULL, NULL }; >@@ -400,56 +403,83 @@ > } > } > >+__u16 get_ev_key_pressed(int fd_evdev, int ev_buf_size, >+ struct input_event *ev_buf) { >+ size_t rb; >+ int i; >+ rb = read(fd_evdev, ev_buf, sizeof(struct input_event) * ev_buf_size); >+ if (rb < (int) sizeof(struct input_event)) >+ return 0; >+ >+ for (i = 0; i < (int) (rb / sizeof(struct input_event)); i++) { >+ if (ev_buf[i].type != EV_KEY || ev_buf[i].value != 0) >+ continue; >+ return ev_buf[i].code; >+ } >+} >+ > /* > * Event device monitor thread. > */ > void* thf_switch_evdev(void *unused) > { >- int i, h, oldstate; >- size_t rb; >- struct input_event ev[8]; >+ int i, h, oldstate, nfds, retval, fd_evdev; >+ fd_set rfds; >+ struct input_event ev_buf[EV_BUF_SIZE]; >+ __u16 key_pressed = 0; > > while (1) { >- rb = read(fd_evdev, ev, sizeof(struct input_event)*8); >- if (rb < (int) sizeof(struct input_event)) >- continue; >+ nfds = 0, fd_evdev = -1; >+ FD_ZERO(&rfds); >+ for (i = 0;i < evdev_count;i++) { >+ FD_SET(fd_evdevs[i], &rfds); >+ nfds = max(nfds, fd_evdevs[i]); >+ } > >- for (i = 0; i < (int) (rb / sizeof(struct input_event)); i++) { >- if (ev[i].type != EV_KEY || ev[i].value != 0) >- continue; >+ nfds++; > >- switch (ev[i].code) { >- case KEY_F2: >- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); >- pthread_mutex_lock(&mtx_paint); >- if (ctty == CTTY_SILENT) { >- h = config.tty_v; >- } else { >- h = config.tty_s; >+ retval = select(nfds, &rfds, NULL, NULL, NULL); >+ if (retval == -1) >+ perror("select()"); >+ else if (retval) { >+ for (i = 0;i < evdev_count;i++) { >+ if (FD_ISSET(fd_evdevs[i], &rfds)) { >+ fd_evdev = fd_evdevs[i]; >+ break; > } >- pthread_mutex_unlock(&mtx_paint); >- pthread_setcancelstate(oldstate, NULL); >+ } >+ key_pressed = get_ev_key_pressed(fd_evdev, EV_BUF_SIZE, ev_buf); >+ if (key_pressed == -1) >+ continue; >+ switch (key_pressed) { >+ case KEY_F2: >+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); >+ pthread_mutex_lock(&mtx_paint); >+ h = (ctty == CTTY_SILENT) ? config.tty_v : config.tty_s; >+ pthread_mutex_unlock(&mtx_paint); >+ pthread_setcancelstate(oldstate, NULL); >+ >+ /* Switch to the new tty. This ioctl has to be done on >+ * the silent tty. Sometimes init will mess with the >+ * settings of the verbose console which will prevent >+ * console switching from working properly. >+ * >+ * Don't worry about fd_tty[config.tty_s] >+ * not being protected by a mutex -- >+ * this thread is always killed before any changes >+ * are made to fd_tty[config.tty_s]. >+ */ >+ ioctl(fd_tty[config.tty_s], VT_ACTIVATE, h); >+ break; > >- /* Switch to the new tty. This ioctl has to be done on >- * the silent tty. Sometimes init will mess with the >- * settings of the verbose console which will prevent >- * console switching from working properly. >- * >- * Don't worry about fd_tty[config.tty_s] not being protected by a >- * mutex -- this thread is always killed before any changes >- * are made to fd_tty[config.tty_s]. >- */ >- ioctl(fd_tty[config.tty_s], VT_ACTIVATE, h); >- break; >- >- case KEY_F3: >- config.textbox_visible = !config.textbox_visible; >- invalidate_textbox(theme, config.textbox_visible); >- cmd_paint(NULL); >- break; >+ case KEY_F3: >+ config.textbox_visible = !config.textbox_visible; >+ invalidate_textbox(theme, config.textbox_visible); >+ cmd_paint(NULL); >+ break; > } >- } >- } >+ } /* end of else if (retval) */ >+ } /* end of while(1) */ > > pthread_exit(NULL); > } >@@ -519,7 +549,7 @@ > > /* Do we have to start a monitor thread? */ > if (update & UPD_MON) { >- if (fd_evdev != -1) { >+ if (evdev_count >= 0) { > if (pthread_create(&th_switchmon, NULL, &thf_switch_evdev, NULL)) { > iprint(MSG_ERROR, "Evdev monitor thread creation failed.\n"); > exit(3); >diff -ru a/core/src/daemon.h b/core/src/daemon.h >--- a/core/src/daemon.h 2013-01-11 06:35:35.000000000 +0200 >+++ b/core/src/daemon.h 2013-01-11 06:34:08.000000000 +0200 >@@ -40,13 +40,13 @@ > extern int fd_tty_s, fd_tty1, fd_tty0; > > /* >- * Event device on which the daemon listens for F2 keypresses. >- * The proper device has to be detected by an external program and >+ * Event devices on which the daemon listens for F2 keypresses. >+ * The proper devices have to be detected by an external program and > * then enabled by sending an appropriate command to the splash > * daemon. > */ >-extern int fd_evdev; >-extern char *evdev; >+extern int fd_evdevs[]; >+extern int evdev_count; > > #ifdef CONFIG_GPM > #include <gpm.h> >diff -ru a/core/src/daemon_cmd.c b/core/src/daemon_cmd.c >--- a/core/src/daemon_cmd.c 2013-01-11 06:35:35.000000000 +0200 >+++ b/core/src/daemon_cmd.c 2013-01-11 06:34:08.000000000 +0200 >@@ -239,18 +239,35 @@ > */ > int cmd_set_event_dev(void **args) > { >- if (evdev) >- free(evdev); >- >- evdev = strdup(args[0]); >+ char *evdevs; >+ char *evdev; >+ int i, j, fd_evdev = -1; > > pthread_cancel(th_switchmon); >+ for (i = 0;i < evdev_count;i++) { >+ close(fd_evdevs[i]); >+ } >+ evdevs = strdup(args[1]); >+ evdev_count = *(int*)args[0]; >+ j = 0; >+ for (i = 0;i < evdev_count;i++, evdevs = NULL) { >+ evdev = strtok(evdevs, ","); >+ fd_evdev = open(evdev, O_RDONLY); >+ if (fd_evdev != -1) { >+ fd_evdevs[j] = fd_evdev; >+ j++; >+ } else { >+ perror("failed to open event device"); >+ } >+ } >+ if (j == 0) { /* all input devices failed to open */ >+ evdev_count = -1; >+ free(evdevs); >+ return -1; >+ } > >- if (fd_evdev != -1) >- close(fd_evdev); >- >- fd_evdev = open(evdev, O_RDONLY); >- >+ evdev_count = j; >+ free(evdevs); > switchmon_start(UPD_MON, config.tty_s); > > return 0; >@@ -524,8 +541,8 @@ > > { .cmd = "set event dev", > .handler = cmd_set_event_dev, >- .args = 1, >- .specs = "s" >+ .args = 2, >+ .specs = "ds" > }, > > { .cmd = "set message", >@@ -628,7 +645,7 @@ > continue; > > for (j = 0; j < known_cmds[i].args; j++) { >- for (; buf[k] == ' '; buf[k] = 0, k++); >+ for (; buf[k] == ' '; buf[k] = '\0', k++); > if (!buf[k]) { > args[j] = NULL; > continue; >diff -ru a/core/src/libfbsplash.c b/core/src/libfbsplash.c >--- a/core/src/libfbsplash.c 2013-01-11 06:35:35.000000000 +0200 >+++ b/core/src/libfbsplash.c 2013-01-11 06:34:08.000000000 +0200 >@@ -588,6 +588,8 @@ > return -1; > } > >+#define EVDV_BUF_LEN 128 >+ > /** > * Try to set the event device for the splash daemon. > * >@@ -595,10 +597,14 @@ > */ > int fbsplash_set_evdev(void) > { >- char buf[128]; >+ char buf[EVDV_BUF_LEN]; >+ char evdev_devs[EVDV_BUF_LEN * MAX_KBDS]; > FILE *fp; > int i, j; >- >+ int kbd_count; >+ int max_chars, chars_left, dev_path_len; >+ char dev_path[] = PATH_DEV "/input/"; >+ dev_path_len = strlen(dev_path); > char *evdev_cmds[] = { > "/bin/grep -Hsi keyboard " PATH_SYS "/class/input/input*/name | /bin/sed -e 's#.*input\\([0-9]*\\)/name.*#event\\1#'", > "/bin/grep -Hsi keyboard " PATH_SYS "/class/input/event*/device/driver/description | /bin/grep -o 'event[0-9]\\+'", >@@ -608,22 +614,43 @@ > > /* Try to activate the event device interface so that F2 can > * be used to switch from verbose to silent. */ >- buf[0] = 0; >- for (i = 0; i < sizeof(evdev_cmds)/sizeof(char*); i++) { >+ buf[0] = '\0'; >+ kbd_count = 0; >+ max_chars = sizeof(evdev_devs) / sizeof(char*); >+ chars_left = max_chars - 1; >+ evdev_devs[0] = '\0'; >+ for (i = 0; i < sizeof(evdev_cmds) / sizeof(char*); i++) { > fp = popen(evdev_cmds[i], "r"); > if (fp) { >- fgets(buf, 128, fp); >- if ((j = strlen(buf)) > 0) { >- if (buf[j-1] == '\n') >- buf[j-1] = 0; >- break; >+ while (fgets(buf, 128, fp) && kbd_count < MAX_KBDS) { >+ if ((j = strlen(buf)) > 0) { >+ if (buf[j-1] == '\n') >+ buf[j-1] = ','; >+ if (chars_left < (j + dev_path_len)) { >+ break; >+ } >+ kbd_count++; >+ strncat(evdev_devs, dev_path, chars_left); >+ chars_left -= dev_path_len; >+ strncat(evdev_devs, buf, chars_left); >+ chars_left -= j; >+ } >+ } >+ /* replace the last ',' with '\n' */ >+ if (chars_left > 0 && evdev_devs[0] != '\0') { >+ j = strlen(evdev_devs); >+ if (j > 2) { >+ evdev_devs[j - 1] = '\n'; >+ } > } > pclose(fp); > } >+ if (kbd_count > 0) >+ break; > } > >- if (buf[0] != 0) { >- fbsplash_send("set event dev " PATH_DEV "/input/%s\n", buf); >+ if (evdev_devs[0] != '\0') { >+ fbsplash_send("set event dev %d %s", kbd_count, evdev_devs); > return 0; > } else { > return -1; >@@ -661,6 +688,8 @@ > return 0; > } > >+#define MAX_CMD 2048 >+ > /** > * Send stuff to the splash daemon using the splash FIFO. > * >@@ -668,7 +697,7 @@ > */ > int fbsplash_send(const char *fmt, ...) > { >- char cmd[256]; >+ char cmd[MAX_CMD]; > va_list ap; > > if (!fp_fifo) { >@@ -690,7 +719,7 @@ > } > > va_start(ap, fmt); >- vsnprintf(cmd, 256, fmt, ap); >+ vsnprintf(cmd, MAX_CMD, fmt, ap); > va_end(ap); > > fprintf(fp_fifo, cmd);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 450156
: 335138 |
335140