#ifndef INCLUDED_console_h_
#define INCLUDED_console_h_
+#include "character.h"
+
/* Devices and consoles are similar entities. The idea is that
a console represents a physical keyboard/mouse/other-input-source
while a device represents a display where frames appear on.
extern const struct struct_description cted_description;
extern const struct struct_description console_methods_description;
+
+/*
+ * Constants returned by device_implementation_flags_method
+ */
+
+/* Set when device uses pixel-based geometry */
+#define XDEVIMPF_PIXEL_GEOMETRY 0x00000001L
+
+/* Indicates that the device is a printer */
+#define XDEVIMPF_IS_A_PRINTER 0x00000002L
+
+/* Do not automatically redisplay this device */
+#define XDEVIMPF_NO_AUTO_REDISPLAY 0x00000004L
+
+/* Do not delete the device when last frame's gone */
+#define XDEVIMPF_FRAMELESS_OK 0x00000008L
+
+/* Do not preempt resiaply of frame or device once it starts */
+#define XDEVIMPF_DONT_PREEMPT_REDISPLAY 0x00000010L
+
struct console_methods
{
const char *name; /* Used by print_console, print_device, print_frame */
Lisp_Object symbol;
Lisp_Object predicate_symbol;
+ unsigned int flags; /* Read-only implementation flags, set once upon
+ console type creation. INITIALIZE_CONSOLE_TYPE sets
+ this member to 0. */
/* console methods */
void (*init_console_method) (struct console *, Lisp_Object props);
void (*asynch_device_change_method) (void);
Lisp_Object (*device_system_metrics_method) (struct device *,
enum device_metrics);
- unsigned int (*device_implementation_flags_method) (void);
Lisp_Object (*own_selection_method)(Lisp_Object selection_name,
Lisp_Object selection_value,
Lisp_Object how_to_add,
int (*left_margin_width_method) (struct window *);
int (*right_margin_width_method) (struct window *);
int (*text_width_method) (struct frame *f, struct face_cachel *cachel,
- const Emchar *str, Charcount len);
+ const Charc *str, Charcount len);
void (*output_display_block_method) (struct window *, struct display_line *,
int, int, int, int, int, int, int);
int (*divider_height_method) (void);
face_index findex, int cursor_start, int cursor_width,
int cursor_height, int offset_bitmap);
void (*output_string_method) (struct window *w, struct display_line *dl,
- Emchar_dynarr *buf, int xpos, int xoffset,
+ Charc_dynarr *buf, int xpos, int xoffset,
int start_pixpos, int width, face_index findex,
int cursor, int cursor_start, int cursor_width,
int cursor_height);
void (*resize_subwindow_method) (Lisp_Image_Instance *, int w, int h);
void (*redisplay_subwindow_method) (Lisp_Image_Instance *);
void (*redisplay_widget_method) (Lisp_Image_Instance *);
+ /* Maybe this should be a specifier. Unfortunately specifiers don't
+ allow us to represent things at the toolkit level, which is what
+ is required here. */
+ int (*widget_border_width_method) (void);
+ int (*widget_spacing_method) (Lisp_Image_Instance *);
int (*image_instance_equal_method) (Lisp_Image_Instance *,
Lisp_Image_Instance *,
int depth);
#ifdef HAVE_TOOLBARS
/* toolbar methods */
void (*output_frame_toolbars_method) (struct frame *);
+ void (*clear_frame_toolbars_method) (struct frame *);
void (*initialize_frame_toolbars_method) (struct frame *);
void (*free_frame_toolbars_method) (struct frame *);
void (*output_toolbar_button_method) (struct frame *, Lisp_Object);
#endif
};
-/*
- * Constants returned by device_implementation_flags_method
- */
-
-/* Set when device uses pixel-based geometry */
-#define XDEVIMPF_PIXEL_GEOMETRY 0x00000001L
-
-/* Indicates that the device is a printer */
-#define XDEVIMPF_IS_A_PRINTER 0x00000002L
-
-/* Do not automatically redisplay this device */
-#define XDEVIMPF_NO_AUTO_REDISPLAY 0x00000004L
-
-/* Do not delete the device when last frame's gone */
-#define XDEVIMPF_FRAMELESS_OK 0x00000008L
-
+#define CONMETH_TYPE(meths) ((meths)->symbol)
+#define CONMETH_IMPL_FLAG(meths, f) ((meths)->flags & (f))
#define CONSOLE_TYPE_NAME(c) ((c)->conmeths->name)
#define CONSOLE_TYPE(c) ((c)->conmeths->symbol)
-#define CONMETH_TYPE(meths) ((meths)->symbol)
+#define CONSOLE_IMPL_FLAG(c, f) CONMETH_IMPL_FLAG ((c)->conmeths, (f))
/******** Accessing / calling a console method *********/
#define CONSOLE_INHERITS_METHOD(type, fromtype, m) \
(type##_console_methods->m##_method = fromtype##_##m)
+/* Define console type implementation flags */
+#define CONSOLE_IMPLEMENTATION_FLAGS(type, flg) \
+ (type##_console_methods->flags = flg)
+
struct console
{
struct lcrecord_header header;
too many places where the abstraction is broken. Need to
fix. */
+#ifdef HAVE_GTK
+#define CONSOLE_TYPESYM_GTK_P(typesym) EQ (typesym, Qgtk)
+#else
+#define CONSOLE_TYPESYM_GTK_P(typesym) 0
+#endif
+
#ifdef HAVE_X_WINDOWS
#define CONSOLE_TYPESYM_X_P(typesym) EQ (typesym, Qx)
#else
#define CONSOLE_TYPESYM_STREAM_P(typesym) EQ (typesym, Qstream)
#define CONSOLE_TYPESYM_WIN_P(typesym) \
- (CONSOLE_TYPESYM_X_P (typesym) || CONSOLE_TYPESYM_MSWINDOWS_P (typesym))
+ (CONSOLE_TYPESYM_GTK_P (typesym) || CONSOLE_TYPESYM_X_P (typesym) || CONSOLE_TYPESYM_MSWINDOWS_P (typesym))
#define CONSOLE_X_P(con) CONSOLE_TYPESYM_X_P (CONSOLE_TYPE (con))
#define CHECK_X_CONSOLE(z) CHECK_CONSOLE_TYPE (z, x)
#define CONCHECK_X_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, x)
+#define CONSOLE_GTK_P(con) CONSOLE_TYPESYM_GTK_P (CONSOLE_TYPE (con))
+#define CHECK_GTK_CONSOLE(z) CHECK_CONSOLE_TYPE (z, gtk)
+#define CONCHECK_GTK_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, gtk)
+
#define CONSOLE_TTY_P(con) CONSOLE_TYPESYM_TTY_P (CONSOLE_TYPE (con))
#define CHECK_TTY_CONSOLE(z) CHECK_CONSOLE_TYPE (z, tty)
#define CONCHECK_TTY_CONSOLE(z) CONCHECK_CONSOLE_TYPE (z, tty)