From dd1d08461c289c0fe0187f82b3dbbd802f3d571d Mon Sep 17 00:00:00 2001 From: kojima Date: Fri, 14 Jan 2000 16:46:43 +0000 Subject: [PATCH] window position/size display widget --- src/geomview.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/geomview.h | 16 ++++++ 2 files changed, 177 insertions(+) create mode 100644 src/geomview.c create mode 100644 src/geomview.h diff --git a/src/geomview.c b/src/geomview.c new file mode 100644 index 00000000..2137d55e --- /dev/null +++ b/src/geomview.c @@ -0,0 +1,161 @@ + + + +#include "WINGsP.h" + + + +typedef struct W_GeometryView { + W_Class widgetClass; + WMView *view; + + GC gc; + WMFont *font; + + WMSize textSize; + + union { + struct { + int x, y; + } pos; + struct { + unsigned width, height; + } size; + } data; + + unsigned showPosition:1; +} WGeometryView; + + + +static void handleEvents(XEvent *event, void *clientData); +static void paint(WGeometryView *gview); + + +WGeometryView* +WCreateGeometryView(WMScreen *scr) +{ + WGeometryView *gview; + char buffer[64]; + static W_Class widgetClass = 0; + + if (!widgetClass) { + widgetClass = W_RegisterUserWidget(); + } + + gview = malloc(sizeof(WGeometryView)); + if (!gview) { + return NULL; + } + memset(gview, 0, sizeof(WGeometryView)); + + gview->widgetClass = widgetClass; + + gview->view = W_CreateTopView(scr); + if (!gview->view) { + free(gview); + + return NULL; + } + gview->view->self = gview; + + gview->font = WMSystemFontOfSize(scr, 12); + if (!gview->font) { + W_DestroyView(gview->view); + free(gview); + + return NULL; + } + + { + WMColor *black = WMBlackColor(scr); + WMColor *gray = WMGrayColor(scr); + XGCValues gcv; + + gcv.foreground = WMColorPixel(black); + gcv.background = WMColorPixel(gray); + + gview->gc = XCreateGC(WMScreenDisplay(scr), W_DRAWABLE(scr), + GCForeground|GCBackground, &gcv); + + WMReleaseColor(black); + WMReleaseColor(gray); + } + + WMCreateEventHandler(gview->view, ExposureMask, handleEvents, gview); + + sprintf(buffer, "%+05i, %+05i", 0, 0); + + gview->textSize.width = WMWidthOfString(gview->font, buffer, + strlen(buffer)); + gview->textSize.height = WMFontHeight(gview->font); + + W_ResizeView(gview->view, gview->textSize.width+8, + gview->textSize.height+6); + + return gview; +} + + +void +WSetGeometryViewShownPosition(WGeometryView *gview, int x, int y) +{ + gview->showPosition = 1; + gview->data.pos.x = x; + gview->data.pos.y = y; + + paint(gview); +} + + +void +WSetGeometryViewShownSize(WGeometryView *gview, + unsigned width, unsigned height) +{ + gview->showPosition = 0; + gview->data.size.width = width; + gview->data.size.height = height; + + paint(gview); +} + + + +static void +paint(WGeometryView *gview) +{ + char buffer[64]; + + if (gview->showPosition) { + sprintf(buffer, "%+5i , %+5i ", gview->data.pos.x, gview->data.pos.y); + } else { + sprintf(buffer, "%+5i x %+5i ", gview->data.size.width, gview->data.size.height); + } + + WMDrawImageString(W_VIEW_SCREEN(gview->view), + W_VIEW_DRAWABLE(gview->view), + gview->gc, 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), + WRRaised); +} + + + +static void +handleEvents(XEvent *event, void *clientData) +{ + WGeometryView *gview = (WGeometryView*)clientData; + + switch (event->type) { + case Expose: + paint(gview); + break; + + } +} + diff --git a/src/geomview.h b/src/geomview.h new file mode 100644 index 00000000..9dc74119 --- /dev/null +++ b/src/geomview.h @@ -0,0 +1,16 @@ + + +typedef struct W_GeometryView WGeometryView; + + +WGeometryView *WCreateGeometryView(WMScreen *scr); + +void WSetGeometryViewShownPosition(WGeometryView *gview, int x, int y); + +void WSetGeometryViewShownSize(WGeometryView *gview, + unsigned width, unsigned height); + + + + + -- 2.11.4.GIT