2011-08-23 12 views
6

Zastanawiam się, jak rysować bezpośrednio na głównym oknie w środowisku X11 z Kairu (w C), aby tworzyć widżety. Skopiowałem niektóre części kodu tint2, ale jest to dość olbrzymie i jedyny rezultat, jaki mam, nie jest satysfakcjonujący. Byłbym zadowolony z posiadania pełnego działającego kodu przykładowego lub przynajmniej kilku wskazówek lub małych programów do nauki. Dziękuję wam!Jak narysować bezpośrednio na pulpicie?

+0

ja nie wiem, czy rysunek bezpośrednio na pulpicie jest najlepszym sposobem, aby to zrobić. Wiesz, że możesz mieć okna bez ramek/pasków tytułowych w X11 i ustawić je tak, aby nigdy nie zminimalizować .. i być na dole stosu. Myślę, że to właśnie robi większość widżetów. –

+0

Oto podobny wątek z linkiem, że moja pomoc: http://stackoverflow.com/questions/1934442/drawing-on-the-x-root-window – CommonSense

+0

ale jeśli to, co chcesz i patrzeć na xosd xsnow .. chociaż nie używają cairo, tylko xlib. –

Odpowiedz

6

"Dolne" okno jest oknem głównym. Problem polega na tym, że w niektórych środowiskach biurowych mamy okna nad oknem głównym, więc jeśli zmienisz okno główne, nie zobaczysz zmian: musisz zmienić okno, które znajduje się na górze.

Ten program wykonuje to, o co prosisz: narysuj okno główne . By to sprawdzić, proponuję Ci:

  • Ctrl + Alt + F1
  • logowanie jako root
  • zatrzymać środowisko graficzne ("stop /etc/init.d/gdm", „/ etc/init.d/stop kdm”czy cokolwiek jest potrzebne w swojej dystrybucji)
  • X -noreset -retro &
  • DISPLAY =: 0.0 xterm &
  • DISPLAY =: 0.0 metacity &

Następnie wróć do X (ctrl + alt + f7 lub może f8) i uruchom program.

Jeśli chcesz narysować na górnym pasku Nautilusa, musisz znaleźć jego identyfikator okna, a następnie użyć go jako zmiennej "w". Komenda „xwininfo” może pomóc w testowaniu ...

#include <assert.h> 
#include <stdio.h> 
#include <X11/Xlib.h> 
#include <cairo.h> 
#include <cairo-xlib.h> 

int width, height; 

void draw(cairo_t *cr) { 
    int quarter_w = width/4; 
    int quarter_h = height/4; 
    cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); 
    cairo_rectangle(cr, quarter_w, quarter_h, quarter_w * 2, quarter_h * 2); 
    cairo_fill(cr); 
} 

int main() { 
    Display *d = XOpenDisplay(NULL); 
    assert(d); 

    int s = DefaultScreen(d); 
    Window w = RootWindow(d, s); 
    width = DisplayWidth(d, s); 
    height = DisplayHeight(d, s); 

    cairo_surface_t *surf = cairo_xlib_surface_create(d, w, 
            DefaultVisual(d, s), 
            width, height); 
    cairo_t *cr = cairo_create(surf); 

    XSelectInput(d, w, ExposureMask); 

    draw(cr); 

    XEvent ev; 
    while (1) { 
    XNextEvent(d, &ev); 
     printf("Event!\n"); 
     if (ev.type == Expose) { 
      draw(cr); 
     } 
    } 

    cairo_destroy(cr); 
    cairo_surface_destroy(surf); 
    XCloseDisplay(d); 
    return 0; 
} 
+0

To zadziałało dla mnie. Mogłem narysować na innym oknie (Sublime Text) za pomocą xwininfo, aby uzyskać identyfikator okna, a następnie zmienić wiersz RootWindow() na: 'Window w = (Window) 0x2400041;', używając własnej wartości dla ID oczywiście . Zauważyłem tylko, że nie działa dla każdego okna. Używanie identyfikatora na pulpicie i w przeglądarce Chrome nie działa. Czy masz jakiś pomysł, dlaczego? – gsingh2011

+0

Właściwie, co ciekawe, widzę czerwony kwadrat w przeglądarce Chrome, gdy zmieniam karty, a chwilę potem znika ... – gsingh2011

+0

Domyślam się, że aplikacja właśnie rysuje na górze twojego prostokąta. Naprawdę nie możesz zacząć rysować na oknie innej aplikacji, ponieważ nie wiesz, kiedy będą rysować ponownie na rzeczy, które zrobiłeś. Jeśli chcesz robić fantazyjne rzeczy na tle pulpitu, sugeruję, abyś spojrzał na kod źródłowy jakiejkolwiek aplikacji odpowiedzialnej za rysowanie tam, a następnie go zmienił. Lub po prostu go zabij :) – pzanoni