90 |
90 |
91 XtManageChild(drawingarea); |
91 XtManageChild(drawingarea); |
92 return drawingarea; |
92 return drawingarea; |
93 } |
93 } |
94 |
94 |
|
95 static void ui_drawingarea_input(Widget widget, XtPointer u, XtPointer c) { |
|
96 XmDrawingAreaCallbackStruct *cbs = (XmDrawingAreaCallbackStruct*)c; |
|
97 XEvent *xevent = cbs->event; |
|
98 UiMouseEventData *event = u; |
|
99 |
|
100 if (cbs->reason == XmCR_INPUT) { |
|
101 if (xevent->xany.type == ButtonPress) { |
|
102 UiMouseEvent me; |
|
103 me.x = xevent->xbutton.x; |
|
104 me.y = xevent->xbutton.y; |
|
105 // TODO: configurable double click time |
|
106 me.type = xevent->xbutton.time - event->last_event > 300 ? UI_PRESS : UI_PRESS2; |
|
107 |
|
108 UiEvent e; |
|
109 e.obj = event->obj; |
|
110 e.window = event->obj->window; |
|
111 e.document = event->obj->ctx->document; |
|
112 e.eventdata = &me; |
|
113 e.intval = 0; |
|
114 event->callback(&e, event->userdata); |
|
115 |
|
116 |
|
117 event->last_event = me.type == UI_PRESS2 ? 0 : xevent->xbutton.time; |
|
118 } |
|
119 } |
|
120 |
|
121 } |
|
122 |
|
123 void ui_mouse_handler(UiObject *obj, UIWIDGET widget, ui_callback f, void *u) { |
|
124 if(f) { |
|
125 UiMouseEventData *event = malloc(sizeof(UiMouseEventData)); |
|
126 event->obj = obj; |
|
127 event->callback = f; |
|
128 event->userdata = u; |
|
129 event->last_event = 0; |
|
130 |
|
131 XtAddCallback(widget, XmNinputCallback, ui_drawingarea_input, event); |
|
132 } |
|
133 } |
95 |
134 |
96 /* -------------------- text layout functions -------------------- */ |
135 /* -------------------- text layout functions -------------------- */ |
97 UiTextLayout* ui_text(UiGraphics *g) { |
136 UiTextLayout* ui_text(UiGraphics *g) { |
98 UiTextLayout *text = malloc(sizeof(UiTextLayout)); |
137 UiTextLayout *text = malloc(sizeof(UiTextLayout)); |
99 memset(text, 0, sizeof(UiTextLayout)); |
138 memset(text, 0, sizeof(UiTextLayout)); |