2017-07-26 93 views
1

我很困擾我做錯了什麼,我試圖複製示例代碼,我試過改變顏色。這裏是我的代碼:Xlib不會畫任何

//Headers 
#include <stdio.h> 
#include <stdlib.h> 
#include <X11/Xlib.h> 
#include <X11/Xatom.h> 

int main(int argc, char *argv[]) 
{ 
    //Vars to create a window 
    Display *dis; 
    int screen; 
    Window win; 
    XEvent event; 

    //Graphics content 
    XGCValues values; 
    unsigned long valuemask = 0; 
    GC gc; 

    //To store mouse location 
    int mouseX[2], mouseY[2]; 

    //Stores screen dimensions 
    XWindowAttributes xwa; 
    int screenHeight, screenWidth; 

    //Colors 
    Colormap colormap; 
    XColor backgroundColor, white; 

    //Checks for open display 
    dis = XOpenDisplay(NULL); 

    //Displays error 
    if(dis == NULL) 
    { 
     fprintf(stderr, "Cannot open display\n"); 
     exit(1); 
    } 

    //Sets screen 
    screen = DefaultScreen(dis); 

    colormap = DefaultColormap(dis, screen);  

    //Background color 
    XParseColor(dis, colormap, "#75677e", &backgroundColor); 
    XAllocColor(dis, colormap, &backgroundColor); 

    //White 
    XParseColor(dis, colormap, "#ffffff", &white); 
    XAllocColor(dis, colormap, &white); 

    //Creates window 
    win = XCreateSimpleWindow(dis, RootWindow(dis, screen), 100, 100, 500, 300, 1, BlackPixel(dis, screen), backgroundColor.pixel); 

    //Changes window to be full screen 
    //Atom atoms[2] = { XInternAtom(dis, "_NET_WM_STATE_FULLSCREEN", False), None }; 
    //XChangeProperty(dis, win, XInternAtom(dis, "_NET_WM_STATE", False), XA_ATOM, 32, PropModeReplace, (unsigned char *)atoms, 1); 

    //Allocates graphics content 
    gc = XCreateGC(dis, win, valuemask, &values); 
    XSetLineAttributes(dis, gc, 2, LineSolid, CapButt, JoinBevel); 
    XSetFillStyle(dis, gc, FillSolid); 
    XSync(dis, False); 

    //Stores screen dimensions 

    //TODO: test 
    XGetWindowAttributes(dis, win, &xwa); 

    screenWidth = xwa.width; 
    screenHeight = xwa.height; 

    //Inner circle 
    //XFillArc(dis, win) 

    XSetForeground(dis, gc, BlackPixel(dis, screen)); 
    XFillRectangle(dis, win, gc, 0, 100, 50, 50); 

    //Listens for input 
    XSelectInput(dis, win, ExposureMask | KeyPressMask); 

    //Maps window 
    XMapWindow(dis, win); 

    while(1) 
    { 
     XNextEvent(dis, &event); 
    } 

    XCloseDisplay(dis); 
    return 0; 
} 

當我運行它時,控制檯中沒有錯誤,沒有任何關於BadDrawable或任何東西。它打開窗口很好,但沒有矩形出現在屏幕上。我也試着畫一條線,一個點和一條弧線。

+0

繪製未映射的窗口上是沒用的,一旦它的映射,你從來不畫任何東西。 –

回答

1

這不是一個權威的答案,因爲我對這個主題的知識是粗略的,但你的事件循環看起來很空。當收到一個Expose事件時,需要重新繪製窗口。

例如:

while(1) 
{ 
    XNextEvent(dis, &event); 

    switch(event.type) { 
    case Expose: 
     if (event.xexpose.count) break; 

     XFillRectangle(dis, win, gc, 0, 100, 50, 50); 
     break; 

    default: 
     break; 
    } 
} 
+0

這確實是答案,謝謝! – Ubspy