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

相关推荐
Starry-sky(jing)1 小时前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda
雨白1 小时前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
疯华整猫2 小时前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
传奇开心果3 小时前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin
Frankie_stand4 小时前
测试自动化实战指南:从脚本化、自动判据到 CI 集成的完整落地路径
android·ci/cd·自动化
恋猫de小郭5 小时前
Flutter 大小核优化又被回滚,然后又开新提案?
android·前端·flutter
Kapaseker5 小时前
领导问我 Kotlin 的 Nothing 是什么?
android·kotlin
韩曙亮6 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
三少爷的鞋7 小时前
不改变异步本质,只改变代码组织:Telegram 项目的 Kotlin 协程实践
android
好的佩奇16 小时前
蓝牙之广播与扫描
android·flutter·蓝牙