58. VFR 요소 : subtitle 및 text

이번 장에서는 폼 요소에 대해 알아본다.

이전 장에서 생성한 HIISimpleForm 애플리케이션과 비슷한 내용으로 새로운 HIIStaticForm 애플리케이션을 생성한다. 이전 장에서 생성한 애플리케이션과 차이는 폼 내용만 변경하므로 생성하는 방법은 다루지 않는다. Strings.uni 파일도 수정해야 한다.

VFR의 내용은 아래 내용으로 작성한다.

#define HIISTATICFORM_FORMSET_GUID  {0x32783cc5, 0xe551, 0x4b61, {0xb7, 0xbd, 0x41, 0xba, 0x71, 0x7f, 0xba, 0x81}}

formset
  guid     = HIISTATICFORM_FORMSET_GUID,
  title    = STRING_TOKEN(HIISTATICFORM_FORMSET_TITLE),
  help     = STRING_TOKEN(HIISTATICFORM_FORMSET_HELP),
  form
    formid = 1,
    title = STRING_TOKEN(HIISTATICFORM_FORMID1_TITLE);
  endform;
endformset;

빌드를 진행하면 아래와 같은 코드를 생성한다. Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst

formset
>00000000: 0E A7 C5 3C 78 32 51 E5 61 4B B7 BD 41 BA 71 7F BA 81 02 00 03 00 01 71 99 03 93 45 85 04 4B B4 5E 32 EB 83 26 04 0E
>00000027: 5C 06 00 00 00 00
>0000002D: 5C 06 00 00 01 00
  guid = {0x32783cc5, 0xe551, 0x4b61, {0xb7, 0xbd, 0x41, 0xba, 0x71, 0x7f, 0xba, 0x81}},
  title = STRING_TOKEN(0x0002),
  help = STRING_TOKEN(0x0003),
  form
>00000033: 01 86 01 00 04 00
    formid = 1,
    title = STRING_TOKEN(0x0004);
  endform;
>00000039: 29 02
endformset;
>0000003B: 29 02

이 형태는 제목이 있는 빈 형태로 생성된다.

Subtitle

가장 간단한 폼 요소는 subtitle이다. https://edk2-docs.gitbook.io/edk-ii-vfr-specification/2_vfr_description_in_bnf/211_vfr_form_definition#2.11.5.1-vfr-subtitle-definition 사용자에게 일부 정보를 표시하기 위한 대화형이 아닌 텍스트이다. 이 요소는 선택할 수 없다. EDKII Form Browser에서는 검은색으로 표시되는 대화형 요소와는 반대로 파란색으로 표시된다.

아래 코드로 subtitle을 추가할 수 있다.

그러나 짧은 폼을 사용하는 것이 가장 일반적이다.

따라서 위 문자열을 폼 코드에 작성하면 된다.

UNI 파일에 subtitle을 위한 문자열을 추가한다.

빌드 후 HIIStaticForm.c를 실행하면 아래와 같이 Subtitle1이 출력된 것을 볼 수 있다.

HIIStaticForm.efi

IFR

subtitle 추가 이전과 이후의 출력을 비교하면 아래와 같이 차이가 있다.

2개의 opcode EFI_IFR_SUBTITLEEFI_IFR_END가 있다. 이미 EFI_IFR_END의 구조를 확인했기 때문에 이번에는 EFI_IFR_SUBTITLE을 확인한다.

다른 subtitle

위에서 했던 것과 비슷하게 subtitle을 하나 더 생성한다.

subtitle2subtitle1 뒤에 출력된다. 이 원칙은 모든 폼 요소에 적용된다. 기본적으로 다음 요소는 단순히 다른 문자열로 이동한다.

HIIStaticForm.efi

subtitle 범위 활용

위에서 봤듯이 EFI_IFR_SUBTITLE은 나중에 EFI_IFR_END에 의해 닫힌 범위를 열 수 있다.

subtitle 범위 내의 요소를 정의하여 범위 내의 모든 요소를 들여 쓸 수 있다.

아래 내용을 Form.vfr 파일에 작성한다.

Strings.uni 파일에도 SUBTITLE3SUBTITLE4를 추가한다.

빌드 후 Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst 내용을 살펴보면 아래와 같이 추가된 것을 볼 수 있다.

opcode EFI_IFR_SUBTITLE-EFI_IFR_SUBTITLE-EFI_IFR_END-EFI_IFR_END를 확인할 수 있다. 만약 SUBTITLE4SUBTITLE3 범위에 넣지 않았을 경우에는 EFI_IFR_SUBTITLE-EFI_IFR_END-EFI_IFR_SUBTITLE-EFI_IFR_END로 된다.

HIIStaticForm.efi

더 깊게 이해하기 위해 SUBTITLE3의 범위 안에 다른 subtitle을 추가하고 범위 뒤에 다른 subtitle을 추가한다.

Strings.uni에도 SUBTITLE5SUBTITLE6을 추가한다.

HIIStaticForm.efi

빈 문자열

subtitle 요소는 빈 문자열을 폼에 쉽게 추가할 수 있는 방법이다.

SUBTITLE6 바로 위에 아래 코드를 작성한다.

Strings.uniSTR_NULL을 추가한다.

빌드 후 실행하면 SUBTITLE6 위가 띄어진 것을 볼 수 있다.

HIIStaticForm.efi

Text 요소

이번에 알아볼 요소는 text이다. https://edk2-docs.gitbook.io/edk-ii-vfr-specification/2_vfr_description_in_bnf/211_vfr_form_definition#2.11.5.2-vfr-text-definition

Form.vfr 파일의 마지막 subtitle 아래에 코드를 작성한다.

Strings.uni 파일에 추가한다.

Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst를 확인하면 text가 범위를 열지 않아 하나의 EFI_IFR_TEXT만 생성된다.

아래는 EFI_IFR_STATEMENT_HEADER 필드에 대한 정의다.

text 요소는 아래와 같이 출력된다.

HIIStaticForm.efi

text 요소와 subtitle 요소의 차이점은 text 요소는 선택할 수 있다는 점이다.

TEXT1 title을 생성했던 방법과 똑같이 TEXT2 title을 생성한다.

HIIStaticForm.efi

방향키를 사용해 Text1 titleText2 title을 선택할 수 있고 선택된 text에 따라 help도 자동으로 변경된다.

다른 text 필드

text 필드에 다른 text 요소를 추가할 수 있다.

추가된 text 요소는 EFI_IFR_TEXT.TextTwo 필드에 추가된다.

Form Browser에는 아래와 같이 출력된다. 두 번째 문자열은 메뉴 항목의 선택된 위치에 배치된다.

HIIStaticForm.efi

Last updated