wnck problem
-
hej leutz,
kennt sich einer von euch mit der libwnck von gnome aus?
follgendes problem:
ich versuche die position bestimmter fenster zu verändern. ich starte das programm und lesse seine xwindow_id aus. irgendwann später versuche ich das fenster zu positionieren was "theoretisch" schief läuft.manager.h:
static WnckWindow *lastwindow; static WnckScreen *screen; static void window_opened(WnckScreen *_screen, WnckWindow *_window) { std::cout << "opened window with id " << _window << std::endl; lastwindow = _window; return; } static void window_changed(WnckScreen *_screen, WnckWindow *_window) { std::cout << "changed window to id " << _window << std::endl; // test_sig(_screen, _window); // testzwecke siehe untere beschreibung return; } static void test_sig(WnckScreen *_screen, WnckWindow *_window) { static pos=100; std::cout << "try to move window with id " << lastwindow << std::endl; wnck_window_set_geometry(lastwindow, WNCK_WINDOW_GRAVITY_CURRENT, WNCK_WINDOW_CHANGE_X, pos, 100, 100, 100); pos += 20; } return; } // zu testzwecken screen-instanz eigene signale nutzen static void active-workspace-changed(WnckScreen *_screen, WnckWindow *_window) { static pos=100; std::cout << "try to move window with id " << lastwindow << std::endl; wnck_window_set_geometry(lastwindow, WNCK_WINDOW_GRAVITY_CURRENT, WNCK_WINDOW_CHANGE_X, pos, 100, 100, 100); pos += 20; } return; } static void window_closed(WnckScreen *_screen, WnckWindow *_window) { std::cout << "closed window with id " << _window << std::endl; return; } static void init() { gdk_init(0, 0); g_type_init(); screen = wnck_screen_get_default(); // wnck_screen_force_update(wnckStructur.screen); g_signal_new("test_sig", G_TYPE_FROM_INSTANCE(screen), G_SIGNAL_RUN_LAST, 0, 0, 0, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_signal_connect(screen, "window_opened", (GCallback)&window_opened, NULL); g_signal_connect(screen, "window_closed", (GCallback)&window_closed, NULL); g_signal_connect(screen, "test_sig", (GCallback)&test_sig, NULL); g_signal_connect(screen, "active-workspace-changed", (GCallback)&test_sig, NULL); } static void run_t() { GMainLoop *loop = NULL; loop = g_main_loop_new(NULL, TRUE); g_main_loop_run(loop); } static void call_it() { g_signal_emit_by_name(screen, "test_sig", 0, 0); // g_signal_emit_by_name(screen, "active-workspace-changed", 0, 0); // als test(siehe eschreibung unten) }
main.cpp
#include "manager.h" #include <libwnck.h> #include <boost/thread.hpp> void doit() { open_program("feh ~/Bilder/icons/avatar.jpg"); sleep(3); call_it(); } int main() { init(); g_thread_create((GThreadFunc)run, 0, true, 0); doit(); sleep(3); }
der fehler passiert in der call_it funktion. sobald das fenster verändert werden soll, sagt er mir:
<unknown>: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.
ich versuche ein signal in die WnckScreen (screen) instanz zu setzen was auch funktioniert, weil er mit dem emit das signal ausführt, aber nicht mehr die wnck_window_set_geometry funktion. auch nicht wenn ich ein signal der screeninstanz (active-workspace-changed) sende.
kommischerweise funktioniert die funktion wnck_window_set_geometry in den signalen wenn diese von der gmainloop aufgerufen werden, bsp: wenn ich die funktion in window_changed einsetze und das fenster verschiebe...kann mir da villeicht einer helfen? bin echt ahnungslos wie weshalb warum...
danke euch schon mal
-
wirfst du da evtl. die threads durcheinander? du rufst g_main_loop in einem thread auf!? geht das?
-
ich ahbe auch versucht call_it in einem thread zu starten. geht leider auch nicht. daran denke ich mal kanns nicht liegen. ich kann auf das fenster insgesammt nicht zugreifen, egal von wo aus.