首页 > 编程语言 >dotnet C# 创建 X11 应用时设置窗口背景颜色

dotnet C# 创建 X11 应用时设置窗口背景颜色

时间:2024-06-01 09:02:47浏览次数:23  
标签:XColor SetWindowValuemask C# 代码 pixel var dotnet X11 display

本文将告诉大家如何在 X11 里面创建一个窗口时,设置窗口的背景颜色

dotnet C# 设置 X11 应用窗口背景透明 的基础上,可以通过创建 XColor 结构体,将 XColor 赋值给到 XSetWindowAttributes 的 background_pixel 进行设置窗口的初始化背景颜色

核心实现如下

先创建 XColor 结构体,代码如下

XColor color = new XColor()
{
    red = 0xF556, // value is 0-65535
    green = 0xC156,
    blue = 0x2156,
    flags = (byte)(ColorFlags.DoRed | ColorFlags.DoGreen | ColorFlags.DoBlue),
};

以上的 XColor 的三个颜色分量是 0-65535 范围的,即 0-0xFFFF 范围,而不是常见的 WPF 系的 0-0xFF 范围。换句话说如果你在 XColor 里面使用 WPF 系习惯的写法,将会发现最终颜色都是一个黑色

最后一个参数(字段)用来指明有哪些颜色分量是有效的。以上的 XColor 和 ColorFlags 类型定义都是从 CPF 和 Avalonia 里面拷贝的,可以从本文末尾找到所有的代码的下载方法

完成 XColor 创建之后,再需要使用 XCreateColormap 创建颜色映射表,代码如下

var colormap = XCreateColormap(display, rootWindow, visual, 0);

以上代码的 display 和 visual 等参数的获取代码如下

var display = XOpenDisplay(IntPtr.Zero);
var screen = XDefaultScreen(display);

var rootWindow = XDefaultRootWindow(display);

var result = XMatchVisualInfo(display, screen, 32, 4, out var info);

获取到所创建颜色映射表之后,即可通过 XAllocColor 获取对应的颜色了。为什么需要这一步?这是因为在X11里面支持多个不同的格式的颜色,需要经过这一步骤才能获取具体设备相关的颜色。虽然大多数时候都是咱熟悉的 RGB 的 0xAARRGGBB 格式

XAllocColor(display, colormap, ref color);

Console.WriteLine(color.pixel.ToString("X"));

接着将 XColor 的 pixel 字段赋值给到 XSetWindowAttributes 的 background_pixel 字段,代码如下

var xSetWindowAttributes = new XSetWindowAttributes
{
    backing_store = 1,
    bit_gravity = Gravity.NorthWestGravity,
    win_gravity = Gravity.NorthWestGravity,
    //override_redirect = true, // 设置窗口的override_redirect属性为True,以避免窗口管理器的干预
    colormap = colormap,
    border_pixel = 0,
    background_pixel = color.pixel,
};

如此执行创建窗口时,即可使用所配置的颜色。所有的代码如下

using static CPF.Linux.XLib;
var display = XOpenDisplay(IntPtr.Zero);
var screen = XDefaultScreen(display);

var rootWindow = XDefaultRootWindow(display);

var result = XMatchVisualInfo(display, screen, 32, 4, out var info);
Console.WriteLine($"Result={result} info.depth={info.depth}");

var visual = info.visual;

var valueMask =
        //SetWindowValuemask.BackPixmap
        0
        | SetWindowValuemask.BackPixel
        | SetWindowValuemask.BorderPixel
        | SetWindowValuemask.BitGravity
        | SetWindowValuemask.WinGravity
        | SetWindowValuemask.BackingStore
        | SetWindowValuemask.ColorMap
    //| SetWindowValuemask.OverrideRedirect
    ;


var colormap = XCreateColormap(display, rootWindow, visual, 0);

XColor color = new XColor()
{
    red = 0xF556, // value is 0-65535
    green = 0xC156,
    blue = 0x2156,
    flags = (byte)(ColorFlags.DoRed | ColorFlags.DoGreen | ColorFlags.DoBlue),
};

XAllocColor(display, colormap, ref color);

Console.WriteLine(color.pixel.ToString("X"));

var xSetWindowAttributes = new XSetWindowAttributes
{
    backing_store = 1,
    bit_gravity = Gravity.NorthWestGravity,
    win_gravity = Gravity.NorthWestGravity,
    //override_redirect = true, // 设置窗口的override_redirect属性为True,以避免窗口管理器的干预
    colormap = colormap,
    border_pixel = 0,
    background_pixel = color.pixel,
};

var width = 500;
var height = 500;
var handle = XCreateWindow(display, rootWindow, 0, 0, width, height, 5,
    (int) info.depth,
    (int) CreateWindowArgs.InputOutput,
    visual,
    (nuint) valueMask, ref xSetWindowAttributes);

XMapWindow(display, handle);
XFlush(display);

while (true)
{
    var xNextEvent = XNextEvent(display, out var @event);
    if (xNextEvent != 0)
    {
        break;
    }
}

本文代码放在 githubgitee 上,可以使用如下命令行拉取代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 2ff0f8d8c502761d58179fa77c3928c7586ae75f

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 2ff0f8d8c502761d58179fa77c3928c7586ae75f

获取代码之后,进入 X11/YalcharlellawWaylarwejear 文件夹,即可获取到源代码

更多 X11 开发请参阅 博客导航

标签:XColor,SetWindowValuemask,C#,代码,pixel,var,dotnet,X11,display
From: https://www.cnblogs.com/lindexi/p/18225520

相关文章

  • dbt dbt-audit-helper 包compare_relation_columns 处理简单说明
    dbtdbt-audit-helper包在进行compare_relation_columns处理的时候进行数据表列字段创建顺序的判断参考使用我按照test处理的,同时进行的测试异常进行存储使用{{audit_helper.compare_relation_columns(a_relation=source("dalongdemo","mytest_appv2")......
  • 5.31 CF R 949 (Div.2)
    5.31CFR949(Div.2)Solve:A~D(4/6)Rank:99Rating:\(1939+131=2070\)(\(1989+81=2070\))发挥评价:Normal失误:小失误是做2B时候没有注意,第一次错了之后就急了,接连交了\(4\)发罚时。注意如果交上去WA了,想清楚、找清楚问题再交。CF1981E(me*2200)给定\(n\)......
  • 学习Django【2】把视图和路由连接起来的是URLconfigs的配置文件
    在view.py视图中定义:defdetail(request,question_id):returnHttpResponse("You'relookingatquestion%s."%question_id)defresults(request,question_id):response="You'relookingattheresultsofquestion%s."......
  • LeetCode 2024/6 每日一题 合集
    2024/6/12928.给小朋友们分糖果I分析枚举所有可能的方案数即可代码实现classSolution{public:intdistributeCandies(intn,intlimit){intans=0;for(inta=0;a<=limit;++a){for(intb=0;b+a<=n&&b<=limi......
  • C++基础编程部分知识总结应用--图书管理系统
    C++基础编程部分知识总结应用–图书管理系统文章目录C++基础编程部分知识总结应用--图书管理系统1.代码结构和预处理命令2.定义图书结构体3.定义图书列表结构体4.后台控制函数5.显示主菜单6.添加图书函数7.查询图书函数8.显示所有图书函数9.修改图书信息函数10......
  • C语言练习题之——从简单到烧脑(12)(每日两道)
    题目1:找出1到99之间的全部同构数, 同构数:它出现在平方数的右边,例如:5是25右边的数,25是625右边的数,5和25都是同构数。#include<stdio.h>intmain(){ intsum=0,left=0,right=0; printf("1-99之间的同构数:\n"); for(inti=1;i<100;i++) { inta=i*i;......
  • C语言练习题之——从简单到烧脑(10)(每日两道)
    题目1:二位数组的应用:输入一个3X5的整数矩阵,输出其中的最大值,最小值,和他们的下标#include<stdio.h>intmain(){ inta[3][5],max,min,maxi,maxj,mini,minj; //最大值最小值,和下标分别定义变量存储 inti,j; for(i=0;i<3;i++) for(j=0;j<5;j++)......
  • WSL error "it can't find the path specified"
    https://huaweicloud.csdn.net/6356079bd3efff3090b58e82.html用powershell输入以下命令检查是否有路径无效:·@($env:path-split";").ForEach({if($_){$result='MISSING|';if(Test-Path-path$_){$result='OK|'};-join($result,'......
  • CTFshow-Crypto(13-16)
    13crypto12跟字母替换有关uozt{Zgyzhv_xlwv_uiln_xguhsld}u-21f-6o-15l-12z-26a-1t-20g-7发现对应两个字母加起来为27查资料发现这是埃特巴什码埃特巴什码最后一个字母替换第一个字母,倒数第二个字母替换第二个字母。明文:ABCDEFGHIJKLMNO......
  • R语言对S&P500股票指数进行ARIMA + GARCH交易策略|附代码数据
    原文链接:http://tecdat.cn/?p=7207最近我们被客户要求撰写关于ARIMA+GARCH交易策略的研究报告,包括一些图形和统计输出。在本文中,我想向您展示如何应用S&P500股票市场指数的交易策略通过组合ARIMA和GARCH模型,从长期来看,我们可以超过“买入并持有”方法。策略概述该策略在“滚......