Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37911
  • 博文数量: 13
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 158
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-05 19:31
文章分类

全部博文(13)

文章存档

2011年(1)

2009年(12)

我的朋友

分类: LINUX

2009-04-12 21:05:21

最近要为公司定制基于nano-X的图形系统,首要任务是要定制nano-X中的窗体任务管理器,我就以nano-X 0.91 full version中的nanowm源码为基础,进行定制。

     一. 概述

            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的联接
}

阅读(1290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~