(U-0002195D): Add `ideographic-structure'; add `sound@ja/on'; add
[chise/xemacs-chise.git.1] / src / device.h
index 1e8f0b5..3c5dcd2 100644 (file)
@@ -24,8 +24,8 @@ Boston, MA 02111-1307, USA.  */
 
 /* Written by Chuck Thompson and Ben Wing. */
 
-#ifndef _XEMACS_DEVICE_H_
-#define _XEMACS_DEVICE_H_
+#ifndef INCLUDED_device_h_
+#define INCLUDED_device_h_
 
 #include "console.h"
 
@@ -48,6 +48,7 @@ struct pixel_to_glyph_translation_cache
 
 #define DEVICE_TYPE_NAME(d) ((d)->devmeths->name)
 #define DEVICE_TYPE(d) ((d)->devmeths->symbol)
+#define DEVICE_IMPL_FLAG(d, f) CONMETH_IMPL_FLAG ((d)->devmeths, (f))
 #define DEVICE_SPECIFIC_FRAME_PROPS(d) \
   ((d)->devmeths->device_specific_frame_props)
 
@@ -166,8 +167,11 @@ struct device
   unsigned int extents_changed :1;
   unsigned int faces_changed :1;
   unsigned int frame_changed :1;
+  unsigned int frame_layout_changed :1;        /* The layout of frame
+                                          elements has changed. */
   unsigned int glyphs_changed :1;
   unsigned int subwindows_changed :1;
+  unsigned int subwindows_state_changed :1;
   unsigned int icon_changed :1;
   unsigned int menubar_changed :1;
   unsigned int modeline_changed :1;
@@ -219,8 +223,8 @@ struct device
 DECLARE_LRECORD (device, struct device);
 #define XDEVICE(x) XRECORD (x, device, struct device)
 #define XSETDEVICE(x, p) XSETRECORD (x, p, device)
+#define wrap_device(p) wrap_object (p)
 #define DEVICEP(x) RECORDP (x, device)
-#define GC_DEVICEP(x) GC_RECORDP (x, device)
 #define CHECK_DEVICE(x) CHECK_RECORD (x, device)
 #define CONCHECK_DEVICE(x) CONCHECK_RECORD (x, device)
 
@@ -238,16 +242,16 @@ DECLARE_LRECORD (device, struct device);
 #define DEVICE_TYPE_P(d, type) EQ (DEVICE_TYPE (d), Q##type)
 
 #ifdef ERROR_CHECK_TYPECHECK
-INLINE struct device *
+INLINE_HEADER struct device *
 error_check_device_type (struct device *d, Lisp_Object sym);
-INLINE struct device *
+INLINE_HEADER struct device *
 error_check_device_type (struct device *d, Lisp_Object sym)
 {
   assert (EQ (DEVICE_TYPE (d), sym));
   return d;
 }
 # define DEVICE_TYPE_DATA(d, type)                     \
-  ((struct type##_device *) (error_check_device_type (d, Q##type))->device_data)
+  ((struct type##_device *) error_check_device_type (d, Q##type)->device_data)
 #else
 # define DEVICE_TYPE_DATA(d, type)                     \
   ((struct type##_device *) (d)->device_data)
@@ -270,6 +274,45 @@ error_check_device_type (struct device *d, Lisp_Object sym)
        (type##_console_methods->predicate_symbol, x);  \
   } while (0)
 
+#define DEVICE_DISPLAY_P(dev)                          \
+  (DEVICE_LIVE_P (dev) &&                              \
+    !DEVICE_IMPL_FLAG (dev, XDEVIMPF_IS_A_PRINTER))
+
+#define CHECK_DISPLAY_DEVICE(dev)                      \
+  do {                                                 \
+    CHECK_DEVICE (dev);                                        \
+    if (!(DEVICEP (dev)                                        \
+          && DEVICE_DISPLAY_P (XDEVICE (dev))))                \
+      dead_wrong_type_argument (Qdisplay, dev);                \
+  } while (0)
+
+#define CONCHECK_DISPLAY_DEVICE(dev)                   \
+  do {                                                 \
+    CONCHECK_DEVICE (dev);                             \
+    if (!(DEVICEP (dev)                                        \
+          && DEVICE_DISPLAY_P (XDEVICE (dev))))                \
+      wrong_type_argument (Qdisplay, dev);             \
+  } while (0)
+
+#define DEVICE_PRINTER_P(dev)                          \
+  (DEVICE_LIVE_P (dev) && !DEVICE_DISPLAY_P (dev))
+
+#define CHECK_PRINTER_DEVICE(dev)                      \
+  do {                                                 \
+    CHECK_DEVICE (dev);                                        \
+    if (!(DEVICEP (dev)                                        \
+          && DEVICE_PRINTER_P (XDEVICE (dev))))                \
+      dead_wrong_type_argument (Qprinter, dev);                \
+  } while (0)
+
+#define CONCHECK_PRINTER_DEVICE(dev)                   \
+  do {                                                 \
+    CONCHECK_DEVICE (dev);                             \
+    if (!(DEVICEP (dev)                                        \
+          && DEVICE_PRINTER_P (XDEVICE (dev))))                \
+      wrong_type_argument (Qprinter, dev);             \
+  } while (0)
+
 /* #### These should be in the device-*.h files but there are
    too many places where the abstraction is broken.  Need to
    fix. */
@@ -278,6 +321,10 @@ error_check_device_type (struct device *d, Lisp_Object sym)
 #define CHECK_X_DEVICE(z) CHECK_DEVICE_TYPE (z, x)
 #define CONCHECK_X_DEVICE(z) CONCHECK_DEVICE_TYPE (z, x)
 
+#define DEVICE_GTK_P(dev) CONSOLE_TYPESYM_GTK_P (DEVICE_TYPE (dev))
+#define CHECK_GTK_DEVICE(z) CHECK_DEVICE_TYPE (z, gtk)
+#define CONCHECK_GTK_DEVICE(z) CONCHECK_DEVICE_TYPE (z, gtk)
+
 #define DEVICE_MSWINDOWS_P(dev) CONSOLE_TYPESYM_MSWINDOWS_P (DEVICE_TYPE (dev))
 #define CHECK_MSWINDOWS_DEVICE(z) CHECK_DEVICE_TYPE (z, mswindows)
 #define CONCHECK_MSWINDOWS_DEVICE(z) CONCHECK_DEVICE_TYPE (z, mswindows)
@@ -294,11 +341,12 @@ error_check_device_type (struct device *d, Lisp_Object sym)
 
 EXFUN (Fdevice_console, 1);
 EXFUN (Fdevice_name, 1);
+EXFUN (Ffind_device, 2);
 EXFUN (Fmake_device, 3);
 EXFUN (Fselected_device, 1);
 
 extern Lisp_Object Qcreate_device_hook, Qdelete_device_hook, Qgrayscale;
-extern Lisp_Object Qinit_post_tty_win, Qmono, Vdefault_x_device;
+extern Lisp_Object Qinit_post_tty_win, Qmono, Vdefault_x_device, Vdefault_gtk_device;
 extern Lisp_Object Vdevice_class_list;
 
 int valid_device_class_p (Lisp_Object class);
@@ -348,6 +396,9 @@ int valid_device_class_p (Lisp_Object class);
 #define MARK_DEVICE_SUBWINDOWS_CHANGED(d)                      \
   ((void) (subwindows_changed = (d)->subwindows_changed = 1))
 
+#define MARK_DEVICE_SUBWINDOWS_STATE_CHANGED(d)                \
+  ((void) (subwindows_state_changed = (d)->subwindows_state_changed = 1))
+
 #define MARK_DEVICE_TOOLBARS_CHANGED(d)                        \
   ((void) (toolbar_changed = (d)->toolbar_changed = 1))
 
@@ -365,15 +416,28 @@ int valid_device_class_p (Lisp_Object class);
   MARK_DEVICE_FACES_CHANGED (mdffc_d);                 \
 } while (0)
 
+#define MARK_DEVICE_FRAMES_GLYPHS_CHANGED(d) do {      \
+  struct device *mdffc_d = (d);                                \
+  Lisp_Object frmcons;                                 \
+  DEVICE_FRAME_LOOP (frmcons, mdffc_d)                 \
+    XFRAME (XCAR (frmcons))->glyphs_changed = 1;               \
+  MARK_DEVICE_GLYPHS_CHANGED (mdffc_d);                \
+} while (0)
+
 #define MARK_DEVICE_FRAME_CHANGED(d)                   \
   ((void) (frame_changed = (d)->frame_changed = 1))
 
+#define MARK_DEVICE_FRAME_LAYOUT_CHANGED(d)                    \
+  ((void) (frame_layout_changed = (d)->frame_layout_changed = 1))
+
 #define MARK_DEVICE_WINDOWS_CHANGED(d)                 \
   ((void) (windows_changed = (d)->windows_changed = 1))
 
 #define MARK_DEVICE_WINDOWS_STRUCTURE_CHANGED(d)       \
   ((void) (windows_structure_changed = (d)->windows_structure_changed = 1))
 
+/* #### unify this with DOMAIN_DEVICE once the latter has image instances
+   expunged from it. */
 /* This turns out to be used heavily so we make it a macro to make it
    inline.  Also, the majority of the time the object will turn out to
    be a window so we move it from being checked last to being checked
@@ -409,4 +473,4 @@ void set_device_selected_frame (struct device *d, Lisp_Object frame);
 Lisp_Object domain_device_type (Lisp_Object domain);
 int window_system_pixelated_geometry (Lisp_Object domain);
 
-#endif /* _XEMACS_DEVICE_H_ */
+#endif /* INCLUDED_device_h_ */