Come cambiere lo sfondo su un desktop Linux (utilizzando GNOME) in un programma C/C++? C'è un'API di sistema per farlo?Modifica dello sfondo su Linux a livello di programmazione
risposta
Anche se la domanda era specifica-gnome, c'è anche un modo per trattare con la carta da parati che non è depepndant sui toolkit di livello superiore. Si dovrebbe essere in grado di affrontare con la finestra principale (che la carta da parati è, appunto) studiando l'origine del xsetroot.c, la parte più interessante di cui ho CopyPaste qui:
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;
}
Grazie. Funziona perfettamente. – computergeek6
Se non altro, si potrebbe forse usare system()
per invocare una delle righe di comando suggerite qui:
http://www.linuxquestions.org/questions/linux-general-1/change-background-via-command-line-350936/
Si potrebbe utilizzare gconf libreria per farlo. Il seguente esempio è un programma completo di cambiare lo sfondo:
// bkgmanage.c
#include <glib.h>
#include <gconf/gconf-client.h>
#include <stdio.h>
typedef enum {
WALLPAPER_ALIGN_TILED = 0,
WALLPAPER_ALIGN_CENTERED = 1,
WALLPAPER_ALIGN_STRETCHED = 2,
WALLPAPER_ALIGN_SCALED = 3,
WALLPAPER_NONE = 4
} WallpaperAlign;
gboolean set_as_wallpaper(const gchar *image_path, WallpaperAlign align)
{
GConfClient *client;
char *options = "none";
client = gconf_client_get_default();
// TODO: check that image_path is a file
if (image_path == NULL) options = "none";
else {
gconf_client_set_string(client,
"/desktop/gnome/background/picture_filename",
image_path,
NULL);
switch (align) {
case WALLPAPER_ALIGN_TILED: options = "wallpaper"; break;
case WALLPAPER_ALIGN_CENTERED: options = "centered"; break;
case WALLPAPER_ALIGN_STRETCHED: options = "stretched"; break;
case WALLPAPER_ALIGN_SCALED: options = "scaled"; break;
case WALLPAPER_NONE: options = "none"; break;
}
}
gboolean result = gconf_client_set_string(client,
"/desktop/gnome/background/picture_options",
options,
NULL);
g_object_unref(G_OBJECT(client));
return result;
}
int main(int argc, const char* argv[])
{
if (argc > 1) {
printf("Setting %s as wallpaper... ", argv[1]);
if (set_as_wallpaper(argv[1], WALLPAPER_ALIGN_STRETCHED)) printf("Ok\n");
else printf("Failed\n");
} else printf("Usage: ./bkgmanage <filename>\n");
return 0;
}
La fonte di cui sopra si basa su gthumb progetto. Potrebbe essere compilato con la seguente stringa:
gcc -Wall -g `pkg-config --libs --cflags glib-2.0 gconf-2.0` bkgmanage.c -o bkgmanage
- 1. Modifica layout widget a livello di programmazione
- 2. Modifica lingua app a livello di programmazione
- 3. Modifica Info.plista possibile a livello di programmazione?
- 4. Modifica log4net livello di registrazione a livello di programmazione
- 5. Come invertire a livello di programmazione i colori dello schermo in Linux
- 6. Modifica della luminosità dello schermo a livello di programmazione (come con il widget di alimentazione)
- 7. Acquisizione del colore di sfondo UIKeyboard a livello di programmazione
- 8. Modifica delle dimensioni di UIView a livello di programmazione
- 9. Modifica della dimensione di UITableView a livello di programmazione
- 10. Modifica delle impostazioni di SQL Server a livello di programmazione
- 11. Impostazione sfondo Modalità azione a livello di programmazione
- 12. Modifica del layout relativo a livello di programmazione
- 13. Blocco/sblocco dello schermo Android a livello di programmazione
- 14. Come cambiare il timeout dello schermo a livello di programmazione?
- 15. Modifica utente Servizio di Windows a livello di programmazione
- 16. Modifica la data di sistema a livello di programmazione
- 17. Come controllo a livello di programmazione le autorizzazioni di modifica?
- 18. Modifica del valore di R.String a livello di programmazione
- 19. UISegmentedControl modifica del numero di segmenti a livello di programmazione
- 20. Come si modifica un file .png a livello di programmazione?
- 21. Modifica endpoint ReaderQuotas al livello di programmazione
- 22. Programmazione webcam su Linux
- 23. Ingrandisci a livello di codice finestra su metà dello schermo
- 24. Programmazione flash su Linux
- 25. Programmazione VHDL su Linux?
- 26. , verificare a livello di programmazione
- 27. Come cambiare il colore di sfondo della finestra di dialogo a livello di programmazione?
- 28. Modifica sfondo UITextField quando inizia la modifica
- 29. Come posso animare la modifica dello sfondo di UINavigationBar su UIViewController push?
- 30. creazione di uiview a livello di programmazione?
Se a capire come, si prega di fare ho voluto poterlo fare per un po 'di tempo. – fauxCoder