标签: xlib

如何检测当前关注的应用程序?

我希望能够通过Python跟踪我的X11显示器上当前关注的应用程序.目的是将其与时间跟踪工具联系起来,这样我就可以记录我花费多少时间无效.

我已在http://thpinfo.com/2007/09/x11-idle-time-and-focused-window-in.html找到此代码:

import Xlib.display
display = Xlib.display.Display()
focus = display.get_input_focus()
print "WM Class: %s" % ( focus.focus.get_wm_class(), )
print "WM Name: %s" % ( focus.focus.get_wm_name(), )
Run Code Online (Sandbox Code Playgroud)

但是,它似乎对我不起作用.显然,无论关注哪个应用程序,get_wm_class()和get_wm_name()都只返回None.

当然,解决方案需要与Compiz等所有这些新奇的窗口管理器一起使用.

python x11 xlib

8
推荐指数
1
解决办法
3378
查看次数

如何从xid获取Gdk窗口?

我在版本3中丢失..在python2 + gdk2中是:

#!/usr/bin/env python2
import gtk

gtk.gdk.window_process_all_updates()
window_xid = 54525964
gdk_window = gtk.gdk.window_foreign_new(window_xid)
Run Code Online (Sandbox Code Playgroud)

这非常直截了当.但是,恐怖:

#!/usr/bin/env python3
from gi.repository import xlib
from gi.repository import Gdk
from gi.repository import GdkX11

Gdk.Window.process_all_updates()
xlib_window = "???????"
gdk_display = GdkX11.X11Display.get_default()
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window)
Run Code Online (Sandbox Code Playgroud)

xlib杀了我..我无法用它做任何事情.有没有人在使用它之前?

我已经多次使用的文档是: Gdk3, Xlib

从xid获取窗口是在python2中获取屏幕截图的最快方法我想我会在python3中尝试另一种方式..任何想法?也许peek_children从根窗口?但是,我怎么知道它是否是我想要的窗口?

xlib python-3.x gtk3

8
推荐指数
1
解决办法
2771
查看次数

没有OpenGL,在X11上在QT上显示图像的最快方法是什么?

我需要在QT小部件中显示原始图像.我在帧缓冲区上运行X11,因此OpenGL不可用.

图像和帧缓冲都是相同的格式 - RGB565,但如果需要,我可以将其更改为任何其他格式.我不需要混合或缩放.我只需按原样显示像素.

我正在使用QPainter :: drawImage,但它将QImage转换为QPixmap,这种转换似乎非常慢.它也得到了Xrender的支持,我认为在Xrender中支持混合需要不必要的开销,我并不需要

有没有更好的方法?如果它在QT中不可用,我可以使用Xlib或任何其他库或协议.我可以修改驱动程序,X服务器或其他任何东西.

linux x11 qt qt4 xlib

8
推荐指数
1
解决办法
2125
查看次数

我们如何用Xlib/C模拟鼠标点击?

我想找到C/Xorg代码来"输入"鼠标左键单击.我期待一行代码,但我发现用C写的唯一的东西大约是二十几行而且它们无论如何都不起作用:(它似乎可以在Windows中完成,但我在Linux中.

问题的原因是我编写了一个实用程序,可以让我使用键盘在几个屏幕之间移动鼠标指针.唯一的问题是,如果我移动到一个窗口abc曾经的位置,但另一个窗口xyz已经加载到同一位置的顶部,鼠标指针移动到xyz就好了,但是xyz没有焦点 - 直到我左键单击鼠标.所以,我想在我的代码中构建'click'.

我尝试过的代码不起作用是基于XSendEvent().

c xlib

8
推荐指数
2
解决办法
2385
查看次数

将QWidget嵌入X11窗口

我想将两个QWidgets嵌入到使用XLib创建的窗口中.我写了这段代码:

// Assume all the necessary headers included

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);

   // Create widget 1
   QWidget widget1 ; 
   widget1.setGeometry(44,44,666,666);
   widget1.show();

   // Create widget 2   
   QWidget widget2 ;
   widget2.setGeometry(144,144,666,666);
   widget2.show();      

   Display *display = XOpenDisplay( 0 ); // 0 parameter for default values

   if ( display != NULL )
   {
      // Create the x11 window using XLib
      Window w = XCreateWindow(display, DefaultRootWindow(display), 
      0, 0, 1200, 1100, 0,CopyFromParent, CopyFromParent, CopyFromParent, 0, 0);

      XMapWindow(display, w);
      XFlush(display);

      XReparentWindow(display, widget1.winId(), …
Run Code Online (Sandbox Code Playgroud)

c++ x11 qt xlib

8
推荐指数
1
解决办法
3137
查看次数

Xlib的空或透明窗口仅显示边框线

有没有办法用Xlib创建一个窗口,它只显示边框线,标题,关闭按钮,你可以用鼠标移动?窗口的内容必须为空(或"完全透明",尽管"透明度"听起来更像是我不需要的效果).基本上窗口应该显示背景区域.

c x11 image-processing transparent xlib

8
推荐指数
1
解决办法
6208
查看次数

如何在x11中获得屏幕像素的颜色

我想获得整个x11显示器的顶部/左侧像素(0; 0)的RGB值.

到目前为止我得到了什么:

XColor c;
Display *d = XOpenDisplay((char *) NULL);

XImage *image;
image = XGetImage (d, RootWindow (d, DefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
c->pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), c);
cout << c.red << " " << c.green << " " << c.blue << "\n";
Run Code Online (Sandbox Code Playgroud)

但我需要这些价值观,0..255或者(0.00)..(1.00),虽然它们看起来0..57825,但我认识的格式不是.

另外,复制整个屏幕只是为了得到一个像素是非常慢的.因为这将用于速度关键的环境,如果有人知道更高效的方式,我会很感激.也许使用XGetSubImage1x1大小,但我在x11开发时非常糟糕,并且不知道如何实现它.

我该怎么办?

c++ linux x11 xlib

8
推荐指数
1
解决办法
5562
查看次数

如何修复错误Xlib.error.DisplayConnectionError:无法连接显示":0":b'No协议指定\n'

我正在用python3和XLib制作一些程序.

在我的电脑上使用Ubuntu 14.04一切正常但是当我尝试在我的笔记本中运行我的应用程序时手动安装Xorg我得到例外:

Xlib.error.DisplayConnectionError: Can't connect to display ":0": b'No protocol specified\n'
Run Code Online (Sandbox Code Playgroud)

在线:

self.__display = Xlib.display.Display()
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?如何解决这个问题,它可以在每个Linux上运行?

编辑:

这看起来不像X11的重复:运行gnome应用程序作为另一个用户.在我的两台计算机上,我有相同的用户和组,所以这个问题可能与缺乏运行我的程序的权限无关.

它必须是X配置错误的东西.

python xlib

8
推荐指数
2
解决办法
5276
查看次数

使用XGrabKey或XGrabKeyboard重定向键盘输入

目标

我想根据键将键盘输入重定向到不同的窗口.并非所有的密钥都会被重定向到同一个窗口,我无法使用XSetInputFocus.


第一次尝试:XGrabKey

我发现我可以抓住某些键,然后将事件发送到右侧窗口.我像这样使用XGrabKey

XGrabKey( mDisplay(), 
                    XKeysymToKeycode(mDisplay(),XK_F1) , 
                    AnyModifier ,
                    RootWindow(mDisplay(), mScreenNum),
                    false, //Events aren't sent to the focused window
                    GrabModeAsync, 
                    GrabModeAsync );
Run Code Online (Sandbox Code Playgroud)

它不适用于F1到F4键,但适用于F5和F6.它也不适用于某些常规键,如e,r和t.可能还有其他人.我需要能够重定向Fkeys,所以这个解决方案对我不起作用.


第二次尝试:XGrabKeyboard

我尝试使用XGrabKeyboard,就像这样

XGrabKeyboard(mDisplay(), 
                        RootWindow(mDisplay(), mScreenNum),
                        false, 
                        GrabModeAsync, 
                        GrabModeAsync, 
                        CurrentTime);
Run Code Online (Sandbox Code Playgroud)

它适用于所有Fkeys,但它产生了其他问题.当抓取键盘处于活动状态时,我无法再使用鼠标移动窗口(如果应用程序移动窗口,它仍可正常工作),我无法访问上下文菜单和闪烁的"|" 在键入区域中不显示.

其他信息

这个问题已经在那里讨论过,但他们没有找到解决方案.我使用的是Lubuntu(LXDE)而不是GNOME,我仍然遇到同样的问题.

unmap事件可能会给出一些信息:

  • 没有抓住键盘时我点击右键

    显示上下文菜单,没有unmap事件.

  • 当我退出上下文菜单时:

    我有3个unmap事件:(我打印Unmap旁边的窗口名称)

Unmap pcmanfm  
Unmap pcmanfm 
Unmap
Run Code Online (Sandbox Code Playgroud)
  • 抓住键盘后我右键单击

    我只有一个unmap事件:

Unmap
Run Code Online (Sandbox Code Playgroud)

看起来上下文菜单在显示之前未映射.


我要的是什么

我想无论是:

  • 使用XGrabKeyboard没有副作用
  • 将XGrabKey与任何键一起使用
  • 使用另一个允许我重定向键盘输入的功能

谢谢.

c++ keyboard xlib

7
推荐指数
1
解决办法
1619
查看次数

在 Xlib 中捕获按钮事件,然后将事件传递给客户端

我正在开发一个窗口管理器,主要是作为练习,我遇到了一个问题。我希望能够将单击的窗口提升到堆栈的顶部。目前,我在 Button1 和 ControlMask 上使用 XGrabButton 来允许移动窗口,当我 Ctrl+单击窗口时,达到了预期的效果。但是,如果我在Button1 上使用XGrabButton 和AnyModifier,虽然达到了我想要的效果,但我无法再通过鼠标按钮与客户端窗口进行交互(突出显示文本等)。我曾尝试在 EnterNotify 上抓取按钮,然后在窗口升起时立即取消抓取按钮,但这似乎没有任何效果,窗口管理器的行为就好像我从未抓取过按钮一样。

我的程序还比较小,所以代码如下:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "window_manager.h"


ewm_instance wm;

void 
ewm_init()
{
    wm._display = XOpenDisplay(NULL);

    if (!wm._display) {
        printf("Could not open display %s\n", XDisplayName(NULL));
    } 
    wm._root = DefaultRootWindow(wm._display);
}

void
ewm_run()
{
    XSelectInput(wm._display, 
                 wm._root, 
                 SubstructureRedirectMask | SubstructureNotifyMask | 
                 KeyPressMask | KeyReleaseMask | 
                 ButtonPressMask | ButtonReleaseMask);

    XSync(wm._display, 0);
    XGrabServer(wm._display);
    Window returned_root, returned_parent;
    Window *top_level_windows;
    unsigned int num_top_level_windows;
    XQueryTree(wm._display,
               wm._root,
               &returned_root,
               &returned_parent,
               &top_level_windows,
               &num_top_level_windows); …
Run Code Online (Sandbox Code Playgroud)

c x11 xlib xorg

7
推荐指数
1
解决办法
1261
查看次数

标签 统计

xlib ×10

x11 ×6

c ×3

c++ ×3

linux ×2

python ×2

qt ×2

gtk3 ×1

image-processing ×1

keyboard ×1

python-3.x ×1

qt4 ×1

transparent ×1

xorg ×1