x11 相关问题

X11是一个用于位图显示的可扩展窗口系统。它构成了大多数Unix操作系统GUI的基础。

跟踪 XWindow 协议

是否可以使用工具跟踪XWindow协议?我认为wireshark将是一个很好的框架来承载这样的想法,但似乎没有支持。为了实现这个目标应该做什么?

回答 5 投票 0

如何使用 xcb 访问共享内存

我正在尝试使用 xcb_shm_get_image_unchecked 抓取窗口部分的屏幕截图。我使用以下代码创建了共享内存: #包括 #包括 我正在尝试使用 xcb_shm_get_image_unchecked 抓取窗口部分的屏幕截图。我使用以下代码创建了共享内存: #include <cstdlib> #include <memory> #include <sys/shm.h> #include <xcb/shm.h> #include <xcb/xcb.h> #include <xcb/xcb_image.h> #include <xcb/xcb_pixel.h> #include <xcb/xproto.h> #include <spdlog/spdlog.h> const auto IMAGE_WIDTH = 640; const auto IMAGE_HEIGHT = 480; const auto SHM_SIZE = 4 * 1024 * 1024; auto main() -> int { std::unique_ptr<xcb_connection_t, decltype(&xcb_disconnect)> c( xcb_connect(nullptr, nullptr), &xcb_disconnect); if (!c) { spdlog::error("failed to connect to X server"); return EXIT_FAILURE; } auto roots_iter = xcb_setup_roots_iterator(xcb_get_setup(c.get())); if (roots_iter.rem == 0) { spdlog::error("no screen found"); return EXIT_FAILURE; } auto root = roots_iter.data->root; xcb_shm_seg_t shmseg = xcb_generate_id(c.get()); // xcb_shm_get_im auto shm_reply = xcb_shm_create_segment_reply( c.get(), xcb_shm_create_segment(c.get(), shmseg, SHM_SIZE, 0), nullptr); if (!shm_reply) { spdlog::error("failed to create shared memory segment"); return EXIT_FAILURE; } auto fds = xcb_shm_create_segment_reply_fds(c.get(), shm_reply); spdlog::info("found {} fds", shm_reply->nfd); for (int i = 0; i < shm_reply->nfd; i++) { auto err = xcb_request_check( c.get(), xcb_shm_attach_fd(c.get(), shmseg, fds[i], true)); if (err) { spdlog::error("failed to attach fd: {}", fds[i]); delete err; } } for (int i = 0; i < shm_reply->nfd; i++) { close(fds[i]); } xcb_shm_detach(c.get(), shmseg); return 0; } 第一个问题:在释放资源方面我做得对吗? 第二:如何访问共享内存段? 最后,我如何抓取根窗口的 640x480 屏幕截图?我是否走在正确的道路上: auto image = xcb_shm_get_image_reply( c.get(), xcb_shm_get_image_unchecked(c.get(), root, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, XCB_GC_PLANE_MASK, XCB_IMAGE_FORMAT_Z_PIXMAP, shmseg, 0), nullptr); if (!image) { spdlog::error("failed to get image"); xcb_shm_detach(c.get(), shmseg); return EXIT_FAILURE; } spdlog::info("image: size {}", image->size); delete image; 您必须调用 mmap 才能访问共享内存。来自 xcb_shm_create_segment_unchecked 的文档: 要求服务器分配共享内存段。服务器的回复将包含一个文件描述符,供客户端传递给 mmap()。 如何获得访问权限? 您必须调用 mmap(包括文件描述符)来告诉 mmap 在哪里找到由 X 服务器分配的内存区域。 你可以使用这样的东西来做到这一点: auto *shmem = mmap(nullptr, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fds[0], 0); if (shmem == MAP_FAILED) { ... // cleanup } close(fds[0]); 一旦您阅读了 mmap 的文档,这些论点应该是不言自明的。最后一个 0 只是意味着我们希望指针指向内存区域的开头。 当然,完成后别忘了munmap: munmap(p, SHM_SIZE); 最后,不需要xcb_shm_attach_fd(c.get(), shmseg, fds[i], true));。仅当您自己创建 mmap 文件并将其传递到 X 服务器以便它可以访问时才需要这样做。 第一个问题:在释放资源方面我做得对吗? 是的,你有 如何抓取根窗口的 640x480 屏幕截图? 您用于抓取图像的代码几乎是正确的。只需将 plane_mask 参数更改为 ~0 即可。要实际将字节转换为图像,您可以选择将其转换为最小公分母图像格式,例如 PPM。该代码如下所示: if (auto f = std::ofstream("/path/to/screenshot.ppm", std::ios::binary); f) { f << "P6\n" << IMAGE_WIDTH << " " << IMAGE_HEIGHT << "\n255\n"; const auto *const imageData = shmem; for (uint32_t rgb = 0; rgb + 4 <= image->size; rgb += 4) { auto b = imageData[rgb]; auto g = imageData[rgb + 1]; auto r = imageData[rgb + 2]; if (setup->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST) { std::swap(b, r); } f << r << g << b; } } 最终结果应该是位于 ppm 的 /path/to/screenshot.ppm 格式的图像。如果你没有办法查看它,imagemagick能够将ppm转换为png,这样你就可以这样查看。

回答 1 投票 0

如何创建最大化的glfw窗口?

这可能吗? 我使用的是OpenGL版本 imgui 的一件事真的让我很恼火, 我似乎找不到为 imgui 创建最大化窗口的方法。 如果(!glfwInit()) ... GLFW...

回答 3 投票 0

Motif 2.3.8 对于虚拟桌面有哪些替代方案?

我读到MWM过去有WSM,并且包含在2.3.8源代码的demos/programs文件夹中。 但是,有一条注释指出支持的功能是远程...

回答 1 投票 0

如何在 ssh 客户端而不是 ssh 服务器上显示 python/openCV 结果图像?

我使用 ssh -Y username@adress 连接到 ssh 服务器。 在服务器上我使用 IDLE 运行 python2.7。 如果我使用 matplotlib,我可以在客户端上看到结果图。这表明图形化的前进......

回答 1 投票 0

X11 转义颜色代码出现在 tmux shell 中

在 Fedora 39 中,使用 i3 + urxvt + tmux,每次我 tmux new-session 或 tmux Attach-session 时,都会将以下字符打印到终端 shell,大概是损坏或误解的......

回答 1 投票 0

如何在 github 代码空间中启用 gui 应用程序?

一些opencv代码在执行时需要显示GUI窗口。相反,它显示 Gtk-WARNING **:xxx:无法打开显示:。它发生在网络和桌面应用程序中。可以用som吗...

回答 3 投票 0

禁用/抑制 R 中 CRAN 镜像选择的 tcltk 弹出窗口

我的问题与之前发布的问题类似,但从未真正在这里得到解答: 在 R 中禁用 GUI、图形设备 我不喜欢用于 CRAN 镜像选择的 R tcltk 弹出窗口。他们也流行...

回答 5 投票 0

使用wmCtrl移动窗口会导致定位不准确

使用:Linux Mint 13 (Maya) 64 Cinnamon 2.0.14,wmctrl v.1.07 由于身体残疾,我希望能够使用键盘移动窗口和调整窗口大小,但调整大小和移动跳转到 b...

回答 1 投票 0

如何使用 python/paramiko 通过 SSH 在服务器 (Raspi) 上打开 GUI 应用程序?

作为服务器,我有一个 Raspberry Pi,其显示器通过 hdmi 连接。在我的 Windows 10 电脑上,我想通过 ssh 在我的 Pi 上执行 gui 应用程序,以便该应用程序显示在 Pi 的显示器上...

回答 1 投票 0

如何设置 VcXSrv 以与 WSL2 一起使用

如何在 Windows 10 上设置 VcXSrv.exe 以在不禁用访问控制的情况下使用 WSL2?互联网上的每个描述都显示禁用访问控制,但这允许

x11
回答 2 投票 0

使用Java通过ID在X11窗口上绘画

我的目标是使用 Java 库在 X11 窗口上绘画。问题是我想在一个已经存在的窗口上执行此操作,并且我知道它的窗口 ID。我已经用 C 和 Rust 完成了这个,但是......

回答 1 投票 0

如何在远程服务器上的 Docker 容器内运行代码 GUI?

我已经在Linux服务器上创建了一个Docker容器。我使用 VSCode 从笔记本电脑连接到此容器,并且可以运行一些代码。但是,我无法运行某些需要 GUI 的程序,...

回答 2 投票 0

xTerm 如何与包含它的 XWindows 会话进行通信?

我想在 Linux (openSUSE 12.3) 和 XWindows 下编写在 kiosk 模式下打开 chromium 的脚本,同时控制 chromium 出现在哪个监视器中。我还需要让这个脚本在工作站之外运行...

回答 2 投票 0

Solaris。 xterm显示问题

我通过 SSH 从我的 Linux 计算机连接到 Solaris (10) 服务器。 但是,当我尝试使用“ xterm”打开另一个终端时,它不起作用。 我将 DISPLAY 环境变量设置为 12...

回答 3 投票 0

Xterm 无法显示超过 11 个窗口

在脚本中,我有一个针对 N 个测试的循环,它在每个测试的 xterm 窗口中运行一个命令。 N可以是30。 当 N = 16 时,我注意到我只有 11 个 xterm 窗口来创建前 11 个测试......

回答 1 投票 0

将 BufferedImage 转换为 Pixmap

有没有办法将 BufferedImage 转换为 X11 Pixmap?看起来 JNA 有 com.sun.jna.platform.unix.X11.Pixmap 但我找不到将任何内容转换为该格式的方法。

回答 1 投票 0

在 Linux C 控制台应用程序中模拟按键

有没有办法用C在Linux中模拟按键? 在我的具体情况下,我使用的是 Ubuntu 9.04,需要一个简单的应用程序,在启动时调用“暂停”按钮。那会...

回答 2 投票 0

有什么方法可以将Xephyr用作QT Widget吗?

我最近了解到了 Xephyr 这个工具,并且想知道是否可以在 QT 小部件中使用它。我设想的是一个嵌入式 Xephyr,或者任何 X11 服务器,在一个小实例中运行

c qt x11
回答 1 投票 0

如何设置“未设置 X11 DISPLAY 变量”?

我正在尝试在 Windows 10 中使用 netbeans 远程访问我的树莓派,但有一个像下图这样的报告。我收到以下错误,我不明白。我看到一些 X11 DIS...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.