我正在尝试编写一个简单的程序,它将所有窗口重定向到后台缓冲区(如复合管理器所做的那样),然后将它们写入像素图并保存到磁盘。但我收到了这个错误:
(.text.startup+0x5e):-1: error: undefined reference to `XCompositeRedirectSubwindows'
(.text.startup+0x171):-1: error: undefined reference to `XCompositeNameWindowPixmap'
:-1: error: collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这是代码:
#include <QApplication>
#include <QDebug>
#include <X11/Xlib.h>
#include <QPaintDevice>
#include <QX11Info>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/Xdamage.h>
#include <QPixmap>
#include <QWidget>
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
app.setGraphicsSystem("native");
Picture frontBuffer;
XRenderPictFormat *format;
Window rootWindow;
int depth;
Display *dpy = XOpenDisplay( getenv("DISPLAY") );
rootWindow = XRootWindow( dpy, …Run Code Online (Sandbox Code Playgroud) 我已经开始直接研究基于 XLib 的 GUI 应用程序编程,我正在尝试在屏幕上创建一个居中的窗口。我不知道用于实现此目的的常用技术。我的代码(不起作用)是这样的(我使用 CodeBlocks)
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
int screen;
Display *display;
XSetWindowAttributes window_attributes;
Window mainwindow;
XEvent events;
int main(int argc, char** argv) {
display = XOpenDisplay(NULL);screen = DefaultScreen(display);
window_attributes.background_pixel = XWhitePixel(display, screen);
window_attributes.border_pixel = XBlackPixel(display, screen);
window_attributes.win_gravity = SouthWestGravity;
mainwindow = XCreateWindow(display,
RootWindow(display, screen),
1, 1,
600, 400,
0,
CopyFromParent,
InputOutput,
CopyFromParent,
CWBackPixel|CWBorderPixel,
&window_attributes
);
XMapWindow(display, mainwindow);
XFlush(display);
XSelectInput(display, mainwindow, ExposureMask|KeyPressMask|ButtonPressMask);
while (1) …Run Code Online (Sandbox Code Playgroud) 我在 Xlib 窗口中使用 opengl。如何在此窗口上绘制文本(不是在 3d 中)?
我目前在使用 Xlib 时遇到问题,每当我调用XKeysymToKeycode()并传入一个大写字母时KeySym,它都会返回一个小写字母KeyCode。就此而言,Google 似乎并没有真正回答这个问题,也没有太多关于我正在使用的功能的文档。
这是我正在使用的代码:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
int main(void) {
Display *display;
char *ptr;
char c[2] = {0, 0};
KeySym ksym;
KeyCode kcode;
display = XOpenDisplay(0);
ptr = "Test";
while (*ptr) {
c[0] = *ptr;
ksym = XStringToKeysym(c);
printf("Before XKeysymToKeycode(): %s\n", XKeysymToString(ksym));
kcode = XKeysymToKeycode(display, ksym);
printf("Key code after XKeysymToKeycode(): %s\n", XKeysymToString(XKeycodeToKeysym(display, kcode, 0)));
ptr++;
}
XCloseDisplay(display);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它可以编译为gcc …
我最近在大学里一直在学习 OpenGL,并自己搜索了像 Qt 这样的 C++ 中的 Windows GUI 编程。我什至更深入地发现了适用于 Windows GUI 的 XLib。但我仍然没有得到大局。
我知道 Qt 是建立在 XLib 之上的。为了做 OpenGL,我需要通过一些库(如 GLUT)来定义上下文。据我了解,GLUT 基本上是一个通过 GLX 连接 XLib 和 OpenGL 的库。
我还了解到 OpenGL 在 GPU 上运行,并且 XLib 嵌入到操作系统中。那么当操作系统安装在没有 GPU 的计算机上时会发生什么。据我所知它会起作用。这是否意味着 XLib 不依赖 OpenGL 来绘制 Windows 等?如果是这样,它依赖什么?或者它可能通过某个驱动程序逐个像素地绘制它。
简而言之,LibX 是如何实现其 GUI 元素的,是通过 openGL 还是其他方式?
注 1:我用“Windows GUI”指的是按钮、文本框和窗口生成等。注 2:我在 Linux 上运行。
Display XOpenDisplay(0) 和 XOpenDisplay(NULL) 有什么区别?
#include <X11/Xlib.h>
struct MwmHints
{
unsigned long flags;
unsigned long functions;
unsigned long decorations;
long input_mode;
unsigned long status;
};
enum
{
MWM_HINTS_FUNCTIONS = (1L << 0),
MWM_HINTS_DECORATIONS = (1L << 1),
MWM_FUNC_ALL = (1L << 0),
MWM_FUNC_RESIZE = (1L << 1),
MWM_FUNC_MOVE = (1L << 2),
MWM_FUNC_MINIMIZE = (1L << 3),
MWM_FUNC_MAXIMIZE = (1L << 4),
MWM_FUNC_CLOSE = (1L << 5)
};
extern "C"
{
void borderless(Window window)
{
Display *display = XOpenDisplay(0);
Atom …Run Code Online (Sandbox Code Playgroud) 具有以下 Haskell 代码:
import Control.Concurrent
import Data.Time.Clock
import Debug.Trace
import Graphics.X11
import Graphics.X11.Xlib.Extras
main :: IO ()
main = do
d <- openDisplay ""
loop d
loop :: Display -> IO ()
loop d = do
time <- getCurrentTime
(w, _) <- getInputFocus d
maybeName <- fetchName d w
windowAttrs <- getWindowAttributes d w
print $ show time ++ " Name: " ++ show maybeName ++ " Width: " ++ show (wa_width windowAttrs)
threadDelay 1000000
loop d
Run Code Online (Sandbox Code Playgroud)
fetchName返回的窗口标题始终为Nothing …
我知道,我可以通过调用以下命令来“关闭”X11 窗口:
XDestroyWindow(display, id);
Run Code Online (Sandbox Code Playgroud)
问题是,这会立即破坏窗口。另一方面,如果我单击关闭按钮(标题栏中的 x),应用程序可能会显示类似“您真的要退出吗?”的内容。
那么我该如何模拟这种类型的窗口关闭呢?
背景:我正在关闭其他应用程序的窗口,而不是我自己的窗口
是否可以通过单击关闭按钮来阻止应用程序退出?以下代码仅隐藏最小化和最大化按钮但不隐藏按钮...
Run Code Online (Sandbox Code Playgroud)Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False); long value = XInternAtom(display, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); XChangeProperty(display, window, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &value,1 );
我试图通过谷歌搜索覆盖_NET_CLOSE_WINDOW,但无法真正找到一个......或者从xprop中删除_NET_WM_ACTION_CLOSE ...