x3.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /* X3 is a lightweight toolset for building cross-platform applications. */
  2. typedef struct _x3widget x3widget;
  3. typedef struct _x3viewclient x3viewclient;
  4. typedef enum {
  5. x3window_main = 1,
  6. x3window_dialog = 2,
  7. } x3windowflags;
  8. typedef enum {
  9. x3center = 0,
  10. x3left = 1,
  11. x3right = 2,
  12. x3hfill = 3,
  13. x3top = 4,
  14. x3bottom = 8,
  15. x3vfill = 12,
  16. x3topleft = 5,
  17. x3topright = 6,
  18. x3bottomleft = 9,
  19. x3bottomright = 10,
  20. } x3alignment;
  21. typedef enum {
  22. x3view_click = 1,
  23. x3view_hover = 2,
  24. x3view_key = 4,
  25. x3view_2d = 0x100,
  26. x3view_rgb = 0x200,
  27. x3view_scroll = 0x10000
  28. } x3viewflags;
  29. typedef struct _x3dc x3dc;
  30. struct _x3viewclient {
  31. void (*destroy)(x3viewclient *self);
  32. void (*mouse)(x3viewclient *self, int buttons, int mods,
  33. double x, double y);
  34. int (*key)(x3viewclient *self, char *keyname, int mods, int key);
  35. void (*draw)(x3viewclient *self, x3dc *dc);
  36. };
  37. /* Windows and Carbon both use left/top/right/bottom nomenclature,
  38. at least for int rects, while gtk+ uses x/y/width/height. */
  39. typedef struct {
  40. double x0;
  41. double y0;
  42. double x1;
  43. double y1;
  44. } x3rect;
  45. #ifdef X3_GTK
  46. #include <gtk/gtk.h>
  47. #define X3_GMW(g, m, w) g
  48. struct _x3dc {
  49. /* move to x3rect structure? */
  50. int x;
  51. int y;
  52. int width;
  53. int height;
  54. cairo_t *cr;
  55. /* for rgb drawing */
  56. unsigned char *buf;
  57. int rowstride;
  58. };
  59. struct _x3widget {
  60. char *name;
  61. x3widget *parent;
  62. GtkWidget *widget;
  63. };
  64. typedef cairo_text_extents_t x3extents;
  65. #define X3_SHIFT_MASK GDK_SHIFT_MASK
  66. #define X3_CONTROL_MASK GDK_CONTROL_MASK
  67. #define X3_ALT_MASK GDK_MOD1_MASK
  68. /* there is no X3_CMD_MASK in gtk */
  69. #define X3_USEMAIN
  70. #endif
  71. #ifdef X3_CARBON
  72. #define X3_GMW(g, m, w) m
  73. #include <Carbon/Carbon.h>
  74. struct _x3dc {
  75. /* move to x3rect structure? */
  76. int x;
  77. int y;
  78. int width;
  79. int height;
  80. CGContextRef ctx;
  81. CGMutablePathRef path;
  82. /* for rgb drawing */
  83. char *buf;
  84. int rowstride;
  85. };
  86. typedef struct _x3type x3type;
  87. struct _x3type {
  88. void (*sizereq)(x3widget *w);
  89. void (*sizealloc)(x3widget *w, x3rect *r);
  90. void (*add)(x3widget *w, x3widget *child);
  91. };
  92. typedef enum {
  93. x3carbonnone,
  94. x3carbonhiview,
  95. x3carbonwindow,
  96. x3carbonmenu,
  97. x3carbonmenuitem,
  98. } x3carbonvar;
  99. typedef enum {
  100. x3flag_needsizereq = 1,
  101. x3flag_needsizealloc = 2
  102. } x3widgetflags;
  103. struct _x3widget {
  104. const x3type *type;
  105. x3widgetflags flags;
  106. x3rect sizerequest;
  107. char *name;
  108. x3widget *parent;
  109. x3carbonvar var;
  110. union {
  111. HIViewRef hiview;
  112. WindowRef window;
  113. MenuRef menu;
  114. int menuitem;
  115. } u;
  116. int n_children;
  117. x3widget **children;
  118. };
  119. typedef struct {
  120. double x_bearing;
  121. double y_bearing;
  122. double width;
  123. double height;
  124. double x_advance;
  125. double y_advance;
  126. } x3extents;
  127. #define X3_SHIFT_MASK shiftKey
  128. #define X3_CONTROL_MASK controlKey
  129. #define X3_CMD_MASK cmdKey
  130. #define X3_ALT_MASK optionKey
  131. /* todo: figure out how to plumb mouse event */
  132. #define X3_BUTTON1_MASK 0
  133. #define X3_2BUTTON_PRESS 0
  134. #define X3_3BUTTON_PRESS 0
  135. #define X3_USEMAIN
  136. #endif
  137. #ifdef X3_WIN32
  138. #include <windows.h>
  139. #define X3_GMW(g, m, w) w
  140. typedef struct _x3type x3type;
  141. struct _x3type {
  142. void (*sizereq)(x3widget *w);
  143. void (*sizealloc)(x3widget *w, x3rect *r);
  144. void (*add)(x3widget *w, x3widget *child);
  145. };
  146. typedef enum {
  147. x3winnone,
  148. x3winhwnd,
  149. } x3winvar;
  150. typedef enum {
  151. x3flag_needsizereq = 1,
  152. x3flag_needsizealloc = 2
  153. } x3widgetflags;
  154. typedef struct {
  155. double x_bearing;
  156. double y_bearing;
  157. double width;
  158. double height;
  159. double x_advance;
  160. double y_advance;
  161. } x3extents;
  162. struct _x3widget {
  163. const x3type *type;
  164. char *name;
  165. x3widget *parent;
  166. x3widgetflags flags;
  167. x3rect sizerequest;
  168. x3winvar var; // should this be in the type?
  169. union {
  170. HWND hwnd;
  171. } u;
  172. int n_children;
  173. x3widget **children;
  174. };
  175. #define X3_USEWINMAIN
  176. void x3init_win32(HINSTANCE hInstance);
  177. #endif
  178. typedef int (*x3window_callback)(x3widget *window, void *data,
  179. char *cmd, char *what, char *arg,
  180. void *more);
  181. /* Main loop */
  182. void x3init(int *pargc, char ***pargv);
  183. void x3main(void);
  184. x3widget *x3window(x3windowflags flags, char *label,
  185. x3window_callback callback, void *callback_data);
  186. x3widget *x3menu(x3widget *parent, char *name);
  187. x3widget *x3menuitem(x3widget *parent, char *name, char *cmd, char *shortcut);
  188. x3widget *x3menusep(x3widget *parent);
  189. x3widget *x3align(x3widget *parent, x3alignment alignment);
  190. x3widget *x3pad(x3widget *parent, int t, int b, int l, int r);
  191. x3widget *x3vbox(x3widget *parent, int homogeneous, int spacing);
  192. x3widget *x3hpane(x3widget *parent);
  193. x3widget *x3vpane(x3widget *parent);
  194. x3widget *x3button(x3widget *parent, char *name, char *label);
  195. x3widget *x3label(x3widget *parent, char *label);
  196. x3widget *x3edittext(x3widget *parent, char *cmd);
  197. x3widget *x3view(x3widget *parent, x3viewflags flags, x3viewclient *vc);
  198. void x3view_dirty(x3widget *w);
  199. void x3view_scrollto(x3widget *w, int x, int y, int width, int height);
  200. void x3viewclient_init(x3viewclient *vc);
  201. void x3window_setdefaultsize(x3widget *w, int width, int height);
  202. void x3pane_setsizing(x3widget *w, int child1_resize, int child1_shrink,
  203. int child2_resize, int child2_shrink);
  204. void x3setactive(x3widget *w, int active);
  205. int x3hasfocus(x3widget *w);
  206. void x3setpacking(x3widget *w, int fill, int expand, int padding);
  207. extern int x3n_winopen;
  208. /* 2d drawing functions */
  209. void x3moveto(x3dc *dc, double x, double y);
  210. void x3lineto(x3dc *dc, double x, double y);
  211. void x3curveto(x3dc *dc,
  212. double x1, double y1,
  213. double x2, double y2,
  214. double x3, double y3);
  215. void x3closepath(x3dc *dc);
  216. void x3rectangle(x3dc *dc, double x, double y, double width, double height);
  217. void x3getcurrentpoint(x3dc *dc, double *px, double *py);
  218. void x3setrgba(x3dc *dc, unsigned int rgba);
  219. void x3setlinewidth(x3dc *dc, double w);
  220. void x3fill(x3dc *dc);
  221. void x3stroke(x3dc *dc);
  222. /* This is an overly simple text api, based on cairo's. It may be phased
  223. out in favor of a more capable one. */
  224. void x3selectfont(x3dc *dc, char *fontname, int slant, int weight);
  225. void x3setfontsize(x3dc *dc, double size);
  226. void x3showtext(x3dc *dc, char *text);
  227. void x3textextents(x3dc *dc, char *text, x3extents *extents);
  228. #if defined(X3_CARBON) || defined(X3_WIN32)
  229. /* Internals for carbon/win32 */
  230. void x3widget_init(x3widget *w, const x3type *type);
  231. void x3add_default(x3widget *parent, x3widget *child);
  232. void x3add(x3widget *parent, x3widget *child);
  233. #endif