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.


Anmelden zum Antworten