diff --git a/client/client.pro b/client/client.pro index 5bfd2af..2d9d1b0 100644 --- a/client/client.pro +++ b/client/client.pro @@ -24,6 +24,7 @@ DESTDIR = $$OUT_PWD/bin DOS_HEADERS = DOS_SOURCES = \ + src/dos/keyboard.c \ src/dos/mouse.c \ src/dos/vesa.c @@ -44,6 +45,7 @@ INCLUDEPATH += \ HEADERS = \ $$LINUX_HEADERS \ src/gui/button.h \ + src/gui/keyboard.h \ src/gui/task.h \ src/thirdparty/stb_ds.h \ src/thirdparty/stb_leakcheck.h \ diff --git a/client/src/dos/keyboard.c b/client/src/dos/keyboard.c new file mode 100644 index 0000000..b19bbd0 --- /dev/null +++ b/client/src/dos/keyboard.c @@ -0,0 +1,99 @@ +/* + * Kangaroo Punch Multi Player Game Server Mark II + * Copyright (C) 2020-2021 Scott Duensing + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +#include "keyboard.h" + + +#define KEYBOARD_READ_EXTENDED 0x10 +#define KEYBOARD_CHECK_EXTENDED 0x11 +#define KEYBOARD_META_EXTENDED 0x12 + + +enum MetaBitsE { + META_SHIFT_RIGHT = 0, + META_SHIFT_LEFT, + META_CONTROL, + META_ALT, + META_SCROLL_LOCKED, + META_NUM_LOCKED, + META_CAPS_LOCKED, + META_INSERT_LOCKED, + META_CONTROL_LEFT, + META_ALT_LEFT, + META_CONTROL_RIGHT, + META_ALT_RIGHT, + META_SCROLL_LOCK, + META_NUM_LOCK, + META_CAPS_LOCK, + META_SYSREQ +}; + + +static int16_t _key = 0; +static int16_t _meta = 0; + + +uint8_t keyAlt(void) { + return 0 != (_meta & (1 << META_ALT)) + (_meta & (1 << META_ALT_LEFT)) + (_meta & (1 << META_ALT_RIGHT)); +} + + +uint8_t keyASCII(void) { + return (uint8_t)(_key & 0x00FF); +} + + +uint8_t keyControl(void) { + return 0 != (_meta & (1 << META_CONTROL)) + (_meta & (1 << META_CONTROL_LEFT)) + (_meta & (1 << META_CONTROL_RIGHT)); +} + + +uint8_t keyHit(void) { + int16_t result = bioskey(KEYBOARD_CHECK_EXTENDED); + int16_t meta = bioskey(KEYBOARD_META_EXTENDED); + + if (result > 0) { + _key = bioskey(KEYBOARD_READ_EXTENDED);; + _meta = meta; + return 1; + } + + return 0; +} + + +uint8_t keyScanCode(void) { + return (uint8_t)((_key & 0xFF00) >> 8); +} + + +uint8_t keyShift(void) { + return 0 != (_meta & (1 << META_SHIFT_LEFT)) + (_meta & (1 << META_SHIFT_RIGHT)); +} + + +void keyShutdown(void) { + // Nada for DOS. +} + + +void keyStartup(void) { + // Nada for DOS. +} diff --git a/client/src/dos/vesa.c b/client/src/dos/vesa.c index 9b0c85d..fa0739b 100644 --- a/client/src/dos/vesa.c +++ b/client/src/dos/vesa.c @@ -143,16 +143,16 @@ void vbeSetDisplayStart(uint32_t pixel, uint32_t scanline); VBESurfaceT *vbeSetMode(uint16_t vbeModeNumber); uint16_t vbeSetScanlineLength(uint16_t pixelLength); -void (*vbePutPixel)(uint16_t x, uint16_t y, PixelT pixel); +void (*vbePutPixel)(uint16_t x, uint16_t y, ColorT color); static void (*pmVBESetDisplayStart)(void); static void vbeCreatePalette(void); static uint8_t vbeIsDesiredMode(void); -static void vbePutPixel8(uint16_t x, uint16_t y, PixelT pixel); -static void vbePutPixel16(uint16_t x, uint16_t y, PixelT pixel); -static void vbePutPixel32(uint16_t x, uint16_t y, PixelT pixel); +static void vbePutPixel8(uint16_t x, uint16_t y, ColorT color); +static void vbePutPixel16(uint16_t x, uint16_t y, ColorT color); +static void vbePutPixel32(uint16_t x, uint16_t y, ColorT color); static VBESurfaceT _vbeSurface; @@ -392,7 +392,7 @@ static uint8_t vbeIsDesiredMode(void) { } -PixelT vbeMakePixel(uint8_t red, uint8_t green, uint8_t blue) { +ColorT vbeMakeColor(uint8_t red, uint8_t green, uint8_t blue) { return (((red >> _vbeSurface.rShift) << _vbeSurface.rPos) & _vbeSurface.rMask) | (((green >> _vbeSurface.gShift) << _vbeSurface.gPos) & _vbeSurface.gMask) | @@ -430,21 +430,21 @@ void vbePresent(void) { } -static void vbePutPixel8(uint16_t x, uint16_t y, PixelT pixel) { - //_farpokeb(_vbeSurface.lfbSelector, _yTable[y] + x, (uint8_t)pixel); - _activeSurface->buffer.bits8[y * _activeSurface->width + x] = (uint8_t)pixel; +static void vbePutPixel8(uint16_t x, uint16_t y, ColorT color) { + //_farpokeb(_vbeSurface.lfbSelector, _yTable[y] + x, (uint8_t)color); + _activeSurface->buffer.bits8[y * _activeSurface->width + x] = (uint8_t)color; } -static void vbePutPixel16(uint16_t x, uint16_t y, PixelT pixel) { - //_farpokew(_vbeSurface.lfbSelector, _yTable[y] + (x << 1), (uint16_t)pixel); - _activeSurface->buffer.bits16[y * _activeSurface->width + x] = (uint16_t)pixel; +static void vbePutPixel16(uint16_t x, uint16_t y, ColorT color) { + //_farpokew(_vbeSurface.lfbSelector, _yTable[y] + (x << 1), (uint16_t)color); + _activeSurface->buffer.bits16[y * _activeSurface->width + x] = (uint16_t)color; } -static void vbePutPixel32(uint16_t x, uint16_t y, PixelT pixel) { - //_farpokel(_vbeSurface.lfbSelector, _yTable[y] + (x << 2), pixel); - _activeSurface->buffer.bits32[y * _activeSurface->width + x] = pixel; +static void vbePutPixel32(uint16_t x, uint16_t y, ColorT color) { + //_farpokel(_vbeSurface.lfbSelector, _yTable[y] + (x << 2), color); + _activeSurface->buffer.bits32[y * _activeSurface->width + x] = color; } @@ -759,7 +759,7 @@ void vbeSurfaceBlit(SurfaceT *source, uint16_t x, uint16_t y) { } -void vbeSurfaceClear(PixelT color) { +void vbeSurfaceClear(ColorT color) { uint16_t x; uint16_t y; diff --git a/client/src/gui/button.c b/client/src/gui/button.c index 676ea37..1afcfb5 100644 --- a/client/src/gui/button.c +++ b/client/src/gui/button.c @@ -102,8 +102,8 @@ ButtonT *buttonNew(uint16_t x, uint16_t y, char *title, widgetCallback callback) static void buttonPaint(WidgetT *widget) { ButtonT *b = (ButtonT *)widget; int16_t i; - PixelT highlight = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_BUTTON_SHADOW] : _guiColor[COLOR_BUTTON_HIGHLIGHT]; - PixelT shadow = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_BUTTON_HIGHLIGHT] : _guiColor[COLOR_BUTTON_SHADOW] ; + ColorT highlight = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_BUTTON_SHADOW] : _guiColor[COLOR_BUTTON_HIGHLIGHT]; + ColorT shadow = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_BUTTON_HIGHLIGHT] : _guiColor[COLOR_BUTTON_SHADOW] ; if (GUI_GET_FLAG(widget, WIDGET_FLAG_DIRTY)) { vbeSurfaceSet(b->base.surface); diff --git a/client/src/gui/font.c b/client/src/gui/font.c index 6a6db37..0a4dd24 100644 --- a/client/src/gui/font.c +++ b/client/src/gui/font.c @@ -64,7 +64,7 @@ FontT *fontLoad(char *filename) { } -void fontRender(FontT *font, char *string, PixelT foreground, PixelT background, uint16_t x, uint16_t y) { +void fontRender(FontT *font, char *string, ColorT foreground, ColorT background, uint16_t x, uint16_t y) { uint8_t cx; uint8_t cy; uint16_t offset; diff --git a/client/src/gui/font.h b/client/src/gui/font.h index a652a1d..1bf40a2 100644 --- a/client/src/gui/font.h +++ b/client/src/gui/font.h @@ -39,7 +39,7 @@ typedef struct FontS { uint16_t fontHeightGet(FontT *font); FontT *fontLoad(char *filename); -void fontRender(FontT *font, char *string, PixelT foreground, PixelT background, uint16_t x, uint16_t y); +void fontRender(FontT *font, char *string, ColorT foreground, ColorT background, uint16_t x, uint16_t y); void fontUnload(FontT **font); uint16_t fontWidthGet(FontT *font); diff --git a/client/src/gui/gui.c b/client/src/gui/gui.c index c2786d5..8ee57fd 100644 --- a/client/src/gui/gui.c +++ b/client/src/gui/gui.c @@ -28,7 +28,7 @@ int16_t _guiMetric[METRIC_COUNT]; -PixelT _guiColor[COLOR_COUNT]; +ColorT _guiColor[COLOR_COUNT]; FontT *_guiFont = NULL; WidgetT *_guiDragWidget = NULL; uint16_t _guiDragOffsetX = 0; @@ -134,7 +134,7 @@ void guiDelete(WidgetT **widget) { } -void guiDrawHighlightFrame(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, PixelT upperLeft, PixelT lowerRight) { +void guiDrawHighlightFrame(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, ColorT upperLeft, ColorT lowerRight) { guiDrawLine(x1, y1, x2, y1, upperLeft); guiDrawLine(x1, y1, x1, y2, upperLeft); guiDrawLine(x1, y2, x2, y2, lowerRight); @@ -142,7 +142,7 @@ void guiDrawHighlightFrame(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, P } -void guiDrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, PixelT color) { +void guiDrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, ColorT color) { int16_t x; int16_t y; int16_t dx; @@ -202,7 +202,7 @@ void guiDrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, PixelT color) { } -void guiDrawFilledRectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, PixelT pixel) { +void guiDrawFilledRectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, ColorT pixel) { uint16_t x; uint16_t y; @@ -351,18 +351,18 @@ DesktopT *guiStartup(void) { _guiMetric[METRIC_WINDOW_TITLE_HEIGHT] = 17; // Does not include highlight or shadow lines. _guiMetric[METRIC_WINDOW_TITLE_GRAB_HEIGHT] = _guiMetric[METRIC_WINDOW_BORDER_WIDTH] + _guiMetric[METRIC_WINDOW_TITLE_HEIGHT] + 4; // Border, highlights, titlebar. - _guiColor[COLOR_BUTTON_BACKGROUND] = vbeMakePixel(168, 168, 168); - _guiColor[COLOR_BUTTON_HIGHLIGHT] = vbeMakePixel(248, 252, 248); - _guiColor[COLOR_BUTTON_SHADOW] = vbeMakePixel( 80, 84, 80); - _guiColor[COLOR_BUTTON_TEXT] = vbeMakePixel( 0, 0, 0); - _guiColor[COLOR_DESKTOP] = vbeMakePixel( 51, 153, 255); - _guiColor[COLOR_WINDOW_BACKGROUND] = vbeMakePixel(168, 168, 168); - _guiColor[COLOR_WINDOW_HIGHLIGHT] = vbeMakePixel(248, 252, 248); - _guiColor[COLOR_WINDOW_SHADOW] = vbeMakePixel( 80, 84, 80); - _guiColor[COLOR_WINDOW_TITLE_ACTIVE] = vbeMakePixel( 80, 84, 80); - _guiColor[COLOR_WINDOW_TITLE_INACTIVE] = vbeMakePixel(168, 168, 168); - _guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] = vbeMakePixel(248, 252, 248); - _guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE] = vbeMakePixel( 0, 0, 0); + _guiColor[COLOR_BUTTON_BACKGROUND] = vbeMakeColor(168, 168, 168); + _guiColor[COLOR_BUTTON_HIGHLIGHT] = vbeMakeColor(248, 252, 248); + _guiColor[COLOR_BUTTON_SHADOW] = vbeMakeColor( 80, 84, 80); + _guiColor[COLOR_BUTTON_TEXT] = vbeMakeColor( 0, 0, 0); + _guiColor[COLOR_DESKTOP] = vbeMakeColor( 51, 153, 255); + _guiColor[COLOR_WINDOW_BACKGROUND] = vbeMakeColor(168, 168, 168); + _guiColor[COLOR_WINDOW_HIGHLIGHT] = vbeMakeColor(248, 252, 248); + _guiColor[COLOR_WINDOW_SHADOW] = vbeMakeColor( 80, 84, 80); + _guiColor[COLOR_WINDOW_TITLE_ACTIVE] = vbeMakeColor( 80, 84, 80); + _guiColor[COLOR_WINDOW_TITLE_INACTIVE] = vbeMakeColor(168, 168, 168); + _guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] = vbeMakeColor(248, 252, 248); + _guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE] = vbeMakeColor( 0, 0, 0); _guiFont = fontLoad("vga8x14.dat"); diff --git a/client/src/gui/gui.h b/client/src/gui/gui.h index f4519fd..c77ca10 100644 --- a/client/src/gui/gui.h +++ b/client/src/gui/gui.h @@ -90,7 +90,7 @@ typedef struct WindowS WindowT; extern int16_t _guiMetric[METRIC_COUNT]; -extern PixelT _guiColor[COLOR_COUNT]; +extern ColorT _guiColor[COLOR_COUNT]; extern FontT *_guiFont; extern WidgetT *_guiDragWidget; extern uint16_t _guiDragOffsetX; @@ -101,9 +101,9 @@ extern WindowT *_guiActiveWindow; void guiAttach(WidgetT *parent, WidgetT *child); void guiComposite(void); void guiDelete(WidgetT **widget); -void guiDrawHighlightFrame(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, PixelT upperLeft, PixelT lowerRight); -void guiDrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, PixelT pixel); -void guiDrawFilledRectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, PixelT pixel); +void guiDrawHighlightFrame(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, ColorT upperLeft, ColorT lowerRight); +void guiDrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, ColorT pixel); +void guiDrawFilledRectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, ColorT pixel); void guiMousePositionOnWidgetGet(WidgetT *widget, MouseT *mouse, uint16_t *x, uint16_t *y); void guiPaint(WidgetT *widget); void guiProcessMouse(MouseT *mouse); diff --git a/client/src/gui/image.c b/client/src/gui/image.c index 7c92ac1..0aaaedd 100644 --- a/client/src/gui/image.c +++ b/client/src/gui/image.c @@ -36,14 +36,14 @@ ImageT *imageAllocate(uint16_t w, uint16_t h) { image->height = h; // Create space for converted pixel data - columns - image->pixels = (PixelT **)malloc(sizeof(PixelT *) * image->width); + image->pixels = (ColorT **)malloc(sizeof(ColorT *) * image->width); if (!image->pixels) { free(image); return NULL; } // Create space for converted pixel data - rows for (x=0; xwidth; x++) { - image->pixels[x] = (PixelT *)malloc(sizeof(PixelT) * image->height); + image->pixels[x] = (ColorT *)malloc(sizeof(ColorT) * image->height); if (!image->pixels[x]) { for (y=0; ypixels[y]); @@ -57,7 +57,7 @@ ImageT *imageAllocate(uint16_t w, uint16_t h) { } -ImageT *imageCreate(uint16_t w, uint16_t h, PixelT color) { +ImageT *imageCreate(uint16_t w, uint16_t h, ColorT color) { uint16_t x; uint16_t y; ImageT *image = imageAllocate(w, h); @@ -97,7 +97,7 @@ ImageT *imageLoad(char *filename) { b = 0; for (y=0; yheight; y++) { for (x=0; xwidth; x++) { - image->pixels[x][y] = vbeMakePixel(raw[b], raw[b + 1], raw[b + 2]); + image->pixels[x][y] = vbeMakeColor(raw[b], raw[b + 1], raw[b + 2]); b += 3; } } @@ -108,7 +108,7 @@ ImageT *imageLoad(char *filename) { } -PixelT imagePixelGet(ImageT *image, uint16_t x, uint16_t y) { +ColorT imagePixelGet(ImageT *image, uint16_t x, uint16_t y) { return image->pixels[x][y]; } @@ -125,7 +125,7 @@ void imageRender(ImageT *image, uint16_t x, uint16_t y) { } -void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, PixelT alpha) { +void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, ColorT alpha) { uint16_t x1; uint16_t y1; uint16_t x2 = image->width; diff --git a/client/src/gui/image.h b/client/src/gui/image.h index 1f0e7cc..9f02c25 100644 --- a/client/src/gui/image.h +++ b/client/src/gui/image.h @@ -31,16 +31,16 @@ typedef struct ImageS { uint16_t width; uint16_t height; - PixelT **pixels; + ColorT **pixels; } ImageT; ImageT *imageAllocate(uint16_t w, uint16_t h); -ImageT *imageCreate(uint16_t w, uint16_t h, PixelT color); +ImageT *imageCreate(uint16_t w, uint16_t h, ColorT color); ImageT *imageLoad(char *filename); -PixelT imagePixelGet(ImageT *image, uint16_t x, uint16_t y); +ColorT imagePixelGet(ImageT *image, uint16_t x, uint16_t y); void imageRender(ImageT *image, uint16_t x, uint16_t y); -void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, PixelT alpha); +void imageRenderWithAlpha(ImageT *image, uint16_t x, uint16_t y, ColorT alpha); void imageUnload(ImageT **image); diff --git a/client/src/gui/keyboard.h b/client/src/gui/keyboard.h new file mode 100644 index 0000000..6884781 --- /dev/null +++ b/client/src/gui/keyboard.h @@ -0,0 +1,38 @@ +/* + * Kangaroo Punch Multi Player Game Server Mark II + * Copyright (C) 2020-2021 Scott Duensing + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +#ifndef KEYBOARD_H +#define KEYBOARD_H + + +#include "os.h" + + +uint8_t keyAlt(void); +uint8_t keyASCII(void); +uint8_t keyControl(void); +uint8_t keyHit(void); +uint8_t keyScanCode(void); +uint8_t keyShift(void); +void keyShutdown(void); +void keyStartup(void); + + +#endif // KEYBOARD_H diff --git a/client/src/gui/os.h b/client/src/gui/os.h index 821e28b..76432b0 100644 --- a/client/src/gui/os.h +++ b/client/src/gui/os.h @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include diff --git a/client/src/gui/vesa.h b/client/src/gui/vesa.h index 27ba8a5..a7f7576 100644 --- a/client/src/gui/vesa.h +++ b/client/src/gui/vesa.h @@ -25,7 +25,7 @@ #include "os.h" -typedef uint32_t PixelT; +typedef uint32_t ColorT; typedef struct SurfaceS { @@ -45,12 +45,12 @@ uint8_t vbeStartup(uint16_t xRes, uint16_t yRes, uint8_t bpp); uint8_t vbeDisplayDepthGet(void); uint16_t vbeDisplayHeightGet(void); uint16_t vbeDisplayWidthGet(void); -PixelT vbeMakePixel(uint8_t red, uint8_t green, uint8_t blue); +ColorT vbeMakeColor(uint8_t red, uint8_t green, uint8_t blue); void vbePresent(void); int16_t vbeShowInfo(void); int16_t vbeShutdown(void); void vbeSurfaceBlit(SurfaceT *source, uint16_t x, uint16_t y); -void vbeSurfaceClear(PixelT color); +void vbeSurfaceClear(ColorT color); SurfaceT *vbeSurfaceCreate(uint16_t width, uint16_t height); void vbeSurfaceDestroy(SurfaceT **surface); uint16_t vbeSurfaceHeightGet(void); @@ -58,7 +58,7 @@ uint16_t vbeSurfaceWidthGet(void); void vbeSurfaceSet(SurfaceT *surface); void vbeWaitVBlank(void); -extern void (*vbePutPixel)(uint16_t x, uint16_t y, PixelT pixel); +extern void (*vbePutPixel)(uint16_t x, uint16_t y, ColorT color); #endif // VESA20_H diff --git a/client/src/gui/window.c b/client/src/gui/window.c index ca4bbac..aca44c3 100644 --- a/client/src/gui/window.c +++ b/client/src/gui/window.c @@ -148,8 +148,8 @@ static void windowPaint(WidgetT *widget) { WindowT *w = (WindowT *)widget; uint16_t x2 = w->base.w - 1; uint16_t y2 = w->base.h - 1; - PixelT background = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_INACTIVE]; - PixelT text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE]; + ColorT background = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_INACTIVE]; + ColorT text = GUI_GET_FLAG(widget, WIDGET_FLAG_ACTIVE) ? _guiColor[COLOR_WINDOW_TITLE_TEXT_ACTIVE] : _guiColor[COLOR_WINDOW_TITLE_TEXT_INACTIVE]; if (GUI_GET_FLAG(widget, WIDGET_FLAG_DIRTY)) { vbeSurfaceSet(w->base.surface); diff --git a/client/src/linux/linux.c b/client/src/linux/linux.c index 4c56fec..9be7285 100644 --- a/client/src/linux/linux.c +++ b/client/src/linux/linux.c @@ -35,12 +35,74 @@ static uint16_t _width = 0; static uint16_t _height = 0; static MouseT _mouse; static uint8_t _windowScale = 1; +static uint8_t _alt = 0; +static uint8_t _control = 0; +static uint8_t _shift = 0; +static uint8_t _ASCII = 0; +static uint8_t _scanCode = 0; +static uint8_t _ASCIIKeep = 0; +static uint8_t _scanCodeKeep = 0; +static uint8_t _keyPressed = 0; +static uint8_t _debounce = 0; -void (*vbePutPixel)(uint16_t x, uint16_t y, PixelT pixel); +void (*vbePutPixel)(uint16_t x, uint16_t y, ColorT color); -static void vbePutPixel32(uint16_t x, uint16_t y, PixelT pixel); +static void processEvent(void); +static void vbePutPixel32(uint16_t x, uint16_t y, ColorT color); + + +uint8_t keyAlt(void) { + return _alt; +} + + +uint8_t keyASCII(void) { + return _ASCIIKeep; +} + + +uint8_t keyControl(void) { + return _control; +} + + +uint8_t keyHit(void) { + uint8_t result = 0; + + processEvent(); + + result = _keyPressed; + if (result) { + if (_scanCode == 41) _ASCII = 27; // Fix ESC mapping. + _ASCIIKeep = _ASCII; + _scanCodeKeep = _scanCode; + _keyPressed = 0; + } + + return result; +} + + +uint8_t keyScanCode(void) { + return _scanCode; +} + + +uint8_t keyShift(void) { + return _shift; +} + + +void keyShutdown(void) { + SDL_StopTextInput(); +} + + +void keyStartup(void) { + SDL_StartTextInput(); +} void mouseShutdown(void) { @@ -67,30 +129,64 @@ int16_t mouseStartup(void) { MouseT *mouseRead(void) { - int mouseX = 0; - int mouseY = 0; - int buttons = 0; - - SDL_Delay(1); - SDL_PumpEvents(); - - buttons = SDL_GetMouseState((int *)&mouseX, (int *)&mouseY); - _mouse.buttonLeftWasDown = _mouse.buttonLeft; _mouse.buttonRightWasDown = _mouse.buttonRight; _mouse.buttonMiddleWasDown = _mouse.buttonMiddle; - _mouse.buttonLeft = ((buttons & SDL_BUTTON_LMASK) != 0); - _mouse.buttonRight = ((buttons & SDL_BUTTON_RMASK) != 0); - _mouse.buttonMiddle = ((buttons & SDL_BUTTON_MMASK) != 0); - - _mouse.x = mouseX / _windowScale; - _mouse.y = mouseY / _windowScale; + processEvent(); return &_mouse; } +static void processEvent(void) { + SDL_Event e; + + while (SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_MOUSEMOTION: + _mouse.x = e.motion.x; + _mouse.y = e.motion.y; + break; + + case SDL_MOUSEBUTTONUP: + if (e.button.button == SDL_BUTTON_LEFT) _mouse.buttonLeft = 0; + if (e.button.button == SDL_BUTTON_RIGHT) _mouse.buttonRight = 0; + if (e.button.button == SDL_BUTTON_MIDDLE) _mouse.buttonMiddle = 0; + break; + + case SDL_MOUSEBUTTONDOWN: + if (e.button.button == SDL_BUTTON_LEFT) _mouse.buttonLeft = 1; + if (e.button.button == SDL_BUTTON_RIGHT) _mouse.buttonRight = 1; + if (e.button.button == SDL_BUTTON_MIDDLE) _mouse.buttonMiddle = 1; + break; + + case SDL_TEXTINPUT: + _ASCII = e.text.text[0]; //***TODO*** This is horrifically wrong. + break; + + case SDL_KEYUP: + _scanCode = 0; + _ASCII = 0; + _keyPressed = 0; + _debounce = 0; + break; + + case SDL_KEYDOWN: + if (_debounce == 0) { + _scanCode = e.key.keysym.scancode; + _shift = ((SDL_GetModState() & KMOD_SHIFT) != 0); + _alt = ((SDL_GetModState() & KMOD_ALT) != 0); + _control = ((SDL_GetModState() & KMOD_CTRL) != 0); + _keyPressed = 1; + _debounce = 1; + } + break; + } + } +} + + uint8_t vbeDisplayDepthGet(void) { return 32; } @@ -106,7 +202,7 @@ uint16_t vbeDisplayWidthGet(void) { } -PixelT vbeMakePixel(uint8_t red, uint8_t green, uint8_t blue) { +ColorT vbeMakeColor(uint8_t red, uint8_t green, uint8_t blue) { return (red << 24) | (green << 16) | @@ -124,10 +220,10 @@ void vbePresent(void) { } -static void vbePutPixel32(uint16_t x, uint16_t y, PixelT pixel) { - uint8_t red = (pixel & 0xff000000) >> 24; - uint8_t green = (pixel & 0x00ff0000) >> 16; - uint8_t blue = (pixel & 0x0000ff00) >> 8; +static void vbePutPixel32(uint16_t x, uint16_t y, ColorT color) { + uint8_t red = (color & 0xff000000) >> 24; + uint8_t green = (color & 0x00ff0000) >> 16; + uint8_t blue = (color & 0x0000ff00) >> 8; SDL_SetRenderDrawColor(_renderer, red, green, blue, 0xff); SDL_RenderDrawPoint(_renderer, x, y); @@ -196,7 +292,7 @@ void vbeSurfaceBlit(SurfaceT *source, uint16_t x, uint16_t y) { } -void vbeSurfaceClear(PixelT color) { +void vbeSurfaceClear(ColorT color) { uint8_t red = (color & 0xff000000) >> 24; uint8_t green = (color & 0x00ff0000) >> 16; uint8_t blue = (color & 0x0000ff00) >> 8; diff --git a/client/src/main.c b/client/src/main.c index d6b999f..171570f 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -21,6 +21,7 @@ #include "os.h" #include "vesa.h" #include "mouse.h" +#include "keyboard.h" #include "task.h" #include "image.h" #include "font.h" @@ -39,12 +40,13 @@ void buttonClick(WidgetT *widget) { void test(void *data) { MouseT *mouse = NULL; ImageT *pointer = NULL; - PixelT alpha; + ColorT alpha; DesktopT *desktop = (DesktopT *)guiRootGet(); WindowT *w1 = NULL; WindowT *w2 = NULL; WindowT *w3 = NULL; ButtonT *b1 = NULL; + int8_t key = 0; (void)data; @@ -63,12 +65,18 @@ void test(void *data) { do { mouse = mouseRead(); + if (keyHit()) { + key = keyASCII(); + logWrite("Key %d Scan %d Alt %d\n", key, keyScanCode(), keyAlt()); + } else { + key = 0; + } guiProcessMouse(mouse); guiComposite(); imageRenderWithAlpha(pointer, mouse->x, mouse->y, alpha); vbeWaitVBlank(); vbePresent(); - } while (!(!mouse->buttonRight && mouse->buttonRightWasDown)); // Exit on release of right-click. + } while (key != 27 && !(!mouse->buttonRight && mouse->buttonRightWasDown)); // Exit on release of right-click. imageUnload(&pointer); }