123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- /* X3 is a lightweight toolset for building cross-platform applications. */
- typedef struct _x3widget x3widget;
- typedef struct _x3viewclient x3viewclient;
- typedef enum {
- x3window_main = 1,
- x3window_dialog = 2,
- } x3windowflags;
- typedef enum {
- x3center = 0,
- x3left = 1,
- x3right = 2,
- x3hfill = 3,
- x3top = 4,
- x3bottom = 8,
- x3vfill = 12,
- x3topleft = 5,
- x3topright = 6,
- x3bottomleft = 9,
- x3bottomright = 10,
- } x3alignment;
- typedef enum {
- x3view_click = 1,
- x3view_hover = 2,
- x3view_key = 4,
- x3view_2d = 0x100,
- x3view_rgb = 0x200,
- x3view_scroll = 0x10000
- } x3viewflags;
- typedef struct _x3dc x3dc;
- struct _x3viewclient {
- void (*destroy)(x3viewclient *self);
- void (*mouse)(x3viewclient *self, int buttons, int mods,
- double x, double y);
- int (*key)(x3viewclient *self, char *keyname, int mods, int key);
- void (*draw)(x3viewclient *self, x3dc *dc);
- };
- /* Windows and Carbon both use left/top/right/bottom nomenclature,
- at least for int rects, while gtk+ uses x/y/width/height. */
- typedef struct {
- double x0;
- double y0;
- double x1;
- double y1;
- } x3rect;
- #ifdef X3_GTK
- #include <gtk/gtk.h>
- #define X3_GMW(g, m, w) g
- struct _x3dc {
- /* move to x3rect structure? */
- int x;
- int y;
- int width;
- int height;
- cairo_t *cr;
- /* for rgb drawing */
- unsigned char *buf;
- int rowstride;
- };
- struct _x3widget {
- char *name;
- x3widget *parent;
- GtkWidget *widget;
- };
- typedef cairo_text_extents_t x3extents;
- #define X3_SHIFT_MASK GDK_SHIFT_MASK
- #define X3_CONTROL_MASK GDK_CONTROL_MASK
- #define X3_ALT_MASK GDK_MOD1_MASK
- /* there is no X3_CMD_MASK in gtk */
- #define X3_USEMAIN
- #endif
- #ifdef X3_CARBON
- #define X3_GMW(g, m, w) m
- #include <Carbon/Carbon.h>
- struct _x3dc {
- /* move to x3rect structure? */
- int x;
- int y;
- int width;
- int height;
- CGContextRef ctx;
- CGMutablePathRef path;
- /* for rgb drawing */
- char *buf;
- int rowstride;
- };
- typedef struct _x3type x3type;
- struct _x3type {
- void (*sizereq)(x3widget *w);
- void (*sizealloc)(x3widget *w, x3rect *r);
- void (*add)(x3widget *w, x3widget *child);
- };
- typedef enum {
- x3carbonnone,
- x3carbonhiview,
- x3carbonwindow,
- x3carbonmenu,
- x3carbonmenuitem,
- } x3carbonvar;
- typedef enum {
- x3flag_needsizereq = 1,
- x3flag_needsizealloc = 2
- } x3widgetflags;
- struct _x3widget {
- const x3type *type;
- x3widgetflags flags;
- x3rect sizerequest;
- char *name;
- x3widget *parent;
- x3carbonvar var;
- union {
- HIViewRef hiview;
- WindowRef window;
- MenuRef menu;
- int menuitem;
- } u;
- int n_children;
- x3widget **children;
- };
- typedef struct {
- double x_bearing;
- double y_bearing;
- double width;
- double height;
- double x_advance;
- double y_advance;
- } x3extents;
- #define X3_SHIFT_MASK shiftKey
- #define X3_CONTROL_MASK controlKey
- #define X3_CMD_MASK cmdKey
- #define X3_ALT_MASK optionKey
- /* todo: figure out how to plumb mouse event */
- #define X3_BUTTON1_MASK 0
- #define X3_2BUTTON_PRESS 0
- #define X3_3BUTTON_PRESS 0
- #define X3_USEMAIN
- #endif
- #ifdef X3_WIN32
- #include <windows.h>
- #define X3_GMW(g, m, w) w
- typedef struct _x3type x3type;
- struct _x3type {
- void (*sizereq)(x3widget *w);
- void (*sizealloc)(x3widget *w, x3rect *r);
- void (*add)(x3widget *w, x3widget *child);
- };
- typedef enum {
- x3winnone,
- x3winhwnd,
- } x3winvar;
- typedef enum {
- x3flag_needsizereq = 1,
- x3flag_needsizealloc = 2
- } x3widgetflags;
- typedef struct {
- double x_bearing;
- double y_bearing;
- double width;
- double height;
- double x_advance;
- double y_advance;
- } x3extents;
- struct _x3widget {
- const x3type *type;
- char *name;
- x3widget *parent;
- x3widgetflags flags;
- x3rect sizerequest;
- x3winvar var; // should this be in the type?
- union {
- HWND hwnd;
- } u;
- int n_children;
- x3widget **children;
- };
- #define X3_USEWINMAIN
- void x3init_win32(HINSTANCE hInstance);
- #endif
- typedef int (*x3window_callback)(x3widget *window, void *data,
- char *cmd, char *what, char *arg,
- void *more);
- /* Main loop */
- void x3init(int *pargc, char ***pargv);
- void x3main(void);
- x3widget *x3window(x3windowflags flags, char *label,
- x3window_callback callback, void *callback_data);
- x3widget *x3menu(x3widget *parent, char *name);
- x3widget *x3menuitem(x3widget *parent, char *name, char *cmd, char *shortcut);
- x3widget *x3menusep(x3widget *parent);
- x3widget *x3align(x3widget *parent, x3alignment alignment);
- x3widget *x3pad(x3widget *parent, int t, int b, int l, int r);
- x3widget *x3vbox(x3widget *parent, int homogeneous, int spacing);
- x3widget *x3hpane(x3widget *parent);
- x3widget *x3vpane(x3widget *parent);
- x3widget *x3button(x3widget *parent, char *name, char *label);
- x3widget *x3label(x3widget *parent, char *label);
- x3widget *x3edittext(x3widget *parent, char *cmd);
- x3widget *x3view(x3widget *parent, x3viewflags flags, x3viewclient *vc);
- void x3view_dirty(x3widget *w);
- void x3view_scrollto(x3widget *w, int x, int y, int width, int height);
- void x3viewclient_init(x3viewclient *vc);
- void x3window_setdefaultsize(x3widget *w, int width, int height);
- void x3pane_setsizing(x3widget *w, int child1_resize, int child1_shrink,
- int child2_resize, int child2_shrink);
- void x3setactive(x3widget *w, int active);
- int x3hasfocus(x3widget *w);
- void x3setpacking(x3widget *w, int fill, int expand, int padding);
- extern int x3n_winopen;
- /* 2d drawing functions */
- void x3moveto(x3dc *dc, double x, double y);
- void x3lineto(x3dc *dc, double x, double y);
- void x3curveto(x3dc *dc,
- double x1, double y1,
- double x2, double y2,
- double x3, double y3);
- void x3closepath(x3dc *dc);
- void x3rectangle(x3dc *dc, double x, double y, double width, double height);
- void x3getcurrentpoint(x3dc *dc, double *px, double *py);
- void x3setrgba(x3dc *dc, unsigned int rgba);
- void x3setlinewidth(x3dc *dc, double w);
- void x3fill(x3dc *dc);
- void x3stroke(x3dc *dc);
- /* This is an overly simple text api, based on cairo's. It may be phased
- out in favor of a more capable one. */
- void x3selectfont(x3dc *dc, char *fontname, int slant, int weight);
- void x3setfontsize(x3dc *dc, double size);
- void x3showtext(x3dc *dc, char *text);
- void x3textextents(x3dc *dc, char *text, x3extents *extents);
- #if defined(X3_CARBON) || defined(X3_WIN32)
- /* Internals for carbon/win32 */
- void x3widget_init(x3widget *w, const x3type *type);
- void x3add_default(x3widget *parent, x3widget *child);
- void x3add(x3widget *parent, x3widget *child);
- #endif
|