]> code.delx.au - refind/commitdiff
Added touch screen support. (Works on a SUBSET of touch-screen systems.)
authorsrs5694 <srs5694@users.sourceforge.net>
Mon, 3 Oct 2016 18:55:13 +0000 (14:55 -0400)
committersrs5694 <srs5694@users.sourceforge.net>
Mon, 3 Oct 2016 18:55:13 +0000 (14:55 -0400)
Makefile
refind/config.c
refind/global.h
refind/main.c
refind/menu.c
refind/menu.h

index bc6e84f0089b031246787da1b178845574d5a7a2..99b14ce958021bfca535ca4836129a23155f3168 100644 (file)
--- 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
index 195317efa9147230f17f883595cffc4b1c3475da..b7851d4f33ebe6ff536855c81d18ab0cd435eb8c 100644 (file)
@@ -763,7 +763,6 @@ VOID ReadConfig(CHAR16 *FileName)
 
         } else if (MyStriCmp(TokenList[0], L"enable_touch")) {
            GlobalConfig.EnableTouch = HandleBoolean(TokenList, TokenCount);
-                  
         }
 
         FreeTokenLine(&TokenList, &TokenCount);
index 1b2a7f9b901fd0e7f0e2c10defbacf6bec0a6e15..efb16d0bb8feafa1974bfd1baaca4fff23613cb9 100644 (file)
@@ -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
index f10fb6f35db0d4595439bef434d7ec3369c7715d..66601177692fd9b7b558b849c5f6b7c3419e285c 100644 (file)
@@ -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,
index 47f308c55d9a2a5c05df34f77b01d095207a9d65..762fd7ae2cb985199fb17445755498e457fee082 100644 (file)
@@ -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) {
index 1c76fd1781a4e3551f5cfd12d9e93ed721035948..e5d02fb031fea12dd582ddddb74e3e707f662fe3 100644 (file)
@@ -48,6 +48,7 @@
 #ifdef __MAKEWITH_GNUEFI
 #include "efi.h"
 #include "efilib.h"
+#include "../EfiLib/AbsolutePointer.h"
 #else
 #include "../include/tiano_includes.h"
 #endif