是否有类似于SetWindowPos的Linux?

Mar*_*ond 5 c linux windows

前段时间我在C中编写了一个脚本,它使用Windows API函数EnumWindows,SetWindowPos和SetForegroundWindow来自动排列我常用的特定布局中的窗口(按标题).

这些功能是否有Linux等价物?我将使用Kubuntu,因此特定于KDE和/或Ubuntu的解决方案都可以.

Hav*_*c P 5

执行此操作的最佳方法是在窗口管理器本身(如果您的支持扩展)或使用旨在支持"寻呼机"的协议和提示(寻呼机=任何非窗口管理器进程来执行窗口组织或导航事务).

EWMH规范包括一个供寻呼机使用的_NET_MOVERESIZE_WINDOW.http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#id2731465

原始Xlib或Xcb非常粗糙,但有一个名为libwnck的库专门用于处理您正在谈论的事情.(我很久以前就编写了原始库,但它一直由其他人维护.)即使你不使用它,也请阅读代码以了解如何处理这些内容.KDE可能与KDE风格的API相当,我不确定.

不需要使用任何KDE或GNOME或分发特定的东西,因为所需的东西都是在EWMH中拼写出来的.也就是说,对于某些窗口管理器来说,这样做作为扩展可能比编写单独的应用程序更容易.

直接使用旧学校X电话当然可以工作但是有很多细节要处理,如果你想解决所有的错误和角落情况需要大量的专业知识,在我看来,所以使用WM扩展API或寻呼机图书馆将是我的建议.


and*_*otn 2

是的,您可以使用 X Windows 协议来完成此操作。它\xe2\x80\x99是一个非常低级的协议,因此需要一些工作。您可以使用xcb_query_tree查找要操作的窗口,然后使用 移动它xcb_configure_window此页面提供了有关如何执行此操作的一些详细信息。\xe2\x80\x99 有一个关于使用这些函数所来自的库的基本教程,但你\xe2\x80\x99 可能需要 Google 来找到更好的教程。

\n\n

这可能看起来令人畏惧,但它\xe2\x80\x99s 还不错。这里\xe2\x80\x99是一个50行的C程序,它将把所有的xterm向右移动10px:

\n\n
#include <stdio.h>\n#include <string.h>\n#include <xcb/xcb.h>\n\nvoid handle(xcb_connection_t* connection, xcb_window_t window) {\n\n    xcb_query_tree_reply_t *tree = xcb_query_tree_reply(connection,\n        xcb_query_tree(connection, window), NULL);\n    xcb_window_t *children = xcb_query_tree_children(tree);\n\n    for (int i = 0;  i < xcb_query_tree_children_length(tree); i++) {\n\n        xcb_get_property_reply_t *class_reply = xcb_get_property_reply(\n            connection,\n            xcb_get_property(connection, 0, children[i], XCB_ATOM_WM_CLASS,\n                XCB_ATOM_STRING, 0, 512), NULL);\n        char* class = (char*)xcb_get_property_value(class_reply);\n        class[xcb_get_property_value_length(class_reply)] = \'\\0\';\n\n        if (!strcmp(class, "xterm")) {\n            /* Get geometry relative to parent window */\n            xcb_get_geometry_reply_t* geom = xcb_get_geometry_reply(\n                connection,\n                xcb_get_geometry(connection, window),\n                NULL);\n\n            /* Move 10 pixels right */\n            uint32_t values[] = {geom->x + 10};\n            xcb_configure_window(connection, children[i],\n                XCB_CONFIG_WINDOW_X, values);\n        }\n\n        /* Recurse down window tree */\n        handle(connection, children[i]);\n    }\n}\n\nint main() {\n    xcb_connection_t *connection;\n    const xcb_setup_t *setup;\n\n    connection = xcb_connect(NULL, NULL);\n    setup = xcb_get_setup(connection);\n    xcb_screen_iterator_t screen = xcb_setup_roots_iterator(setup);\n    handle(connection, screen.data->root);\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x99s 没有错误检查或内存管理,而且它能做的事情非常有限。但是,更新为执行您想要的操作的程序应该很简单,或者通过添加命令行选项来指定要操作的窗口以及对它们执行哪些操作,将其转换为通用帮助程序。

\n

  • @rubenvb如果你有更好的答案,请务必发布它,我会赞成你的答案并删除这个答案。但我认为如果你确实有更好的答案,你就不会诉诸侮辱。 (5认同)
  • +1 提供了一个现代 XCB 示例,遗留代码继续使用 Xlib 是一回事……但新代码确实应该使用现代方法。或者更好的是,完全没有 X,但这没有意义,因为 OP 是专门关于 X 的。 (2认同)