星期一, 3月 13, 2006

workrecord on gui -nonox

雖然只有用到簡單的icon和key動作,但是若是直接對framebuffer動作,一些line, drawtext, rectanglar等等都要自己寫,所以...還是用nanox好了。

Compile nanox demo program的command 是(從make output 抄下來的)
arm-elf-gcc -c -DMWPIXEL_FORMAT=MWPF_TRUECOLOR8888 -DHAVE_FILEIO -DHAVE_FNT_SUPPORT=1 -DFNT_FONT_DIR="\""fonts/bdf""\" -DHAVE_PCF_SUPPORT=1 -DPCF_FONT_DIR="\""fonts/pcf""\" -DHAVE_BMP_SUPPORT=1 -DHAVE_GIF_SUPPORT=1 -DHAVE_PNM_SUPPORT=1 -DHAVE_XPM_SUPPORT=1 -DHAVETEXTMODE=0 -DTHREADSAFE=1 -DERASEMOVE=1 -DUPDATEREGIONS=1 -DDEBUG=1 -DLINUX=1 -DUNIX=1  -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8  -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include -o demo2.o demo2.c

Link的command是
arm-elf-gcc  -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8  -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include  -L/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib -Wl,-elf2flt="s3276" demo2.o /home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib/libnano-X.a -o demo2
demo.o ~~~/lib/libnano-X.a -o demo 這個command會把demo.o和libnano-X.a link link起來。
這樣寫不用-lnano-X -L~~~/lib 指定兩個option : -l libraryname -L library path.

所以demo.c的Makefile就是:
TARGET = demo

CC = arm-elf-gcc
LD = arm-elf-gcc

CFLAGS = -DMWPIXEL_FORMAT=MWPF_TRUECOLOR8888 -DHAVE_FILEIO -DHAVE_FNT_SUPPORT=1 -DFNT_FONT_DIR="\""fonts/bdf""\" -DHAVE_PCF_SUPPORT=1 -DPCF_FONT_DIR="\""fonts/pcf""\" -DHAVE_BMP_SUPPORT=1 -DHAVE_GIF_SUPPORT=1 -DHAVE_PNM_SUPPORT=1 -DHAVE_XPM_SUPPORT=1 -DHAVETEXTMODE=0 -DTHREADSAFE=1 -DERASEMOVE=1 -DUPDATEREGIONS=1 -DDEBUG=1 -DLINUX=1 -DUNIX=1 -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8 -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include

LDFLAGS = -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8 -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include -L/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib -Wl,-elf2flt="s3276"

LDLIB = /home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib/libnano-X.a

$(TARGET) : $(TARGET).o
$(LD) $(LDFLAGS) $(TARGET).o $(LDLIB) -o $(TARGET)
chmod a+x $(TARGET)

$(TARGET).o : $(TARGET).c
$(CC) -c $(CFLAGS) $(TARGET).c -o $(TARGET).o

Some APIs:

GrReqShmCmds(size)
使用share memory的方式來和X-server溝通(不用BDS sock的方式)。這樣會比較快)。如果host os不支援share memory,nano-X會自動用BSD socket的方式。
GrNewWindow( parent,orgx,orgy,w,h,boardsize,background,boardercolor)
Create一個Window
GrMapWindow( winid)
將windows和他的child window都畫出來,送出EXPOSURE event改他(們)。
GrClose(void)
將Graphic device關閉,將所有message清空
最簡單的program,create一個window,用Ctrl-C 結束...
#include <stdio.h>
#include <stdlib.h>

#define MWINCLUDECOLORS
#include "nano-X.h"

int main(int argc,char **argv)
{
GR_EVENT event;
GR_WINDOW_ID w1;

if (GrOpen() >0) // 開啟和XServer連線的socket
exit(1);

w1 = GrNewWindow(GR_ROOT_WINDOW_ID,10,10, 100, 100, 1, BROWN, WHITE); // create一個window
GrSelectEvents(w1, GR_EVENT_MASK_CLOSE_REQ); // 指定接收CLOSE_REQ event
GrMapWindow(w1); // 顯示

while(1){
GrCheckNextEvent(&event); // get system event
switch(event.type){
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
break;
}
}
}
太過heavy weight,還是直接對framebuffer動作比較快(很多)。
所以把nano-X的graphic routine 改為直接動作。

原來nanox已經有這個功能。
修改config ,將LINK_APP_INTO_SERVER = Y。重新build就可以。
這樣nano-X 就不會以server的方式存在,application改為直接呼叫nanox的function。

rebuild之後,不用再run nano-X了。直接run demo program就可以。
測試結果果然快了很多。

沒有留言:

張貼留言