There can be cases when we would like to move terminal window. For example, it 
follows our theme design.

So,

options:
terminal-top
terminal-left
terminal-width
terminal-height
terminal-border

(the last is for setting terminal-border width)

All of these were hard-coded.

Tested on all cases. Safe. (if some part of the terminal window is going to 
fall of the screen rectangle, parameters will be correspondingly auto-
adjusted)

-- 
With best regards,
_______________________________
Vladimir Testov, ROSA Laboratory.
www.rosalab.ru
diff -Naur grub-new4/docs/grub.texi grub-new5/docs/grub.texi
--- grub-new4/docs/grub.texi	2013-04-26 11:58:20.041859276 +0400
+++ grub-new5/docs/grub.texi	2013-04-26 11:58:37.055800288 +0400
@@ -1901,6 +1901,11 @@
 @item desktop-image @tab Specifies the image to use as the background.  It will be scaled to fit the screen size.
 @item desktop-color @tab Specifies the color for the background if *desktop-image* is not specified.
 @item terminal-box @tab Specifies the file name pattern for the styled box slices used for the command line terminal window.  For example, ``terminal-box: terminal_*.png'' will use the images ``terminal_c.png`` as the center area, ``terminal_n.png`` as the north (top) edge, ``terminal_nw.png`` as the northwest (upper left) corner, and so on.  If the image for any slice is not found, it will simply be left empty.
+@item terminal-border @tab Specifies the terminal border's width.
+@item terminal-left @tab Specifies the terminal left coordinate.
+@item terminal-top @tab Specifies the termianl top coordinate.
+@item terminal-width @tab Specifies the terminal width.
+@item terminal-height @tab Specifies the terminal height.
 @end multitable
 
 
diff -Naur grub-new4/grub-core/gfxmenu/theme_loader.c grub-new5/grub-core/gfxmenu/theme_loader.c
--- grub-new4/grub-core/gfxmenu/theme_loader.c	2013-04-24 12:50:05.143117525 +0400
+++ grub-new5/grub-core/gfxmenu/theme_loader.c	2013-04-25 20:26:25.133801135 +0400
@@ -31,6 +31,9 @@
 #include <grub/gfxmenu_view.h>
 #include <grub/gui.h>
 
+static grub_err_t
+parse_proportional_spec (char *value, signed *abs, grub_fixed_signed_t *prop);
+
 /* Construct a new box widget using ABSPATTERN to find the pixmap files for
    it, storing the new box instance at *BOXPTR.
    PATTERN should be of the form: "(hd0,0)/somewhere/style*.png".
@@ -178,6 +181,56 @@
         if (err != GRUB_ERR_NONE)
           return err;
     }
+  else if (! grub_strcmp ("terminal-border", name))
+    {
+      view->terminal_border = grub_strtol (value, 0, 10);
+      if (grub_errno)
+        return grub_errno;
+    }
+  else if (! grub_strcmp ("terminal-left", name))
+    {
+      grub_err_t err;
+      grub_fixed_signed_t frac;
+      signed pixels;
+      err = parse_proportional_spec (value, &pixels, &frac);
+      if (err != GRUB_ERR_NONE)
+        return err;
+      view->x = pixels;
+      view->xfrac = frac;
+    }
+  else if (! grub_strcmp ("terminal-top", name))
+    {
+      grub_err_t err;
+      grub_fixed_signed_t frac;
+      signed pixels;
+      err = parse_proportional_spec (value, &pixels, &frac);
+      if (err != GRUB_ERR_NONE)
+        return err;
+      view->y = pixels;
+      view->yfrac = frac;
+    }
+  else if (! grub_strcmp ("terminal-width", name))
+    {
+      grub_err_t err;
+      grub_fixed_signed_t frac;
+      signed pixels;
+      err = parse_proportional_spec (value, &pixels, &frac);
+      if (err != GRUB_ERR_NONE)
+        return err;
+      view->w = pixels;
+      view->wfrac = frac;
+    }
+  else if (! grub_strcmp ("terminal-height", name))
+    {
+      grub_err_t err;
+      grub_fixed_signed_t frac;
+      signed pixels;
+      err = parse_proportional_spec (value, &pixels, &frac);
+      if (err != GRUB_ERR_NONE)
+        return err;
+      view->h = pixels;
+      view->hfrac = frac;
+    }
   else if (! grub_strcmp ("title-text", name))
     {
       grub_free (view->title_text);
diff -Naur grub-new4/grub-core/gfxmenu/view.c grub-new5/grub-core/gfxmenu/view.c
--- grub-new4/grub-core/gfxmenu/view.c	2013-04-24 12:34:44.999051941 +0400
+++ grub-new5/grub-core/gfxmenu/view.c	2013-04-26 16:00:37.923386069 +0400
@@ -40,7 +40,6 @@
 
 static void
 init_terminal (grub_gfxmenu_view_t view);
-static grub_video_rect_t term_rect;
 static grub_gfxmenu_view_t term_view;
 
 /* Create a new view object, loading the theme specified by THEME_PATH and
@@ -63,6 +62,19 @@
   view->screen.width = width;
   view->screen.height = height;
 
+  view->terminal_border = 3;
+
+  /* view->terminal_rect will be defined during execution of init_terminal */
+
+  view->x = 0;
+  view->xfrac = 0;
+  view->y = 0;
+  view->yfrac = 0;
+  view->w = 0;
+  view->wfrac = 0;
+  view->h = 0;
+  view->hfrac = 0;
+
   default_font = grub_font_get ("Unknown Regular 16");
   default_fg_color = grub_video_rgba_color_rgb (0, 0, 0);
   default_bg_color = grub_video_rgba_color_rgb (255, 255, 255);
@@ -219,7 +231,7 @@
 grub_gfxmenu_view_redraw (grub_gfxmenu_view_t view,
 			  const grub_video_rect_t *region)
 {
-  if (grub_video_have_common_points (&term_rect, region))
+  if (grub_video_have_common_points (&view->terminal_rect, region))
     grub_gfxterm_schedule_repaint ();
 
   grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
@@ -300,25 +312,36 @@
   term_box = term_view->terminal_box;
   if (!term_box)
     return;
-  
-  term_box->set_content_size (term_box, term_rect.width,
-			      term_rect.height);
+
+  term_box->set_content_size (term_box, term_view->terminal_rect.width,
+			      term_view->terminal_rect.height);
   
   term_box->draw (term_box,
-		  term_rect.x - term_box->get_left_pad (term_box),
-		  term_rect.y - term_box->get_top_pad (term_box));
+		  term_view->terminal_rect.x - term_box->get_left_pad (term_box),
+		  term_view->terminal_rect.y - term_box->get_top_pad (term_box));
 }
 
 static void
-init_terminal (grub_gfxmenu_view_t view)
+get_min_terminal (grub_font_t terminal_font, int border_width,
+                         unsigned int *width, unsigned int *height)
 {
-  const int border_width = 3;
+  struct grub_font_glyph *glyph;
+  glyph = grub_font_get_glyph (terminal_font, 'M');
+  *width = (glyph? glyph->device_width : 8) * 80 + 2 * border_width;
+  *height = (grub_font_get_ascent (terminal_font)
+             + grub_font_get_descent (terminal_font)) * 20 + 2 * border_width;
+}
 
+static void
+init_terminal (grub_gfxmenu_view_t view)
+{
+  if (view->terminal_border < 0)
+    view->terminal_border = 0;
+  int border_width = view->terminal_border;
+  grub_video_rect_t screen_rect = view->screen;
   grub_font_t terminal_font;
-
   unsigned int line_width;
-
-  struct grub_font_glyph *glyph;
+  unsigned int line_height;
 
   terminal_font = grub_font_get (view->terminal_font_name);
   if (!terminal_font)
@@ -327,36 +350,71 @@
       return;
     }
 
-  glyph = grub_font_get_glyph (terminal_font, 'M');
-
-  line_width = ((glyph ? glyph->device_width : 8) * 80 + 2 * border_width);
-
-  if (view->screen.width <= line_width)
-    /* The screen is too small. Use all space, except a small border
-       to show the user, it is a window and not full screen: */
-    term_rect.width = view->screen.width - 6 * border_width;
-  else
+  get_min_terminal (terminal_font, border_width, &line_width, &line_height);
+  /* Check that border_width isn't too big */
+  if ((border_width > 3) && ((line_width >= screen_rect.width)
+                             || (line_height >= screen_rect.height)))
     {
-      /* The screen is big enough. Try 70% of the screen width: */
-      term_rect.width = view->screen.width * 7 / 10;
-      /* Make sure, that we use at least the line_width: */
-      if ( term_rect.width < line_width )
-	term_rect.width = line_width;
+      border_width = 3;
+      get_min_terminal (terminal_font, border_width, &line_width, &line_height);
     }
 
-  term_rect.height = view->screen.height * 7 / 10;
+  signed x, y, w, h;
+  x = grub_fixed_sfs_multiply (screen_rect.width, view->xfrac) + view->x;
+  y = grub_fixed_sfs_multiply (screen_rect.height, view->yfrac) + view->y;
+  w = grub_fixed_sfs_multiply (screen_rect.width, view->wfrac) + view->w;
+  h = grub_fixed_sfs_multiply (screen_rect.height, view->hfrac) + view->h;
+
+  /* Sanity checks. */
+  if (w <= 0)
+    w = (signed) screen_rect.width * 7 / 10;
+  if (h <= 0)
+    h = (signed) screen_rect.height * 7 / 10;
+
+  if (w > (signed) screen_rect.width)
+    w = (signed) screen_rect.width;
+  if (h > (signed) screen_rect.height)
+    h = (signed) screen_rect.height;
 
-  term_rect.x = view->screen.x + (view->screen.width  - term_rect.width) / 2;
-  term_rect.y = view->screen.y + (view->screen.height - term_rect.height) / 2;
+  if (screen_rect.width <= line_width)
+    /* The screen is too small. Use all space, except a small border
+       to show the user, it is a window and not full screen: */
+    w = (signed) screen_rect.width - 6 * border_width;
+  else if (w < (signed) line_width)
+    /* The screen is big enough. The desired width is satisfying. */
+    /* Make sure, that we use at least the line_width: */
+    w = (signed) line_width;
+
+  /* The same procedure for height. */
+  if (screen_rect.height <= line_height)
+    h = (signed) screen_rect.height - 6 * border_width;
+  else if (h < (signed) line_height)
+    h = (signed) line_height;
+
+  /* At this point w and h are satisfying. */
+  if (x + w > (signed) screen_rect.width)
+    x = (signed) screen_rect.width - w;
+  if (y + h > (signed) screen_rect.height)
+    y = (signed) screen_rect.height - h;
+
+  if (x < (signed) screen_rect.x)
+    x = (signed) screen_rect.x;
+  if (y < (signed) screen_rect.y)
+    y = (signed) screen_rect.y;
+
+  view->terminal_rect.x = x;
+  view->terminal_rect.width = w;
+  view->terminal_rect.y = y;
+  view->terminal_rect.height = h;
+  view->terminal_border = border_width;
 
   term_view = view;
 
   /* Note: currently there is no API for changing the gfxterm font
      on the fly, so whatever font the initially loaded theme specifies
      will be permanent.  */
-  grub_gfxterm_set_window (GRUB_VIDEO_RENDER_TARGET_DISPLAY, term_rect.x,
-			   term_rect.y,
-			   term_rect.width, term_rect.height,
+  grub_gfxterm_set_window (GRUB_VIDEO_RENDER_TARGET_DISPLAY, 
+                           x, y, w, h,
 			   view->double_repaint, terminal_font,
 			   border_width);
   grub_gfxterm_decorator_hook = grub_gfxmenu_draw_terminal_box;
diff -Naur grub-new4/include/grub/gfxmenu_view.h grub-new5/include/grub/gfxmenu_view.h
--- grub-new4/include/grub/gfxmenu_view.h	2013-04-24 12:29:40.203816750 +0400
+++ grub-new5/include/grub/gfxmenu_view.h	2013-04-25 20:24:58.936119052 +0400
@@ -89,7 +89,18 @@
 struct grub_gfxmenu_view
 {
   grub_video_rect_t screen;
+  grub_video_rect_t terminal_rect;
 
+  signed x;
+  grub_fixed_signed_t xfrac;
+  signed y;
+  grub_fixed_signed_t yfrac;
+  signed w;
+  grub_fixed_signed_t wfrac;
+  signed h;
+  grub_fixed_signed_t hfrac;
+
+  int terminal_border;
   grub_font_t title_font;
   char *terminal_font_name;
   grub_video_rgba_color_t title_color;
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to