From dd910ca40c3ea630983ad18cf1a23e0afe38ffe9 Mon Sep 17 00:00:00 2001 From: srs5694 Date: Mon, 3 Oct 2016 14:55:13 -0400 Subject: [PATCH] Added touch screen support. (Works on a SUBSET of touch-screen systems.) --- Makefile | 2 +- refind/config.c | 1 - refind/global.h | 2 +- refind/main.c | 2 +- refind/menu.c | 246 ++++++++++++++++++++++++------------------------ refind/menu.h | 1 + 6 files changed, 126 insertions(+), 128 deletions(-) diff --git a/Makefile b/Makefile index bc6e84f..99b14ce 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ MOK_DIR=mok GPTSYNC_DIR=gptsync EFILIB_DIR=EfiLib export EDK2BASE=/usr/local/UDK2014/MyWorkSpace -export REFIND_VERSION='L"0.10.3"' +export REFIND_VERSION='L"0.10.3.1"' # The "all" target builds with the TianoCore library if possible, but falls # back on the more easily-installed GNU-EFI library if TianoCore isn't diff --git a/refind/config.c b/refind/config.c index 195317e..b7851d4 100644 --- a/refind/config.c +++ b/refind/config.c @@ -763,7 +763,6 @@ VOID ReadConfig(CHAR16 *FileName) } else if (MyStriCmp(TokenList[0], L"enable_touch")) { GlobalConfig.EnableTouch = HandleBoolean(TokenList, TokenCount); - } FreeTokenLine(&TokenList, &TokenCount); diff --git a/refind/global.h b/refind/global.h index 1b2a7f9..efb16d0 100644 --- a/refind/global.h +++ b/refind/global.h @@ -301,6 +301,7 @@ typedef struct { BOOLEAN DeepLegacyScan; BOOLEAN EnableAndLockVMX; BOOLEAN FoldLinuxKernels; + BOOLEAN EnableTouch; UINTN RequestedScreenWidth; UINTN RequestedScreenHeight; UINTN BannerBottomEdge; @@ -333,7 +334,6 @@ typedef struct { UINT32_LIST *CsrValues; UINTN ShowTools[NUM_TOOLS]; CHAR8 ScanFor[NUM_SCAN_OPTIONS]; // codes of types of loaders for which to scan - BOOLEAN EnableTouch; } REFIT_CONFIG; // Global variables diff --git a/refind/main.c b/refind/main.c index f10fb6f..6660117 100644 --- a/refind/main.c +++ b/refind/main.c @@ -160,7 +160,7 @@ REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L" L"Insert or F2 for more options; Esc to refresh" }; static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL, L"Press Enter to return to main menu", L"" }; -REFIT_CONFIG GlobalConfig = { FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0, 0, DONT_CHANGE_TEXT_MODE, +REFIT_CONFIG GlobalConfig = { FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, 0, 0, 0, DONT_CHANGE_TEXT_MODE, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, 0, 0, { DEFAULT_BIG_ICON_SIZE / 4, DEFAULT_SMALL_ICON_SIZE, DEFAULT_BIG_ICON_SIZE }, BANNER_NOSCALE, NULL, NULL, NULL, NULL, CONFIG_FILE_NAME, NULL, NULL, NULL, NULL, diff --git a/refind/menu.c b/refind/menu.c index 47f308c..762fd7a 100644 --- a/refind/menu.c +++ b/refind/menu.c @@ -366,7 +366,7 @@ static VOID SaveScreen(VOID) { egClearScreen(&Black); if(TouchEnabled) { - WaitList[1] = TouchProtocol->WaitForInput; + WaitList[1] = TouchProtocol->WaitForInput; refit_call3_wrapper(BS->WaitForEvent, 2, WaitList, &index); } else { refit_call3_wrapper(BS->WaitForEvent, 1, WaitList, &index); @@ -468,26 +468,26 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty } // read key press or touch event (and wait for them if applicable) - if(TouchEnabled) { - TouchStatus = refit_call2_wrapper(TouchProtocol->GetState, TouchProtocol, TouchState); - } - Status = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key); - - if(Status == EFI_SUCCESS) { - TouchActive = FALSE; - TimeSinceKeystroke = 0; - } else if(TouchStatus == EFI_SUCCESS) { - if(StyleFunc != MainMenuStyle) { - // prevent user from getting stuck on submenus - // (the only one currently reachable without a keyboard is the about screen) - MenuExit = MENU_EXIT_ENTER; - break; - } - - TouchActive = TRUE; - TimeSinceKeystroke = 0; - } else { - EFI_EVENT WaitList[3] = { ST->ConIn->WaitForKey, NULL, NULL }; + if(TouchEnabled) { + TouchStatus = refit_call2_wrapper(TouchProtocol->GetState, TouchProtocol, TouchState); + } + Status = refit_call2_wrapper(ST->ConIn->ReadKeyStroke, ST->ConIn, &key); + + if(Status == EFI_SUCCESS) { + TouchActive = FALSE; + TimeSinceKeystroke = 0; + } else if (TouchStatus == EFI_SUCCESS) { + if (StyleFunc != MainMenuStyle) { + // prevent user from getting stuck on submenus + // (the only one currently reachable without a keyboard is the about screen) + MenuExit = MENU_EXIT_ENTER; + break; + } + + TouchActive = TRUE; + TimeSinceKeystroke = 0; + } else { + EFI_EVENT WaitList[3] = { ST->ConIn->WaitForKey, NULL, NULL }; if (HaveTimeout && TimeoutCountdown == 0) { // timeout expired MenuExit = MENU_EXIT_TIMEOUT; @@ -503,16 +503,16 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty UINTN Index; refit_call3_wrapper(BS->SetTimer, TimerEvent, TimerRelative, 10000000); // 1s Timeout - - if(TouchEnabled) { - WaitList[1] = TouchProtocol->WaitForInput; - WaitList[2] = TimerEvent; - Status = refit_call3_wrapper(BS->WaitForEvent, 3, WaitList, &Index); - } else { - WaitList[1] = TimerEvent; - Status = refit_call3_wrapper(BS->WaitForEvent, 2, WaitList, &Index); - } - + + if (TouchEnabled) { + WaitList[1] = TouchProtocol->WaitForInput; + WaitList[2] = TimerEvent; + Status = refit_call3_wrapper(BS->WaitForEvent, 3, WaitList, &Index); + } else { + WaitList[1] = TimerEvent; + Status = refit_call3_wrapper(BS->WaitForEvent, 2, WaitList, &Index); + } + refit_call1_wrapper(BS->CloseEvent, TimerEvent); if (EFI_ERROR(Status)) refit_call1_wrapper(BS->Stall, 100000); // Pause for 100 ms @@ -532,12 +532,12 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty TimeSinceKeystroke = 0; } // if } else { - if(TouchEnabled) { - WaitList[1] = TouchProtocol->WaitForInput; - refit_call3_wrapper(BS->WaitForEvent, 2, WaitList, &index); - } else { - refit_call3_wrapper(BS->WaitForEvent, 1, WaitList, &index); - } + if (TouchEnabled) { + WaitList[1] = TouchProtocol->WaitForInput; + refit_call3_wrapper(BS->WaitForEvent, 2, WaitList, &index); + } else { + refit_call3_wrapper(BS->WaitForEvent, 1, WaitList, &index); + } } continue; } // if/else !read keystroke @@ -553,85 +553,84 @@ static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Sty } } - if(!TouchActive) { // react to key press - switch (key.ScanCode) { - case SCAN_UP: - UpdateScroll(&State, SCROLL_LINE_UP); - break; - case SCAN_LEFT: - UpdateScroll(&State, SCROLL_LINE_LEFT); - break; - case SCAN_DOWN: - UpdateScroll(&State, SCROLL_LINE_DOWN); - break; - case SCAN_RIGHT: - UpdateScroll(&State, SCROLL_LINE_RIGHT); - break; - case SCAN_HOME: - UpdateScroll(&State, SCROLL_FIRST); - break; - case SCAN_END: - UpdateScroll(&State, SCROLL_LAST); - break; - case SCAN_PAGE_UP: - UpdateScroll(&State, SCROLL_PAGE_UP); - break; - case SCAN_PAGE_DOWN: - UpdateScroll(&State, SCROLL_PAGE_DOWN); - break; - case SCAN_ESC: - MenuExit = MENU_EXIT_ESCAPE; - break; - case SCAN_INSERT: - case SCAN_F2: - MenuExit = MENU_EXIT_DETAILS; - break; - case SCAN_F10: - egScreenShot(); - break; - case 0x0016: // F12 - if (EjectMedia()) - MenuExit = MENU_EXIT_ESCAPE; - break; - } - switch (key.UnicodeChar) { - case CHAR_LINEFEED: - case CHAR_CARRIAGE_RETURN: - case ' ': - MenuExit = MENU_EXIT_ENTER; - break; - case '+': - MenuExit = MENU_EXIT_DETAILS; - break; - default: - KeyAsString[0] = key.UnicodeChar; - KeyAsString[1] = 0; - ShortcutEntry = FindMenuShortcutEntry(Screen, KeyAsString); - if (ShortcutEntry >= 0) { - State.CurrentSelection = ShortcutEntry; - MenuExit = MENU_EXIT_ENTER; - } - break; - } - } else { //react to touch event - UINTN Item = FindMainMenuItem(Screen, &State, TouchState->CurrentX, TouchState->CurrentY); - - switch(Item) { - case TOUCH_NO_ITEM: - //do nothing - break; - case TOUCH_LEFT_ARROW: - UpdateScroll(&State, SCROLL_PAGE_UP); - break; - case TOUCH_RIGHT_ARROW: - UpdateScroll(&State, SCROLL_PAGE_DOWN); - break; - default: - State.CurrentSelection = Item; - MenuExit = MENU_EXIT_ENTER; - break; - } - } + if(!TouchActive) { // react to key press + switch (key.ScanCode) { + case SCAN_UP: + UpdateScroll(&State, SCROLL_LINE_UP); + break; + case SCAN_LEFT: + UpdateScroll(&State, SCROLL_LINE_LEFT); + break; + case SCAN_DOWN: + UpdateScroll(&State, SCROLL_LINE_DOWN); + break; + case SCAN_RIGHT: + UpdateScroll(&State, SCROLL_LINE_RIGHT); + break; + case SCAN_HOME: + UpdateScroll(&State, SCROLL_FIRST); + break; + case SCAN_END: + UpdateScroll(&State, SCROLL_LAST); + break; + case SCAN_PAGE_UP: + UpdateScroll(&State, SCROLL_PAGE_UP); + break; + case SCAN_PAGE_DOWN: + UpdateScroll(&State, SCROLL_PAGE_DOWN); + break; + case SCAN_ESC: + MenuExit = MENU_EXIT_ESCAPE; + break; + case SCAN_INSERT: + case SCAN_F2: + MenuExit = MENU_EXIT_DETAILS; + break; + case SCAN_F10: + egScreenShot(); + break; + case 0x0016: // F12 + if (EjectMedia()) + MenuExit = MENU_EXIT_ESCAPE; + break; + } + switch (key.UnicodeChar) { + case CHAR_LINEFEED: + case CHAR_CARRIAGE_RETURN: + case ' ': + MenuExit = MENU_EXIT_ENTER; + break; + case '+': + MenuExit = MENU_EXIT_DETAILS; + break; + default: + KeyAsString[0] = key.UnicodeChar; + KeyAsString[1] = 0; + ShortcutEntry = FindMenuShortcutEntry(Screen, KeyAsString); + if (ShortcutEntry >= 0) { + State.CurrentSelection = ShortcutEntry; + MenuExit = MENU_EXIT_ENTER; + } + break; + } + } else { //react to touch event + UINTN Item = FindMainMenuItem(Screen, &State, TouchState->CurrentX, TouchState->CurrentY); + switch (Item) { + case TOUCH_NO_ITEM: + //do nothing + break; + case TOUCH_LEFT_ARROW: + UpdateScroll(&State, SCROLL_PAGE_UP); + break; + case TOUCH_RIGHT_ARROW: + UpdateScroll(&State, SCROLL_PAGE_DOWN); + break; + default: + State.CurrentSelection = Item; + MenuExit = MENU_EXIT_ENTER; + break; + } + } } StyleFunc(Screen, &State, MENU_FUNCTION_CLEANUP, NULL); @@ -1383,14 +1382,13 @@ UINTN RunMainMenu(REFIT_MENU_SCREEN *Screen, CHAR16** DefaultSelection, REFIT_ME if (AllowGraphicsMode) { Style = GraphicsMenuStyle; MainStyle = MainMenuStyle; - - if(GlobalConfig.EnableTouch) { - // Check for touch availability - EFI_STATUS status = refit_call3_wrapper(BS->LocateProtocol, &TouchGuid, NULL, (VOID **) &TouchProtocol); - if(status == EFI_SUCCESS) { - TouchEnabled = TouchActive = TRUE; - } - } + if (GlobalConfig.EnableTouch) { + // Check for touch availability + EFI_STATUS status = refit_call3_wrapper(BS->LocateProtocol, &TouchGuid, NULL, (VOID **) &TouchProtocol); + if (status == EFI_SUCCESS) { + TouchEnabled = TouchActive = TRUE; + } + } } while (!MenuExit) { diff --git a/refind/menu.h b/refind/menu.h index 1c76fd1..e5d02fb 100644 --- a/refind/menu.h +++ b/refind/menu.h @@ -48,6 +48,7 @@ #ifdef __MAKEWITH_GNUEFI #include "efi.h" #include "efilib.h" +#include "../EfiLib/AbsolutePointer.h" #else #include "../include/tiano_includes.h" #endif -- 2.39.2