我现在对Xlib编程有点困惑.几周前我开始使用dwm(一个轻量级的窗口管理器),我想收集一些Xlib编程书籍或在线资源来定制dwm.
然而,谷歌搜索网络后,我没有看到很多新的文章谈论Xlib?亚马逊X窗口系统的最新编程指南是在1994年!?没有Xlib的新文章,因为旧书已经足够,或者因为有一些我不知道的新技术?或者,也许我没有正确的关键字来搜索网络.如果是这样的话,请有人指点我到正确的地方吗?
我目前正在尝试从我的全屏Xlib OpenGL窗口启用alt-tabbing,但是遇到了一些困难.我试过XUnmapWindow(..),哪种方法有效,但分辨率没有重置(除非我应该手动执行此操作?)并且我的Xlib窗口不会显示为最小化窗口(即我无法将alt-tab返回窗口,即使应用程序似乎仍然在后台运行).
我尝试的下一件事是将窗口从全屏模式更改为窗口模式(即在窗口模式下重新创建窗口),但显然,我宁愿不必这样做.
我正在听FocusOut和FocusIn事件,FocusOut似乎在我的alt-tab时调用,但我不知道如何让我的应用程序正确地最小化.如果在FocusOut调用事件时我的代码中没有做任何事情,我的应用程序不会做任何事情(即我不能最小化窗口).
任何帮助,将不胜感激!
编辑:不幸的是,我无法让X Windows正确地最小化全屏窗口.因此,为了解决这个问题,我决定destroy()使用全屏窗口,然后create()在窗口模式下使用新窗口.似乎运作良好.
我尝试使用XLib和XTestFakeKeyEvent将密钥发送到应用程序,并且它工作正常,使用以下代码:
XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,CurrentTime);
for(i=0;i<hello.size();i++){
tamper[0] = hello[i];
KeySym key = XStringToKeysym(tamper);
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, key),True, CurrentTime );
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, key),False, CurrentTime );
}
Run Code Online (Sandbox Code Playgroud)
当选择列表[selectWindow]是我发送数据和篡改一个char [2](以字符从打招呼[I]为char*的函数转换窗口.这个代码写的Hello wariable的内容到选定的窗口,但是,我试图发送Return键,
XSetInputFocus(disp, list[selectWindow],RevertToPointerRoot,CurrentTime);
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, XK_Return),True, CurrentTime );
XTestFakeKeyEvent(disp,XKeysymToKeycode(disp, XK_Return),False, CurrentTime );
Run Code Online (Sandbox Code Playgroud)
所以我再次选择窗口,并发送XK_Return关键应用,但它不工作,我想这是因为与Xlib的"滞后"的,因为如果我把一个wait(2)的结束'for'循环,它工作正常,但我不想在每次发送邮件的2秒内等待.
我不知道如何解决这个问题.
谢谢.
我想编写一个简单的Xlib程序来改变鼠标行为(举个例子,反转垂直运动).我在捕获事件时遇到问题.
我想要代码
MotionEvent)new_x -= difference_x)XWarpPointer,防止事件生成)下面的代码应该在每次移动鼠标时捕获一个动作事件,但只有当指针从一个窗口移动到另一个窗口时它才会生成事件...如何捕获所有的移动事件?
#include "X11/Xlib.h"
#include "stdio.h"
int main(int argc, char *argv[])
{
Display *display;
Window root_window;
XEvent event;
display = XOpenDisplay(0);
root_window = XRootWindow(display, 0);
XSelectInput(display, root_window, PointerMotionMask );
while(1) {
XNextEvent( display, &event );
switch( event.type ) {
case MotionNotify:
printf("x %d y %d\n", event.xmotion.x, event.xmotion.y );
break;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有关:
我需要找到窗口位置和大小,但我无法弄清楚如何.例如,如果我尝试:
id.get_geometry() # "id" is Xlib.display.Window
Run Code Online (Sandbox Code Playgroud)
我得到这样的东西:
data = {'height': 2540,
'width': 1440,
'depth': 24,
'y': 0, 'x': 0,
'border_width': 0
'root': <Xlib.display.Window 0x0000026a>
'sequence_number': 63}
Run Code Online (Sandbox Code Playgroud)
我需要找到窗口位置和大小,所以我的问题是:"y","x"和"border_width"总是0; 更糟糕的是,"高度"和"宽度"在没有窗框的情况下返回.
在这种情况下,在我的X屏幕上(其尺寸为4400x2560)我预期x = 1280,y = 0,宽度= 1440,高度= 2560.
换句话说,我正在寻找python等价物:
#!/bin/bash
id=$1
wmiface framePosition $id
wmiface frameSize $id
Run Code Online (Sandbox Code Playgroud)
如果您认为Xlib不是我想要的,请随意在python中提供非Xlib解决方案,如果它可以将window id作为参数(如上面的bash脚本).在python代码中使用bash脚本输出的明显解决方法感觉不对.
我不确定为什么会发生这种情况,但是我在C++中使用Xlib创建的任何窗口都会在我尝试关闭时使用X按钮向终端输出错误.我可以通过编程方式关闭它而没有错误,它只是执行它的X按钮.
错误如下:
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 483 requests (483 known processed) with 0 events remaining.
Run Code Online (Sandbox Code Playgroud)
请求的数量每次都不同,但总有0个事件剩余.为什么会这样?原因似乎不是我的代码,因为它无论如何都会执行此操作并且不向队列发送任何关闭事件.我试过拦截Atom WM_WINDOW_DELETE,当我关闭窗口时它不会运行预期的代码.
编辑:添加了事件循环代码.
while(XPending(display)) {
XNextEvent(display, &event);
pthread_mutex_unlock(&mutex);
if(event.type == Expose) {
XWindowAttributes getWindowAttributes;
pthread_mutex_lock(&mutex);
XGetWindowAttributes(display, window, &getWindowAttributes);
if(state.currentState == STATE_NORMAL) {
state.normX = getWindowAttributes.x;
state.normY = getWindowAttributes.y;
state.normWidth = getWindowAttributes.width;
state.normHeight = getWindowAttributes.height;
}
pthread_mutex_unlock(&mutex);
glViewport(0, 0, getWindowAttributes.width, getWindowAttributes.height);
} else if(event.type == KeyPress) {
return false;
} else if(event.type == ClientMessage) {
std::cout<<"X Button …Run Code Online (Sandbox Code Playgroud) 我想在我的Debian 64位环境中构建32位应用程序.
所以,我正在尝试编译Qt源以获得32位库.
我正在尝试使用以下configure命令:
./configure -platform linux-g++-32
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到如下错误:
Basic XLib functionality test failed!
You might need to modify the include and library search paths by editing
Run Code Online (Sandbox Code Playgroud)
但是当我做以下事情时:
./configure -platform linux-g++-64
Run Code Online (Sandbox Code Playgroud)
它工作正常.
任何猜测?
我知道的唯一事实XImage是存储在客户端,pixmaps存储在服务器端.这么简单吗?
那么什么是XY和Z Pixmaps为什么X需要这么多类型的图像格式?
为什么没有XY和Z Images?
什么是上下文中的Bitmap Xlib以及为什么有一个XCreateBitmapFromData返回Pixmap句柄的函数?(或指针?或结构?)
我正在尝试收听键盘输入(使用X11事件循环)并获取扫描码.这些扫描码应该指代密钥的物理位置,而不是它所键入的字符.问题是,我所能得到的只是KeySyms和KeyCodes,它们针对不同的语言进行了不同的映射(例如QWERTY vs QWERTZ).
我目前的解决方案是阅读"/ usr/share/X11/xkb/keycodes/evdev"文件.它包含密钥位置到密钥代码的映射.使用这个我可以简单地将任何键码转换回扫描码.我的猜测是,这不是一种稳定的做事方式.我根本不太了解Linux.这就是为什么我认为在这里问这可能是一个好主意.
假设大多数用户的机器正在使用这些evdev映射是否安全?如果没有,我还能在哪里找到实际使用的关键映射?或者是否有更好的解决方案?
我想使用带有VNC的GNOME环境来访问我的Ubuntu 16.10 VPS(Contabo),但是我仍然遇到一些我目前无法解决的问题。要安装和配置软件,我运行了以下命令:
sudo apt-get install ubuntu-gnome-desktop
sudo apt-get install tightvncserver xtightvncviewer tightvnc-java
sudo locale-gen de_DE.UTF-8
sudo apt-get install xfonts-75dpi
sudo apt-get install xfonts-100dpi
sudo apt-get install gnome-panel
sudo apt-get install metacity
sudo apt-get install light-themes
touch ~/.Xresources
vncpasswd
Run Code Online (Sandbox Code Playgroud)
文件〜/ .vnc / xstartup最初包含以下几行:
#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
Run Code Online (Sandbox Code Playgroud)
当我启动VNC服务器时,vncserver -geometry 1920x1200根据〜/ .vnc中的日志文件,一切正常
17/02/17 11:47:48 …Run Code Online (Sandbox Code Playgroud)