Files
sibo-playground/code/SIBOSDK/wkdemo/lcdview.c
2026-07-06 18:01:36 +01:00

241 lines
7.3 KiB
C

/*
File: LCDVIEW.C
Methods for Class: cpview (Superclass: win).
Main client window
*/
#include <lcdtest.g>
#include <hwim.g>
#include <gate.g>
#include <hwim.h>
#include <olib.h>
#include <fonts.h>
#include <p_file.h>
#include <lcdview.g>
#include <lcdtest.rsg>
#define FONT_DEF FONT_ID_MONO_8x8
#define CHARBUFFSIZE 64
GLREF_D PR_GATE *DatGate;
GLREF_D WSERV_SPEC *wserv_channel;
GLREF_D PR_LCDVIEW *DatApp3; /* Main Client Window */
LOCAL_C VOID lSetDisplayInfo(LCD_DISP_INFO * pLinfo)
{
G_FONT_INFO finfo;
gFontInfo(pLinfo->textfont,G_STY_MONO,&finfo);
pLinfo->numwidth = finfo.numeric_width;
pLinfo->textheight = finfo.height;
pLinfo->textascent = finfo.ascent;
pLinfo->lineheight = finfo.height + 2;
pLinfo->lineascent = finfo.ascent + 2;
pLinfo->scrlines = wserv_channel->conn.info.pixels.y
/pLinfo->lineheight;
pLinfo->scrwidth = wserv_channel->conn.info.pixels.x;
}
LOCAL_C VOID lSetGCTemp(UWORD fid, UWORD style)
/* Sets font and style */
{
G_GC g_gc;
g_gc.font = fid;
g_gc.style = (BYTE)style;
gSetGC(WS_TEMPORARY_GC,G_GC_MASK_FONT|G_GC_MASK_STYLE,&g_gc);
}
LOCAL_C VOID lFillCharBuff(PR_LCDVIEW *const self, TEXT *pTxt, INT size)
{
INT jj;
for(jj = 0; jj < size; ++jj, ++pTxt)
{
*pTxt = self->lcdview.letter;
++self->lcdview.letter;
if(self->lcdview.letter > 'Z')
self->lcdview.letter = 'A';
}
}
LOCAL_C VOID lDrawPatternHHH(PR_LCDVIEW *const self)
{
P_RECT rect0;
P_RECT rect1;
TEXT xBuff[CHARBUFFSIZE];
INT row;
INT chars;
UINT width;
p_bfil(&xBuff[0],sizeof(xBuff),'H');
/* Set font and style */
lSetGCTemp(self->lcdview.dinfo.textfont,G_STY_MONO);
rect1 = rect0 = *((P_RECT*)&self->lcdview.extent);
gClrRect(&rect1,G_TRMODE_CLR);
width = self->lcdview.dinfo.scrwidth;
chars = gTextCount(self->lcdview.dinfo.textfont,G_STY_MONO,
&xBuff[0],sizeof(xBuff),&width);
rect0.tl.y = 25;
++rect0.tl.x;
--rect0.br.x;
for(row = 0; row < 5; ++row)
{
rect0.br.y = rect0.tl.y + self->lcdview.dinfo.lineheight;
gPrintBoxText(&rect0,self->lcdview.dinfo.lineascent,
G_TEXT_ALIGN_LEFT,0,&xBuff[0],chars);
rect0.tl.y += 10;
}
gDrawBox(&rect1);
}
LOCAL_C VOID lDrawPatternOnOff(PR_LCDVIEW *const self)
{ /* Alternate pixels On/Off */
gFillPattern((P_RECT*)&self->lcdview.extent,
WS_BITMAP_GREY,G_TRMODE_REPL);
}
LOCAL_C VOID lDrawPatternON(PR_LCDVIEW *const self)
{ /* All pixels ON */
gClrRect((P_RECT*)&self->lcdview.extent,G_TRMODE_SET);
}
LOCAL_C VOID lDrawPatternOFF(PR_LCDVIEW *const self)
{ /* All pixels OFF */
gClrRect((P_RECT*)&self->lcdview.extent,G_TRMODE_CLR);
}
LOCAL_C VOID lDrawPatternGrey(PR_LCDVIEW *const self)
{
INT row;
P_RECT rect0;
G_GC g_gc;
gClrRect((P_RECT*)&self->lcdview.extent,G_TRMODE_CLR);
g_gc.flags = G_GC_FLAG_GREY_PLANE;
gSetGC(WS_TEMPORARY_GC,G_GC_MASK_GREY,&g_gc);
rect0 = *((P_RECT*)&self->lcdview.extent);
rect0.tl.y = self->lcdview.offset % (self->lcdview.dinfo.lineheight+1);
for(row = 0; row < self->lcdview.dinfo.scrlines; ++row)
{
rect0.br.y = rect0.tl.y + self->lcdview.dinfo.lineheight;
gClrRect(&rect0,row%2? G_TRMODE_SET: G_TRMODE_CLR);
rect0.tl.y += self->lcdview.dinfo.lineheight;
}
gClrRect(&rect0,G_TRMODE_CLR);
g_gc.flags = 0;
gSetGC(WS_TEMPORARY_GC,G_GC_MASK_GREY,&g_gc);
}
LOCAL_C VOID lDrawPatternChars(PR_LCDVIEW *const self)
{
P_RECT rect0;
TEXT xBuff[CHARBUFFSIZE];
INT row;
INT chars;
UINT width;
/* Set font and style */
lSetGCTemp(self->lcdview.dinfo.textfont,G_STY_MONO);
p_bcpy(&rect0,&self->lcdview.extent,sizeof(rect0));
gClrRect(&rect0,G_TRMODE_CLR);
for(row = 0; row < self->lcdview.dinfo.scrlines; ++row)
{
rect0.br.y = rect0.tl.y + self->lcdview.dinfo.lineheight;
lFillCharBuff(self,&xBuff[0],sizeof(xBuff));
width = self->lcdview.dinfo.scrwidth;
chars = gTextCount(self->lcdview.dinfo.textfont,G_STY_MONO,
&xBuff[0],sizeof(xBuff),&width);
self->lcdview.letter = xBuff[chars];
gPrintBoxText(&rect0,self->lcdview.dinfo.lineascent,
G_TEXT_ALIGN_LEFT,0,&xBuff[0],chars);
rect0.tl.y += self->lcdview.dinfo.lineheight;
}
}
LOCAL_C VOID SetPattern(PR_LCDVIEW *const self, VOID(*func)(PR_LCDVIEW *))
{
self->lcdview.funct = (VOID(*)(VOID*))func;
}
#pragma METHOD_CALL
METHOD VOID lcdview_wn_init(PR_LCDVIEW *const self)
{
W_WINDATA wd;
wd.background = W_WIN_BACK_CLR|W_WIN_BACK_GREY_CLR;
wd.flags = 0;
wd.extent.tl.x = wd.extent.tl.y = 0;
wd.extent.width = wserv_channel->conn.info.pixels.x;
wd.extent.height = wserv_channel->conn.info.pixels.y;
self->lcdview.extent = wd.extent;
p_send5(self,O_WN_CONNECT,NULL_D,W_WIN_ALL_FLAGS|W_WIN_EXTENT|W_WIN_BACKGROUND,&wd);
wStatusWindow(W_STATUS_WINDOW_OFF);
wsSetList(W_STATUS_WINDOW_ICON,NULL_D,0);
self->lcdview.letter = 'A';
self->lcdview.dinfo.textfont = FONT_DEF;
lSetDisplayInfo(&self->lcdview.dinfo);
SetPattern(self,lDrawPatternHHH);
}
METHOD VOID lcdview_wn_draw(PR_LCDVIEW *const self)
{
(*self->lcdview.funct)(self);
if(self->lcdview.status & LCD_STAT_INVERSE)
gInvObloid(&self->lcdview.extent);
}
METHOD INT lcdview_wn_key(PR_LCDVIEW *const self,UINT key,UINT mod)
{
switch(key)
{
case '0':
gCreateTempGC0(self->win.id);
gInvObloid(&self->lcdview.extent);
self->lcdview.status ^= LCD_STAT_INVERSE;
gFreeTempGC();
return WN_KEY_NO_CHANGE;
case '1':
SetPattern(self,lDrawPatternHHH);
break; /* to WN_DODRAW */
case '2':
SetPattern(self,lDrawPatternOnOff);
break; /* to WN_DODRAW */
case '3':
SetPattern(self,lDrawPatternON);
break; /* to WN_DODRAW */
case '4':
SetPattern(self,lDrawPatternOFF);
break; /* to WN_DODRAW */
case '5':
SetPattern(self,lDrawPatternGrey);
break; /* to WN_DODRAW */
case '6':
SetPattern(self,lDrawPatternChars);
break; /* to WN_DODRAW */
case W_KEY_UP:
++self->lcdview.offset;
break; /* to WN_DODRAW */
case W_KEY_DOWN:
--self->lcdview.offset;
break; /* to WN_DODRAW */
case W_KEY_HOME:
self->lcdview.offset = 0;
break; /* to WN_DODRAW */
case W_KEY_END:
self->lcdview.offset = self->lcdview.dinfo.lineheight;
break; /* to WN_DODRAW */
default:
return WN_KEY_NO_CHANGE;
} /* End switch() */
p_send2(self,O_WN_DODRAW);
return WN_KEY_NO_CHANGE;
}