Fix ioctl issues on DragonFly BSD and FreeBSD

* Include the correct headers on DragonFly BSD and FreeBSD.

* Use UTF-8 characters to draw border on Linux.

* Use ioctl 'KDGETLED' to get the keyboard LED states, which is supported
  on both Linux and BSD.

* Use macros 'LED_NUM' and 'LED_CAP' instead of hard-coded magic numbers.

NOTE:
This patch only allows 'ly' to build fine on DragonFly BSD and FreeBSD
(other *BSD not tested), and more works are needed to make 'ly' working
fine on BSD.
This commit is contained in:
Aaron LI 2018-10-07 16:19:15 +08:00
parent f2f3d7ca3d
commit 2cf3ba8713
2 changed files with 19 additions and 11 deletions

View File

@ -10,15 +10,20 @@
#include <stdlib.h> #include <stdlib.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <linux/kd.h>
#include <linux/vt.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#if defined(__DragonFly__) || defined(__FreeBSD__)
# include <sys/kbio.h>
#else /* assume Linux */
# include <linux/kd.h>
#endif
#if defined(__linux__)
// border chars: ┌ └ ┐ ┘ ─ ─ │ │ // border chars: ┌ └ ┐ ┘ ─ ─ │ │
struct box box_main = {0x250c, 0x2514, 0x2510, 0x2518, 0x2500, 0x2500 ,0x2502, 0x2502}; struct box box_main = {0x250c, 0x2514, 0x2510, 0x2518, 0x2500, 0x2500 ,0x2502, 0x2502};
// alternative border chars: #else /* no UTF-8 */
// struct box box_main = {'+', '+', '+', '+', '-', '-', '|', '|'}; struct box box_main = {'+', '+', '+', '+', '-', '-', '|', '|'};
#endif
u16 width = 0; u16 width = 0;
u16 height = 0; u16 height = 0;
@ -207,7 +212,7 @@ void draw_f_commands()
// numlock and capslock info // numlock and capslock info
void draw_lock_state() void draw_lock_state()
{ {
FILE* console = fopen(config.console_dev, "w"); FILE* console = fopen(config.console_dev, "r");
if (console == NULL) if (console == NULL)
{ {
@ -216,14 +221,13 @@ void draw_lock_state()
} }
int fd = fileno(console); int fd = fileno(console);
char ret; char led;
ioctl(fd, KDGETLED, &led);
ioctl(fd, KDGKBLED, &ret);
fclose(console); fclose(console);
u16 pos_x = width - strlen(lang.numlock); u16 pos_x = width - strlen(lang.numlock);
if (((ret >> 1) & 0x01) == 1) if (led & LED_NUM)
{ {
struct tb_cell* numlock = str_cell(lang.numlock); struct tb_cell* numlock = str_cell(lang.numlock);
tb_blit(pos_x, 0, strlen(lang.numlock), 1, numlock); tb_blit(pos_x, 0, strlen(lang.numlock), 1, numlock);
@ -232,7 +236,7 @@ void draw_lock_state()
pos_x -= strlen(lang.capslock) + 1; pos_x -= strlen(lang.capslock) + 1;
if (((ret >> 2) & 0x01) == 1) if (led & LED_CAP)
{ {
struct tb_cell* capslock = str_cell(lang.capslock); struct tb_cell* capslock = str_cell(lang.capslock);
tb_blit(pos_x, 0, strlen(lang.capslock), 1, capslock); tb_blit(pos_x, 0, strlen(lang.capslock), 1, capslock);

View File

@ -14,7 +14,11 @@
#include <unistd.h> #include <unistd.h>
#include <netdb.h> #include <netdb.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <linux/vt.h> #if defined(__DragonFly__) || defined(__FreeBSD__)
# include <sys/consio.h>
#else /* assume Linux */
# include <linux/vt.h>
#endif
static char* hostname_backup = NULL; static char* hostname_backup = NULL;