1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #ifndef __VT_LOGICAL_VISUAL_H__
4 #define __VT_LOGICAL_VISUAL_H__
5 
6 #include "vt_model.h"
7 #include "vt_cursor.h"
8 #include "vt_bidi.h" /* vt_bidi_mode_t */
9 
10 /*
11  * LTR ... e.g. Mongolian
12  * RTL ... e.g. CJK
13  */
14 typedef enum vt_vertical_mode {
15   VERT_LTR = 0x1,
16   VERT_RTL = 0x2,
17 
18   VERT_MODE_MAX
19 
20 } vt_vertical_mode_t;
21 
22 typedef struct vt_logical_visual {
23   /* Private */
24 
25   vt_model_t *model;
26   vt_cursor_t *cursor;
27 
28   int8_t is_visual;
29 
30   /* Public */
31 
32   /*
33    * Whether logical <=> visual is reversible.
34    *
35    * XXX This flag is used to determine if logvis is vertical mode or not in vt_screen.c
36    * (vt_screen_set_use_status_line())
37    */
38   int8_t is_reversible;
39 
40   int (*init)(struct vt_logical_visual *, vt_model_t *, vt_cursor_t *);
41 
42   int (*destroy)(struct vt_logical_visual *);
43 
44   u_int (*logical_cols)(struct vt_logical_visual *);
45   u_int (*logical_rows)(struct vt_logical_visual *);
46 
47   /*
48    * !! Notice !!
49    * vt_model_t should not be modified from render/viaul until logical.
50    * Any modification is done from logical until render/visual.
51    */
52   void (*render)(struct vt_logical_visual *);
53   int (*visual)(struct vt_logical_visual *);
54   int (*logical)(struct vt_logical_visual *);
55 
56   void (*visual_line)(struct vt_logical_visual *, vt_line_t *line);
57 
58 } vt_logical_visual_t;
59 
60 vt_logical_visual_t *vt_logvis_container_new(void);
61 
62 int vt_logvis_container_add(vt_logical_visual_t *logvis, vt_logical_visual_t *child);
63 
64 vt_logical_visual_t *vt_logvis_comb_new(void);
65 
66 vt_logical_visual_t *vt_logvis_vert_new(vt_vertical_mode_t vertical_mode);
67 
68 vt_vertical_mode_t vt_get_vertical_mode_by_name(const char *name);
69 
70 char *vt_get_vertical_mode_name(vt_vertical_mode_t mode);
71 
72 #if !defined(NO_DYNAMIC_LOAD_CTL) || defined(USE_FRIBIDI) || defined(USE_IND) || \
73     defined(USE_OT_LAYOUT)
74 vt_logical_visual_t *vt_logvis_ctl_new(vt_bidi_mode_t mode, const char *separators, void *term);
75 
76 int vt_logical_visual_cursor_is_rtl(vt_logical_visual_t *logvis);
77 #else
78 #define vt_logvis_ctl_new(mode, separators, term) (0)
79 #define vt_logical_visual_cursor_is_rtl(logvis) (0)
80 #endif
81 
82 #endif /* __VT_LOGICAL_VISUAL_H__ */
83