分类: LINUX
2009-04-12 21:05:21
一. 概述
nanowm在nano-X图形系统中的主要任务是提供对多个客户端窗体的集中管理,主要是对客户窗体进行边框绘制、及对客户窗体操作进行处理,如窗体的关闭,移动,放大、缩小等,还可以对窗体的外观进行定制,如改变窗体的标题文本、大小、前景或背景颜色或窗体边框的颜色,类似于window平台的主题定制。
二. 源码分析
好了,大理论我也说不太清楚,还是分析源代码吧^_^
1. 源码文件列表
nanowm的源代码在microwindows-0.91full\src\demos\nanowm\下,下面是该目录下的文件列表:
Actions.c 此文件实现的几个函数主要是用于客户窗体的在被HID设备down、up、move的时候对窗体进行处理
Clients.c 此文件实现的几个函数主要是用于客户窗体的子窗体的绘画,及窗体的新建、缩放、消毁。
Events.c 此文件实现的函数主要提供对mouse,keyboard的事件进行处理,如mouse的down, up, move。 keyboard的down,up等。
Nanowm.c nanow窗体任务管理的主函数main,里面有个while loop. 派遣各种窗体的各种事件及mouse,keyboard事件。
Nanowm.h nanowm窗体任务管理头文件,里面有一些重要的数据结构。
Root.c 只有一个函数root_create(...),用于创建nanowm的desktop.
Wlist.c 文件实现的函数主要用于对窗体在窗体链表中进行查找、删除等操作。
还有一几个文件,如Makefile文件,run.sh文件。(未完)
2. nanowm的入口在nanowm.c文件中,该文件的全部代码如下:
/*
* NanoWM - Window Manager for Nano-X
*
* Copyright (C) 2000 Greg Haerr <>
* Copyright (C) 2000 Alex Holden <>
* Parts based on npanel.c Copyright (C) 1999 Alistair Riddoch.
*/
#include
#include
#define MWINCLUDECOLORS // 以后需要用到MW开头的系统预定颜色宏
#include "nano-X.h" // nano-X图形系统核心头文件
/* Uncomment this if you want debugging output from this file */
/*#define DEBUG*/
#include "nanowm.h" // nanowm的头文件,包含几个数据结构和函数原型定义
GR_SCREEN_INFO si; // 屏幕结构,在nano-X.h中定义,其实是MWSCREENINFO结构
int main(int argc, char *argv[])
{
GR_EVENT event;
GR_WM_PROPERTIES props; // 窗体属性结构
win window;
if(GrOpen() < 0) { // 建立与nano-X服务程序的联接
fprintf(stderr, "Couldn't connect to Nano-X server!\n");
exit(1);
}
/* pass errors through main loop, don't exit*/
GrSetErrorHandler(NULL);
GrGetScreenInfo(&si); // 得到screen信息
/* add root window*/
window.wid = GR_ROOT_WINDOW_ID;
window.pid = GR_ROOT_WINDOW_ID;
window.type = WINDOW_TYPE_ROOT;
window.clientid = 1;
window.sizing = GR_FALSE;
window.active = 0;
window.data = NULL;
add_window(&window); // 把window窗体结构加入到窗体链表中
GrSelectEvents(GR_ROOT_WINDOW_ID, GR_EVENT_MASK_CHLD_UPDATE); // 为第一个窗体设置窗体事件mask
/* Set new root window background color*/
props.flags = GR_WM_FLAGS_BACKGROUND;
props.background = GrGetSysColor(GR_COLOR_DESKTOP);
GrSetWMProperties(GR_ROOT_WINDOW_ID, &props); // 设置第一个(根)窗体属性
while(1) {
GrGetNextEvent(&event); // 从事件队列中取出发生的事件
switch(event.type) { // 事件判断
case GR_EVENT_TYPE_ERROR:
printf("nanowm: error %d\n", event.error.code);
break;
case GR_EVENT_TYPE_EXPOSURE:
do_exposure(&event.exposure); // 窗口exposure时的处理函数,类似于window平台下窗口的active事件
break;
case GR_EVENT_TYPE_BUTTON_DOWN:
do_button_down(&event.button); //
break;
case GR_EVENT_TYPE_BUTTON_UP:
do_button_up(&event.button); //
break;
case GR_EVENT_TYPE_MOUSE_ENTER:
do_mouse_enter(&event.general); //
break;
case GR_EVENT_TYPE_MOUSE_EXIT:
do_mouse_exit(&event.general);
break;
case GR_EVENT_TYPE_MOUSE_POSITION:
do_mouse_moved(&event.mouse);
break;
case GR_EVENT_TYPE_KEY_DOWN:
do_key_down(&event.keystroke);
break;
case GR_EVENT_TYPE_KEY_UP:
do_key_up(&event.keystroke);
break;
case GR_EVENT_TYPE_FOCUS_IN:
do_focus_in(&event.general);
break;
case GR_EVENT_TYPE_CHLD_UPDATE: // 与Window平台的WM_PAINT功能相当
do_update(&event.update); // 此函数会比较复杂,其中会对窗体进行边框的绘制等动作
break;
default:
fprintf(stderr, "Got unexpected event %d\n",
event.type);
break;
}
}
GrClose(); // 断开与nano-X的联接
}