mirror of
				https://git.proxmox.com/git/grub2
				synced 2025-11-04 03:55:15 +00:00 
			
		
		
		
	too. * grub-core/gfxmenu/named_colors.c: Move to ... * grub-core/video/colors.c: ... here. Rename grub_gui_get_named_color to grub_video_get_named_color. * grub-core/gfxmenu/gui_string_util.c (my_isxdigit): Move to ... * grub-core/video/colors.c (my_isxdigit): ... here. * grub-core/gfxmenu/gui_string_util.c (parse_hex_color_component): Move to ... * grub-core/video/colors.c (parse_hex_color_component): ... here. * grub-core/gfxmenu/gui_string_util.c (grub_gui_parse_color): Move to ... * grub-core/video/colors.c (grub_video_parse_color): ... here. * include/grub/gui.h (grub_gui_color_t): Move to ... * include/grub/video.h (grub_video_rgba_color_t): ... here. * include/grub/gui.h (grub_gui_color_rgb): Move to ... * include/grub/video.h (grub_video_rgba_color_rgb): ... here. * include/grub/gui.h (grub_gui_map_color): Move to ... * include/grub/video.h (grub_video_map_rgba_color): ... here. * include/grub/gui_string_util.h (grub_gui_get_named_color): Move to ... * include/grub/video.h (grub_video_get_named_color): ... here. * include/grub/gui_string_util.h (grub_gui_parse_color): Move to ... * include/grub/video.h (grub_video_parse_color): ... here. * grub-core/Makefile.core.def (kernel) [videoinkernel]: Add video/colors.c. (gfxmenu): Remove gfxmenu/named_colors.c. (video_colors) [videomodules]: New module, containing video/colors.c.
		
			
				
	
	
		
			249 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* gui.h - GUI components header file. */
 | 
						|
/*
 | 
						|
 *  GRUB  --  GRand Unified Bootloader
 | 
						|
 *  Copyright (C) 2008,2009  Free Software Foundation, Inc.
 | 
						|
 *
 | 
						|
 *  GRUB is free software: you can redistribute it and/or modify
 | 
						|
 *  it under the terms of the GNU General Public License as published by
 | 
						|
 *  the Free Software Foundation, either version 3 of the License, or
 | 
						|
 *  (at your option) any later version.
 | 
						|
 *
 | 
						|
 *  GRUB is distributed in the hope that it will be useful,
 | 
						|
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 *  GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 *  You should have received a copy of the GNU General Public License
 | 
						|
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
 | 
						|
#include <grub/types.h>
 | 
						|
#include <grub/err.h>
 | 
						|
#include <grub/video.h>
 | 
						|
#include <grub/bitmap.h>
 | 
						|
#include <grub/gfxmenu_view.h>
 | 
						|
#include <grub/mm.h>
 | 
						|
 | 
						|
#ifndef GRUB_GUI_H
 | 
						|
#define GRUB_GUI_H 1
 | 
						|
 | 
						|
/* The component ID identifying GUI components to be updated as the timeout
 | 
						|
   status changes.  */
 | 
						|
#define GRUB_GFXMENU_TIMEOUT_COMPONENT_ID "__timeout__"
 | 
						|
 | 
						|
typedef struct grub_gui_component *grub_gui_component_t;
 | 
						|
typedef struct grub_gui_container *grub_gui_container_t;
 | 
						|
typedef struct grub_gui_list *grub_gui_list_t;
 | 
						|
 | 
						|
typedef void (*grub_gui_component_callback) (grub_gui_component_t component,
 | 
						|
                                             void *userdata);
 | 
						|
 | 
						|
/* Component interface.  */
 | 
						|
 | 
						|
struct grub_gui_component_ops
 | 
						|
{
 | 
						|
  void (*destroy) (void *self);
 | 
						|
  const char * (*get_id) (void *self);
 | 
						|
  int (*is_instance) (void *self, const char *type);
 | 
						|
  void (*paint) (void *self, const grub_video_rect_t *bounds);
 | 
						|
  void (*set_parent) (void *self, grub_gui_container_t parent);
 | 
						|
  grub_gui_container_t (*get_parent) (void *self);
 | 
						|
  void (*set_bounds) (void *self, const grub_video_rect_t *bounds);
 | 
						|
  void (*get_bounds) (void *self, grub_video_rect_t *bounds);
 | 
						|
  void (*get_minimal_size) (void *self, unsigned *width, unsigned *height);
 | 
						|
  grub_err_t (*set_property) (void *self, const char *name, const char *value);
 | 
						|
  void (*repaint) (void *self, int second_pass);
 | 
						|
};
 | 
						|
 | 
						|
struct grub_gui_container_ops
 | 
						|
{
 | 
						|
  void (*add) (void *self, grub_gui_component_t comp);
 | 
						|
  void (*remove) (void *self, grub_gui_component_t comp);
 | 
						|
  void (*iterate_children) (void *self,
 | 
						|
                            grub_gui_component_callback cb, void *userdata);
 | 
						|
};
 | 
						|
 | 
						|
struct grub_gui_list_ops
 | 
						|
{
 | 
						|
  void (*set_view_info) (void *self,
 | 
						|
                         grub_gfxmenu_view_t view);
 | 
						|
};
 | 
						|
 | 
						|
struct grub_gui_progress_ops
 | 
						|
{
 | 
						|
  void (*set_state) (void *self, int visible, int start, int current, int end);
 | 
						|
};
 | 
						|
 | 
						|
typedef void (*grub_gfxmenu_set_state_t) (void *self, int visible, int start,
 | 
						|
					  int current, int end);
 | 
						|
 | 
						|
struct grub_gfxmenu_timeout_notify
 | 
						|
{
 | 
						|
  struct grub_gfxmenu_timeout_notify *next;
 | 
						|
  grub_gfxmenu_set_state_t set_state;
 | 
						|
  grub_gui_component_t self;
 | 
						|
};
 | 
						|
 | 
						|
extern struct grub_gfxmenu_timeout_notify *grub_gfxmenu_timeout_notifications;
 | 
						|
 | 
						|
static inline grub_err_t
 | 
						|
grub_gfxmenu_timeout_register (grub_gui_component_t self,
 | 
						|
			       grub_gfxmenu_set_state_t set_state)
 | 
						|
{
 | 
						|
  struct grub_gfxmenu_timeout_notify *ne = grub_malloc (sizeof (*ne));
 | 
						|
  if (!ne)
 | 
						|
    return grub_errno;
 | 
						|
  ne->set_state = set_state;
 | 
						|
  ne->self = self;
 | 
						|
  ne->next = grub_gfxmenu_timeout_notifications;
 | 
						|
  grub_gfxmenu_timeout_notifications = ne;
 | 
						|
  return GRUB_ERR_NONE;
 | 
						|
}
 | 
						|
 | 
						|
static inline void
 | 
						|
grub_gfxmenu_timeout_unregister (grub_gui_component_t self)
 | 
						|
{
 | 
						|
  struct grub_gfxmenu_timeout_notify **p, *q;
 | 
						|
 | 
						|
  for (p = &grub_gfxmenu_timeout_notifications, q = *p;
 | 
						|
       q; p = &(q->next), q = q->next)
 | 
						|
    if (q->self == self)
 | 
						|
      {
 | 
						|
	*p = q->next;
 | 
						|
	break;
 | 
						|
      }
 | 
						|
}
 | 
						|
 | 
						|
typedef signed grub_fixed_signed_t;
 | 
						|
#define GRUB_FIXED_1 0x10000
 | 
						|
 | 
						|
static inline signed
 | 
						|
grub_fixed_sfs_divide (signed a, grub_fixed_signed_t b)
 | 
						|
{
 | 
						|
  return (a * GRUB_FIXED_1) / b;
 | 
						|
}
 | 
						|
 | 
						|
static inline grub_fixed_signed_t
 | 
						|
grub_fixed_fsf_divide (grub_fixed_signed_t a, signed b)
 | 
						|
{
 | 
						|
  return a / b;
 | 
						|
}
 | 
						|
 | 
						|
static inline signed
 | 
						|
grub_fixed_sfs_multiply (signed a, grub_fixed_signed_t b)
 | 
						|
{
 | 
						|
  return (a * b) / GRUB_FIXED_1;
 | 
						|
}
 | 
						|
 | 
						|
static inline signed
 | 
						|
grub_fixed_to_signed (grub_fixed_signed_t in)
 | 
						|
{
 | 
						|
  return in / GRUB_FIXED_1;
 | 
						|
}
 | 
						|
 | 
						|
static inline grub_fixed_signed_t
 | 
						|
grub_signed_to_fixed (signed in)
 | 
						|
{
 | 
						|
  return in * GRUB_FIXED_1;
 | 
						|
}
 | 
						|
 | 
						|
struct grub_gui_component
 | 
						|
{
 | 
						|
  struct grub_gui_component_ops *ops;
 | 
						|
  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;
 | 
						|
};
 | 
						|
 | 
						|
struct grub_gui_progress
 | 
						|
{
 | 
						|
  struct grub_gui_component component;
 | 
						|
  struct grub_gui_progress_ops *ops;
 | 
						|
};
 | 
						|
 | 
						|
struct grub_gui_container
 | 
						|
{
 | 
						|
  struct grub_gui_component component;
 | 
						|
  struct grub_gui_container_ops *ops;
 | 
						|
};
 | 
						|
 | 
						|
struct grub_gui_list
 | 
						|
{
 | 
						|
  struct grub_gui_component component;
 | 
						|
  struct grub_gui_list_ops *ops;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Interfaces to concrete component classes.  */
 | 
						|
 | 
						|
grub_gui_container_t grub_gui_canvas_new (void);
 | 
						|
grub_gui_container_t grub_gui_vbox_new (void);
 | 
						|
grub_gui_container_t grub_gui_hbox_new (void);
 | 
						|
grub_gui_component_t grub_gui_label_new (void);
 | 
						|
grub_gui_component_t grub_gui_image_new (void);
 | 
						|
grub_gui_component_t grub_gui_progress_bar_new (void);
 | 
						|
grub_gui_component_t grub_gui_list_new (void);
 | 
						|
grub_gui_component_t grub_gui_circular_progress_new (void);
 | 
						|
 | 
						|
/* Manipulation functions.  */
 | 
						|
 | 
						|
/* Visit all components with the specified ID.  */
 | 
						|
void grub_gui_find_by_id (grub_gui_component_t root,
 | 
						|
                          const char *id,
 | 
						|
                          grub_gui_component_callback cb,
 | 
						|
                          void *userdata);
 | 
						|
 | 
						|
/* Visit all components.  */
 | 
						|
void grub_gui_iterate_recursively (grub_gui_component_t root,
 | 
						|
                                   grub_gui_component_callback cb,
 | 
						|
                                   void *userdata);
 | 
						|
 | 
						|
/* Helper functions.  */
 | 
						|
 | 
						|
static __inline void
 | 
						|
grub_gui_save_viewport (grub_video_rect_t *r)
 | 
						|
{
 | 
						|
  grub_video_get_viewport ((unsigned *) &r->x,
 | 
						|
                           (unsigned *) &r->y,
 | 
						|
                           (unsigned *) &r->width,
 | 
						|
                           (unsigned *) &r->height);
 | 
						|
}
 | 
						|
 | 
						|
static __inline void
 | 
						|
grub_gui_restore_viewport (const grub_video_rect_t *r)
 | 
						|
{
 | 
						|
  grub_video_set_viewport (r->x, r->y, r->width, r->height);
 | 
						|
}
 | 
						|
 | 
						|
/* Set a new viewport relative the the current one, saving the current
 | 
						|
   viewport in OLD so it can be later restored.  */
 | 
						|
static __inline void
 | 
						|
grub_gui_set_viewport (const grub_video_rect_t *r, grub_video_rect_t *old)
 | 
						|
{
 | 
						|
  grub_gui_save_viewport (old);
 | 
						|
  grub_video_set_viewport (old->x + r->x,
 | 
						|
                           old->y + r->y,
 | 
						|
                           r->width,
 | 
						|
                           r->height);
 | 
						|
}
 | 
						|
 | 
						|
static inline int
 | 
						|
grub_video_have_common_points (const grub_video_rect_t *a,
 | 
						|
			       const grub_video_rect_t *b)
 | 
						|
{
 | 
						|
  if (!((a->x <= b->x && b->x <= a->x + a->width)
 | 
						|
	|| (b->x <= a->x && a->x <= b->x + b->width)))
 | 
						|
    return 0;
 | 
						|
  if (!((a->y <= b->y && b->y <= a->y + a->height)
 | 
						|
	|| (b->y <= a->y && a->y <= b->y + b->height)))
 | 
						|
    return 0;
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* ! GRUB_GUI_H */
 |