- s/sprintf/snprintf
[wmaker-crm.git] / src / geomview.c
blob789d9c9d2e60045089d2a16dfefdc55756b08e66
4 #include <WINGs/WINGsP.h>
8 typedef struct W_GeometryView {
9 W_Class widgetClass;
10 WMView *view;
12 GC gc;
13 WMFont *font;
15 WMSize textSize;
17 union {
18 struct {
19 int x, y;
20 } pos;
21 struct {
22 unsigned width, height;
23 } size;
24 } data;
26 unsigned showPosition:1;
27 } WGeometryView;
31 static void handleEvents(XEvent *event, void *clientData);
32 static void paint(WGeometryView *gview);
35 WGeometryView*
36 WCreateGeometryView(WMScreen *scr)
38 WGeometryView *gview;
39 char buffer[64];
40 static W_Class widgetClass = 0;
42 if (!widgetClass) {
43 widgetClass = W_RegisterUserWidget();
46 gview = malloc(sizeof(WGeometryView));
47 if (!gview) {
48 return NULL;
50 memset(gview, 0, sizeof(WGeometryView));
52 gview->widgetClass = widgetClass;
54 gview->view = W_CreateTopView(scr);
55 if (!gview->view) {
56 wfree(gview);
58 return NULL;
60 gview->view->self = gview;
62 gview->font = WMSystemFontOfSize(scr, 12);
63 if (!gview->font) {
64 W_DestroyView(gview->view);
65 wfree(gview);
67 return NULL;
71 WMColor *black = WMBlackColor(scr);
72 WMColor *gray = WMGrayColor(scr);
73 XGCValues gcv;
75 gcv.foreground = WMColorPixel(black);
76 gcv.background = WMColorPixel(gray);
78 gview->gc = XCreateGC(WMScreenDisplay(scr), W_DRAWABLE(scr),
79 GCForeground|GCBackground, &gcv);
81 WMReleaseColor(black);
82 WMReleaseColor(gray);
85 WMCreateEventHandler(gview->view, ExposureMask, handleEvents, gview);
87 snprintf(buffer, sizeof(buffer), "%+05i, %+05i", 0, 0);
89 gview->textSize.width = WMWidthOfString(gview->font, buffer,
90 strlen(buffer));
91 gview->textSize.height = WMFontHeight(gview->font);
93 W_ResizeView(gview->view, gview->textSize.width+8,
94 gview->textSize.height+6);
96 return gview;
100 void
101 WSetGeometryViewShownPosition(WGeometryView *gview, int x, int y)
103 gview->showPosition = 1;
104 gview->data.pos.x = x;
105 gview->data.pos.y = y;
107 paint(gview);
111 void
112 WSetGeometryViewShownSize(WGeometryView *gview,
113 unsigned width, unsigned height)
115 gview->showPosition = 0;
116 gview->data.size.width = width;
117 gview->data.size.height = height;
119 paint(gview);
124 static void
125 paint(WGeometryView *gview)
127 char buffer[64];
129 if (gview->showPosition) {
130 snprintf(buffer, sizeof(buffer), "%+5i , %+5i ",
131 gview->data.pos.x, gview->data.pos.y);
132 } else {
133 snprintf(buffer, sizeof(buffer), "%+5i x %+5i ",
134 gview->data.size.width, gview->data.size.height);
137 WMDrawImageString(W_VIEW_SCREEN(gview->view),
138 W_VIEW_DRAWABLE(gview->view),
139 gview->gc, gview->font,
140 (W_VIEW_WIDTH(gview->view)-gview->textSize.width)/2,
141 (W_VIEW_HEIGHT(gview->view)-gview->textSize.height)/2,
142 buffer, strlen(buffer));
144 W_DrawRelief(W_VIEW_SCREEN(gview->view), W_VIEW_DRAWABLE(gview->view),
145 0, 0, W_VIEW_WIDTH(gview->view), W_VIEW_HEIGHT(gview->view),
146 WRRaised);
151 static void
152 handleEvents(XEvent *event, void *clientData)
154 WGeometryView *gview = (WGeometryView*)clientData;
156 switch (event->type) {
157 case Expose:
158 paint(gview);
159 break;