miniGUI 配置使用FAQ

admin @ 2014-03-25 , reply:0

        下面是關於miniGUI的一些hints,應該覆蓋了miniGUI使用中的很多問題,不過,個人覺得,在移植miniGUI至某個特殊平台時,關於系統的經驗還是很重要的,甚至超過下面這些小技巧的重要性;另外,仔細閱讀文檔也是相當重要的一環,仔細讀文檔能幫助你避免很多麻煩。不過這份文檔當初是拿來我自己參考的,所以格式還有排版以及完整性都比較欠缺,不過還是希望能對象我這樣初用miniGUI的人有所幫助。另外,十分感謝kongmin, piano,armix諸位的討論,沒有他們前面的摸索,我們這些後來人要走不少彎路。

1、Framebuffer支持:使用miniGUI時,需要系統啟動framebuffer支持,在lilo.conf中添加一行:
vga=0x0317
在啟動時進入framebuffer模式,也可用fbset設置;

2、如果啟動時提示init錯誤,可以考慮給lilo傳遞init參數:
init=/bin/sh rw

3、如果miniGUI啟動錯誤,考慮可能是以下原因:
A)沒有啟動framebuffer,即lilo.conf中的vga=XXXX,顯示模式參照表如下:
640x480 800x600 1024x768 1280x1024
256 0x3010x3030x3050x307
32k  0x3100x3130x3160x319
64k  0x3110x3140x3170x31A
16M  0x3120x3150x3180x31B
B)啟動了framebuffer,但無fb設備文件,可以自己創建/dev/fb0文件:
mknod fb0 c 29 0
C)miniGUI需要/var/tmp目錄,如果不存在也會導致錯誤;

4、 MiniGUI提供抓屏,用PrintScr鍵,抓到的圖片為tmp模式,存在當前目錄下;

5、有些時候,在試了很多方法之後設備仍然不能使用,可以考慮換個知名品牌的硬體試試,會有驚喜;

6、MiniGUI需要Unix Domain socket和System V IPC支持,內核里需要這兩個;

7、啟動時的輸入條可以用ctrl鍵關閉/啟動,不過可能響應比較慢,要多摁幾下;另外,也可以通過配置MiniGUI.cfg文件里的imenumber選項:
[imeinfo]
imenumber=2
將imenumber=2改為imenumber=0,啟動時就不會出現輸入條了;

8、iniGUI對串口滑鼠的支持:
MiniGUI 的 Native IAL engine 目前不支持串口滑鼠。
如果要使用滑鼠,可以通過 gpm 程序:
1. 運行 gpm -k 命令殺掉正在運行的 gpm。
2. 運行 mouse-test 命令確認自己的滑鼠設備和協議。
3. 運行 gpm,指定滑鼠設備和協議:
gpm -R -t <yourmousetype> -m <yourmousedevice>
4. 編輯 /etc/MiniGUI.cfg 文件,將 mtype 設置為 gpm。
 將 mdev 設置為 /dev/gpmdata。
重新啟動就OK了。
注意:用gpm設置滑鼠格式的時候,可以使用-R參數,gpm 的 -R 參數是指定將原有滑鼠協議轉換成哪種滑鼠協議,並 出現在 /dev/gpmdata 文件上的。
gpm -R -t ms -m /dev/psaux
ms3 這種滑鼠協議目前的 ial 引擎中 gpm 類型的設備所不支持的。

9、Framebuffer選項需要在內核中打開試驗選項,即第一項:
Code maturity level options-》Prompt for development and/or incomplete code/drivers

10、popt.h文件的用處:
這東西專門用於命令行解析,如果你不準備使用miniGUI的虛擬控制終端,大可以將其扔掉(我就把它給扔了:))。還有不少交叉編譯環境都不支持這玩意,小心點哦。 如果你要在目標版上支持控制終端,內核得有pty與pts支持

11、關於i810的framebuffer支持:
i810 的確是個令人鬱悶的顯示晶元。Linux 內核中沒有對這個顯示晶元的 FrameBuffer支持(除標準的 VGA16 FrameBuffer 之外)。
網路上有一個專門為 i810 編寫的 FrameBuffer 驅動程序,以下是配置步驟:

The steps described here are given by leon, and have been tested on
RedHat Linux 7.1, Linux kernel 2.4.2.

  1.  get the i810fb tar ball -- i810fb_1.0x.tbz
    which is compressed by bz2.
    you can get it from http://www.visuelle-maschinen.de/ctfb/i810/
  2.  ucompress the tarball (using 'bunzip2' and 'tar' commands), and copy the i810fb.c i810fb.h
    to your kernel directory:
    /usr/src/linux-2.4/drivers/video
  3.  modify the file: /usr/src/linux-2.4/drivers/video/fbmem.c

    1) add these lines as declaration:

    #ifdef CONFIG_FB_I810
    extern int i810fb_init (void);
    extern int i810fb_setup (char*);
    #endif

    before lines:

    static struct {
    const char *name;
    int (*init)(void);
    int (*setup)(char*);
    } fb_drivers[] __initdata = {
    ...

    2) add these lines as the entry for i810 FrameBuffer driver:

    #ifdef CONFIG_FB_I810
    { "i810fb", i810fb_init, i810fb_setup },
    #endif

    before lines:

    #ifdef CONFIG_FB_VESA
    { "vesa", vesafb_init, vesafb_setup },
    #endif
    ...
  4.  if you compile this driver into the kernel 2.4.0 or above,
    you should modify the file: /usr/src/linux-2.4/drivers/char/agp/agpgart_be.c

    Current version:
    ----------------
    static int __init agp_init(void)
    {
    init ret_val;
    ...

    Change to:
    ----------
    int __init agp_init(void)
    {
    static int ret_val = 0;
    static int woman = 0;
    if (woman) return ret_val;
    woman = 1;
    ...
  5.  edit the Makefile in the directory: /usr/src/linux-2.4/drivers/video
    add line:

    obj-$(CONFIG_FB_I810) += i810fb.o
  6.  edit the Config.in in the directory: /usr/src/linux-2.4/drivers/video
    add these lines:

    if [ "$CONFIG_PCI" = "y" ]; then
    bool ' i810 support' CONFIG_FB_I810
    fi

    below the lines:

    bool 'Support for frame buffer devices (EXPERIMENTAL)' CONFIG_FB_RIVA

    if [ "$CONFIG_FB" = "y" ]; then
    define_bool CONFIG_DUMMY_CONSOLE y
    if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
    if [ " $CONFIG_PCI" = "y" ]; then
    tristate ' nVidia Riva support (EXPERIMENTAL)' CONFIG_FB_RIVA
    fi
  7.  exexute the 'make menuconfig'
    a, make sure:
    Character devices --->
    <*> /dev/agpgart (AGP Support)
    ·  Intel I810/I815 (on-board) support
    b, make sure:
    Console drivers --->
    Frame-buffer support --->
    ·  i810 support
  8.  compile the kernel image:

    make dep
    make bzImage
  9.  then cp your-bzImage /boot
  10.  edit /etc/lilo.conf:
    add lines:

    image = /boot/your-bzImage
    append = "video=i810fb:x:1280,xv:1280,y:1024,yv:1024, \
    depth:16,pclk:7800,le:248,ri:16,up:38,lo:1, \
    hs:144,vs:3,sync=3,vmode:0,accel:0,font:VGA8x8"
    initrd = /boot/initrd
    label = i810fb

    note: if your monitor doesn't support the 1280x1024 mode
    you can add this lines instead:

    image = /boot/your-bzImage
    append = "video=i810fb:x:1024,xv:1024,y:768,yv:768, \
    depth:16,pclk:15384,le:168,ri:8,up:29,lo:3, \
    hs:144,vs:6,sync=3,vmode:0,accel:0,font:VGA8x8"
    initrd = /boot/initrd
    label = i810fb

    This is a 1024x768x16bpp mode with 60Hz vertical frequency.
  11.  Run 'lilo' command.
  12.  Congratulations!! you can reboot your computer now!


12、移植miniGUI的心得:
應上頭要求,我花了三天時間把miniGUI 1.00挪上了mips VR4181(內核vrlinux).
以下供大家參考:
  編譯所需頭文件主機x86與mips不同,可能會引起編譯出錯;
  觸摸屏介面用microWindow的就行,它帶有校正功能,很不錯;
  上板子時遇到莫名其妙的共享內存操作錯誤,重倒幾次后問題又奇怪地消失了(why?)。

13、i810/815主板的framebuffer攻略:
經歷了2天的痛苦
我終於讓我的815上出現了企鵝的LOGO了
而且fbset能夠列出顯示
如果是815/810的同志們再遇到FB問題的話
我願意在這裡解答問題
其實讓815/810(內置顯卡)支持FB說白了不是太難
1.下載一位洋人為815/810寫的FB驅動(內付詳細安裝說明)
2.按照那位洋人說的修改/linux/Driver(內核的Driver目錄--內核可使用原來的亦可下載其他版本的--注意洋人在安裝說明中所說的驅動要求的內核版本)下的部分文件
3.重新make內核(這一步需要參照www.minigui.org/cdoc.htm里的framebuffer配置方法)
4.重起機器應該就能看見企鵝了(反正我是按照這個方法一次就成功的)
有問題的話歡迎提出
i810fb_1.08.tbz的下載地址
http://www.visuelle-maschinen.de/ctfb/i810/

14、又一案例:
現象:我用的是EP7212的板子,BlueCat的開發平台,下載了三個資源文件,libminiGUI1.1.0pre7,mde-0.2.7,資源文件安裝了,然後解開libminiGUI1.1.0,
運行./autogen.sh,再運行./configure,再運行make,出現這麼一個錯誤:
Making all in server
make[3]: Entering directory '/BlueCat/demo.clep7212/developer/src/minigui/libminigui-1.1.0/src/server'
/bin/sh ../../libtool --moe=complile gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../..
/include -I../include -g -02 -D__MINIGUI_LIB__ -02 -Wall -Wstrict-prototypes
-pipe -DNDEBUG -c server.c
gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I../include -g -02 -D__MINIGUI_LIB__ -02 -Wall -Wstrict-prototypes -pipe -DNDEBUG -Wp,-MD,.deps/server.pp -c server.c -o server.o
../../gcc/pexecute.c:245: Internal compiler error in function pexecute
make[3]: ***[server.lo] Error 1
make[3]: Leaving directory '/BlueCat/demo.clep7212/developer/src/minigui/libminigui-1.1.0/src'
make[1]: *** [all-recursive] Error1

解決方法:搞定!
Todd Goodman on Sun, 28 Feb 1999 10:10:28 -0600 (CST) 
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
[Freeciv-Dev] Building Under Cygwin 
To: <freeciv-dev@freeciv.org>
Subject: [Freeciv-Dev] Building Under Cygwin
From: "Todd Goodman" <tsg1@earthlink.net>
Date: Sun, 28 Feb 1999 11:05:28 -0500
Sender: freeciv-dev-bounce@freeciv.org

--------------------------------------------------------------------------------

I just wanted to let you know that the latest CVS does not build
without changes on Cygwin.

The problem is that the gcc distributed with Cygwin 20.1 barfs
on the -pipe option with an internal compiler error:

make all-recursive
Making all in data
Making all in default
make[3]: Nothing to be done for `all'.
Making all in civ1
make[3]: Nothing to be done for `all'.
Making all in classic
make[3]: Nothing to be done for `all'.
Making all in common
gcc -DHAVE_CONFIG_H -I. -I. -I..   -g -O2 -Wall -pipe -c capability.c
/home/noer/src/b20/comp-tools/devo/gcc/pexecute.c:245: Internal compiler
error in function pexecute
make[2]: *** [capability.o] Error 33
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive-am] Error 2
/usr/local/src/freeciv/freeciv>

I fixed it by patching configure.in to no longer use the -pipe option.
I'm going to be reporting this problem to the Cygwin list too.

My patch to configure.in is:

  --- configure.in        Sun Feb 28 10:52:22 1999
  +++ configure.in.orig   Sun Feb 28 10:51:40 1999
  @@ -104,8 +104,7 @@
   dnl  AC_PROG_MAKE_SET

   if test -n "$GCC"; then
  -   dnl CFLAGS="$CFLAGS -Wall -pipe"
  -   CFLAGS="$CFLAGS -Wall"
  +   CFLAGS="$CFLAGS -Wall -pipe"
   fi

   if test "$CVS_DEPS" = "maybe"; then

Thanks,

Todd

--------------------------------------------------------------------------------

Prev by Date: [Freeciv-Dev] trouble with SuSE.& freeciv
Next by Date: Fwd: Re: [Freeciv-Dev] A city doesn't have a mine beneath it
Prev by thread: Re: [Freeciv-Dev] trouble with SuSE.& freeciv
Next by thread: [Freeciv-Dev] Pre-Alpha WIN 95/98/NT Installation Available to Test
Index(es):
Date
Thread

15、miniGUI的裁減
裁剪 MiniGUI 的三個步驟:
1. 在運行 ./configure 時進行定製,取消某些不需要的功能。
2. 修改 /etc/MiniGUI.cfg,刪除某些不需要的字體文件。比如, 如果你只使用 GB2312、12 點陣的字體,就可以只保留系統字體, 而刪除其他的字體。當然了,刪除的方法是修改 fontnumber 鍵 的值,而不是刪除這個段。對應的那些字體文件,就可以從系統 中刪除了。
3. 那三個資源包中實際有用的東西,都列在了 /etc/MiniGUI.cfg 文件中。 如果哪個文件沒有出現在 /etc/MiniGUI.cfg 中,就刪除這個文件。
這樣,一般可以將 MiniGUI 及其所使用的文件縮小到 2M 以內,有的情況下可以縮小到 1M 以內。
移植時,光修改配置文件是不夠的。 默認情況下,許多針對具體嵌入式系統的 IAL 引擎並沒有編譯到 MiniGUI 函數庫 當中。你要在運行 ./configure 腳本的時候指定所需要的引擎。 具體方法,可參閱 http://www.minigui.org/cdoc.shtml 中有關配置的文章。 也可以參閱源代碼當中的 ./buildlib-* 文件。
如果你使用的是 MiniGUI 1.1.0PreX 版本,請使用老 GAL 引擎來提供
對 4bpp 灰度 LCD 的支持。也就是在配置時使用
--disable-newgal
選項。新的 GAL 引擎,不支持低於 8 bpp 的演示模式。
另外,你還需要在配置時指定
--enable-fblin4
--enable-ep7211ial
等選項。

16、編譯時的-m286和-m486選項的作用和意義:
from gcc-HowTo中文版:
這之中最重要的有是- m386和-m486這兩種,用來告訴gcc該把正在編譯的程序代碼視作專為386或是486機器所寫的。不論是用哪一種-m來編譯程序代碼,都可以在彼此的機器上執行,-m486編譯出來的碼會比較大,不過拿來在386的機器上跑也不會比較慢就是了。
目前尚無-mpentium或是- m586的旗號。Linus建議我們可以用-m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2來得到最佳編碼的486程序代碼,這樣做正好就可以避免alignment(Pentium並不需要)有過大的 gaps發生。

17、MiniGUI移植到EP7211的問題:
我最近幾天一直忙著移植MiniGUI到EP7212板上,碰到不少問題,在此一次列出,請大家指點:

  1. Cygwin下編譯pexecute.c錯誤問題,去掉autogen.sh產生的configure.in中的-pipe;
  2. Libminigui-1.1.0編譯根據舵主手諭:./configure --disable-newgal--enable-fblin4 --enable-ep7211ial 。編譯ok,但我編譯的libminigui都是靜態庫。我在redhat上同樣編譯卻是動態連接庫,奇怪?
  3. 庫文件找不到,Makefile中手工加-lm;,編譯後文件都2M多,如何編譯成動態庫?
  4. 編譯mde-0.2.7,bomb,same等程序出錯,好像調用newgdi/下的attr.c中的函數出錯,為什麼調newgdi呢?我編譯庫時指定了--disable-newgal,難道mde-0.2.7不能運行在ep7212?
    不管三七二十一,刪掉Makefile里的subdirs相關目錄,先編譯過了再說。
  5. 仔細看發現InitEP7211Input()函數里打開設備/dev/ts,還有一個文件/etc/ts.conf
    難道設備不用MiniGUI.CFG里指定的?ts.conf那來的?mtype=應該是什麼?
  6. strip mginit后,變成600多k,勉強倒到板上,運行出錯,憑我的想象,修改
      /etc/MiniGUI.cfg:
      gal_engine=native
      ial_engine=native
      mdev=/dev/tpanel     #我用mknod -m 644 /dev/tpanel   c 10 12產生的
      mtype=PS2            #我不清楚touchpanel改用什麼,索性不改
      defaultmode=320x240x4
      運行,出現錯誤:
    Error in step 8: Can not initialize low level event!
    InitGUI failure when using /etc/MiniGUI.cfg as cfg file.
    看來時ial出錯,查來查去好像init-lite.c文件調用引起,難道編譯了lite版本?EP7212上能用lite版本么?

看來你還是做了許多研究,但沒有找到主要問題。
MiniGUI 中給出了針對 EP7211 的 IAL 引擎,但並沒有針對 EP7212 的 IAL 引擎。如果兩者不同,你需要自己編寫一個引擎,就像 EP7211 的引擎一樣,並且要在/etc/MiniGUI.cfg 文件中指定 ial_engine=ep7212,而不是 native。native 的 ial 引擎是用於 PC 的,操作的是鍵盤和滑鼠,你用在你的 EP7212 板子上能行嗎?
mdev 和 mtype 是給 IAL 引擎使用的一些可配置參數。某些 IAL 引擎(比如 EP7211)根本就沒有可配置的選項,所以程序不用這些配置參數,直接將設備名稱硬編碼到代碼當中了,所以,是否設置 mdev 和 mtype,這無關緊要。
defaultmode 是用於新的 GAL 引擎的,你使用舊的 GAL 引擎,沒有任何作用。
對於你這種情況,建議如下:
1. 在配置 MiniGUI 的時候,打開 Dummy ial 引擎,即使用如下的參數:
 --enable-dummyial
 其他的參數和你以前使用的一樣。既然 EP7211 的引擎和你 EP7212 的引擎 不一樣,就不需要使用這個引擎了。Dummy IAL 引擎是個什麼工作都不做的 引擎。使用這個引擎你可以首先將 MiniGUI 在目標板上運行起來,然後再 進一步參照其他的引擎編寫適合自己的引擎。
2. 在 /etc/MiniGUI.cfg 中,指定如下設置:
 gal_engine=native
 ial_engine=dummy
 其他參數可以忽略。
至於無法生成動態庫的問題,可能和你的編譯環境設置有關,我就幫不上什麼忙了。

18、newgal和gal的區別:newgal 只支持 8 位色以上的線性顯示模式,功能強大,
而低於 8 位色的那些模式(比如 16 色及低於 16 色的灰度等等)不被支持。

19、設置ial引擎的問題:
大家新年好!請問:
在MiniGUI.cfg文件中,如設置
ial_engine=Dummy
則 mdev,mtype如何設置?
設置ial_engine=Dummy后,演示程序mginit能否運行?

那兩個參數隨便取值即可。
在使用 Dummy 引擎之後,MiniGUI 是可以正常運行的,
只是你無法控制程序而已,因為沒有任何的輸入。

20、系統時間對miniGUI也會有影響。譬如,如果系統時間不對,生成的文件時間比源文件舊,會導致make進行clock skew

21、桌面程序的層:
今天總算把MiniGUI給裝上了,真爽呀!但是為什麼不管運行什麼程序都是在屏幕右邊三分之二處有一條線把屏幕分成二部分了?

MiniGUI-Lite 原本是每個客戶進程在自己的層中運行的。
後來可以讓許多進程在同一個層中運行,但不能互相重疊。
那個線就是表示一個客戶在一個層中所佔有的矩形區域。

kongming大哥,你的意思是不是說,除了不能互相重疊之外,是可以在桌面上同時看到兩個矩形區域,分別有不同的客戶程序在運行呢?可是在mde中除了能看到一個客戶程序和桌紙、任務欄外,即便還運行著別的客戶程序也是看不到的呀。
如果要做一個比較完善的窗口管理器的話,是不是可以做到“讓許多進程在同一個層中運行,並能互相重疊”的效果呢,是不是還可以象windows下那樣隨意移動窗口的位置和改變窗口的大小呢?
我是新手,剛剛把MiniGUI安裝好,還不懂其編程呢,所以問題很幼稚,請大俠們不要見笑,不吝賜教喲:)

那需要在運行程序時添加一個特殊的選項,
比如:
./fminigui -layer vcongui
指定它加入某個層,否則會新建一個層。
其實,在許多嵌入式設備當中,有這種層,以及進程內的多窗口完全支持,就足夠了。

22、在Embedded Planet上安裝MiniGUI.1.1.0的注意事項:

  1. 修改helio.c文件
          #define _HELIO_BUTTON  1
    改為  #undef _HELIO_BUTTON
  2. 修改configure文件
         CC = “$ac_cv_prog_cc”
    改為 CC = ppc_8xx-gcc
  3. 修改config.h文件
         #undef  _EXT_CTRL_TREEVIEW
    改為 #define  _EXT_CTRL_TREEVIEW
  4. 修改tools/目錄下的Makefile文件:
          LIBS = -lminigui
    改為:LIBS = -lminigui –lm
  5. taskbar.c中去掉
    hIMEwnd = IMEWindowEx…….
  6. 配置使用build_helio
  7. 頭文件、四個庫文件、資源文件以及配置文件MiniGUI.cfg都要複製到嵌入式系統的對應目錄中。
  8. 根據mginit目錄中minigui.rc文件的要求將mginit及其它demo複製到相應目錄下。

23、about滑鼠的問題:
現在我的pc104平台上已經顯示出bomb的畫面,真令人激動。現在還有兩個小問題想請教
1。bomb只在屏幕上顯示了一部分,功能正常,** 但我無法修改圖形模式**,
我的顯卡(C&T 65535 1M)可以用SVGALib的測試程序,最高可設為1024x768x256
我在MiniGUI.cfg中設置了
[SVGALib]
defaultmode=1024x768x256(1024x768x256或1024x768-256 ,1024x768x-8bpp,640x480-256)
從bomb退出后均提示無效的圖形模式。
若設成:defaultmode=G1024x768x256(或G640x480x256) 則黑屏
我看了網站上的文檔,好象沒有具體的說明,不知如何設 置
2。我看網站上有貼是關於串列口滑鼠支持的一段修改的程序(用ms3),我下載后編譯成功,但滑鼠無法驅動。是否此修改不能在SVGALib上用?

第一個問題:
正確的設置應該是

[SVGALib]
defaultmode=G1024x768x256

如果是黑屏,可能是驅動不支持的原因,也許要修改 /etc/vga/libvga.conf 中的設置。

第二個問題:
那段程序是用來支持 native IAL 引擎的,SVGALib 的滑鼠支持,需要修改
/etc/vga/libvga.conf 文件。

將 mousetype 設置為 Microsoft,並正確設定滑鼠設備文件。

我現在用PS2滑鼠,顯卡正常的設置應該是G320x200x256 ,我看了一下文件src/gal/svgalib.c 似乎在模式非法時預設返回G320x200x256,然後我將MiniGUI.cfg的模式也改成這個后,可以正常。改成G640x480x256  ,或G1024x768x256都會黑屏,但這兩種模式我安裝好SVGALib-1.4.0后運行其自帶的vgatest測試程序都可以正常顯示。不知 SVGALib圖形引擎支持的模式,是否minigui-1.1.0都支持?黑屏跟其他設置有關嗎,比如滑鼠,鍵盤?
 另外,在執行./configure ----disable-newgal --disable-nativegal --enable-svgalib后 似乎仍然沒有將SVGALib編譯進去,我看了以下生成的文件config.h,有一行
/*undef _SVGALIB*/
必須還要加上--disable-lite生成的config.h里就有了#define _SVGALIB 1,不知是否是這樣?

應該和滑鼠鍵盤沒有關係。
至於配置選項,的確應該加上 --disable-lite,因為 MiniGUI-Lite 版本不能在
SVGALIB 上運行。所以,我估計應該是這個問題造成的。

24、如何在啟動的任務欄中添加自己的程序:
我們在redhat7.2上編譯好minigui1.1.x后,準備學習在該環境下編譯調試minigui應用程序。我們以源程序中附帶的hello world程序為例。該程序要求畫一個窗口並在其中顯示Hello world。
  於是大家摸索如何在mginit中添加一個圖標,並使該圖標的點擊啟動hello world程序。基本做法如下:
  1、在mde0.3.0中添加一個hello文件包,並將hello world源程序複製到其中。
  2、將notebook中的Makefile等三個文件以及res包複製到hello中。
  3、分別修改三個make文件,將其中的notebook字樣全部替換為hello。
  4、用linux下的任何圖像編輯工具設計一個圖標存為hello.png和hello.gif,存到mginit包下的res包中。
  5、修改mginit包下的mginit.rc文件:將其中的nr=10,改為nr=11;
       複製其中的一組程序段到最後,段頭改為apply10;其中對應的字樣也改為hello
  6、修改mginit包下的三個make文件,其中有一個地方列出了很多應用程序可執行文件名,在其中添加hello。
  至此,基本修改結束。執行make命令。成功后,運行mginit,則應能看到mginit窗口下多了一個圖標,那就是你設計的。點擊之,應該能看到hello world程序運行結果。
  不一定描述準確,僅供參考。

25、 miniGUI應用程序的問題:
各位兄弟:
  大家好!我做了一個應用,使板子一上電Linux引導之後就自動運行MiniGUI伺服器進程和MiniGUI應用程序,但發現伺服器進程mginit每次均能正常運行,而應用程序時好時壞(有時能起來,有時卻起不來)。我估計這種現象可能是伺服器與應用程序之間的通訊造成的(即伺服器還沒有準備好,而應用程序卻開始運行了)。但發現在mginit&之後加延時再跑應用程序也存在著這個問題。下面是我寫的簡單伺服器進程mginit.c和應用程序 test.c,可能存在著桌面、層、通訊方面的問題與不足,請大家不吝賜教,謝謝!

  顯示:單色LCD(320*240)

  一、伺服器進程mginit.c
  
  int DisplayImeProc(HWND hWnd, int nMsg, WPARAM wParam, LPARAM lParam);

  int MiniGUIMain (int args, const char* arg[])
{
  MSG Msg;
  MAINWINCREATE CreateInfo;
  HWND hMainWnd;


  if (!ServerStartup ())
  {
      fprintf(stderr, "Can not start mginit.\n");
      return 1;
  }

  
  if(SetDesktopRect (0, 207, 320, 240)==0)
  {
     fprintf(stderr, "Can not get the required desktop rectangle.\n");
     return 2;
  }
  

  if(!InitMiniGUIExt())
  {
  
     fprintf(stderr, "Can not init mgext library.\n");
     return 3;
  }

  CreateInfo.dwstyle =  WS_BORDER;
  CreateInfo.dwExstyle = WS_EX_NONE;
  CreateInfo.hMenu =(HMENU)NULL;
  CreateInfo.hCursor =(HCURSOR)(IDC_ARROW);
  CreateInfo.hIcon = GetSmallSystemIcon (IDI_APPLICATION);
  CreateInfo.lx=0;
  CreateInfo.ty=207;
  CreateInfo.rx=320;
  CreateInfo.by=240;
  CreateInfo.hMenu=(HMENU)NULL;
  CreateInfo.MainWindowProc=DisplayImeProc;
  CreateInfo.iBkColor=COLOR_lightwhite;
  CreateInfo.dwAddData=0;
  CreateInfo.hHosting=HWND_DESKTOP;

  hMainWnd=CreateMainWindow(&CreateInfo);
  
    
  if(hMainWnd==HWND_INVALID)
  {
       fprintf(stderr,"Main Window invalid!\n");
       return -1;
  }
  
  ShowWindow(hMainWnd,SW_HIDE);
  
  
  while(GetMessage(&Msg,hMainWnd))
  {
    DispatchMessage(&Msg);
  }
  
  MainWindowThreadCleanup(hMainWnd);
  
  return 0;
}


int DisplayImeProc(HWND hWnd, int nMsg, WPARAM wParam, LPARAM lParam)
{
 
 switch (nMsg)
 {
     case MSG_CREATE:
    {
IMEWindow(hWnd);
return 0;
    }
 }
 
return DefaultMainWinProc(hWnd, nMsg, wParam, lParam);
  
}

二、應用程序test.c
 int MiniGUIMain (int args, const char* arg[])
{
  MSG Msg;
  MAINWINCREATE        CreateInfo;
  HWND hMainWnd;
  HHOOK hhook;

  SetDesktopRect (0, 0, 320, 207);
  CreateInfo.dwstyle =  WS_BORDER;
  CreateInfo.dwExstyle = WS_EX_NONE;
  CreateInfo.hMenu =(HMENU)NULL;
  CreateInfo.hCursor = GetSystemCursor (IDC_ARROW);
  CreateInfo.hIcon = GetSmallSystemIcon (IDI_APPLICATION);
  CreateInfo.MainWindowProc = MainWinProc;
  CreateInfo.lx = 0;
  CreateInfo.ty = 0;
  CreateInfo.rx = 320;
  CreateInfo.by = 207;
  CreateInfo.iBkColor=COLOR_lightwhite;
  CreateInfo.dwAddData = 0;
  CreateInfo.hHosting = HWND_DESKTOP;
  
  if(!InitMiniGUIExt())
  {
    return 1;
  }
  
  hMainWnd = CreateMainWindow (&CreateInfo);
  
  if (hMainWnd == HWND_INVALID)
      return 2;

  ShowWindow (hMainWnd, SW_SHOWNORMAL);
  hhook = RegisterKeyMsgHook(hMainWnd, AllKeyboardProc);
  while( GetMessage (&Msg, hMainWnd))
  {
  TranslateMessage(&Msg);
      DispatchMessage (&Msg);
  }

  UnregisterHook (hhook);
  MainWindowThreadCleanup (hMainWnd);

  return 0;
}

三、存在的問題:
  1.mginit進程與應用程序進程test存在著通訊上的問題(即伺服器進程能正常工作,而 應用程序有時能起來,有時卻起不來)。如何解決?
    具體實現,在/etc/rc.sysinit文件中加入:
        insmod ...    //加入一些驅動,如DOC、鍵盤。
        mginit &
        ./test &
  2.在應用程序中的編輯框中,按左右方向鍵不能在編輯框中的字元間移動,但左右方向鍵在MiniGUI上能通過按鍵消息得到。是否與Caret的設置有關?

  3.伺服器與應用程序中相應的配置是否還存在著問題? (主要是桌面、層方面)

1. 如果是你懷疑的那個願意,你可以試著在 mginit 當中 fork 然後執行 test 程序。
 就像 MDE 中的 mginit 那樣。
2. 是在你的目標板上不正常嗎?
3. 似乎沒有什麼問題。

1.為了使mginit快速啟動,我把mginit和運行庫放到了FLASH中了,而應用程序、字型檔、輸 入法放在DOC中。但大多數情況下,應用程序都能起來。

2.板子好像沒有問題,但可能驅動大多造成了伺服器與應用間的通訊。我有DOC、AD、顯示、鍵盤等驅動。
至於游標,跑例子程序中的notebook,左右方向鍵仍然不能在字元間移動。

Kong Ming:
 您好!
 問題已經解決,原來是我在mginit中處理MSG_PAINT消息后使用了 return 0;語句,而應使用break;結束,從而引起了mginit 死機!還有游標問題基本上已得到解決,原來我在鍵盤驅動中處理左右方向鍵時,掃描碼沒有按照MiniGUI的要求做。修改之後,游標已能在Edit框中左右移動了,但在ComboBox框中設置了焦點,仍不出現閃爍的豎線游標,請問是什麼原因?

請問你是怎麼設置 ComboBox 控制項的焦點的?

使用SetFocus(hComboOperator);其中,hComboOperator是所創建組合框的窗口柄。謝謝!

似乎不應該出問題啊。你用的是什麼版本的 MiniGUI?檢查一下 src/control/combobox.c 中 SETFOCUS 消息的處理。

我用的是MiniGUI1.10Pre9,在這個版本中怎麼沒有SETFOCUS的消息處理呢?

那看來是版本太老的原因,建議你還是升級到最新的 1.2.1 吧。

26、如果mginit不能正常啟動的話,可以考慮減少mginit.rc的nr值,譬如修改為6,這個文件是mginit的配置文件。




[admin via 研發互助社區 ] miniGUI 配置使用FAQ已經有2993次圍觀

http://cocdig.com/docs/show-post-42523.html