🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
4 messages
4 total messages Started by szykcech Sat, 17 Nov 2018 15:54
Pulpity witrualne Kde Plazma i Qt: Jak się dowiedzieć na którym pulpicie pracuję?!?
#72861
Author: szykcech
Date: Sat, 17 Nov 2018 15:54
27 lines
3046 bytes
Witam
Piszę wieloplatformowy edytor tekstu w Qt5.x. Starsze wersje chodziły pod Widnows, a nowa, lepsza wersja ma chodzić również pod Linux-em. Problem jest taki, że chcę umożliwić pracę na wielu pulpitach. Stara wersja otwierała sobie gniazdko lokalne i nasłuchiwała na nim listy plików z innych (późniejszych) instancji. To było dobre pod Windows, jednak na Linuxie nie jest wystarczające, bo będąc najpierw na pulpicie 0 otwieram sobie edytor, przechodzę na pulpit 1 i chcę otworzyć nowy plik a tu zonk! Plik otwiera się w edytorze na pulpicie 0! Aby temu zaradzić muszę znać numer bieżącego pulpitu (lub jego unikalny identyfikator).  Wtedy wystarczy dodać ten identyfikator do ścieżki gniazdka i już mam unikalne gniazdko związane z danym pulpitem.

Próbowałem następujących sposobów:
1. Identyfikować pulpit po wskaźniku do QScreen (wiem, że to nie miało szansy działać, ale próbowałem):
    MainWindow w;
    reinterpret_cast<quint64>(w.windowHandle()->screen()
2. Odbierać listę wirtualnych pulpitów
    QList<QScreen*> lScreens(w.windowHandle()->screen()->virtualSiblings());
    for(QScreen* lScreen : lScreens)
        qInfo() << "Detected screen: " << reinterpret_cast<quint64>(lScreen);
Ale zwraca zawsze tylko jeden wskaźnik.
3. Podobnie jak w 1 ale z QApplication::primaryScreen()
4. QDesktopWidget::screenNumber()
Ale zawsze zwraca 0 (bez względu na jakim pulpicie program jest uruchamiany).

Wie ktoś jak uzyskać numer/id bieżącego pulpitu?!?

dzięki i pozdro
Szyk Cech
--
http://szyk.jcom.pl/
http://szyk.free.of.pl/
http://szykcech.cba.pl/
http://szyk.000webhostapp.com/
http://www.geocities.ws/szyk/
http://szyk.wex.pl/
Re: Pulpity witrualne Kde Plazma i Qt: Jak się dowiedzieć na którym pulpicie pracuję?!?
#72862
Author: szykcech
Date: Sun, 18 Nov 2018 12:48
23 lines
2225 bytes
> Wie ktoś jak uzyskać numer/id bieżącego pulpitu?!?

Już wie! Oto rozwiąznie (choć nie w Qt):

#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX)
    Display* lDisplay = XOpenDisplay(nullptr);
    int lScreen = DefaultScreen(lDisplay);
    Window lRootWindow = RootWindow(lDisplay, lScreen);
    Atom lAtom(XInternAtom(lDisplay, "_NET_CURRENT_DESKTOP", True));
    if(lAtom == None)
        qFatal("no atom\n");

    unsigned long nitems, leftover;
    unsigned char *data = nullptr;
    int actual_format;
    Atom actual_type;

    if(XGetWindowProperty(lDisplay, lRootWindow, lAtom, 0L, (long)200, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &leftover, &data) != Success)
        qFatal("XGetWindowProperty failed!");

    printf("ok\n");
    printf("desktop = %d\n", (unsigned int)*data);
#endif
Re: Pulpity witrualne Kde Plazma i Qt: Jak się dowiedzieć na którym pulpicie pracuję?!?
#72863
Author: szykcech
Date: Sun, 18 Nov 2018 15:12
51 lines
3677 bytes
Może będą to czytać małe dzieci, które chcą nauczyć się programować - więc...

Dobrą praktyką programistyczną jest wyłączanie specyficznego kodu do plików łatwo identyfikowalnych. W tym przypadku mam takie pliki:
+ Application.h : z deklaracją kasy aplikacji służącej do obsługi gniazdka lokalnego i tłumaczeń
+ Application.cpp : z definicją funkcji klas kodowanych niezależnie od systemu operacyjnego.
+ Application.Linux.cpp : z definicją funkcji specyficznych dla systemu operacyjnego Linux (są one wyłączone do osobnego, łatwo zauważalnego pliku - to jest właśnie ta "dobra praktyka")
+ Application.Windows.cpp : funkcje zakodowane z użyciem Api systemu Windows.

Każdy nowy system jaki bym wspierał musi mieć odpowiedni plik Application.XXX.cpp w mojej aplikacji (wynika to z tego, że nie mam czegoś takiego jak "domyślne zachowanie" w razie braku funkcji specyficznych).

W pliku pro dodaje się wtedy dyrektywę kompilacji warunkowej:
linux: SOURCES += Src/Application.Linux.cpp
win32: SOURCES += Src/Application.Windows.cpp
(w innych systemach budowania są podobne możliwości)

Natomiast mój plik Application.Linux.cpp wygląda tak:

#include "Application.h"
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>

quint32 Application::currentDesktopNumber()
{
    Display* lDisplay = XOpenDisplay(nullptr);
    int lScreen = DefaultScreen(lDisplay);
    Window lRootWindow = RootWindow(lDisplay, lScreen);
    Atom lAtom(XInternAtom(lDisplay, "_NET_CURRENT_DESKTOP", True));
    if(lAtom == None)
        qFatal("no atom\n");

    unsigned long nitems, leftover;
    unsigned char* lData = nullptr;
    int actual_format;
    Atom actual_type;

//    if(XGetWindowProperty(lDisplay, lRootWindow, lAtom, 0L, 8, False, AnyPropertyType, nullptr, nullptr, nullptr, nullptr, &lData) != Success)
    if(XGetWindowProperty(lDisplay, lRootWindow, lAtom, 0L, 8, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &leftover, &lData) != Success)
        qFatal("XGetWindowProperty failed!");

    quint32 lResult = lData[0];
    delete [] lData;

    return lResult;
}

void Application::raiseAnotherInstance(quint32 /*aProcesId*/)
{
}
Re: Pulpity witrualne Kde Plazma i Qt: Jak się dowiedzieć na którym pulpicie pracuję?!?
#72864
Author: szykcech
Date: Sun, 18 Nov 2018 15:18
4 lines
1740 bytes
Zapomniałem:
1. W moim 3 poście jest rozwiązanie z usuwaniem tablicy z wynikami zwracanymi (lData)
2. Powyższe rozwiązanie oryginalnie zostało podane przez d4rk74m4 2004-10-24 tu:
https://forums.gentoo.org/viewtopic-t-241716-start-0.html
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads