2015-09-20 5 views
1

Linux имеет множество настольных сред (GNOME, KDE, Xfce, Cinnamon ...) и оконных систем (X11, Wayland, Mir ...) и кажется, что у каждого есть свой собственный способ изменить обои. Существуют ли библиотеки высокого уровня, особенно в C++ (и Qt 5), что позволяет разработчику изменять программно обои в Linux, независимо от управления окнами или управления рабочим столом? Я ищу что-то вроде этого:Изменение программных обоев в Linux независимо от среды рабочего стола или оконного менеджера

#include <the_lib> 
#include <cstdlib> 

int main(int argc, char ** argv) { 
    std::string theNewWallpaper = "path/to/my/wallpaper.jpg"; 
    // Or a file, an image, or something else representing the wallpaper. 

    TheLib::changeWallpaper(theNewWallpaper); 
    // or a more complicated piece of code which does the same. 

    return EXIT_SUCCESS; 
} 
+0

Просто предложение: Почему вы не ищете место, где сохраняются обои для рабочего стола, а затем его заменяете? – Max

+0

Это возможность. Но как вы можете его найти, ** независимо от вашего управления окнами или среды рабочего стола **? Это основная трудность этого вопроса. –

+0

Mh ... Вот почему я не написал это как ответ, я не знаю, где этот путь. – Max

ответ

1

Try решения «Эндрю Y» в посте: Changing wallpaper on Linux programmatically

Он утверждает, что его решение не зависит от высшего инструментарии слоя, поэтому он должен работать для любых рабочих окружений Linux.

static void 
SetBackgroundToBitmap(Pixmap bitmap, unsigned int width, unsigned int height) 
{ 
    Pixmap pix; 
    GC gc; 
    XGCValues gc_init; 

    gc_init.foreground = NameToPixel(fore_color, BlackPixel(dpy, screen)); 
    gc_init.background = NameToPixel(back_color, WhitePixel(dpy, screen)); 
    if (reverse) { 
     unsigned long temp=gc_init.foreground; 
     gc_init.foreground=gc_init.background; 
     gc_init.background=temp; 
    } 
    gc = XCreateGC(dpy, root, GCForeground|GCBackground, &gc_init); 
    pix = XCreatePixmap(dpy, root, width, height, 
         (unsigned int)DefaultDepth(dpy, screen)); 
    XCopyPlane(dpy, bitmap, pix, gc, 0, 0, width, height, 0, 0, (unsigned long)1); 
    XSetWindowBackgroundPixmap(dpy, root, pix); 
    XFreeGC(dpy, gc); 
    XFreePixmap(dpy, bitmap); 
    if (save_colors) 
     save_pixmap = pix; 
    else 
     XFreePixmap(dpy, pix); 
    XClearWindow(dpy, root); 
    unsave_past = 1; 
} 
+0

Я видел вопрос SO, но он не отвечает мне. Код зависит от X11. Так как насчет этой части кода с Мир или Уэйланд? –

+0

Универсального API нет. Мир и Wayland все еще являются нишевыми продуктами. Если вы заботитесь о них, вам придется искать решения для них отдельно. –