Sì, è possibile farlo utilizzando il protocollo X Windows. È un protocollo di livello molto basso, quindi ci vorrà del lavoro. È possibile utilizzare xcb_query_tree
per trovare la finestra su cui operare e quindi spostarlo con xcb_configure_window
. This page fornisce alcuni dettagli su come farlo. C'è un basic tutorial sull'utilizzo della libreria da cui provengono queste funzioni, ma probabilmente vorrai Google per una migliore.
Può sembrare scoraggiante, ma non è male. Ecco un programma di 50-linea C che si sposta tutti i tuoi xterm 10px a destra:
#include <stdio.h>
#include <string.h>
#include <xcb/xcb.h>
void handle(xcb_connection_t* connection, xcb_window_t window) {
xcb_query_tree_reply_t *tree = xcb_query_tree_reply(connection,
xcb_query_tree(connection, window), NULL);
xcb_window_t *children = xcb_query_tree_children(tree);
for (int i = 0; i < xcb_query_tree_children_length(tree); i++) {
xcb_get_property_reply_t *class_reply = xcb_get_property_reply(
connection,
xcb_get_property(connection, 0, children[i], XCB_ATOM_WM_CLASS,
XCB_ATOM_STRING, 0, 512), NULL);
char* class = (char*)xcb_get_property_value(class_reply);
class[xcb_get_property_value_length(class_reply)] = '\0';
if (!strcmp(class, "xterm")) {
/* Get geometry relative to parent window */
xcb_get_geometry_reply_t* geom = xcb_get_geometry_reply(
connection,
xcb_get_geometry(connection, window),
NULL);
/* Move 10 pixels right */
uint32_t values[] = {geom->x + 10};
xcb_configure_window(connection, children[i],
XCB_CONFIG_WINDOW_X, values);
}
/* Recurse down window tree */
handle(connection, children[i]);
}
}
int main() {
xcb_connection_t *connection;
const xcb_setup_t *setup;
connection = xcb_connect(NULL, NULL);
setup = xcb_get_setup(connection);
xcb_screen_iterator_t screen = xcb_setup_roots_iterator(setup);
handle(connection, screen.data->root);
return 0;
}
Non c'è nessun controllo degli errori o di gestione della memoria, e che cosa può fare è piuttosto limitata. Ma dovrebbe essere semplice aggiornare in un programma che fa ciò che si vuole, o trasformarlo in un programma di aiuto generico aggiungendo opzioni della riga di comando per specificare su quale finestra operare e su quali operazioni eseguire.
Si potrebbe voler usare un wiling di piastrellatura insieme a KDE: http://awesome.naquadah.org/wiki/KDE_and_awesome o http://blog.frozen-zone.org/2010/01/kde4-with-xmonad/ –