| 32 #include <X11/IntrinsicP.h> |
32 #include <X11/IntrinsicP.h> |
| 33 |
33 |
| 34 #include "graphics.h" |
34 #include "graphics.h" |
| 35 |
35 |
| 36 #include "container.h" |
36 #include "container.h" |
| |
37 |
| |
38 UIWIDGET ui_drawingarea_create(UiObject *obj, UiDrawingAreaArgs *args) { |
| |
39 Arg xargs[16]; |
| |
40 int n = 0; |
| |
41 |
| |
42 UiContainerPrivate *ctn = ui_obj_container(obj); |
| |
43 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
44 |
| |
45 Widget parent = ui_container_prepare(ctn, &layout, xargs, &n); |
| |
46 char *name = args->name ? (char*)args->name : "drawingarea"; |
| |
47 |
| |
48 Widget widget = XmCreateDrawingArea(parent, name, xargs, n); |
| |
49 XtManageChild(widget); |
| |
50 ui_container_add(ctn, widget); |
| |
51 |
| |
52 UiDrawingArea *drawingarea = malloc(sizeof(UiDrawingArea)); |
| |
53 drawingarea->obj = obj; |
| |
54 drawingarea->draw = args->draw; |
| |
55 drawingarea->drawdata = args->drawdata; |
| |
56 drawingarea->onclick = args->onclick; |
| |
57 drawingarea->onclickdata = args->onclickdata; |
| |
58 drawingarea->onmotion = args->onmotion; |
| |
59 drawingarea->onmotiondata = args->onmotiondata; |
| |
60 drawingarea->gc = NULL; |
| |
61 |
| |
62 XtAddCallback( |
| |
63 widget, |
| |
64 XmNdestroyCallback, |
| |
65 (XtCallbackProc)ui_drawingarea_destroy, |
| |
66 drawingarea); |
| |
67 XtAddCallback( |
| |
68 widget, |
| |
69 XmNexposeCallback, |
| |
70 (XtCallbackProc)ui_drawingarea_expose, |
| |
71 drawingarea); |
| |
72 |
| |
73 return widget; |
| |
74 } |
| |
75 |
| |
76 void ui_drawingarea_destroy(Widget w, UiDrawingArea *drawingarea, XtPointer d) { |
| |
77 if(drawingarea->gc) { |
| |
78 XFreeGC(XtDisplay(w), drawingarea->gc); |
| |
79 } |
| |
80 free(drawingarea); |
| |
81 } |
| |
82 |
| |
83 void ui_drawingarea_expose(Widget w, UiDrawingArea *drawingarea, XtPointer d) { |
| |
84 Display *dp = XtDisplay(w); |
| |
85 |
| |
86 if(!drawingarea->gc) { |
| |
87 XGCValues gcvals; |
| |
88 gcvals.foreground = BlackPixelOfScreen(XtScreen(w)); |
| |
89 drawingarea->gc = XCreateGC(dp, XtWindow(w), (GCForeground), &gcvals); |
| |
90 } |
| |
91 |
| |
92 if(drawingarea->draw) { |
| |
93 UiEvent event; |
| |
94 event.obj = drawingarea->obj; |
| |
95 event.window = event.obj->window; |
| |
96 event.document = event.obj->ctx->document; |
| |
97 event.eventdata = NULL; |
| |
98 event.eventdatatype = 0; |
| |
99 event.intval = 0; |
| |
100 event.set = 0; |
| |
101 |
| |
102 UiXlibGraphics g; |
| |
103 g.g.width = w->core.width; |
| |
104 g.g.height = w->core.height; |
| |
105 g.widget = w; |
| |
106 g.display = dp; |
| |
107 g.colormap = w->core.colormap; |
| |
108 g.gc = drawingarea->gc; |
| |
109 |
| |
110 drawingarea->draw(&event, (UiGraphics*)&g, drawingarea->drawdata); |
| |
111 } |
| |
112 } |
| |
113 |
| |
114 void ui_drawingarea_getsize(UIWIDGET drawingarea, int *width, int *height) { |
| |
115 |
| |
116 } |
| |
117 |
| |
118 void ui_drawingarea_redraw(UIWIDGET drawingarea) { |
| |
119 |
| |
120 } |