小编Mic*_*sch的帖子

在X11上拦截WM_DELETE_WINDOW?

我想拦截WM_DELETE_WINDOW发布到我正在编写的应用程序(AllTray)的某些窗口选择的消息,以便我可以对其进行操作而不是接收它的应用程序.目前,我看着在GDK级别尝试此通过gdk_display_add_client_message_filter,如果有可能,但我很高兴与Xlib的解决方案,如果有一个为好; 这似乎是可能的,但我似乎并不理解我是如何成功地做到的.

目前,我有两个程序(用C编写),我试图用它来解决这个问题,第一个程序除了创建一个它知道的窗口和寄存器之外什么也没做WM_DELETE_WINDOW,第二个试图捕获该消息,但是似乎没有这样做; 它似乎没有做任何事情.我是否理解文档错误,或者我需要做些什么(或者我是否需要完全避免使用GDK)?

背景是这样的:在我重新编写AllTray之前,它的工作方式似乎是试图拦截鼠标点击X按钮本身.对于某些窗口管理器,这种方法正常工作,对于其他窗口管理器根本不起作用,而对于其他窗口管理器,用户必须手动配置它并指示AllTray关闭窗口的按钮所在的位置.我正在寻找的是一个不涉及的解决方案,LD_LIBRARY_PRELOAD它将适用于任何符合当前标准的窗口管理器/应用程序组合,并WM_DELETE_WINDOW在窗口关闭时发送ClientMessage.

更新:我还在寻找答案.我现在采取的路线是尝试重新调整窗口并自行管理,但我无法使其工作.重新定位后,我似乎无法以任何方式取回它.我可能会遗漏一些非常基本的东西,但我无法弄清楚如何让它再次出现在我自己的窗口,将它带回屏幕.

更新2:好的,所以我打了另一个砖墙.X服务器文档说在窗口的事件掩码上设置StructureNotifyMask以接收MapNotify和ReparentNotify事件.我有兴趣接收任何一个.我目前的想法是创建一个窗口,作为事件接收器,然后当我获得有趣事件的事件时,通过创建和重新创建来对它们进行操作.但是,这根本不起作用.我实际收到的唯一事件是PropertyNotify事件.因此,这条路线似乎也没有做得很好.

c linux x11 events intercept

13
推荐指数
2
解决办法
1万
查看次数

数据损坏:错误在哪里‽

最后编辑:我已经弄清楚问题是什么(请参阅下面我自己的答案),但我无法将问题标记为已回答的问题.如果有人可以回答我在下面的答案中提出的问题,也就是说,这是Cython中的错误还是Cython的预期行为,我会将该答案标记为已接受,因为这将是最有用的教训,恕我直言.


首先,我必须首先说我已经试图解决这个问题三天了,而我只是把头靠在墙上.从文档中我可以看出,我正在做正确的事情.显然,我不能正确地做事,因为如果我是,我就不会有问题(对吧?).

无论如何,我正在为mcrypt绑定到Python.它应该适用于Python 2和Python 3(虽然它未经Python 2测试).它可以在我的网站上找到,因为它太大而无法包含在帖子中,并且考虑到我不知道我做错了什么,我甚至无法隔离可能存在问题的代码.显示问题的脚本也在我的网站上.该脚本只提供100个块,只有字母"a"(无论加密算法/加密模式使用的块大小),当然应该得到一个"a"块作为往返的结果.但它(不总是).以下是单次运行的输出:

Wed Dec 15 10:35:44 EST 2010
test.py:5: McryptSecurityWarning: get_key() is not recommended
  return ''.join(['{:02x}'.format(x) for x in o.get_key()])

key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
16
self test result: 0
enc parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
dec parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
enc key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
dec key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
Stats: 88 / 100 good packets (88.0%)

#5: b'aaaaaaaaaaaaaaaa' != b'\xa6\xb8\xf9\td\x8db\xf6\x00Y"ST\xc6\x9b\xe7'
#6: …
Run Code Online (Sandbox Code Playgroud)

python mcrypt cython python-extensions

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

Cython 字节到 C char*

我正在尝试为 CPython 编写 Cython 扩展来包装 mcrypt 库,以便我可以将它与 Python 3 一起使用。但是,我在尝试使用 mcrypt API 之一时遇到了段错误的问题。

失败的代码是:

def _real_encrypt(self, source):
    src_len = len(source)
    cdef char* ciphertext = source
    cmc.mcrypt_generic(self._mcStream, <void *>ciphertext, src_len)
    retval = source[:src_len]
    return retval
Run Code Online (Sandbox Code Playgroud)

现在,按照我理解 Cython 文档的方式,第 3 行的赋值应该将缓冲区的内容(Python 3 中的一个对象)复制到 C 字符串指针。我认为这也意味着它将分配内存,但是当我进行此修改时:

def _real_encrypt(self, source):
    src_len = len(source)
    cdef char* ciphertext = <char *>malloc(src_len)
    ciphertext = source
    cmc.mcrypt_generic(self._mcStream, <void *>ciphertext, src_len)
    retval = source[:src_len]
    return retval
Run Code Online (Sandbox Code Playgroud)

它仍然因段错误而崩溃。它在 mcrypt_generic 内部崩溃,但是当我使用普通的 C 代码时,我能够让它正常工作,所以必须有一些我不太了解 Cython 在这里如何处理 C 数据的东西。

谢谢你的帮助!

ETA:问题是我的一个错误。在醒了太多小时后我正在研究这个(这不是我们在某个时候都做过的事情吗?)并且错过了一些愚蠢的事情。我现在拥有的有效代码是:

def …
Run Code Online (Sandbox Code Playgroud)

python cython python-3.x python-bindings

5
推荐指数
1
解决办法
6427
查看次数

将 X11 光标设置为箭头

我在调用 XCreateWindow() 时尝试了以下操作:

unsigned long ctt_attribute_mask = CWWinGravity | CWCursor;

ctt_attributes->win_gravity = NorthEastGravity;
ctt_attributes->cursor = XC_arrow;

ctt_window = XCreateWindow(dpy, parent, ctt_xpos, ctt_ypos,
             ctt_xy_size, ctt_xy_size, ctt_border,
             ctt_depth, ctt_class, ctt_visual,
             ctt_attribute_mask, ctt_attributes);
Run Code Online (Sandbox Code Playgroud)

这会创建窗口,但是当它在窗口上滚动时它不会影响指针。

当鼠标出现在我的窗口上时,我想使用用户桌面环境的标准指针光标。

Xlib 是必需的,因为这是一个与工具包无关的程序。

ETA:额外的上下文可用;请参阅create_ctt_window源文件中的第 35 行开始。

c x11 mouse cursor xlib

3
推荐指数
1
解决办法
1914
查看次数

Python 3的事件循环实现?

有没有人知道Python 3可用的事件循环库(或绑定)?没关系,如果它只是UNIX系统,虽然我更喜欢做Windows的东西.

ETA:我意识到编写事件循环系统并不是非常困难.但是,我不想重新发明轮子(我们仍然鼓励这些天不这样做,对吗?;-))

这是针对服务器应用程序计划的,所以显然我想要一些与GUI小部件工具包无关的东西.

如果答案是"不,没有一个"(可能;我确定无法找到),那么我很可能为libev创建Python 3的绑定.

event-handling event-loop python-3.x

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

为什么编译器需要复杂的语法?

或者,"我做错了吗?"

我正在编写一个小函数,如果需要,将返回一个字符串,引用(如引用可打印),否则按原样返回.字符输入到函数中; 结果是一个字符串.

我最初尝试做的是:

private string QuotedChar(char ch) {
    if(ch < (char)128 && !char.IsWhiteSpace(ch))
        return(new string(ch));

    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,在编译返回语句时,编译器说CS0214,"指针和固定大小的缓冲区只能在不安全的上下文中使用".如果我改变代码说:

private string QuotedChar(char ch) {
    if(ch < (char)128 && !char.IsWhiteSpace(ch))
        return(new string(new char[] { ch }));

    // ...
}
Run Code Online (Sandbox Code Playgroud)

......它运作得很好.然而,这似乎毫无意义.我不明白为什么它认为我试图使用指针或固定大小的缓冲区,因为它只是一个字符.我错过了一些严重愚蠢的事情,还是这是一个问题/错误?

仅供参考,这是Mono 2.0,而不是Microsoft .NET Framework.我没有运行Windows,因此我没有使用Microsoft的C#编译器来查看它是否做同样的事情,这就是为什么我想知道它是否是一个bug.

.net c# string mono char

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

获取有关在Python装饰器中调用代码的具体信息

我有一个Python装饰器,我用它来标记函数/方法已弃用.它的工作原理充分,但我想它的工作更好.具体来说,我想要它做的是要能说出确切的调用行号过时的功能.这样就不必通过源代码来查找它了; 相反,警告会将它们直接指向它.(这并不是说有人不会通过代码来寻找其他使用调用已弃用功能的地方,但他们不应该这样做以响应这样的警告,恕我直言).

class deprecated(object):
    '''This class implements the deprecated decorator.

    This decorator is used to mark a function or a class as
    deprecated.  A message indicating why it is deprecated (and what
    to use instead) must be provided.  Also, a version number
    indicating when the function or class was deprecated must _also_
    be provided.

    Optionally, a third parameter may be passed that indicates when
    the deprecated functionality will actually be removed.'''
    def …
Run Code Online (Sandbox Code Playgroud)

python decorator

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