模拟实现android的窗口系统本质上还是在ubuntu 上实现自己的窗口系统, xwindow是一套成熟的解决方案。在ubuntu上使用xwindow的好处之一 是ubuntu自带xwindow的库, 直接引用头文件和库文件。下面来了解下 xwindow的基本函数接口。
参考 https://tronche.com/gui/x/xlib/
简介
Xwindow system 是MIT设计的一个网络透明的窗口系统。Xlib是一个c 程序库。
显示函数
- 打开显示器
函数: Display *XOpenDisplay( char *display_name )
参数: display_name 指定硬件显示名称。 该名称确定显示和要使用的通信域。如果display_name 为null, 则它默认为 display 环境变量的值。如果display_name是以下格式的字符串 :hostname:number.screen_number
表示主机名的第几个屏幕。
返回值: Display 结构, 该结构在 X11/Xlib.h 中定义。 如果XOpenDisplay ()未成功,返回NULL.
- 获取有关显示 ,图像格式 或屏幕的信息
应用程序不应该直接修改Display 和Screen 结构的任何部分。 成员应被视为只读。
函数: Window XDefaultRootWindow(Display display)
函数功能: 显示指定与 X 服务器的连接。返回默认屏幕的根窗口。 看过android系统的同学对 这个函数是不是有种似曾相识的感觉。很像android里的 RootWindowContainer.
函数: Screen *XDefaultScreenOfDisplay(Display display)
函数功能:显示指定与x服务器的连接。 返回指向默认屏幕的指针。
函数:XCloseDisplay()
函数功能: 关闭或断开与 x服务器的连接。
窗口函数
在 xwindow 系统中,窗口是屏幕上的矩形区域。可让你查看图形输出。
- 创建windows
函数: Window XCreateWindwo(++++Display++++ *display ,
Window parent ,
int x , y ,
unsigned int width , height ,
unsigned int border_width ,
int depth ,
unsigned int class ,
++++Visual++++ *visual ,
unsigned long valuemask ,
++++XSetWindowAttributes++++ *attributes
)
Window XCreateSimpleWindow(
++++Display++++ *display ,
Window parent ,
int x , y ,
unsigned int width , height ,
unsigned int border_width ,
unsigned long border ,
unsigned long background
)
参数: Display 指定与 X 服务器的连接.
Window 指定父窗口
x,y 指定x和y 坐标
Width, height 指定宽度和高度。他们是创建的窗口的内部尺寸.
Border_Width 创建的窗口边框的宽度。
Border 窗口的边框像素值
Background 窗口的背景 像素值
Depth 指定窗口的深度
Class 创建的窗口的类
Visual 指定视觉对象类型
Valuemask
typedef struct {
Pixmap background_pixmap; /* background, None , or ParentRelative */
unsigned long background_pixel; /* background pixel */
Pixmap border_pixmap; /* border of the window or CopyFromParent */
unsigned long border_pixel; /* border pixel value */
int bit_gravity; /* one of bit gravity values */
int win_gravity; /* one of the window gravity values */
int backing_store; /* NotUseful , WhenMapped , Always */
unsigned long backing_planes; /* planes to be preserved if possible */
unsigned long backing_pixel; /* value to use in restoring planes */
Bool save_under; /* should bits under be saved? (popups) */
long event_mask; /* set of events that should be saved */
long do_not_propagate_mask; /* set of events that should not propagate */
Bool override_redirect; /* boolean value for override_redirect */
Colormap colormap; /* color map to be associated with window */
Cursor cursor; /* cursor to be displayed (or None ) */
} XSetWindowAttributes;
- 销毁windows
XDestroyWindow()
XDestorySubWindows()
- 配置windows
配置窗口大小,位置,堆叠,或边框 使用 XConfigureWindow()
移动窗口 XMoveWindow()
更改窗口大小 XResizeWindow()
升高窗口 XRaiseWindow()
降低窗口 XLowerWindow()
- 修改 window属性
XChangeWindowAttributes()
窗口信息函数
- 获取窗口信息
XGetWindowAttributes()
- 图像和光标函数
XCreatePixmap()
XFreePixmap()
- 色彩管理函数
- 颜色结构
typedef struct {
unsigned long pixel; /* pixel value */
unsigned short red, green, blue; /* rgb values */
char flags; /* DoRed, DoGreen, DoBlue */
char pad;
} XColor;
XCreateColormap()
XFreeColormap()
七.图形上下文函数
XCreateGC
图形函数
绘制单点和多点
XDrawPoint()
XDrawPoints()
XDrawLine()
XDrawLines()
XDrawSegments()
XDrawRectangle()
XDrawRectangles()
XDrawArc()
XDrawArcs()
XFillRectangle()
XFillRectangles()
XFillPolygon()
XFillArc()
XFillArcs()
XDrawText()
XDrawText16()
XDrawString()
XDrawString16()
XDrawImageString()
XDrawImageString16()
所有图像处理函数都使用 XImage 结构, 它描述存在于客户端内存中的图像.
typedef struct _XImage {
int width, height; /* size of image */
int xoffset; /* number of pixels offset in X direction */
int format; /* XYBitmap, XYPixmap, ZPixmap */
char *data; /* pointer to image data */
int byte_order; /* data byte order, LSBFirst, MSBFirst */
int bitmap_unit; /* quant. of scanline 8, 16, 32 */
int bitmap_bit_order; /* LSBFirst, MSBFirst */
int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */
int depth; /* depth of image */
int bytes_per_line; /* accelerator to next scanline */
int bits_per_pixel; /* bits per pixel (ZPixmap) */
unsigned long red_mask; /* bits in z arrangement */
unsigned long green_mask;
unsigned long blue_mask;
XPointer obdata; /* hook for the object routines to hang on */
struct funcs { /* image manipulation routines */
struct _XImage *(*create_image)();
int (*destroy_image)();
unsigned long (*get_pixel)();
int (*put_pixel)();
struct _XImage *(*sub_image)();
int (*add_pixel)();
} f;
} XImage;
初始化图像结构 XInitImage()
将 图片与显示屏上的可绘制对象矩形合并 XPutImage()
返回给定可绘制对象中的矩形的内容 XGetImage()
复制矩形的内容 XGetSubImage()
窗口和会话管理器功能
事件
资源管理
应用程序实用程序函数
用一个简单的例子来看下 xlib 的效果, gcc awindow.c -o awindow -lX11.
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
int createXWindow( ){
Display *display;
int screen;
Window win;
XEvent event;
display = XOpenDisplay(NULL);
if(display == NULL)
{
printf("Cannot open display\n");
exit(1);
}
screen = XDefaultScreen(display);
win = XCreateSimpleWindow(display,
RootWindow(display, screen),
10,
10,
200,
200,
1,
BlackPixel(display, screen),
WhitePixel(display, screen));
XWMHints hints;
hints.input = True;
hints.flags = InputHint;
XSetWMHints(display, win, &hints);
XSizeHints *size_hints = XAllocSizeHints();
size_hints->flags = PMinSize | PMaxSize | PSize;
size_hints->min_width = 600;
size_hints->max_width = 600;
size_hints->min_height = 800;
size_hints->max_height = 800;
XSetNormalHints(display, win, size_hints);
XSetWMSizeHints(display,win , size_hints, PSize | PMinSize | PMaxSize);
XMapWindow(display, win);
XSelectInput(display, win, ExposureMask | KeyPressMask);
while(1)
{
XNextEvent(display, &event);
/* draw or redraw the window */
if(event.type == Expose)
{
XDrawRectangle(display, win, DefaultGC(display, screen), 10, 10, 100, 100);
}
/* exit on key press */
if(event.type == KeyPress)
break;
}
XCloseDisplay(display);
return 0;
}
void main(){
createXWindow();
}
./awindow 会画出一个 带矩形框的窗口。