如何将 shm pixmap 与 xcb 一起使用?

2024-03-05

我尝试学习如何使用 xcb 库中的共享内存像素图。你们中有人有这方面的经验并想分享示例代码和/或信息吗?这会很有帮助。

Thanks


经过一些研究,我发现了如何在 xcb 中使用共享内存像素图。

这是我的测试代码:

#include <stdlib.h>
#include <stdio.h>

#include <sys/ipc.h>
#include <sys/shm.h>

#include <xcb/xcb.h>
#include <xcb/shm.h>
#include <xcb/xcb_image.h>


#define WID 512
#define HEI 512



int main(){
    xcb_connection_t*       connection;
    xcb_window_t            window;
    xcb_screen_t*           screen;
    xcb_gcontext_t          gcontext;
    xcb_generic_event_t*    event;

    uint32_t value_mask;
    uint32_t value_list[2];

    //connect to the X server and get screen

    connection = xcb_connect(NULL, NULL);
    screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data;

    //create a window

    value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
    value_list[0] = screen->black_pixel;
    value_list[1] = XCB_EVENT_MASK_EXPOSURE;

    window = xcb_generate_id(connection);

    xcb_create_window(
        connection,            
        screen->root_depth,  
        window,    
        screen->root,    
        0, 0,         
        WID, HEI,    
        0,              
        XCB_WINDOW_CLASS_INPUT_OUTPUT,   
        screen->root_visual,    
        value_mask, value_list  
    );

    //create a graphic context

    value_mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
    value_list[0] = screen->black_pixel;
    value_list[1] = 0;

    gcontext = xcb_generate_id(connection);
    xcb_create_gc(connection, gcontext, window, value_mask, value_list);

    //map the window onto the screen

    xcb_map_window(connection, window);
    xcb_flush(connection);


    //Shm test
    xcb_shm_query_version_reply_t*  reply;
    xcb_shm_segment_info_t          info;

    reply = xcb_shm_query_version_reply(
        connection,
        xcb_shm_query_version(connection),
        NULL
    );

    if(!reply || !reply->shared_pixmaps){
        printf("Shm error...\n");
        exit(0);
    }

    info.shmid   = shmget(IPC_PRIVATE, WID*HEI*4, IPC_CREAT | 0777);
    info.shmaddr = shmat(info.shmid, 0, 0);

    info.shmseg = xcb_generate_id(connection);
    xcb_shm_attach(connection, info.shmseg, info.shmid, 0);
    shmctl(info.shmid, IPC_RMID, 0);

    uint32_t* data = info.shmaddr;

    xcb_pixmap_t pix = xcb_generate_id(connection);
    xcb_shm_create_pixmap(
        connection,
        pix,
        window,
        WID, HEI,
        screen->root_depth,
        info.shmseg,
        0
    );

    int i = 0;
    while(1){
        usleep(10000);

        data[i] = 0xFFFFFF;
        i++;

        xcb_copy_area(
            connection,
            pix,
            window,
            gcontext,
            0, 0, 0, 0,
            WID, HEI
        );

        xcb_flush(connection);
    }

    xcb_shm_detach(connection, info.shmseg);
    shmdt(info.shmaddr);

    xcb_free_pixmap(connection, pix);

    xcb_destroy_window(connection, window);
    xcb_disconnect(connection);

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 shm pixmap 与 xcb 一起使用? 的相关文章

  • 在C中,如何使用X11获取屏幕内活动监视器的几何形状(x,y,宽度,高度)

    我所有的搜索都得到了关于如何使用 C 获取 X11 中活动屏幕的几何形状的答案 但该屏幕可能包含许多显示器 并且通常只有一个屏幕 除非有许多用户同时使用同一台计算机 关于获取屏幕几何形状的那些答案已经过时 因为它们没有考虑多个显示器 那么
  • WPF 将窗口标题绑定到属性

    我试图绑定从 Window 派生的类 MainWindow 的属性 MyTitle 的值 我创建了一个名为 MyTitleProperty 的依赖属性 实现了 INotifyPropertyChanged 接口并修改了 MyTitle 的
  • Activity 已泄漏窗口

    在我的启动屏幕中 我做了它 以便它检测 wifi 或 3g 是否启用 如果不是 则会出现一个对话框屏幕提示用户退出并打开其中一个 如果它打开 则代码将继续 我的 logcat 中不断收到有关我的活动有泄漏窗口的错误 我不知道如何解决这个问题
  • 与 fork() 共享堆内存

    我正在努力用 C 语言实现一个数据库服务器 它将处理来自多个客户端的请求 我在用fork 处理单个客户端的连接 服务器将数据存储在堆中 堆由指向动态分配记录的哈希表的根指针组成 记录是具有指向各种数据类型的指针的结构 我希望进程能够共享这些
  • javascript 根据浏览器窗口大小动态更改主体 ID(使用 css)

    这是我所拥有的 但它不起作用 if window width lt 1000 document getElementsByTagName body 0 id be else document getElementsByTagName bod
  • 跟踪 XWindow 协议

    是否可以使用工具跟踪 XWindow 协议 我认为wireshark将是一个很好的框架来承载这样的想法 但似乎没有支持 为了实现这个目标应该做什么 Wiresharkdoes具有剖析X Window协议的能力 但是 您首先必须能够捕获 X
  • 每个版本的 IE 在新窗口中打开链接

    我一直在设计一个网站 并使用 Safari 和 Chrome 进行大部分测试 我刚刚尝试测试 Firefox 也很顺利 让 IE 来解决吧 由于某种原因 对于从 IE 6 到 IE 10 的每个版本 每个链接都会打开一个新窗口 在 IE 1
  • 双击标题栏时如何知道窗口是否最小化?

    This image is from SystemPreferences gt Appearance 我想知道如何以编程方式获取该值 我问这个问题是因为我正在绘制一个带有自定义标题栏的窗口 并且我希望它 在行为上 尽可能类似于普通 非自定义
  • 在父级构造函数中设置窗口所有者时遇到问题

    在 WPF 中 在父窗口的构造函数中将窗口的 Owner 属性设置为其父窗口是否有任何问题 不应该有吧 那么为什么我会得到一个XamlParseException从下面的代码 public partial class MainView Wi
  • 当页面比屏幕大时如何将div定位在屏幕中间

    您好 我正在使用类似于以下内容的方法来将 div 放置在屏幕中间
  • 如何让编译日志在Emacs中创建一个新窗口?

    如果我在 emacs 中只显示一个窗口并使用 M x 编译 则该窗口会一分为二 我可以轻松查看编译缓冲区 但是 如果我显示更多窗口 编译日志就会接管其他窗口之一 这让我感到恼火 如何让emacs始终分割一个新窗口来显示编译日志 编辑 从我一
  • createwindow(...)之后,如何给窗口赋予颜色?

    我创建了一个窗口 其句柄是handle parent 然后我创建了一个子窗口 如下所示 hwnd child CreateWindow child class name T WS CHILDWINDOW 0 0 0 0 hwnd paren
  • 无法以编程方式减小 gtk 窗口的大小

    以编程方式调整 gtk 窗口大小时 我似乎遇到了问题 问题是 一旦我将窗口的宽度和高度增加到 800x600 我似乎无法将其缩小回原来的大小 400x200 下面是示例代码 有人遇到过这样的问题吗 include
  • IPC 跨不同 Docker 容器中的 Python 脚本共享内存

    问题 我编写了一个神经网络分类器 它接收大量图像 每个图像约 1 3 GB 对它们进行修补 然后将修补程序单独通过网络传递 训练正在进行中really慢慢地 所以我对它进行了基准测试 发现将补丁从一张图像加载到内存中需要大约 50 秒 使用
  • 在 ASP .NET Core 6.0 中获取 Windows 用户名

    我目前正在尝试将 ASP NET Core 5 0 项目迁移到 ASP NET Core 6 0 Window 用户名显示在 NET 5 0 上 但是 对于 NET 6 项目 窗口用户名始终使用匿名用户 我不确定我是否缺少任何代码 欢迎任何
  • IE 不会在使用 window.open 创建的窗口中加载 PDF

    问题就在这里 仅发生在 Internet Explorer IE 中 我有一个页面 其中包含指向几种不同类型文件的链接 这些文件中的链接执行一个 Javascript 函数 该函数打开一个新窗口并加载特定文件 这非常有效 除非我需要在新窗口
  • 如何正确处理在node-webkit中打开_blank窗口的链接?

    我正在尝试使用new win policy事件来处理打开新窗口的链接点击 https github com rogerwang node webkit wiki Window new win policy https github com
  • 如何判断全屏应用程序是否正在运行?

    python 是否可以判断 linux 上的全屏应用程序是否正在运行 我感觉使用 Xlib 可能是可行的 但我还没有找到方法 EDIT 我所说的全屏是指整个屏幕 除了应用程序之外 没有其他任何内容 例如全屏游戏 如果您有兴趣在支持下运行所有
  • 使用 WinAPI 在 C# 中隐藏任务栏窗口

    相信我 我用谷歌搜索过它 并期望它是一个相当容易找到的东西 事实证明并非如此 我有窗把手 但没有表格 我该怎么做 谢谢 声明这些 DllImport user32 dll SetLastError true static extern in
  • 如何检测并突出显示鼠标悬停时的矩形

    我在 C net 中创建了一个 Windows 应用程序控件 以图形模式显示一些对象 为此 我根据列表中的项目数量创建了一个矩形 并使用 Control OnPaint 事件将其绘制在控件上 现在 如果鼠标悬停在该矩形上 我想突出显示该矩形

随机推荐