diff src/glyphs.h @ 384:bbff43aa5eb7 r21-2-7

Import from CVS: tag r21-2-7
author cvs
date Mon, 13 Aug 2007 11:08:24 +0200
parents 8626e4521993
children aabb7f5b1c81
line wrap: on
line diff
--- a/src/glyphs.h	Mon Aug 13 11:07:40 2007 +0200
+++ b/src/glyphs.h	Mon Aug 13 11:08:24 2007 +0200
@@ -25,6 +25,7 @@
 #define _XEMACS_GLYPHS_H_
 
 #include "specifier.h"
+#include "gui.h"
 
 /************************************************************************/
 /*			Image Instantiators				*/
@@ -47,11 +48,18 @@
   jpeg				color-pixmap
   png				color-pixmap
   tiff				color-pixmap
+  bmp				color-pixmap
   cursor-font			pointer
+  mswindows-resource		pointer
   font				pointer
   subwindow			subwindow
   inherit			mono-pixmap
   autodetect			mono-pixmap, color-pixmap, pointer, text
+  button				widget
+  edit				widget
+  combo				widget
+  scrollbar			widget
+  static				widget
 */
 
 /* These are methods specific to a particular format of image instantiator
@@ -74,6 +82,8 @@
 {
   Lisp_Object symbol;
 
+  Lisp_Object device;		/* sometimes used */
+
   ii_keyword_entry_dynarr *keywords;
   /* Implementation specific methods: */
 
@@ -104,6 +114,15 @@
 			      Lisp_Object pointer_bg,
 			      int dest_mask,
 			      Lisp_Object domain);
+  /* Property method: Given an image instance, return device specific
+     properties. */
+  Lisp_Object (*property_method) (Lisp_Object image_instance,
+				  Lisp_Object property);
+  /* Set-property method: Given an image instance, set device specific
+     properties. */
+  Lisp_Object (*set_property_method) (Lisp_Object image_instance,
+				      Lisp_Object property,
+				      Lisp_Object val);
 };
 
 /***** Calling an image-instantiator method *****/
@@ -112,12 +131,22 @@
 #define IIFORMAT_METH(mstruc, m, args) (((mstruc)->m##_method) args)
 
 /* Call a void-returning specifier method, if it exists */
-#define MAYBE_IIFORMAT_METH(mstruc, m, args) do {				\
-  struct image_instantiator_methods *maybe_iiformat_meth_mstruc = (mstruc);	\
-  if (HAS_IIFORMAT_METH_P (maybe_iiformat_meth_mstruc, m))			\
-    IIFORMAT_METH (maybe_iiformat_meth_mstruc, m, args);			\
+#define MAYBE_IIFORMAT_METH(mstruc, m, args)				     \
+if (mstruc)							\
+do {									     \
+  struct image_instantiator_methods *maybe_iiformat_meth_mstruc = (mstruc); \
+  if (HAS_IIFORMAT_METH_P (maybe_iiformat_meth_mstruc, m))		     \
+    IIFORMAT_METH (maybe_iiformat_meth_mstruc, m, args);		     \
 } while (0)
 
+#define MAYBE_IIFORMAT_DEVMETH(device, mstruc, m, args)				\
+do {											\
+  struct image_instantiator_methods *_mstruc = decode_ii_device (device, mstruc);	\
+  if (_mstruc)										\
+    MAYBE_IIFORMAT_METH(_mstruc, m, args);						\
+} while (0)
+
+
 /* Call a specifier method, if it exists; otherwise return
    the specified value */
 
@@ -133,23 +162,32 @@
 #define DEFINE_IMAGE_INSTANTIATOR_FORMAT(format)		\
 struct image_instantiator_methods *format##_image_instantiator_methods
 
-#define INITIALIZE_IMAGE_INSTANTIATOR_FORMAT(format, obj_name)	\
+#define INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM(format, obj_name)	\
 do {								\
   format##_image_instantiator_methods =				\
     xnew_and_zero (struct image_instantiator_methods);		\
-  defsymbol (&Q##format, obj_name);				\
   format##_image_instantiator_methods->symbol = Q##format;	\
+  format##_image_instantiator_methods->device = Qnil;		\
   format##_image_instantiator_methods->keywords =		\
     Dynarr_new (ii_keyword_entry);				\
   add_entry_to_image_instantiator_format_list			\
     (Q##format, format##_image_instantiator_methods);		\
 } while (0)
 
+#define INITIALIZE_IMAGE_INSTANTIATOR_FORMAT(format, obj_name)	\
+do {								\
+  defsymbol (&Q##format, obj_name);				\
+  INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM(format, obj_name);	\
+} while (0)
+
 /* Declare that image-instantiator format FORMAT has method M; used in
    initialization routines */
 #define IIFORMAT_HAS_METHOD(format, m) \
   (format##_image_instantiator_methods->m##_method = format##_##m)
 
+#define IIFORMAT_HAS_SHARED_METHOD(format, m, type) \
+  (format##_image_instantiator_methods->m##_method = type##_##m)
+
 /* Declare that KEYW is a valid keyword for image-instantiator format
    FORMAT.  VALIDATE_FUN if a function that returns whether the data
    is valid.  The keyword may not appear more than once. */
@@ -177,8 +215,36 @@
 		entry);							\
   } while (0)
 
+#define DEFINE_DEVICE_IIFORMAT(type, format)\
+struct image_instantiator_methods *type##_##format##_image_instantiator_methods
+
+#define INITIALIZE_DEVICE_IIFORMAT(type, format)	\
+do {								\
+  type##_##format##_image_instantiator_methods =				\
+    xnew_and_zero (struct image_instantiator_methods);		\
+  type##_##format##_image_instantiator_methods->symbol = Q##format;	\
+  type##_##format##_image_instantiator_methods->device = Q##type;	\
+  type##_##format##_image_instantiator_methods->keywords =		\
+    Dynarr_new (ii_keyword_entry);				\
+  add_entry_to_device_ii_format_list				\
+    (Q##type, Q##format, type##_##format##_image_instantiator_methods);	\
+} while (0)
+
+/* Declare that image-instantiator format FORMAT has method M; used in
+   initialization routines */
+#define IIFORMAT_HAS_DEVMETHOD(type, format, m) \
+  (type##_##format##_image_instantiator_methods->m##_method = type##_##format##_##m)
+
+struct image_instantiator_methods *
+decode_device_ii_format (Lisp_Object device, Lisp_Object format,
+			 Error_behavior errb);
+struct image_instantiator_methods *
+decode_image_instantiator_format (Lisp_Object format, Error_behavior errb);
+
 void add_entry_to_image_instantiator_format_list (Lisp_Object symbol,
 			struct image_instantiator_methods *meths);
+void add_entry_to_device_ii_format_list (Lisp_Object device, Lisp_Object symbol,
+			struct image_instantiator_methods *meths);
 Lisp_Object find_keyword_in_vector (Lisp_Object vector,
 				    Lisp_Object keyword);
 Lisp_Object find_keyword_in_vector_or_given (Lisp_Object vector,
@@ -193,6 +259,14 @@
 						Lisp_Object console_type);
 void check_valid_string (Lisp_Object data);
 void check_valid_int (Lisp_Object data);
+void check_valid_face (Lisp_Object data);
+void check_valid_vector (Lisp_Object data);
+
+void initialize_subwindow_image_instance (struct Lisp_Image_Instance*);
+void subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+			    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+			    int dest_mask, Lisp_Object domain);
+
 DECLARE_DOESNT_RETURN (incompatible_image_types (Lisp_Object instantiator,
                                                  int given_dest_mask,
                                                  int desired_dest_mask));
@@ -250,7 +324,8 @@
   IMAGE_MONO_PIXMAP,
   IMAGE_COLOR_PIXMAP,
   IMAGE_POINTER,
-  IMAGE_SUBWINDOW
+  IMAGE_SUBWINDOW,
+  IMAGE_WIDGET
 };
 
 #define IMAGE_NOTHING_MASK (1 << 0)
@@ -259,6 +334,7 @@
 #define IMAGE_COLOR_PIXMAP_MASK (1 << 3)
 #define IMAGE_POINTER_MASK (1 << 4)
 #define IMAGE_SUBWINDOW_MASK (1 << 5)
+#define IMAGE_WIDGET_MASK (1 << 6)
 
 #define IMAGE_INSTANCE_TYPE_P(ii, type) \
 (IMAGE_INSTANCEP (ii) && XIMAGE_INSTANCE_TYPE (ii) == type)
@@ -275,6 +351,8 @@
      IMAGE_INSTANCE_TYPE_P (ii, IMAGE_POINTER)
 #define SUBWINDOW_IMAGE_INSTANCEP(ii) \
      IMAGE_INSTANCE_TYPE_P (ii, IMAGE_SUBWINDOW)
+#define WIDGET_IMAGE_INSTANCEP(ii) \
+     IMAGE_INSTANCE_TYPE_P (ii, IMAGE_WIDGET)
 
 #define CHECK_NOTHING_IMAGE_INSTANCE(x) do {			\
   CHECK_IMAGE_INSTANCE (x);					\
@@ -308,10 +386,17 @@
 
 #define CHECK_SUBWINDOW_IMAGE_INSTANCE(x) do {			\
   CHECK_IMAGE_INSTANCE (x);					\
-  if (!SUBWINDOW_IMAGE_INSTANCEP (x))				\
+  if (!SUBWINDOW_IMAGE_INSTANCEP (x)				\
+      && !WIDGET_IMAGE_INSTANCEP (x))				\
     x = wrong_type_argument (Qsubwindow_image_instance_p, (x));	\
 } while (0)
 
+#define CHECK_WIDGET_IMAGE_INSTANCE(x) do {			\
+  CHECK_IMAGE_INSTANCE (x);					\
+  if (!WIDGET_IMAGE_INSTANCEP (x))				\
+    x = wrong_type_argument (Qwidget_image_instance_p, (x));	\
+} while (0)
+
 struct Lisp_Image_Instance
 {
   struct lcrecord_header header;
@@ -338,7 +423,17 @@
     } pixmap; /* used for pointers as well */
     struct
     {
-      int dummy; /* #### fill in this structure */
+      Lisp_Object frame;
+      unsigned int width, height;
+      void* subwindow;		/* specific devices can use this as necessary */
+      int being_displayed;		/* used to detect when needs to be unmapped */
+      struct
+      {
+	Lisp_Object face; /* foreground and background colors */
+	Lisp_Object type;
+	Lisp_Object props;	/* properties */
+	struct gui_item gui_item;
+      } widget;			/* widgets are subwindows */
     } subwindow;
   } u;
 
@@ -366,6 +461,25 @@
 #define IMAGE_INSTANCE_PIXMAP_BG(i) ((i)->u.pixmap.bg)
 #define IMAGE_INSTANCE_PIXMAP_AUXDATA(i) ((i)->u.pixmap.auxdata)
 
+#define IMAGE_INSTANCE_SUBWINDOW_WIDTH(i) ((i)->u.subwindow.width)
+#define IMAGE_INSTANCE_SUBWINDOW_HEIGHT(i) ((i)->u.subwindow.height)
+#define IMAGE_INSTANCE_SUBWINDOW_ID(i) ((i)->u.subwindow.subwindow)
+#define IMAGE_INSTANCE_SUBWINDOW_FRAME(i) ((i)->u.subwindow.frame)
+#define IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP(i) \
+((i)->u.subwindow.being_displayed)
+
+#define IMAGE_INSTANCE_WIDGET_WIDTH(i) \
+  IMAGE_INSTANCE_SUBWINDOW_WIDTH(i)
+#define IMAGE_INSTANCE_WIDGET_HEIGHT(i) \
+  IMAGE_INSTANCE_SUBWINDOW_HEIGHT(i)
+#define IMAGE_INSTANCE_WIDGET_CALLBACK(i) \
+  ((i)->u.subwindow.widget.gui_item.callback)
+#define IMAGE_INSTANCE_WIDGET_TYPE(i) ((i)->u.subwindow.widget.type)
+#define IMAGE_INSTANCE_WIDGET_PROPS(i) ((i)->u.subwindow.widget.props)
+#define IMAGE_INSTANCE_WIDGET_FACE(i) ((i)->u.subwindow.widget.face)
+#define IMAGE_INSTANCE_WIDGET_TEXT(i) ((i)->u.subwindow.widget.gui_item.name)
+#define IMAGE_INSTANCE_WIDGET_ITEM(i) ((i)->u.subwindow.widget.gui_item)
+
 #define XIMAGE_INSTANCE_DEVICE(i) \
   IMAGE_INSTANCE_DEVICE (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_NAME(i) \
@@ -395,6 +509,34 @@
 #define XIMAGE_INSTANCE_PIXMAP_BG(i) \
   IMAGE_INSTANCE_PIXMAP_BG (XIMAGE_INSTANCE (i))
 
+#define XIMAGE_INSTANCE_WIDGET_WIDTH(i) \
+  IMAGE_INSTANCE_WIDGET_WIDTH (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_HEIGHT(i) \
+  IMAGE_INSTANCE_WIDGET_HEIGHT (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_CALLBACK(i) \
+  IMAGE_INSTANCE_WIDGET_CALLBACK (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_TYPE(i) \
+  IMAGE_INSTANCE_WIDGET_TYPE (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_PROPS(i) \
+  IMAGE_INSTANCE_WIDGET_PROPS (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_FACE(i) \
+  IMAGE_INSTANCE_WIDGET_FACE (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_TEXT(i) \
+  IMAGE_INSTANCE_WIDGET_TEXT (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_WIDGET_ITEM(i) \
+  IMAGE_INSTANCE_WIDGET_ITEM (XIMAGE_INSTANCE (i))
+
+#define XIMAGE_INSTANCE_SUBWINDOW_WIDTH(i) \
+  IMAGE_INSTANCE_SUBWINDOW_WIDTH (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_SUBWINDOW_HEIGHT(i) \
+  IMAGE_INSTANCE_SUBWINDOW_HEIGHT (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_SUBWINDOW_ID(i) \
+  IMAGE_INSTANCE_SUBWINDOW_ID (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_SUBWINDOW_FRAME(i) \
+  IMAGE_INSTANCE_SUBWINDOW_FRAME (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP(i) \
+  IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (XIMAGE_INSTANCE (i))
+
 #ifdef HAVE_XPM
 Lisp_Object evaluate_xpm_color_symbols (void);
 Lisp_Object pixmap_to_lisp_data (Lisp_Object name, int ok_if_data_invalid);
@@ -480,10 +622,11 @@
 
 extern Lisp_Object Qxpm;
 extern Lisp_Object Q_data, Q_file, Q_color_symbols, Qconst_glyph_variable;
-extern Lisp_Object Qxbm;
+extern Lisp_Object Qxbm, Qedit, Qgroup, Qlabel, Qcombo, Qscrollbar;
 extern Lisp_Object Q_mask_file, Q_mask_data, Q_hotspot_x, Q_hotspot_y;
-extern Lisp_Object Q_foreground, Q_background;
-extern Lisp_Object Qimage_conversion_error;
+extern Lisp_Object Q_foreground, Q_background, Q_face, Q_descriptor, Q_group;
+extern Lisp_Object Q_width, Q_height, Q_pixel_width, Q_pixel_height;
+extern Lisp_Object Q_items, Q_properties, Qimage_conversion_error;
 extern Lisp_Object Vcontinuation_glyph, Vcontrol_arrow_glyph, Vhscroll_glyph;
 extern Lisp_Object Vinvisible_text_glyph, Voctal_escape_glyph, Vtruncation_glyph;
 extern Lisp_Object Vxemacs_logo;
@@ -519,6 +662,11 @@
 			    void (*after_change) (Lisp_Object glyph,
 						  Lisp_Object property,
 						  Lisp_Object locale));
+Lisp_Object widget_face_font_info (Lisp_Object domain, Lisp_Object face,
+				   int *height, int *width);
+void widget_text_to_pixel_conversion (Lisp_Object domain, Lisp_Object face,
+				      int th, int tw,
+				      int* height, int* width);
 
 /************************************************************************/
 /*				Glyph Cachels				*/
@@ -557,6 +705,7 @@
 			 void (*markobj) (Lisp_Object));
 void mark_glyph_cachels_as_not_updated (struct window *w);
 void reset_glyph_cachels (struct window *w);
+
 #ifdef MEMORY_USAGE_STATS
 int compute_glyph_cachel_usage (glyph_cachel_dynarr *glyph_cachels,
 				struct overhead_stats *ovstats);
@@ -566,9 +715,37 @@
 /*				Display Tables				*/
 /************************************************************************/
 
-#define DISP_TABLE_SIZE	256
-#define DISP_CHAR_ENTRY(dp, c) ((c < (dp)->size) ? (dp)->contents[c] : Qnil)
+Lisp_Object display_table_entry (Emchar, Lisp_Object, Lisp_Object);
+void get_display_tables (struct window *, face_index,
+			 Lisp_Object *, Lisp_Object *);
+
+/****************************************************************************
+ *                            Subwindow Object                              *
+ ****************************************************************************/
 
-struct Lisp_Vector *get_display_table (struct window *, face_index);
+/* redisplay needs a per-frame cache of subwindows being displayed so
+ * that we known when to unmap them */
+typedef struct subwindow_cachel subwindow_cachel;
+struct subwindow_cachel
+{
+  Lisp_Object subwindow;
+  int x, y;
+  int width, height;
+  int being_displayed;
+  int updated;
+};
+
+typedef struct
+{
+  Dynarr_declare (subwindow_cachel);
+} subwindow_cachel_dynarr;
+
+void mark_subwindow_cachels (subwindow_cachel_dynarr *elements,
+			 void (*markobj) (Lisp_Object));
+void mark_subwindow_cachels_as_not_updated (struct frame *f);
+void reset_subwindow_cachels (struct frame *f);
+void unmap_subwindow (Lisp_Object subwindow);
+void map_subwindow (Lisp_Object subwindow, int x, int y);
+void update_frame_subwindows (struct frame *f);
 
 #endif /* _XEMACS_GLYPHS_H_ */