一、数据结构抽象
很多产品的页面设计都有类似的效果,如以下这些系统的页面
对于每一个页面,抽象出如下结构体,
核心在于其中的Run函数:
page_manager.h
#ifndef _PAGE_MANAGER_H #define _PAGE_MANAGER_H typedef struct PageAction { char *name; void (*Run)(void *pParams); struct PageAction *ptNext; }PageAction, *PPageAction; void PageRegister(PPageAction ptPageAction); void PagesRegister(void); PPageAction Page(char *name); #endif
第10行:注册一个页面
第11行:注册多个页面
第12行:在链表里找到同名的页面名字
二、页面管理器
页面管理器用来管理页面,只需要实现2个函数:
1. PagesRegister : 把多个页面注册进链表
2. Page(name) :取出某个页面
page_manager.c
#include <common.h> #include <page_manager.h> #include <string.h> static PPageAction g_ptPages = NULL; void PageRegister(PPageAction ptPageAction) { ptPageAction->ptNext = g_ptPages; g_ptPages = ptPageAction; } PPageAction Page(char *name) { PPageAction ptTmp = g_ptPages; while (ptTmp) { if (strcmp(name, ptTmp->name) == 0) return ptTmp; ptTmp = ptTmp->ptNext; } return NULL; } void PagesRegister(void) { extern void MainPageRegister(void); MainPageRegister(); }
第6行:存放链表头
第8~12行:链表,用于将页面头文件注册到链表里,与头文件进行链接
第14~26行:在链表中找到同名的页面
三、单元测试
创建一个PageAction MainPage:
1.main_page.c
#include <page_manager.h> #include <stdio.h> static void MainPageRun(void *pParams) { printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__); } static PageAction g_tMainPage = { .name = "main", .Run = MainPageRun, }; void MainPageRegister(void) { PageRegister(&g_tMainPage); }
第7行:__FILE__文件,__FUNCTION__ 函数名,__LINE__ 行数
第17行:将构建的结构体注册进上层的页面管理器
2.page_test.c
#include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <linux/fb.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <sys/ioctl.h> #include <stdlib.h> #include <page_manager.h> int main(int argc, char **argv) { PagesRegister(); Page("main")->Run(NULL); return 0; }
第16行:将页面管理器注册进去
第17行:调用Page里面的Run函数传入NULL
3.unitttest下的Makefile
EXTRA_CFLAGS := CFLAGS_file.o := #obj-y += disp_test.o #obj-y += input_test.o #obj-y += font_test.o #obj-y += ui_test.o obj-y += page_test.o
4.page下的Makefile
EXTRA_CFLAGS := CFLAGS_file.o := obj-y += page_manager.o obj-y += main_page.o
四、上板测试
1.ubuntu上
book@100ask:~/source$ make book@100ask:~/source$ cp -r 23_page_unittest/ ~/nfs_rootfs/
2. 开发板上
[root@100ask:/]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt [root@100ask:/mnt/23_page_unittest]# ./test ./simsun.ttc
3.运行效果: