从0开始写android 之xwindow

模拟实现android的窗口系统本质上还是在ubuntu 上实现自己的窗口系统, xwindow是一套成熟的解决方案。在ubuntu上使用xwindow的好处之一 是ubuntu自带xwindow的库, 直接引用头文件和库文件。下面来了解下 xwindow的基本函数接口。

参考 https://tronche.com/gui/x/xlib/

简介

Xwindow system 是MIT设计的一个网络透明的窗口系统。Xlib是一个c 程序库。

显示函数

  1. 打开显示器

函数: Display *XOpenDisplay( char *display_name )

参数: display_name 指定硬件显示名称。 该名称确定显示和要使用的通信域。如果display_name 为null, 则它默认为 display 环境变量的值。如果display_name是以下格式的字符串 :hostname:number.screen_number

表示主机名的第几个屏幕。

返回值: Display 结构, 该结构在 X11/Xlib.h 中定义。 如果XOpenDisplay ()未成功,返回NULL.

  1. 获取有关显示 ,图像格式 或屏幕的信息

应用程序不应该直接修改Display 和Screen 结构的任何部分。 成员应被视为只读。

函数: Window XDefaultRootWindow(Display display)

函数功能: 显示指定与 X 服务器的连接。返回默认屏幕的根窗口。 看过android系统的同学对 这个函数是不是有种似曾相识的感觉。很像android里的 RootWindowContainer.

函数: Screen *XDefaultScreenOfDisplay(Display display)

函数功能:显示指定与x服务器的连接。 返回指向默认屏幕的指针。

函数:XCloseDisplay()

函数功能: 关闭或断开与 x服务器的连接。

窗口函数

在 xwindow 系统中,窗口是屏幕上的矩形区域。可让你查看图形输出。

  1. 创建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

++++XSetWindowAttributes++++

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;

  1. 销毁windows

XDestroyWindow()

XDestorySubWindows()

  1. 配置windows

配置窗口大小,位置,堆叠,或边框 使用 XConfigureWindow()

移动窗口 XMoveWindow()

更改窗口大小 XResizeWindow()

升高窗口 XRaiseWindow()

降低窗口 XLowerWindow()

  1. 修改 window属性

XChangeWindowAttributes()

窗口信息函数

  1. 获取窗口信息

XGetWindowAttributes()

  • 图像和光标函数

XCreatePixmap()

XFreePixmap()

  • 色彩管理函数
  1. 颜色结构

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 会画出一个 带矩形框的窗口。

相关推荐
安东尼肉店3 小时前
Android compose屏幕适配终极解决方案
android
2501_916007474 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
feiyangqingyun5 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg
用户2018792831679 小时前
ANR之RenderThread不可中断睡眠state=D
android
煤球王子9 小时前
简单学:Android14中的Bluetooth—PBAP下载
android
小趴菜82279 小时前
安卓接入Max广告源
android
齊家治國平天下9 小时前
Android 14 系统 ANR (Application Not Responding) 深度分析与解决指南
android·anr
ZHANG13HAO9 小时前
Android 13.0 Framework 实现应用通知使用权默认开启的技术指南
android
【ql君】qlexcel9 小时前
Android 安卓RIL介绍
android·安卓·ril
写点啥呢9 小时前
android12解决非CarProperty接口深色模式设置后开机无法保持
android·车机·aosp·深色模式·座舱