我正在尝试使用Xlib来深入了解Linux GUI程序的工作原理.我写了一个简单的程序,在一个窗口中显示"Hello,world",但它看起来很不合时宜,因为文本没有消除锯齿.
在X11中显示消除锯齿文本的最佳方法是什么?如何在GTK,Qt和其他工具包中实现抗锯齿?
我目前正在尝试从我的全屏Xlib OpenGL窗口启用alt-tabbing,但是遇到了一些困难.我试过XUnmapWindow(..),哪种方法有效,但分辨率没有重置(除非我应该手动执行此操作?)并且我的Xlib窗口不会显示为最小化窗口(即我无法将alt-tab返回窗口,即使应用程序似乎仍然在后台运行).
我尝试的下一件事是将窗口从全屏模式更改为窗口模式(即在窗口模式下重新创建窗口),但显然,我宁愿不必这样做.
我正在听FocusOut和FocusIn事件,FocusOut似乎在我的alt-tab时调用,但我不知道如何让我的应用程序正确地最小化.如果在FocusOut调用事件时我的代码中没有做任何事情,我的应用程序不会做任何事情(即我不能最小化窗口).
任何帮助,将不胜感激!
编辑:不幸的是,我无法让X Windows正确地最小化全屏窗口.因此,为了解决这个问题,我决定destroy()使用全屏窗口,然后create()在窗口模式下使用新窗口.似乎运作良好.
我尝试使用Xft的教程,以及让他们打电话的是一个教程...看起来就像是写在朝鲜的阵营......我也发现了这一个。所以让我试着一步一步地做:
// g++ XftTest.cc -lX11 -lXft `pkg-config --cflags freetype2`
#include<unistd.h>
#include<X11/Xlib.h>
#include<X11/Xutil.h>
#include<X11/Xft/Xft.h>
int main()
{
Display *display;
XftFont *font;
XftDraw *xftdraw;
XRenderColor xrcolor;
XftColor xftcolor;
display = XOpenDisplay(0);
Window XP = XCreateSimpleWindow(display,DefaultRootWindow(display),0,0,360,90,0,0,0);
XMapWindow(display,XP);
font = NULL; /* added 6/16 */
//font = XftFontOpenName(display,0,"NorthKorea-50"); // how to check if this is good ?
font = XftFontOpenName(display,0,"") /* added 6/16 */
if (!font) return 1;
xftdraw = XftDrawCreate(display,XP,DefaultVisual(display,0),DefaultColormap(display,0));
xrcolor.red =65535;
xrcolor.green=0;
xrcolor.blue =0;
xrcolor.alpha=65535;
XftColorAllocValue(display,DefaultVisual(display,0),DefaultColormap(display,0),&xrcolor,&xftcolor);
XftDrawString8(xftdraw, &xftcolor, …Run Code Online (Sandbox Code Playgroud) 我想知道如何检测按键事件或鼠标指针事件是否是由像 xdotool 这样的(类似自动化)应用程序生成的。
基本上,我正在编写一个应用程序来检查是否没有真正的鼠标或键盘活动。
在我的应用程序中,只有当我们没有真正的鼠标移动或键盘上没有真正的按键按下/释放时,我才想标记空闲活动。
任何有关此的参考都会很棒。
我想使用纯XLib API 来完成此操作。
我不想使用XCB。
任何扩展,例如XRecord(我目前正在使用它来捕获事件)都可以。
我写了一个 SFML C++ 游戏,并试图开始使用线程,但过了一段时间一切都崩溃了。搜索后我发现修复似乎是调用 XInitThreads(); 但这以某种方式不起作用。
简化代码:
#include <X11/Xlib.h>
int main() {
XInitThreads();
//other stuff
return 1337;
}
Run Code Online (Sandbox Code Playgroud)
我尝试编译时收到的错误消息是“对符号‘XInitThreads’的未定义引用。难道头文件正在工作,但没有实现该方法的文件?
等待X11窗口映射和查看的正确方法是什么?确切地说,我想等到我可以安全地调用XSetInputFocus()而不会遇到以下错误导致X服务器回火的任何风险:
// X Error of failed request: BadMatch (invalid parameter attributes)
// Major opcode of failed request: 42 (X_SetInputFocus)
Run Code Online (Sandbox Code Playgroud)
目前这种错误经常发生,尤其是在慢速X服务器上或者在使用libXrandr更改了监视器分辨率后立即尝试打开新窗口时.
我已经有了这个问题的解决方案,但它非常hacky因为它轮询window属性所以我想知道是否有更清洁的版本.
这是我目前的做法:
static Bool predicate(Display *display, XEvent *ev, XPointer arg)
{
return(ev->type == MapNotify);
}
static void waitmapnotify(struct osdisplayinfo *osd)
{
XEvent ev;
XWindowAttributes xwa;
XPeekIfEvent(osd->display, &ev, predicate, NULL);
do {
XGetWindowAttributes(osd->display, osd->window, &xwa);
usleep(1);
} while(xwa.map_state != IsViewable);
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作得很好,但它很hacky所以我在这里讨论它 - 以防万一有一个更干净的方式来做这件事.
我想制作一个非常简单的 python 3 脚本,它将生成一个按键(F15)。我不想使用一堆库来执行此操作,因为我只需要按下一个键并且不需要支持整个键盘。我知道我需要使用 KeyPress 和 KeyRelease 来生成键盘事件。我只是不确定从哪里开始,而且文档有点混乱。
http://tronche.com/gui/x/xlib/events/keyboard-pointer/keyboard-pointer.html http://python-xlib.sourceforge.net/?page=documentation
UPD:很久以前就应该更新这篇文章,但如果有人需要示例,可以在https://github.com/awpe/xwinclone上看到结果软件。
我不仅对 Xlib 很陌生,而且对 Linux 接口编程也很陌生。
我正在尝试解决将一个窗口的内容绘制到另一个窗口的常见任务(这并不像看起来那么常见,因为我找不到任何可靠的示例)。
然而,我遇到了严重的性能问题,我正在寻找可以用来使程序更快、更可靠的解决方案。
现在我将提供一些有关程序流程的信息,因为我不确定所选的程序设计是否正确,也许我使用Xlib的方式存在一些错误。
程序以适当的方式获取活动窗口(从现在起称为SrcWin)的ID(Xlib“Window”类型)(不是某些程序的小部件的ID,而是绘制所有内容的真实可见窗口),首先它XGetInputFocus用于获取焦点窗口,然后在找到根窗口的子窗口时使用迭代窗口XQueryTree,然后使用XmuClientWindow函数获取命名窗口(如果不是已找到的窗口)。
然后使用它获取SrcWinXGetWindowAttributes的宽度和高度,它们都在函数中用于创建相同大小的新窗口(称为TrgWin )。XCreateSimpleWindow
一些事件是为新窗口 TrgWin 注册的,例如KeyPress和Expose usingXSelectInput函数。
图形上下文是这样创建的:
GC gc = DefaultGC (Display, ScreenCount (Display) - 1);
Run Code Online (Sandbox Code Playgroud)
现在开始无限循环,在此循环中select调用函数来等待 X 连接上的某些事件或超时 ( struct timeval)。
之后该程序尝试使用以下命令从SrcWin获取图像:
XImage *xi;
xi = XGetImage (Display, SrcWin, 0, 0, SrcWinWidth, SrcWinHeight, AllPlanes, ZPixmap);
Run Code Online (Sandbox Code Playgroud)
如果成功获取图像,则会将其放入TrgWin:
if (xi)
{
XPutImage (Display, TrgWin, gc, …Run Code Online (Sandbox Code Playgroud) 我目前正在将我的一个应用程序从 Xlib 移植到 libxcb,但在查找有关我在某个时候使用的 XInput2 扩展的信息时遇到了一些麻烦。libxcb 中是否有 XInput2 实现?如果是,我在哪里可以找到文档。
目前我在使用以下功能时遇到了麻烦:XIQueryDevice, XISelectEvents. 这些主要是我使用的功能。
也许有人可以为我指出文档或为我提供一个非常小的例子来开始。
是否可以使用 xlib 绘制没有标题栏、关闭按钮、鼠标按钮响应的透明窗口。所以只是用特定的颜色和宽度边框?就像是
这个橙色矩形是我需要创建的。此外,我希望有可能以编程方式移动、调整大小、关闭并使其闪烁(更改计时器的边框颜色)。
我设法创建没有标题栏的透明窗口,并在窗口的每一侧绘制矩形以制作边框效果:
#define W_WIDTH 640
#define W_HEIGHT 480
#define X_POS 100
#define Y_POS 120
#define BORDER_WIDTH 2
Display *dpy;
Window w;
XRectangle rectangles[4] =
{
{ X_POS, Y_POS, W_WIDTH, BORDER_WIDTH },
{ X_POS, Y_POS, BORDER_WIDTH, W_HEIGHT },
{ X_POS, W_HEIGHT - BORDER_WIDTH, W_WIDTH, BORDER_WIDTH },
{ W_WIDTH - BORDER_WIDTH, Y_POS, BORDER_WIDTH, W_HEIGHT }
};
int main(int argc, char *argv[])
{
GC gc;
XGCValues gcv;
int run = 1;
dpy = XOpenDisplay(NULL);
XVisualInfo vinfo;
XMatchVisualInfo(dpy, DefaultScreen(dpy), 32, TrueColor, …Run Code Online (Sandbox Code Playgroud)