[edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line

Gao, Zhichao posted 1 patch 2 years, 6 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/edk2 tags/patchew/20210909072541.3069-1-zhichao.gao@intel.com
There is a newer version of this series
.../BootManagerMenuApp/BootManagerMenu.c      | 72 ++++++++++++++++++-
1 file changed, 69 insertions(+), 3 deletions(-)
[edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Gao, Zhichao 2 years, 6 months ago
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590

Limit the draw box always within the screen's column and row.
Limit the string drawing within one line.

Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Ray Ni <ray.ni@intel.com>
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
---
V2:
Drop the change in UefiBootManagerLib in V1.
Add the limitation in BootManagerMenuApp instead.

 .../BootManagerMenuApp/BootManagerMenu.c      | 72 ++++++++++++++++++-
 1 file changed, 69 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
index 9e729074ec..d4bdeba073 100644
--- a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
+++ b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
@@ -1,7 +1,7 @@
 /** @file
   The application to show the Boot Manager Menu.
 
-Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -45,9 +45,56 @@ PrintStringAt (
   IN CHAR16    *String
   )
 {
+  UINTN         ScreenWidth;
+  UINTN         ScreenRows;
+  CHAR16        *TurncateString;
+  EFI_STATUS    Status;
+  UINTN         ShowingLength;
 
   gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
-  return Print (L"%s", String);
+
+  gST->ConOut->QueryMode (
+                 gST->ConOut,
+                 gST->ConOut->Mode->Mode,
+                 &ScreenWidth,
+                 &ScreenRows
+                 );
+
+  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
+    return 0;
+  }
+
+  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
+    //
+    // |      - ScreenWidth -       |
+    // ...Column.....................
+    // TurncateString length should leave one character for draw box and
+    // require one character for string end.
+    //
+    ShowingLength = ScreenWidth - Column - 1;
+    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));
+
+    if (TurncateString == NULL) {
+      return 0;
+    }
+
+    Status = StrnCpyS (TurncateString, ShowingLength + 1, String, ShowingLength - 3);
+
+    if (EFI_ERROR (Status)) {
+      FreePool (TurncateString);
+      return 0;
+    }
+
+    *(TurncateString + ShowingLength - 3) = L'.';
+    *(TurncateString + ShowingLength - 2) = L'.';
+    *(TurncateString + ShowingLength - 1) = L'.';
+    *(TurncateString + ShowingLength)     = L'\0';
+    ShowingLength = Print (L"%s", TurncateString);
+    FreePool (TurncateString);
+    return ShowingLength;
+  } else {
+    return Print (L"%s", String);
+  }
 }
 
 /**
@@ -68,7 +115,22 @@ PrintCharAt (
   CHAR16       Character
   )
 {
+  UINTN         ScreenWidth;
+  UINTN         ScreenRows;
+
   gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
+
+  gST->ConOut->QueryMode (
+                 gST->ConOut,
+                 gST->ConOut->Mode->Mode,
+                 &ScreenWidth,
+                 &ScreenRows
+                 );
+
+  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
+    return 0;
+  }
+
   return Print (L"%c", Character);
 }
 
@@ -193,7 +255,11 @@ InitializeBootMenuScreen (
 
   MaxPrintRows = Row - 6;
   UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2;
-  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
+  if (MaxStrWidth + 8 > Column) {
+    BootMenuData->MenuScreen.Width = Column;
+  } else {
+    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
+  }
   if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
     BootMenuData->MenuScreen.Height = MaxPrintRows;
     BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
-- 
2.31.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#80406): https://edk2.groups.io/g/devel/message/80406
Mute This Topic: https://groups.io/mt/85479254/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Ni, Ray 2 years, 6 months ago
I remember that HII can tell the width of a string.
Have you evaluated using HII? +@Bi, Dandan

> -----Original Message-----
> From: Gao, Zhichao <zhichao.gao@intel.com>
> Sent: Thursday, September 9, 2021 3:26 PM
> To: devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> 
> Limit the draw box always within the screen's column and row.
> Limit the string drawing within one line.
> 
> Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Ray Ni <ray.ni@intel.com>
> Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> ---
> 
> V2:
> 
> Drop the change in UefiBootManagerLib in V1.
> 
> Add the limitation in BootManagerMenuApp instead.
> 
> 
>  .../BootManagerMenuApp/BootManagerMenu.c      | 72 ++++++++++++++++++-
>  1 file changed, 69 insertions(+), 3 deletions(-)
> 
> diff --git a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
> index 9e729074ec..d4bdeba073 100644
> --- a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
> +++ b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
> @@ -1,7 +1,7 @@
>  /** @file
> 
>    The application to show the Boot Manager Menu.
> 
> 
> 
> -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> 
> 
>  **/
> 
> @@ -45,9 +45,56 @@ PrintStringAt (
>    IN CHAR16    *String
> 
>    )
> 
>  {
> 
> +  UINTN         ScreenWidth;
> 
> +  UINTN         ScreenRows;
> 
> +  CHAR16        *TurncateString;
> 
> +  EFI_STATUS    Status;
> 
> +  UINTN         ShowingLength;
> 
> 
> 
>    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> 
> -  return Print (L"%s", String);
> 
> +
> 
> +  gST->ConOut->QueryMode (
> 
> +                 gST->ConOut,
> 
> +                 gST->ConOut->Mode->Mode,
> 
> +                 &ScreenWidth,
> 
> +                 &ScreenRows
> 
> +                 );
> 
> +
> 
> +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> 
> +    return 0;
> 
> +  }
> 
> +
> 
> +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> 
> +    //
> 
> +    // |      - ScreenWidth -       |
> 
> +    // ...Column.....................
> 
> +    // TurncateString length should leave one character for draw box and
> 
> +    // require one character for string end.
> 
> +    //
> 
> +    ShowingLength = ScreenWidth - Column - 1;
> 
> +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));
> 
> +
> 
> +    if (TurncateString == NULL) {
> 
> +      return 0;
> 
> +    }
> 
> +
> 
> +    Status = StrnCpyS (TurncateString, ShowingLength + 1, String, ShowingLength - 3);
> 
> +
> 
> +    if (EFI_ERROR (Status)) {
> 
> +      FreePool (TurncateString);
> 
> +      return 0;
> 
> +    }
> 
> +
> 
> +    *(TurncateString + ShowingLength - 3) = L'.';
> 
> +    *(TurncateString + ShowingLength - 2) = L'.';
> 
> +    *(TurncateString + ShowingLength - 1) = L'.';
> 
> +    *(TurncateString + ShowingLength)     = L'\0';
> 
> +    ShowingLength = Print (L"%s", TurncateString);
> 
> +    FreePool (TurncateString);
> 
> +    return ShowingLength;
> 
> +  } else {
> 
> +    return Print (L"%s", String);
> 
> +  }
> 
>  }
> 
> 
> 
>  /**
> 
> @@ -68,7 +115,22 @@ PrintCharAt (
>    CHAR16       Character
> 
>    )
> 
>  {
> 
> +  UINTN         ScreenWidth;
> 
> +  UINTN         ScreenRows;
> 
> +
> 
>    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> 
> +
> 
> +  gST->ConOut->QueryMode (
> 
> +                 gST->ConOut,
> 
> +                 gST->ConOut->Mode->Mode,
> 
> +                 &ScreenWidth,
> 
> +                 &ScreenRows
> 
> +                 );
> 
> +
> 
> +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> 
> +    return 0;
> 
> +  }
> 
> +
> 
>    return Print (L"%c", Character);
> 
>  }
> 
> 
> 
> @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> 
> 
>    MaxPrintRows = Row - 6;
> 
>    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2;
> 
> -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> 
> +  if (MaxStrWidth + 8 > Column) {
> 
> +    BootMenuData->MenuScreen.Width = Column;
> 
> +  } else {
> 
> +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> 
> +  }
> 
>    if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
> 
>      BootMenuData->MenuScreen.Height = MaxPrintRows;
> 
>      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> 
> --
> 2.31.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#80443): https://edk2.groups.io/g/devel/message/80443
Mute This Topic: https://groups.io/mt/85479254/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Gao, Zhichao 2 years, 6 months ago
No. My point is the HII usage would require the HII browser engine. That's too complex for this simple app.

Dandan,
If I am wrong, please help to correct.

Thanks,
Zhichao

> -----Original Message-----
> From: Ni, Ray <ray.ni@intel.com>
> Sent: Thursday, September 9, 2021 10:55 PM
> To: Gao, Zhichao <zhichao.gao@intel.com>; Bi, Dandan
> <dandan.bi@intel.com>
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> <gaoliming@byosoft.com.cn>; devel@edk2.groups.io
> Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> string drawing within one line
> 
> I remember that HII can tell the width of a string.
> Have you evaluated using HII? +@Bi, Dandan
> 
> > -----Original Message-----
> > From: Gao, Zhichao <zhichao.gao@intel.com>
> > Sent: Thursday, September 9, 2021 3:26 PM
> > To: devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> > Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string
> drawing within one line
> >
> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> >
> > Limit the draw box always within the screen's column and row.
> > Limit the string drawing within one line.
> >
> > Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > ---
> >
> > V2:
> >
> > Drop the change in UefiBootManagerLib in V1.
> >
> > Add the limitation in BootManagerMenuApp instead.
> >
> >
> >  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> ++++++++++++++++++-
> >  1 file changed, 69 insertions(+), 3 deletions(-)
> >
> > diff --git
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> >
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> > index 9e729074ec..d4bdeba073 100644
> > ---
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> > +++
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> > @@ -1,7 +1,7 @@
> >  /** @file
> >
> >    The application to show the Boot Manager Menu.
> >
> >
> >
> > -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> >
> > +Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
> >
> >  SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >
> >
> >  **/
> >
> > @@ -45,9 +45,56 @@ PrintStringAt (
> >    IN CHAR16    *String
> >
> >    )
> >
> >  {
> >
> > +  UINTN         ScreenWidth;
> >
> > +  UINTN         ScreenRows;
> >
> > +  CHAR16        *TurncateString;
> >
> > +  EFI_STATUS    Status;
> >
> > +  UINTN         ShowingLength;
> >
> >
> >
> >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> >
> > -  return Print (L"%s", String);
> >
> > +
> >
> > +  gST->ConOut->QueryMode (
> >
> > +                 gST->ConOut,
> >
> > +                 gST->ConOut->Mode->Mode,
> >
> > +                 &ScreenWidth,
> >
> > +                 &ScreenRows
> >
> > +                 );
> >
> > +
> >
> > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> >
> > +    return 0;
> >
> > +  }
> >
> > +
> >
> > +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> >
> > +    //
> >
> > +    // |      - ScreenWidth -       |
> >
> > +    // ...Column.....................
> >
> > +    // TurncateString length should leave one character for draw box and
> >
> > +    // require one character for string end.
> >
> > +    //
> >
> > +    ShowingLength = ScreenWidth - Column - 1;
> >
> > +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));
> >
> > +
> >
> > +    if (TurncateString == NULL) {
> >
> > +      return 0;
> >
> > +    }
> >
> > +
> >
> > +    Status = StrnCpyS (TurncateString, ShowingLength + 1, String,
> ShowingLength - 3);
> >
> > +
> >
> > +    if (EFI_ERROR (Status)) {
> >
> > +      FreePool (TurncateString);
> >
> > +      return 0;
> >
> > +    }
> >
> > +
> >
> > +    *(TurncateString + ShowingLength - 3) = L'.';
> >
> > +    *(TurncateString + ShowingLength - 2) = L'.';
> >
> > +    *(TurncateString + ShowingLength - 1) = L'.';
> >
> > +    *(TurncateString + ShowingLength)     = L'\0';
> >
> > +    ShowingLength = Print (L"%s", TurncateString);
> >
> > +    FreePool (TurncateString);
> >
> > +    return ShowingLength;
> >
> > +  } else {
> >
> > +    return Print (L"%s", String);
> >
> > +  }
> >
> >  }
> >
> >
> >
> >  /**
> >
> > @@ -68,7 +115,22 @@ PrintCharAt (
> >    CHAR16       Character
> >
> >    )
> >
> >  {
> >
> > +  UINTN         ScreenWidth;
> >
> > +  UINTN         ScreenRows;
> >
> > +
> >
> >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> >
> > +
> >
> > +  gST->ConOut->QueryMode (
> >
> > +                 gST->ConOut,
> >
> > +                 gST->ConOut->Mode->Mode,
> >
> > +                 &ScreenWidth,
> >
> > +                 &ScreenRows
> >
> > +                 );
> >
> > +
> >
> > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> >
> > +    return 0;
> >
> > +  }
> >
> > +
> >
> >    return Print (L"%c", Character);
> >
> >  }
> >
> >
> >
> > @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> >
> >
> >    MaxPrintRows = Row - 6;
> >
> >    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT +
> 2;
> >
> > -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> >
> > +  if (MaxStrWidth + 8 > Column) {
> >
> > +    BootMenuData->MenuScreen.Width = Column;
> >
> > +  } else {
> >
> > +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> >
> > +  }
> >
> >    if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
> >
> >      BootMenuData->MenuScreen.Height = MaxPrintRows;
> >
> >      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> >
> > --
> > 2.31.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#80469): https://edk2.groups.io/g/devel/message/80469
Mute This Topic: https://groups.io/mt/85479254/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Ni, Ray 2 years, 6 months ago
Reviewed-by: Ray Ni <ray.ni@intel.com>

-----Original Message-----
From: Gao, Zhichao <zhichao.gao@intel.com> 
Sent: Thursday, September 9, 2021 3:26 PM
To: devel@edk2.groups.io
Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590

Limit the draw box always within the screen's column and row.
Limit the string drawing within one line.

Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Ray Ni <ray.ni@intel.com>
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
---

V2:

Drop the change in UefiBootManagerLib in V1.

Add the limitation in BootManagerMenuApp instead.


 .../BootManagerMenuApp/BootManagerMenu.c      | 72 ++++++++++++++++++-
 1 file changed, 69 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
index 9e729074ec..d4bdeba073 100644
--- a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
+++ b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.c
@@ -1,7 +1,7 @@
 /** @file

   The application to show the Boot Manager Menu.

 

-Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>

+Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>

 SPDX-License-Identifier: BSD-2-Clause-Patent

 

 **/

@@ -45,9 +45,56 @@ PrintStringAt (
   IN CHAR16    *String

   )

 {

+  UINTN         ScreenWidth;

+  UINTN         ScreenRows;

+  CHAR16        *TurncateString;

+  EFI_STATUS    Status;

+  UINTN         ShowingLength;

 

   gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);

-  return Print (L"%s", String);

+

+  gST->ConOut->QueryMode (

+                 gST->ConOut,

+                 gST->ConOut->Mode->Mode,

+                 &ScreenWidth,

+                 &ScreenRows

+                 );

+

+  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {

+    return 0;

+  }

+

+  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {

+    //

+    // |      - ScreenWidth -       |

+    // ...Column.....................

+    // TurncateString length should leave one character for draw box and

+    // require one character for string end.

+    //

+    ShowingLength = ScreenWidth - Column - 1;

+    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));

+

+    if (TurncateString == NULL) {

+      return 0;

+    }

+

+    Status = StrnCpyS (TurncateString, ShowingLength + 1, String, ShowingLength - 3);

+

+    if (EFI_ERROR (Status)) {

+      FreePool (TurncateString);

+      return 0;

+    }

+

+    *(TurncateString + ShowingLength - 3) = L'.';

+    *(TurncateString + ShowingLength - 2) = L'.';

+    *(TurncateString + ShowingLength - 1) = L'.';

+    *(TurncateString + ShowingLength)     = L'\0';

+    ShowingLength = Print (L"%s", TurncateString);

+    FreePool (TurncateString);

+    return ShowingLength;

+  } else {

+    return Print (L"%s", String);

+  }

 }

 

 /**

@@ -68,7 +115,22 @@ PrintCharAt (
   CHAR16       Character

   )

 {

+  UINTN         ScreenWidth;

+  UINTN         ScreenRows;

+

   gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);

+

+  gST->ConOut->QueryMode (

+                 gST->ConOut,

+                 gST->ConOut->Mode->Mode,

+                 &ScreenWidth,

+                 &ScreenRows

+                 );

+

+  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {

+    return 0;

+  }

+

   return Print (L"%c", Character);

 }

 

@@ -193,7 +255,11 @@ InitializeBootMenuScreen (
 

   MaxPrintRows = Row - 6;

   UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2;

-  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;

+  if (MaxStrWidth + 8 > Column) {

+    BootMenuData->MenuScreen.Width = Column;

+  } else {

+    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;

+  }

   if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {

     BootMenuData->MenuScreen.Height = MaxPrintRows;

     BootMenuData->ScrollBarControl.HasScrollBar = TRUE;

-- 
2.31.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#80942): https://edk2.groups.io/g/devel/message/80942
Mute This Topic: https://groups.io/mt/85479254/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Gao, Zhichao 2 years, 6 months ago
Hi Liming,

The solution is different with the first time we discussed on the Bugzilla. Can you review if it is OK to you?

Thanks,
Zhichao

> -----Original Message-----
> From: Ni, Ray <ray.ni@intel.com>
> Sent: Wednesday, September 22, 2021 11:28 AM
> To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> <gaoliming@byosoft.com.cn>
> Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> string drawing within one line
> 
> Reviewed-by: Ray Ni <ray.ni@intel.com>
> 
> -----Original Message-----
> From: Gao, Zhichao <zhichao.gao@intel.com>
> Sent: Thursday, September 9, 2021 3:26 PM
> To: devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string
> drawing within one line
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> 
> Limit the draw box always within the screen's column and row.
> Limit the string drawing within one line.
> 
> Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Ray Ni <ray.ni@intel.com>
> Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> ---
> 
> V2:
> 
> Drop the change in UefiBootManagerLib in V1.
> 
> Add the limitation in BootManagerMenuApp instead.
> 
> 
>  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> ++++++++++++++++++-
>  1 file changed, 69 insertions(+), 3 deletions(-)
> 
> diff --git
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> index 9e729074ec..d4bdeba073 100644
> ---
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> +++
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> c
> @@ -1,7 +1,7 @@
>  /** @file
> 
>    The application to show the Boot Manager Menu.
> 
> 
> 
> -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> 
> +Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
> 
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> 
> 
>  **/
> 
> @@ -45,9 +45,56 @@ PrintStringAt (
>    IN CHAR16    *String
> 
>    )
> 
>  {
> 
> +  UINTN         ScreenWidth;
> 
> +  UINTN         ScreenRows;
> 
> +  CHAR16        *TurncateString;
> 
> +  EFI_STATUS    Status;
> 
> +  UINTN         ShowingLength;
> 
> 
> 
>    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> 
> -  return Print (L"%s", String);
> 
> +
> 
> +  gST->ConOut->QueryMode (
> 
> +                 gST->ConOut,
> 
> +                 gST->ConOut->Mode->Mode,
> 
> +                 &ScreenWidth,
> 
> +                 &ScreenRows
> 
> +                 );
> 
> +
> 
> +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> 
> +    return 0;
> 
> +  }
> 
> +
> 
> +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> 
> +    //
> 
> +    // |      - ScreenWidth -       |
> 
> +    // ...Column.....................
> 
> +    // TurncateString length should leave one character for draw box and
> 
> +    // require one character for string end.
> 
> +    //
> 
> +    ShowingLength = ScreenWidth - Column - 1;
> 
> +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));
> 
> +
> 
> +    if (TurncateString == NULL) {
> 
> +      return 0;
> 
> +    }
> 
> +
> 
> +    Status = StrnCpyS (TurncateString, ShowingLength + 1, String,
> ShowingLength - 3);
> 
> +
> 
> +    if (EFI_ERROR (Status)) {
> 
> +      FreePool (TurncateString);
> 
> +      return 0;
> 
> +    }
> 
> +
> 
> +    *(TurncateString + ShowingLength - 3) = L'.';
> 
> +    *(TurncateString + ShowingLength - 2) = L'.';
> 
> +    *(TurncateString + ShowingLength - 1) = L'.';
> 
> +    *(TurncateString + ShowingLength)     = L'\0';
> 
> +    ShowingLength = Print (L"%s", TurncateString);
> 
> +    FreePool (TurncateString);
> 
> +    return ShowingLength;
> 
> +  } else {
> 
> +    return Print (L"%s", String);
> 
> +  }
> 
>  }
> 
> 
> 
>  /**
> 
> @@ -68,7 +115,22 @@ PrintCharAt (
>    CHAR16       Character
> 
>    )
> 
>  {
> 
> +  UINTN         ScreenWidth;
> 
> +  UINTN         ScreenRows;
> 
> +
> 
>    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> 
> +
> 
> +  gST->ConOut->QueryMode (
> 
> +                 gST->ConOut,
> 
> +                 gST->ConOut->Mode->Mode,
> 
> +                 &ScreenWidth,
> 
> +                 &ScreenRows
> 
> +                 );
> 
> +
> 
> +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> 
> +    return 0;
> 
> +  }
> 
> +
> 
>    return Print (L"%c", Character);
> 
>  }
> 
> 
> 
> @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> 
> 
>    MaxPrintRows = Row - 6;
> 
>    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2;
> 
> -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> 
> +  if (MaxStrWidth + 8 > Column) {
> 
> +    BootMenuData->MenuScreen.Width = Column;
> 
> +  } else {
> 
> +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> 
> +  }
> 
>    if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
> 
>      BootMenuData->MenuScreen.Height = MaxPrintRows;
> 
>      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> 
> --
> 2.31.1.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#80943): https://edk2.groups.io/g/devel/message/80943
Mute This Topic: https://groups.io/mt/85479254/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


回复: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by gaoliming 2 years, 6 months ago
Zhichao:
  With this change, the same boot option will be displayed differently in
BootManagerApp and BootManager Page. Is it the designed behavior?

  Besides, please remove change-id from the commit message. 

Thanks
Liming
> -----邮件原件-----
> 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Gao, Zhichao
> 发送时间: 2021年9月22日 12:50
> 收件人: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Liming Gao
> <gaoliming@byosoft.com.cn>
> 抄送: Wang, Jian J <jian.j.wang@intel.com>
> 主题: Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp:
> Limit string drawing within one line
> 
> Hi Liming,
> 
> The solution is different with the first time we discussed on the
Bugzilla. Can
> you review if it is OK to you?
> 
> Thanks,
> Zhichao
> 
> > -----Original Message-----
> > From: Ni, Ray <ray.ni@intel.com>
> > Sent: Wednesday, September 22, 2021 11:28 AM
> > To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > <gaoliming@byosoft.com.cn>
> > Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> > string drawing within one line
> >
> > Reviewed-by: Ray Ni <ray.ni@intel.com>
> >
> > -----Original Message-----
> > From: Gao, Zhichao <zhichao.gao@intel.com>
> > Sent: Thursday, September 9, 2021 3:26 PM
> > To: devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> > Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string
> > drawing within one line
> >
> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> >
> > Limit the draw box always within the screen's column and row.
> > Limit the string drawing within one line.
> >
> > Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > ---
> >
> > V2:
> >
> > Drop the change in UefiBootManagerLib in V1.
> >
> > Add the limitation in BootManagerMenuApp instead.
> >
> >
> >  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> > ++++++++++++++++++-
> >  1 file changed, 69 insertions(+), 3 deletions(-)
> >
> > diff --git
> > a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > c
> > b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > c
> > index 9e729074ec..d4bdeba073 100644
> > ---
> > a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > c
> > +++
> > b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > c
> > @@ -1,7 +1,7 @@
> >  /** @file
> >
> >    The application to show the Boot Manager Menu.
> >
> >
> >
> > -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> >
> > +Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
> >
> >  SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >
> >
> >  **/
> >
> > @@ -45,9 +45,56 @@ PrintStringAt (
> >    IN CHAR16    *String
> >
> >    )
> >
> >  {
> >
> > +  UINTN         ScreenWidth;
> >
> > +  UINTN         ScreenRows;
> >
> > +  CHAR16        *TurncateString;
> >
> > +  EFI_STATUS    Status;
> >
> > +  UINTN         ShowingLength;
> >
> >
> >
> >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> >
> > -  return Print (L"%s", String);
> >
> > +
> >
> > +  gST->ConOut->QueryMode (
> >
> > +                 gST->ConOut,
> >
> > +                 gST->ConOut->Mode->Mode,
> >
> > +                 &ScreenWidth,
> >
> > +                 &ScreenRows
> >
> > +                 );
> >
> > +
> >
> > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> >
> > +    return 0;
> >
> > +  }
> >
> > +
> >
> > +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> >
> > +    //
> >
> > +    // |      - ScreenWidth -       |
> >
> > +    // ...Column.....................
> >
> > +    // TurncateString length should leave one character for draw box
and
> >
> > +    // require one character for string end.
> >
> > +    //
> >
> > +    ShowingLength = ScreenWidth - Column - 1;
> >
> > +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof
(CHAR16));
> >
> > +
> >
> > +    if (TurncateString == NULL) {
> >
> > +      return 0;
> >
> > +    }
> >
> > +
> >
> > +    Status = StrnCpyS (TurncateString, ShowingLength + 1, String,
> > ShowingLength - 3);
> >
> > +
> >
> > +    if (EFI_ERROR (Status)) {
> >
> > +      FreePool (TurncateString);
> >
> > +      return 0;
> >
> > +    }
> >
> > +
> >
> > +    *(TurncateString + ShowingLength - 3) = L'.';
> >
> > +    *(TurncateString + ShowingLength - 2) = L'.';
> >
> > +    *(TurncateString + ShowingLength - 1) = L'.';
> >
> > +    *(TurncateString + ShowingLength)     = L'\0';
> >
> > +    ShowingLength = Print (L"%s", TurncateString);
> >
> > +    FreePool (TurncateString);
> >
> > +    return ShowingLength;
> >
> > +  } else {
> >
> > +    return Print (L"%s", String);
> >
> > +  }
> >
> >  }
> >
> >
> >
> >  /**
> >
> > @@ -68,7 +115,22 @@ PrintCharAt (
> >    CHAR16       Character
> >
> >    )
> >
> >  {
> >
> > +  UINTN         ScreenWidth;
> >
> > +  UINTN         ScreenRows;
> >
> > +
> >
> >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> >
> > +
> >
> > +  gST->ConOut->QueryMode (
> >
> > +                 gST->ConOut,
> >
> > +                 gST->ConOut->Mode->Mode,
> >
> > +                 &ScreenWidth,
> >
> > +                 &ScreenRows
> >
> > +                 );
> >
> > +
> >
> > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> >
> > +    return 0;
> >
> > +  }
> >
> > +
> >
> >    return Print (L"%c", Character);
> >
> >  }
> >
> >
> >
> > @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> >
> >
> >    MaxPrintRows = Row - 6;
> >
> >    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 +
> HELP_TOKEN_COUNT + 2;
> >
> > -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> >
> > +  if (MaxStrWidth + 8 > Column) {
> >
> > +    BootMenuData->MenuScreen.Width = Column;
> >
> > +  } else {
> >
> > +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> >
> > +  }
> >
> >    if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
> >
> >      BootMenuData->MenuScreen.Height = MaxPrintRows;
> >
> >      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> >
> > --
> > 2.31.1.windows.1
> 
> 
> 
> 
> 





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81006): https://edk2.groups.io/g/devel/message/81006
Mute This Topic: https://groups.io/mt/85806406/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Gao, Zhichao 2 years, 6 months ago
Hi Liming,

Yes. Because the design of the BM app is not aimed to display the boot option over one line. And it is not using the setup browser engine.
That would cause the difference.
If we want to make them align, there are two options:
1. BM app to use the setup browser engine
2. add scroll bar logic for the boot item

Both above change is not simple and may cause new issues. It would be a new design other than a bug fix.

Another solution is the patch V1 to limit the boot option description within 72 characters. Ray pointed out it is not a good solution.

BTW, I would remove the change-id in next patch.

Thanks,
Zhichao

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> gaoliming
> Sent: Thursday, September 23, 2021 10:59 AM
> To: devel@edk2.groups.io; Gao, Zhichao <zhichao.gao@intel.com>; Ni, Ray
> <ray.ni@intel.com>
> Cc: Wang, Jian J <jian.j.wang@intel.com>
> Subject: 回复: [edk2-devel] [PATCH V2]
> MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> 
> Zhichao:
>   With this change, the same boot option will be displayed differently in
> BootManagerApp and BootManager Page. Is it the designed behavior?
> 
>   Besides, please remove change-id from the commit message.
> 
> Thanks
> Liming
> > -----邮件原件-----
> > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Gao,
> Zhichao
> > 发送时间: 2021年9月22日 12:50
> > 收件人: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Liming Gao
> > <gaoliming@byosoft.com.cn>
> > 抄送: Wang, Jian J <jian.j.wang@intel.com>
> > 主题: Re: [edk2-devel] [PATCH V2]
> MdeModulePkg/BootManagerMenuApp:
> > Limit string drawing within one line
> >
> > Hi Liming,
> >
> > The solution is different with the first time we discussed on the
> Bugzilla. Can
> > you review if it is OK to you?
> >
> > Thanks,
> > Zhichao
> >
> > > -----Original Message-----
> > > From: Ni, Ray <ray.ni@intel.com>
> > > Sent: Wednesday, September 22, 2021 11:28 AM
> > > To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > <gaoliming@byosoft.com.cn>
> > > Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> > > string drawing within one line
> > >
> > > Reviewed-by: Ray Ni <ray.ni@intel.com>
> > >
> > > -----Original Message-----
> > > From: Gao, Zhichao <zhichao.gao@intel.com>
> > > Sent: Thursday, September 9, 2021 3:26 PM
> > > To: devel@edk2.groups.io
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> > > Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> string
> > > drawing within one line
> > >
> > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> > >
> > > Limit the draw box always within the screen's column and row.
> > > Limit the string drawing within one line.
> > >
> > > Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > > Cc: Ray Ni <ray.ni@intel.com>
> > > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > > ---
> > >
> > > V2:
> > >
> > > Drop the change in UefiBootManagerLib in V1.
> > >
> > > Add the limitation in BootManagerMenuApp instead.
> > >
> > >
> > >  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> > > ++++++++++++++++++-
> > >  1 file changed, 69 insertions(+), 3 deletions(-)
> > >
> > > diff --git
> > >
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > c
> > >
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > c
> > > index 9e729074ec..d4bdeba073 100644
> > > ---
> > >
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > c
> > > +++
> > >
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > c
> > > @@ -1,7 +1,7 @@
> > >  /** @file
> > >
> > >    The application to show the Boot Manager Menu.
> > >
> > >
> > >
> > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights
> > > reserved.<BR>
> > >
> > > +Copyright (c) 2011 - 2021, Intel Corporation. All rights
> > > +reserved.<BR>
> > >
> > >  SPDX-License-Identifier: BSD-2-Clause-Patent
> > >
> > >
> > >
> > >  **/
> > >
> > > @@ -45,9 +45,56 @@ PrintStringAt (
> > >    IN CHAR16    *String
> > >
> > >    )
> > >
> > >  {
> > >
> > > +  UINTN         ScreenWidth;
> > >
> > > +  UINTN         ScreenRows;
> > >
> > > +  CHAR16        *TurncateString;
> > >
> > > +  EFI_STATUS    Status;
> > >
> > > +  UINTN         ShowingLength;
> > >
> > >
> > >
> > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > >
> > > -  return Print (L"%s", String);
> > >
> > > +
> > >
> > > +  gST->ConOut->QueryMode (
> > >
> > > +                 gST->ConOut,
> > >
> > > +                 gST->ConOut->Mode->Mode,
> > >
> > > +                 &ScreenWidth,
> > >
> > > +                 &ScreenRows
> > >
> > > +                 );
> > >
> > > +
> > >
> > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > >
> > > +    return 0;
> > >
> > > +  }
> > >
> > > +
> > >
> > > +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> > >
> > > +    //
> > >
> > > +    // |      - ScreenWidth -       |
> > >
> > > +    // ...Column.....................
> > >
> > > +    // TurncateString length should leave one character for draw
> > > + box
> and
> > >
> > > +    // require one character for string end.
> > >
> > > +    //
> > >
> > > +    ShowingLength = ScreenWidth - Column - 1;
> > >
> > > +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof
> (CHAR16));
> > >
> > > +
> > >
> > > +    if (TurncateString == NULL) {
> > >
> > > +      return 0;
> > >
> > > +    }
> > >
> > > +
> > >
> > > +    Status = StrnCpyS (TurncateString, ShowingLength + 1, String,
> > > ShowingLength - 3);
> > >
> > > +
> > >
> > > +    if (EFI_ERROR (Status)) {
> > >
> > > +      FreePool (TurncateString);
> > >
> > > +      return 0;
> > >
> > > +    }
> > >
> > > +
> > >
> > > +    *(TurncateString + ShowingLength - 3) = L'.';
> > >
> > > +    *(TurncateString + ShowingLength - 2) = L'.';
> > >
> > > +    *(TurncateString + ShowingLength - 1) = L'.';
> > >
> > > +    *(TurncateString + ShowingLength)     = L'\0';
> > >
> > > +    ShowingLength = Print (L"%s", TurncateString);
> > >
> > > +    FreePool (TurncateString);
> > >
> > > +    return ShowingLength;
> > >
> > > +  } else {
> > >
> > > +    return Print (L"%s", String);
> > >
> > > +  }
> > >
> > >  }
> > >
> > >
> > >
> > >  /**
> > >
> > > @@ -68,7 +115,22 @@ PrintCharAt (
> > >    CHAR16       Character
> > >
> > >    )
> > >
> > >  {
> > >
> > > +  UINTN         ScreenWidth;
> > >
> > > +  UINTN         ScreenRows;
> > >
> > > +
> > >
> > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > >
> > > +
> > >
> > > +  gST->ConOut->QueryMode (
> > >
> > > +                 gST->ConOut,
> > >
> > > +                 gST->ConOut->Mode->Mode,
> > >
> > > +                 &ScreenWidth,
> > >
> > > +                 &ScreenRows
> > >
> > > +                 );
> > >
> > > +
> > >
> > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > >
> > > +    return 0;
> > >
> > > +  }
> > >
> > > +
> > >
> > >    return Print (L"%c", Character);
> > >
> > >  }
> > >
> > >
> > >
> > > @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> > >
> > >
> > >    MaxPrintRows = Row - 6;
> > >
> > >    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 +
> > HELP_TOKEN_COUNT + 2;
> > >
> > > -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > >
> > > +  if (MaxStrWidth + 8 > Column) {
> > >
> > > +    BootMenuData->MenuScreen.Width = Column;
> > >
> > > +  } else {
> > >
> > > +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > >
> > > +  }
> > >
> > >    if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
> > >
> > >      BootMenuData->MenuScreen.Height = MaxPrintRows;
> > >
> > >      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> > >
> > > --
> > > 2.31.1.windows.1
> >
> >
> >
> >
> >
> 
> 
> 
> 
> 
> 
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81012): https://edk2.groups.io/g/devel/message/81012
Mute This Topic: https://groups.io/mt/85806969/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Ni, Ray 2 years, 6 months ago
Another option is to use EfiBootManagerRegisterBootDescriptionHandler() to alter the boot descriptions.

> -----Original Message-----
> From: Gao, Zhichao <zhichao.gao@intel.com>
> Sent: Thursday, September 23, 2021 11:47 AM
> To: devel@edk2.groups.io; gaoliming@byosoft.com.cn; Ni, Ray <ray.ni@intel.com>
> Cc: Wang, Jian J <jian.j.wang@intel.com>
> Subject: RE: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> 
> Hi Liming,
> 
> Yes. Because the design of the BM app is not aimed to display the boot option over one line. And it is not using the setup
> browser engine.
> That would cause the difference.
> If we want to make them align, there are two options:
> 1. BM app to use the setup browser engine
> 2. add scroll bar logic for the boot item
> 
> Both above change is not simple and may cause new issues. It would be a new design other than a bug fix.
> 
> Another solution is the patch V1 to limit the boot option description within 72 characters. Ray pointed out it is not a good
> solution.
> 
> BTW, I would remove the change-id in next patch.
> 
> Thanks,
> Zhichao
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> > gaoliming
> > Sent: Thursday, September 23, 2021 10:59 AM
> > To: devel@edk2.groups.io; Gao, Zhichao <zhichao.gao@intel.com>; Ni, Ray
> > <ray.ni@intel.com>
> > Cc: Wang, Jian J <jian.j.wang@intel.com>
> > Subject: 回复: [edk2-devel] [PATCH V2]
> > MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> >
> > Zhichao:
> >   With this change, the same boot option will be displayed differently in
> > BootManagerApp and BootManager Page. Is it the designed behavior?
> >
> >   Besides, please remove change-id from the commit message.
> >
> > Thanks
> > Liming
> > > -----邮件原件-----
> > > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Gao,
> > Zhichao
> > > 发送时间: 2021年9月22日 12:50
> > > 收件人: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Liming Gao
> > > <gaoliming@byosoft.com.cn>
> > > 抄送: Wang, Jian J <jian.j.wang@intel.com>
> > > 主题: Re: [edk2-devel] [PATCH V2]
> > MdeModulePkg/BootManagerMenuApp:
> > > Limit string drawing within one line
> > >
> > > Hi Liming,
> > >
> > > The solution is different with the first time we discussed on the
> > Bugzilla. Can
> > > you review if it is OK to you?
> > >
> > > Thanks,
> > > Zhichao
> > >
> > > > -----Original Message-----
> > > > From: Ni, Ray <ray.ni@intel.com>
> > > > Sent: Wednesday, September 22, 2021 11:28 AM
> > > > To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
> > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > > <gaoliming@byosoft.com.cn>
> > > > Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> > > > string drawing within one line
> > > >
> > > > Reviewed-by: Ray Ni <ray.ni@intel.com>
> > > >
> > > > -----Original Message-----
> > > > From: Gao, Zhichao <zhichao.gao@intel.com>
> > > > Sent: Thursday, September 9, 2021 3:26 PM
> > > > To: devel@edk2.groups.io
> > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > > <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> > > > Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> > string
> > > > drawing within one line
> > > >
> > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> > > >
> > > > Limit the draw box always within the screen's column and row.
> > > > Limit the string drawing within one line.
> > > >
> > > > Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> > > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > > > Cc: Ray Ni <ray.ni@intel.com>
> > > > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > > > ---
> > > >
> > > > V2:
> > > >
> > > > Drop the change in UefiBootManagerLib in V1.
> > > >
> > > > Add the limitation in BootManagerMenuApp instead.
> > > >
> > > >
> > > >  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> > > > ++++++++++++++++++-
> > > >  1 file changed, 69 insertions(+), 3 deletions(-)
> > > >
> > > > diff --git
> > > >
> > a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > c
> > > >
> > b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > c
> > > > index 9e729074ec..d4bdeba073 100644
> > > > ---
> > > >
> > a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > c
> > > > +++
> > > >
> > b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > c
> > > > @@ -1,7 +1,7 @@
> > > >  /** @file
> > > >
> > > >    The application to show the Boot Manager Menu.
> > > >
> > > >
> > > >
> > > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights
> > > > reserved.<BR>
> > > >
> > > > +Copyright (c) 2011 - 2021, Intel Corporation. All rights
> > > > +reserved.<BR>
> > > >
> > > >  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > >
> > > >
> > > >
> > > >  **/
> > > >
> > > > @@ -45,9 +45,56 @@ PrintStringAt (
> > > >    IN CHAR16    *String
> > > >
> > > >    )
> > > >
> > > >  {
> > > >
> > > > +  UINTN         ScreenWidth;
> > > >
> > > > +  UINTN         ScreenRows;
> > > >
> > > > +  CHAR16        *TurncateString;
> > > >
> > > > +  EFI_STATUS    Status;
> > > >
> > > > +  UINTN         ShowingLength;
> > > >
> > > >
> > > >
> > > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > > >
> > > > -  return Print (L"%s", String);
> > > >
> > > > +
> > > >
> > > > +  gST->ConOut->QueryMode (
> > > >
> > > > +                 gST->ConOut,
> > > >
> > > > +                 gST->ConOut->Mode->Mode,
> > > >
> > > > +                 &ScreenWidth,
> > > >
> > > > +                 &ScreenRows
> > > >
> > > > +                 );
> > > >
> > > > +
> > > >
> > > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > > >
> > > > +    return 0;
> > > >
> > > > +  }
> > > >
> > > > +
> > > >
> > > > +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> > > >
> > > > +    //
> > > >
> > > > +    // |      - ScreenWidth -       |
> > > >
> > > > +    // ...Column.....................
> > > >
> > > > +    // TurncateString length should leave one character for draw
> > > > + box
> > and
> > > >
> > > > +    // require one character for string end.
> > > >
> > > > +    //
> > > >
> > > > +    ShowingLength = ScreenWidth - Column - 1;
> > > >
> > > > +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof
> > (CHAR16));
> > > >
> > > > +
> > > >
> > > > +    if (TurncateString == NULL) {
> > > >
> > > > +      return 0;
> > > >
> > > > +    }
> > > >
> > > > +
> > > >
> > > > +    Status = StrnCpyS (TurncateString, ShowingLength + 1, String,
> > > > ShowingLength - 3);
> > > >
> > > > +
> > > >
> > > > +    if (EFI_ERROR (Status)) {
> > > >
> > > > +      FreePool (TurncateString);
> > > >
> > > > +      return 0;
> > > >
> > > > +    }
> > > >
> > > > +
> > > >
> > > > +    *(TurncateString + ShowingLength - 3) = L'.';
> > > >
> > > > +    *(TurncateString + ShowingLength - 2) = L'.';
> > > >
> > > > +    *(TurncateString + ShowingLength - 1) = L'.';
> > > >
> > > > +    *(TurncateString + ShowingLength)     = L'\0';
> > > >
> > > > +    ShowingLength = Print (L"%s", TurncateString);
> > > >
> > > > +    FreePool (TurncateString);
> > > >
> > > > +    return ShowingLength;
> > > >
> > > > +  } else {
> > > >
> > > > +    return Print (L"%s", String);
> > > >
> > > > +  }
> > > >
> > > >  }
> > > >
> > > >
> > > >
> > > >  /**
> > > >
> > > > @@ -68,7 +115,22 @@ PrintCharAt (
> > > >    CHAR16       Character
> > > >
> > > >    )
> > > >
> > > >  {
> > > >
> > > > +  UINTN         ScreenWidth;
> > > >
> > > > +  UINTN         ScreenRows;
> > > >
> > > > +
> > > >
> > > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > > >
> > > > +
> > > >
> > > > +  gST->ConOut->QueryMode (
> > > >
> > > > +                 gST->ConOut,
> > > >
> > > > +                 gST->ConOut->Mode->Mode,
> > > >
> > > > +                 &ScreenWidth,
> > > >
> > > > +                 &ScreenRows
> > > >
> > > > +                 );
> > > >
> > > > +
> > > >
> > > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > > >
> > > > +    return 0;
> > > >
> > > > +  }
> > > >
> > > > +
> > > >
> > > >    return Print (L"%c", Character);
> > > >
> > > >  }
> > > >
> > > >
> > > >
> > > > @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> > > >
> > > >
> > > >    MaxPrintRows = Row - 6;
> > > >
> > > >    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 +
> > > HELP_TOKEN_COUNT + 2;
> > > >
> > > > -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > > >
> > > > +  if (MaxStrWidth + 8 > Column) {
> > > >
> > > > +    BootMenuData->MenuScreen.Width = Column;
> > > >
> > > > +  } else {
> > > >
> > > > +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > > >
> > > > +  }
> > > >
> > > >    if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
> > > >
> > > >      BootMenuData->MenuScreen.Height = MaxPrintRows;
> > > >
> > > >      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> > > >
> > > > --
> > > > 2.31.1.windows.1
> > >
> > >
> > >
> > >
> > >
> >
> >
> >
> >
> >
> > 
> >



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81014): https://edk2.groups.io/g/devel/message/81014
Mute This Topic: https://groups.io/mt/85806969/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Gao, Zhichao 2 years, 6 months ago
Hi Ray,
That is one way for platform to customize their own boot option. It can solve the issue. But my point is it should not be used in such case. If EDK2 want a default behavior of the boot option description, we should change at the root instead of using the customize interfaces.

Thanks,
Zhichao

> -----Original Message-----
> From: Ni, Ray <ray.ni@intel.com>
> Sent: Thursday, September 23, 2021 3:43 PM
> To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io;
> gaoliming@byosoft.com.cn
> Cc: Wang, Jian J <jian.j.wang@intel.com>
> Subject: RE: [edk2-devel] [PATCH V2]
> MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> 
> Another option is to use EfiBootManagerRegisterBootDescriptionHandler()
> to alter the boot descriptions.
> 
> > -----Original Message-----
> > From: Gao, Zhichao <zhichao.gao@intel.com>
> > Sent: Thursday, September 23, 2021 11:47 AM
> > To: devel@edk2.groups.io; gaoliming@byosoft.com.cn; Ni, Ray
> > <ray.ni@intel.com>
> > Cc: Wang, Jian J <jian.j.wang@intel.com>
> > Subject: RE: [edk2-devel] [PATCH V2]
> MdeModulePkg/BootManagerMenuApp:
> > Limit string drawing within one line
> >
> > Hi Liming,
> >
> > Yes. Because the design of the BM app is not aimed to display the boot
> > option over one line. And it is not using the setup browser engine.
> > That would cause the difference.
> > If we want to make them align, there are two options:
> > 1. BM app to use the setup browser engine 2. add scroll bar logic for
> > the boot item
> >
> > Both above change is not simple and may cause new issues. It would be a
> new design other than a bug fix.
> >
> > Another solution is the patch V1 to limit the boot option description
> > within 72 characters. Ray pointed out it is not a good solution.
> >
> > BTW, I would remove the change-id in next patch.
> >
> > Thanks,
> > Zhichao
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> > > gaoliming
> > > Sent: Thursday, September 23, 2021 10:59 AM
> > > To: devel@edk2.groups.io; Gao, Zhichao <zhichao.gao@intel.com>; Ni,
> > > Ray <ray.ni@intel.com>
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>
> > > Subject: 回复: [edk2-devel] [PATCH V2]
> > > MdeModulePkg/BootManagerMenuApp: Limit string drawing within one
> > > line
> > >
> > > Zhichao:
> > >   With this change, the same boot option will be displayed
> > > differently in BootManagerApp and BootManager Page. Is it the designed
> behavior?
> > >
> > >   Besides, please remove change-id from the commit message.
> > >
> > > Thanks
> > > Liming
> > > > -----邮件原件-----
> > > > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Gao,
> > > Zhichao
> > > > 发送时间: 2021年9月22日 12:50
> > > > 收件人: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Liming Gao
> > > > <gaoliming@byosoft.com.cn>
> > > > 抄送: Wang, Jian J <jian.j.wang@intel.com>
> > > > 主题: Re: [edk2-devel] [PATCH V2]
> > > MdeModulePkg/BootManagerMenuApp:
> > > > Limit string drawing within one line
> > > >
> > > > Hi Liming,
> > > >
> > > > The solution is different with the first time we discussed on the
> > > Bugzilla. Can
> > > > you review if it is OK to you?
> > > >
> > > > Thanks,
> > > > Zhichao
> > > >
> > > > > -----Original Message-----
> > > > > From: Ni, Ray <ray.ni@intel.com>
> > > > > Sent: Wednesday, September 22, 2021 11:28 AM
> > > > > To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
> > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > > > <gaoliming@byosoft.com.cn>
> > > > > Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp:
> Limit
> > > > > string drawing within one line
> > > > >
> > > > > Reviewed-by: Ray Ni <ray.ni@intel.com>
> > > > >
> > > > > -----Original Message-----
> > > > > From: Gao, Zhichao <zhichao.gao@intel.com>
> > > > > Sent: Thursday, September 9, 2021 3:26 PM
> > > > > To: devel@edk2.groups.io
> > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > > > <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> > > > > Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> > > string
> > > > > drawing within one line
> > > > >
> > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> > > > >
> > > > > Limit the draw box always within the screen's column and row.
> > > > > Limit the string drawing within one line.
> > > > >
> > > > > Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> > > > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > > > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > > > > Cc: Ray Ni <ray.ni@intel.com>
> > > > > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > > > > ---
> > > > >
> > > > > V2:
> > > > >
> > > > > Drop the change in UefiBootManagerLib in V1.
> > > > >
> > > > > Add the limitation in BootManagerMenuApp instead.
> > > > >
> > > > >
> > > > >  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> > > > > ++++++++++++++++++-
> > > > >  1 file changed, 69 insertions(+), 3 deletions(-)
> > > > >
> > > > > diff --git
> > > > >
> > >
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > c
> > > > >
> > >
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > c
> > > > > index 9e729074ec..d4bdeba073 100644
> > > > > ---
> > > > >
> > >
> a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > c
> > > > > +++
> > > > >
> > >
> b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > c
> > > > > @@ -1,7 +1,7 @@
> > > > >  /** @file
> > > > >
> > > > >    The application to show the Boot Manager Menu.
> > > > >
> > > > >
> > > > >
> > > > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights
> > > > > reserved.<BR>
> > > > >
> > > > > +Copyright (c) 2011 - 2021, Intel Corporation. All rights
> > > > > +reserved.<BR>
> > > > >
> > > > >  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > > >
> > > > >
> > > > >
> > > > >  **/
> > > > >
> > > > > @@ -45,9 +45,56 @@ PrintStringAt (
> > > > >    IN CHAR16    *String
> > > > >
> > > > >    )
> > > > >
> > > > >  {
> > > > >
> > > > > +  UINTN         ScreenWidth;
> > > > >
> > > > > +  UINTN         ScreenRows;
> > > > >
> > > > > +  CHAR16        *TurncateString;
> > > > >
> > > > > +  EFI_STATUS    Status;
> > > > >
> > > > > +  UINTN         ShowingLength;
> > > > >
> > > > >
> > > > >
> > > > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > > > >
> > > > > -  return Print (L"%s", String);
> > > > >
> > > > > +
> > > > >
> > > > > +  gST->ConOut->QueryMode (
> > > > >
> > > > > +                 gST->ConOut,
> > > > >
> > > > > +                 gST->ConOut->Mode->Mode,
> > > > >
> > > > > +                 &ScreenWidth,
> > > > >
> > > > > +                 &ScreenRows
> > > > >
> > > > > +                 );
> > > > >
> > > > > +
> > > > >
> > > > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > > > >
> > > > > +    return 0;
> > > > >
> > > > > +  }
> > > > >
> > > > > +
> > > > >
> > > > > +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> > > > >
> > > > > +    //
> > > > >
> > > > > +    // |      - ScreenWidth -       |
> > > > >
> > > > > +    // ...Column.....................
> > > > >
> > > > > +    // TurncateString length should leave one character for
> > > > > + draw box
> > > and
> > > > >
> > > > > +    // require one character for string end.
> > > > >
> > > > > +    //
> > > > >
> > > > > +    ShowingLength = ScreenWidth - Column - 1;
> > > > >
> > > > > +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof
> > > (CHAR16));
> > > > >
> > > > > +
> > > > >
> > > > > +    if (TurncateString == NULL) {
> > > > >
> > > > > +      return 0;
> > > > >
> > > > > +    }
> > > > >
> > > > > +
> > > > >
> > > > > +    Status = StrnCpyS (TurncateString, ShowingLength + 1,
> > > > > + String,
> > > > > ShowingLength - 3);
> > > > >
> > > > > +
> > > > >
> > > > > +    if (EFI_ERROR (Status)) {
> > > > >
> > > > > +      FreePool (TurncateString);
> > > > >
> > > > > +      return 0;
> > > > >
> > > > > +    }
> > > > >
> > > > > +
> > > > >
> > > > > +    *(TurncateString + ShowingLength - 3) = L'.';
> > > > >
> > > > > +    *(TurncateString + ShowingLength - 2) = L'.';
> > > > >
> > > > > +    *(TurncateString + ShowingLength - 1) = L'.';
> > > > >
> > > > > +    *(TurncateString + ShowingLength)     = L'\0';
> > > > >
> > > > > +    ShowingLength = Print (L"%s", TurncateString);
> > > > >
> > > > > +    FreePool (TurncateString);
> > > > >
> > > > > +    return ShowingLength;
> > > > >
> > > > > +  } else {
> > > > >
> > > > > +    return Print (L"%s", String);
> > > > >
> > > > > +  }
> > > > >
> > > > >  }
> > > > >
> > > > >
> > > > >
> > > > >  /**
> > > > >
> > > > > @@ -68,7 +115,22 @@ PrintCharAt (
> > > > >    CHAR16       Character
> > > > >
> > > > >    )
> > > > >
> > > > >  {
> > > > >
> > > > > +  UINTN         ScreenWidth;
> > > > >
> > > > > +  UINTN         ScreenRows;
> > > > >
> > > > > +
> > > > >
> > > > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > > > >
> > > > > +
> > > > >
> > > > > +  gST->ConOut->QueryMode (
> > > > >
> > > > > +                 gST->ConOut,
> > > > >
> > > > > +                 gST->ConOut->Mode->Mode,
> > > > >
> > > > > +                 &ScreenWidth,
> > > > >
> > > > > +                 &ScreenRows
> > > > >
> > > > > +                 );
> > > > >
> > > > > +
> > > > >
> > > > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > > > >
> > > > > +    return 0;
> > > > >
> > > > > +  }
> > > > >
> > > > > +
> > > > >
> > > > >    return Print (L"%c", Character);
> > > > >
> > > > >  }
> > > > >
> > > > >
> > > > >
> > > > > @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> > > > >
> > > > >
> > > > >    MaxPrintRows = Row - 6;
> > > > >
> > > > >    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 +
> > > > HELP_TOKEN_COUNT + 2;
> > > > >
> > > > > -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > > > >
> > > > > +  if (MaxStrWidth + 8 > Column) {
> > > > >
> > > > > +    BootMenuData->MenuScreen.Width = Column;
> > > > >
> > > > > +  } else {
> > > > >
> > > > > +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > > > >
> > > > > +  }
> > > > >
> > > > >    if (BootMenuData->ItemCount + UnSelectableItmes >
> > > > > MaxPrintRows) {
> > > > >
> > > > >      BootMenuData->MenuScreen.Height = MaxPrintRows;
> > > > >
> > > > >      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> > > > >
> > > > > --
> > > > > 2.31.1.windows.1
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> > > 
> > >



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81016): https://edk2.groups.io/g/devel/message/81016
Mute This Topic: https://groups.io/mt/85806969/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
Posted by Ni, Ray 2 years, 6 months ago
Limiting the boot description to a fixed number of characters should be a platform policy.
BDS common logic should NOT do that.

Imagine a platform that contains a fancy UI with scrollbar or supports a big resolution.
Such platform can still use the BdsDxe driver. But it doesn't need the BootManagerMenuApp.

> -----Original Message-----
> From: Gao, Zhichao <zhichao.gao@intel.com>
> Sent: Thursday, September 23, 2021 4:22 PM
> To: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; gaoliming@byosoft.com.cn
> Cc: Wang, Jian J <jian.j.wang@intel.com>
> Subject: RE: [edk2-devel] [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> 
> Hi Ray,
> That is one way for platform to customize their own boot option. It can solve the issue. But my point is it should not be used in
> such case. If EDK2 want a default behavior of the boot option description, we should change at the root instead of using the
> customize interfaces.
> 
> Thanks,
> Zhichao
> 
> > -----Original Message-----
> > From: Ni, Ray <ray.ni@intel.com>
> > Sent: Thursday, September 23, 2021 3:43 PM
> > To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io;
> > gaoliming@byosoft.com.cn
> > Cc: Wang, Jian J <jian.j.wang@intel.com>
> > Subject: RE: [edk2-devel] [PATCH V2]
> > MdeModulePkg/BootManagerMenuApp: Limit string drawing within one line
> >
> > Another option is to use EfiBootManagerRegisterBootDescriptionHandler()
> > to alter the boot descriptions.
> >
> > > -----Original Message-----
> > > From: Gao, Zhichao <zhichao.gao@intel.com>
> > > Sent: Thursday, September 23, 2021 11:47 AM
> > > To: devel@edk2.groups.io; gaoliming@byosoft.com.cn; Ni, Ray
> > > <ray.ni@intel.com>
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>
> > > Subject: RE: [edk2-devel] [PATCH V2]
> > MdeModulePkg/BootManagerMenuApp:
> > > Limit string drawing within one line
> > >
> > > Hi Liming,
> > >
> > > Yes. Because the design of the BM app is not aimed to display the boot
> > > option over one line. And it is not using the setup browser engine.
> > > That would cause the difference.
> > > If we want to make them align, there are two options:
> > > 1. BM app to use the setup browser engine 2. add scroll bar logic for
> > > the boot item
> > >
> > > Both above change is not simple and may cause new issues. It would be a
> > new design other than a bug fix.
> > >
> > > Another solution is the patch V1 to limit the boot option description
> > > within 72 characters. Ray pointed out it is not a good solution.
> > >
> > > BTW, I would remove the change-id in next patch.
> > >
> > > Thanks,
> > > Zhichao
> > >
> > > > -----Original Message-----
> > > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> > > > gaoliming
> > > > Sent: Thursday, September 23, 2021 10:59 AM
> > > > To: devel@edk2.groups.io; Gao, Zhichao <zhichao.gao@intel.com>; Ni,
> > > > Ray <ray.ni@intel.com>
> > > > Cc: Wang, Jian J <jian.j.wang@intel.com>
> > > > Subject: 回复: [edk2-devel] [PATCH V2]
> > > > MdeModulePkg/BootManagerMenuApp: Limit string drawing within one
> > > > line
> > > >
> > > > Zhichao:
> > > >   With this change, the same boot option will be displayed
> > > > differently in BootManagerApp and BootManager Page. Is it the designed
> > behavior?
> > > >
> > > >   Besides, please remove change-id from the commit message.
> > > >
> > > > Thanks
> > > > Liming
> > > > > -----邮件原件-----
> > > > > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Gao,
> > > > Zhichao
> > > > > 发送时间: 2021年9月22日 12:50
> > > > > 收件人: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io; Liming Gao
> > > > > <gaoliming@byosoft.com.cn>
> > > > > 抄送: Wang, Jian J <jian.j.wang@intel.com>
> > > > > 主题: Re: [edk2-devel] [PATCH V2]
> > > > MdeModulePkg/BootManagerMenuApp:
> > > > > Limit string drawing within one line
> > > > >
> > > > > Hi Liming,
> > > > >
> > > > > The solution is different with the first time we discussed on the
> > > > Bugzilla. Can
> > > > > you review if it is OK to you?
> > > > >
> > > > > Thanks,
> > > > > Zhichao
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Ni, Ray <ray.ni@intel.com>
> > > > > > Sent: Wednesday, September 22, 2021 11:28 AM
> > > > > > To: Gao, Zhichao <zhichao.gao@intel.com>; devel@edk2.groups.io
> > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > > > > <gaoliming@byosoft.com.cn>
> > > > > > Subject: RE: [PATCH V2] MdeModulePkg/BootManagerMenuApp:
> > Limit
> > > > > > string drawing within one line
> > > > > >
> > > > > > Reviewed-by: Ray Ni <ray.ni@intel.com>
> > > > > >
> > > > > > -----Original Message-----
> > > > > > From: Gao, Zhichao <zhichao.gao@intel.com>
> > > > > > Sent: Thursday, September 9, 2021 3:26 PM
> > > > > > To: devel@edk2.groups.io
> > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Liming Gao
> > > > > > <gaoliming@byosoft.com.cn>; Ni, Ray <ray.ni@intel.com>
> > > > > > Subject: [PATCH V2] MdeModulePkg/BootManagerMenuApp: Limit
> > > > string
> > > > > > drawing within one line
> > > > > >
> > > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3590
> > > > > >
> > > > > > Limit the draw box always within the screen's column and row.
> > > > > > Limit the string drawing within one line.
> > > > > >
> > > > > > Change-Id: Ib7bd63cb07b23875a1e4f37ae80a422e1d5ed54f
> > > > > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > > > > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > > > > > Cc: Ray Ni <ray.ni@intel.com>
> > > > > > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > > > > > ---
> > > > > >
> > > > > > V2:
> > > > > >
> > > > > > Drop the change in UefiBootManagerLib in V1.
> > > > > >
> > > > > > Add the limitation in BootManagerMenuApp instead.
> > > > > >
> > > > > >
> > > > > >  .../BootManagerMenuApp/BootManagerMenu.c      | 72
> > > > > > ++++++++++++++++++-
> > > > > >  1 file changed, 69 insertions(+), 3 deletions(-)
> > > > > >
> > > > > > diff --git
> > > > > >
> > > >
> > a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > > c
> > > > > >
> > > >
> > b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > > c
> > > > > > index 9e729074ec..d4bdeba073 100644
> > > > > > ---
> > > > > >
> > > >
> > a/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > > c
> > > > > > +++
> > > > > >
> > > >
> > b/MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenu.
> > > > > > c
> > > > > > @@ -1,7 +1,7 @@
> > > > > >  /** @file
> > > > > >
> > > > > >    The application to show the Boot Manager Menu.
> > > > > >
> > > > > >
> > > > > >
> > > > > > -Copyright (c) 2011 - 2018, Intel Corporation. All rights
> > > > > > reserved.<BR>
> > > > > >
> > > > > > +Copyright (c) 2011 - 2021, Intel Corporation. All rights
> > > > > > +reserved.<BR>
> > > > > >
> > > > > >  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > > > >
> > > > > >
> > > > > >
> > > > > >  **/
> > > > > >
> > > > > > @@ -45,9 +45,56 @@ PrintStringAt (
> > > > > >    IN CHAR16    *String
> > > > > >
> > > > > >    )
> > > > > >
> > > > > >  {
> > > > > >
> > > > > > +  UINTN         ScreenWidth;
> > > > > >
> > > > > > +  UINTN         ScreenRows;
> > > > > >
> > > > > > +  CHAR16        *TurncateString;
> > > > > >
> > > > > > +  EFI_STATUS    Status;
> > > > > >
> > > > > > +  UINTN         ShowingLength;
> > > > > >
> > > > > >
> > > > > >
> > > > > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > > > > >
> > > > > > -  return Print (L"%s", String);
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +  gST->ConOut->QueryMode (
> > > > > >
> > > > > > +                 gST->ConOut,
> > > > > >
> > > > > > +                 gST->ConOut->Mode->Mode,
> > > > > >
> > > > > > +                 &ScreenWidth,
> > > > > >
> > > > > > +                 &ScreenRows
> > > > > >
> > > > > > +                 );
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > > > > >
> > > > > > +    return 0;
> > > > > >
> > > > > > +  }
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +  if ((StrLen (String) + Column) > (ScreenWidth - 1)) {
> > > > > >
> > > > > > +    //
> > > > > >
> > > > > > +    // |      - ScreenWidth -       |
> > > > > >
> > > > > > +    // ...Column.....................
> > > > > >
> > > > > > +    // TurncateString length should leave one character for
> > > > > > + draw box
> > > > and
> > > > > >
> > > > > > +    // require one character for string end.
> > > > > >
> > > > > > +    //
> > > > > >
> > > > > > +    ShowingLength = ScreenWidth - Column - 1;
> > > > > >
> > > > > > +    TurncateString = AllocatePool ((ShowingLength + 1) * sizeof
> > > > (CHAR16));
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +    if (TurncateString == NULL) {
> > > > > >
> > > > > > +      return 0;
> > > > > >
> > > > > > +    }
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +    Status = StrnCpyS (TurncateString, ShowingLength + 1,
> > > > > > + String,
> > > > > > ShowingLength - 3);
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +    if (EFI_ERROR (Status)) {
> > > > > >
> > > > > > +      FreePool (TurncateString);
> > > > > >
> > > > > > +      return 0;
> > > > > >
> > > > > > +    }
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +    *(TurncateString + ShowingLength - 3) = L'.';
> > > > > >
> > > > > > +    *(TurncateString + ShowingLength - 2) = L'.';
> > > > > >
> > > > > > +    *(TurncateString + ShowingLength - 1) = L'.';
> > > > > >
> > > > > > +    *(TurncateString + ShowingLength)     = L'\0';
> > > > > >
> > > > > > +    ShowingLength = Print (L"%s", TurncateString);
> > > > > >
> > > > > > +    FreePool (TurncateString);
> > > > > >
> > > > > > +    return ShowingLength;
> > > > > >
> > > > > > +  } else {
> > > > > >
> > > > > > +    return Print (L"%s", String);
> > > > > >
> > > > > > +  }
> > > > > >
> > > > > >  }
> > > > > >
> > > > > >
> > > > > >
> > > > > >  /**
> > > > > >
> > > > > > @@ -68,7 +115,22 @@ PrintCharAt (
> > > > > >    CHAR16       Character
> > > > > >
> > > > > >    )
> > > > > >
> > > > > >  {
> > > > > >
> > > > > > +  UINTN         ScreenWidth;
> > > > > >
> > > > > > +  UINTN         ScreenRows;
> > > > > >
> > > > > > +
> > > > > >
> > > > > >    gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +  gST->ConOut->QueryMode (
> > > > > >
> > > > > > +                 gST->ConOut,
> > > > > >
> > > > > > +                 gST->ConOut->Mode->Mode,
> > > > > >
> > > > > > +                 &ScreenWidth,
> > > > > >
> > > > > > +                 &ScreenRows
> > > > > >
> > > > > > +                 );
> > > > > >
> > > > > > +
> > > > > >
> > > > > > +  if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
> > > > > >
> > > > > > +    return 0;
> > > > > >
> > > > > > +  }
> > > > > >
> > > > > > +
> > > > > >
> > > > > >    return Print (L"%c", Character);
> > > > > >
> > > > > >  }
> > > > > >
> > > > > >
> > > > > >
> > > > > > @@ -193,7 +255,11 @@ InitializeBootMenuScreen (
> > > > > >
> > > > > >
> > > > > >    MaxPrintRows = Row - 6;
> > > > > >
> > > > > >    UnSelectableItmes = TITLE_TOKEN_COUNT + 2 +
> > > > > HELP_TOKEN_COUNT + 2;
> > > > > >
> > > > > > -  BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > > > > >
> > > > > > +  if (MaxStrWidth + 8 > Column) {
> > > > > >
> > > > > > +    BootMenuData->MenuScreen.Width = Column;
> > > > > >
> > > > > > +  } else {
> > > > > >
> > > > > > +    BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
> > > > > >
> > > > > > +  }
> > > > > >
> > > > > >    if (BootMenuData->ItemCount + UnSelectableItmes >
> > > > > > MaxPrintRows) {
> > > > > >
> > > > > >      BootMenuData->MenuScreen.Height = MaxPrintRows;
> > > > > >
> > > > > >      BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
> > > > > >
> > > > > > --
> > > > > > 2.31.1.windows.1
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > 
> > > >



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81058): https://edk2.groups.io/g/devel/message/81058
Mute This Topic: https://groups.io/mt/85806969/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-