Articles of x11

检测快速用户切换Linux

我目前正在尝试检测用户在Linux平台(特别是Fedora 14-16,RedHat 4.7-6.x,CentOS 4-6,OpenSuse 10-11)上是否有快速用户切换到其他用户的情况。 我一直在寻找类似于Windows上可用的WTSRegisterSessionNotification()函数的东西,但是我所遇到的是对Wine软件中的一些错误的引用。 有没有其他人跑过这个障碍? 似乎有很多关于如何在Windows和Mac OS X(这是好的)这样做的资源,但在Linux上似乎没有什么… 编辑:显然,在较新的系统(至lessFedora 16) 这似乎是一个可行的select。 我不知道它是否有一个DBUS接口…更多即将推出!

单声道全球热键

我试图在Mono和X11中实现全局热键。 不幸的是,应用程序使用System.Windows.Forms ,所以我不能使用在这个问题中提出的GDK#事件filter。 使用XGrabKey作品,但我有事件循环的问题。 closures应用程序时,处理X11事件循环的线程仍挂在XNextEvent 。 有没有办法呢? 我宁愿不要求XPending投票。 我可以以某种方式取消XNextEvent或发送虚拟事件吗? 我在根窗口调用XGrabKey ,所以不幸的是我没有得到像DestroyNotify或UnmapNotify事件。

Linux上的X Windows事件

我试图通过好奇心来教导自己如何在Linux上的两个或多个X窗口之间抓取事件。 到目前为止,我是一个可怕的黑客攻击,只能获得FocusIn和FocusOut事件。 任何人有任何build议或快速教程如何正确地做到这一点?

触发X窗口的resize事件

所以我有一个X窗口(属于另一个进程),我想为该窗口触发一个resize事件,最好不实际调整它的大小。 我的第一个办法是重新调整窗口两次,第二次回到原来的大小,但我失败了。 问题是,有问题的窗口显示全屏,显然调用XResizeWindow或XMoveResizeWindow这些什么都不做(这是有道理的某种方式)。 如果窗口不处于全屏模式,它工作正常。 由于这只是为了快速testing反正我开始想知道是否有可能在X服务器中伪造/注入该窗口的resize事件。 对于MS Windows来说,看起来很容易,但是在Google上search的时候发现了很多例子,但是对于X来说,我似乎运气不好。 背景(因为人们可能会问无论如何;)):我正在全屏启动一个VMware Player实例,并在某些情况下启动后,Windows客人不会根据主机更改它的分辨率(但主要是,谢谢到客户机上安装的VMware Tools)。 虚拟机在连接不同大小屏幕的多台机器上使用,因此我无法预先configuration图像以获得正确的分辨率。 目前用户被告知退出并重新进入全屏,如果分辨率是错误的,但这是相当不方便的。 所以我的想法是简单地告诉VMplayer它在启动后只是resize,但也许有更好的方法…

在Emacs中更改当前缓冲区的字体?

在emacs中,我可以通过text-scale-adjust来改变当前缓冲区的字体大小。 但是,为了改变字体,我只能find像set-face-font或set-frame-font这样的函数,它们会在emacs中全局更改字体(或者在当前帧中更改所有缓冲区的字体)。 emacs中是否有一个函数只改变当前缓冲区的字体(默认字体),而不修改任何其他缓冲区中的字体?

如何移动或调整X11窗口(即使它们被最大化)?

我想改变一个窗口的位置。 我的问题是窗口可以最大化,这不允许改变它的大小和位置(窗口可以属于任何应用程序)。 我使用KDE4。 我试图使用ewmh Python模块。 在我的情况下,当窗口最大化,我只是想从一个显示器移动到另一个,保持最大化。 我需要unmaximize它来设置它的几何,所以我试图unmaximize它使用ewmh.setWmState()设置_NET_WM_STATE_MAXIMIZED_VERT , _NET_WM_STATE_MAXIMIZED_HORZ为0 ,然后ewmh.display.flush() 。 有时我可以configuration以前最大化的窗口的位置和大小,有时不可以。 出于某种原因,它不能可靠地工作,如果我只是从一台显示器切换到xrandr显示器与xrandr ,特别是可能失败的最大化Windows。 请注意,unmaximizing始终工作,什么(经常)不起作用正在改变窗口位置(或大小)之后。 我也试过在terminal上做这个。 这是重现我的问题最简单的方法。 首先,获得窗口ID( $WID )的一些最大化的窗口。 然后: wmctrl -i -r $WID -b remove,maximized_vert,maximized_horz wmctrl -i -r $WID -e 0,1280,50,1250,1250 但是第二个命令除非在运行之前手动移动或调整窗口的大小,否则什么也不做。 与ewmh不同,如果窗口最大化, wmctrl不会如预期的那样工作。 wmctrl成功地wmctrl窗口的wmctrl ,但之后不能改变它的位置或大小。 在单屏幕和三屏幕X屏幕状态下都可以重现。 这个问题似乎不是特定于任何特定的工具。 例如,如果窗口只是unmaximized,但没有手动移动/resize,则xdotool也无法更改窗口大小/位置。 到目前为止,唯一可靠的解决方法是使用ewmh或wmctrl手动ewmh窗口,然后手动更改窗口大小或手动移动窗口。 只有这样,我总是可以移动或调整它与ewmh或wmctrl 。 但显然这是不可接受的解决scheme。 即使窗口最大化,是否有可靠的方法来设置窗口几何? 通过Python的方法是首选,但与shell命令的解决scheme也将罚款。

如何将X11 KeyCode或KeySym转换为扫描代码

我需要以独立于布局的方式获取键盘button(或任何其他代码)的扫描代码。 更具体的说,我有QEditText并从中捕获击键。 现在我开始按下一个button,当布局是英文的时候它有keycode = X ,然后我把布局切换到俄语(德语,法语,不pipe),键码变成Y – 但是物理按键是一样的。 所以我需要知道那个物理button的代码,怎么做?

ISO-10646 XFont编码问题

我正在尝试在我的X Window程序中使用ISO-10646固定字体。 它必须支持英文,俄文和希腊文字母,但它不支持。 在xfontsel窗口中一切正常,但在我的程序中只有英文显示正确。 使用类似g++ -fexec-charset=ISO-10646 …或g++ -finput-charset=ISO-10646 …没有帮助。 我该如何解决? testing应用窗口截图: xfontsel窗口截图: testing应用代码: #include <X11/StringDefs.h> #include <X11/Xaw/Command.h> int main(int argc, char **argv) { Widget widget = XtInitialize(argv[0], "simple", NULL, 0, &argc, argv); XtVaCreateManagedWidget( "English Русский ελληνικά", labelWidgetClass, widget, XtNfont, XLoadQueryFont(XtDisplay(widget), "-Misc-Fixed-Medium-R-Normal–20-200-75-75-C-100-ISO10646-1" ), XtNwidth, 500, XtNheight, 100, NULL ); XtRealizeWidget(widget); XtMainLoop(); }

C每个Unicode字符的xtest发射按键

我想制作一个程序来模拟按键。 我认为我大部分都做完了,但是我做了一些错误,我猜是因为它没有做我期望的事情。 我举了一个小例子来说明这个问题。 主要的问题是,如果我想要生成大写字母,它不适用于像'zZ'这样'zZ'string。 它只产生小写字母'zz' 。 虽然符号像'! $ & _ >' '! $ & _ >'等工作正常(这需要我的德国键盘布局),甚至像”💣“多字节的。 我正在做的是这样的: 前言: 所以基本上模仿按键的主要问题首先是从用户到用户的布局,最重要的是修改键。 所以,如果你走上天真的路线,用XStringToKeysym()得到一个keysym和XKeysymToKeycode()并从那个keysym中获取一个XKeysymToKeycode()并且它不像大多数新手所期望的那样工作(像我一样)。 这里的问题是,多个keysyms被映射到相同的keycode。 就像'a'和'A'的keysysm被映射到相同的键码,因为它们在键盘上的相同物理button上,并且链接到该键码。 所以,如果你走上面的路线,你会得到相同的键码,虽然keysyms是不同的,但映射到相同的button/键码。 而且通常没有办法解决这个问题,因为不清楚'A'是如何存在的。 shift + a或caps + a,或者你有一个花式键盘,上面有一个'a'和'A'button。 另一个问题是我如何发出按键甚至没有运行该应用程序的人的键盘按键。 如果我想input'Ä' (德语变音符号),就像在英文版面上按什么键。 这是行不通的,因为XKeysymToKeycode()不会为此返回一个合适的键码,因为这个布局没有键盘映射。 我的方法: 我正在绑定什么来绕过这个是find一个没有被使用的键码。 你有255-8的keycodes在你的处置,但一个普通的键盘上只有~110键,所以通常还有一些空间。 我正试图find在当前布局未映射的键码之一,并使用它来分配我自己的键盘。 然后我从我的字符得到一个keysym我迭代了我的string,并将其传递给XStringToKeysym() ,这给了我适当的keysym。 在大多数情况下,“💣”不映射到我知道的任何键盘布局。 所以我把它映射到未使用的键码,并用XTestFakeKeyEvent()按下并重复该string中的每个字符。 这可以与所有花式字形人们可以想到的,但它不能用简单的字母,我真的不知道为什么:(在我的debugging会话中,键盘和键码似乎是正确的,只是XTestFakeKeyEvent()不做在这种情况下,我可能会把事情搞砸,但我不确定这里的问题是什么,我希望有人有一个好主意,可以帮助我find一个可行的解决scheme。 我只是在strings数组中使用这个unicode符号,因为我不想在这里的例子中处理这个。 假设有任何inputstring产生的代码。 请注意,下面的代码可能会破坏你的键盘映射,使你无法键入和使用键盘了,需要重新启动你的X-Server / PC …我希望它不处于当前状态在这里工作很好)只要知道如果你拨弄的代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include […]

X11:窗口移动时得到通知

我的应用程序需要知道窗口何时被移动(我需要知道我的应用程序的窗口相对于屏幕的确切位置(根窗口/绝对位置) – 例如xcb_translate_coordinates返回的xcb_translate_coordinates ,dst_window设置为屏幕的根窗口)。 问题是我需要接收一个事件,如果我的窗口被用户移动。 我已经将这个XCB_EVENT_MASK_STRUCTURE_NOTIFY添加到了事件掩码中,正如我们在这里所build议的那样,我的应用程序只是在窗口pipe理器的框架的相对位置发生改变时才获取事件(这反过来,X服务器不会向我的应用程序发送任何事件如果窗口被用户移动,因为它不改变窗口pipe理器框架的相对位置)。 有关其他信息,这里是窗口创build代码: uint32_t events = XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_KEY_PRESS; xcb_create_window(conn, XCB_COPY_FROM_PARENT, main_window, scr->root, 0, 0, width, height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, scr->root_visual, XCB_CW_EVENT_MASK , &events); xcb_map_window(conn, main_window); 我已经在桌面会话和Xephyr中使用Xfwm4,Openbox和metacity,在合成模式和非合成模式下都尝试了这种方法,所有结果都一样。 什么是解决scheme,以便我可以通知窗口移动事件? 我不想启用override_redirect ,因为我也需要我的应用程序由窗口pipe理器来pipe理。