Files
wmaker/src/geomview.c
T

134 lines
2.8 KiB
C
Raw Normal View History

2000-01-14 16:46:43 +00:00
#include <WINGs/WINGsP.h>
2000-01-14 16:46:43 +00:00
#include "geomview.h"
2013-06-10 22:38:08 +02:00
struct W_GeometryView {
2009-08-20 00:59:40 +02:00
W_Class widgetClass;
WMView *view;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
WMColor *color;
WMColor *bgColor;
2004-10-18 01:30:02 +00:00
2009-08-20 00:59:40 +02:00
WMFont *font;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
WMSize textSize;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
union {
struct {
int x, y;
} pos;
struct {
unsigned width, height;
} size;
} data;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
unsigned showPosition:1;
2013-06-10 22:38:08 +02:00
};
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
static void handleEvents(XEvent * event, void *clientData);
static void paint(WGeometryView * gview);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
WGeometryView *WCreateGeometryView(WMScreen * scr)
2000-01-14 16:46:43 +00:00
{
2009-08-20 00:59:40 +02:00
WGeometryView *gview;
char buffer[64];
static W_Class widgetClass = 0;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
if (!widgetClass) {
widgetClass = W_RegisterUserWidget();
}
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
gview = malloc(sizeof(WGeometryView));
if (!gview) {
return NULL;
}
memset(gview, 0, sizeof(WGeometryView));
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
gview->widgetClass = widgetClass;
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
gview->view = W_CreateTopView(scr);
if (!gview->view) {
wfree(gview);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
return NULL;
}
gview->view->self = gview;
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
gview->font = WMSystemFontOfSize(scr, 12);
if (!gview->font) {
W_DestroyView(gview->view);
wfree(gview);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
return NULL;
}
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
gview->bgColor = WMCreateRGBColor(scr, 0x3333, 0x6666, 0x9999, True);
gview->color = WMWhiteColor(scr);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
WMCreateEventHandler(gview->view, ExposureMask, handleEvents, gview);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
snprintf(buffer, sizeof(buffer), "%+05i, %+05i", 0, 0);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
gview->textSize.width = WMWidthOfString(gview->font, buffer, strlen(buffer));
gview->textSize.height = WMFontHeight(gview->font);
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
WMSetWidgetBackgroundColor(gview, gview->bgColor);
2004-10-18 01:30:02 +00:00
2009-08-20 00:59:40 +02:00
W_ResizeView(gview->view, gview->textSize.width + 8, gview->textSize.height + 6);
2000-01-14 16:46:43 +00:00
2009-08-20 00:59:40 +02:00
return gview;
2000-01-14 16:46:43 +00:00
}
2009-08-20 00:59:40 +02:00
void WSetGeometryViewShownPosition(WGeometryView * gview, int x, int y)
2000-01-14 16:46:43 +00:00
{
2009-08-20 00:59:40 +02:00
gview->showPosition = 1;
gview->data.pos.x = x;
gview->data.pos.y = y;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
paint(gview);
2000-01-14 16:46:43 +00:00
}
2009-08-20 00:59:40 +02:00
void WSetGeometryViewShownSize(WGeometryView * gview, unsigned width, unsigned height)
2000-01-14 16:46:43 +00:00
{
2009-08-20 00:59:40 +02:00
gview->showPosition = 0;
gview->data.size.width = width;
gview->data.size.height = height;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
paint(gview);
2000-01-14 16:46:43 +00:00
}
2009-08-20 00:59:40 +02:00
static void paint(WGeometryView * gview)
2000-01-14 16:46:43 +00:00
{
2009-08-20 00:59:40 +02:00
char buffer[64];
if (gview->showPosition) {
snprintf(buffer, sizeof(buffer), "%+5i , %+5i ", gview->data.pos.x, gview->data.pos.y);
} else {
snprintf(buffer, sizeof(buffer), "%+5i x %+5i ",
gview->data.size.width, gview->data.size.height);
}
WMDrawImageString(W_VIEW_SCREEN(gview->view),
W_VIEW_DRAWABLE(gview->view),
gview->color, gview->bgColor, gview->font,
(W_VIEW_WIDTH(gview->view) - gview->textSize.width) / 2,
(W_VIEW_HEIGHT(gview->view) - gview->textSize.height) / 2, buffer, strlen(buffer));
W_DrawRelief(W_VIEW_SCREEN(gview->view), W_VIEW_DRAWABLE(gview->view),
0, 0, W_VIEW_WIDTH(gview->view), W_VIEW_HEIGHT(gview->view), WRSimple);
2000-01-14 16:46:43 +00:00
}
2009-08-20 00:59:40 +02:00
static void handleEvents(XEvent * event, void *clientData)
2000-01-14 16:46:43 +00:00
{
2009-08-20 00:59:40 +02:00
WGeometryView *gview = (WGeometryView *) clientData;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
switch (event->type) {
case Expose:
paint(gview);
break;
2004-10-12 21:28:27 +00:00
2009-08-20 00:59:40 +02:00
}
2000-01-14 16:46:43 +00:00
}