bool Timing::update() { game_time.update(); canvas.clear(clan::Colorf(0.0f,0.0f,0.0f)); draw_graphics(canvas, game_time.get_time_elapsed()); window.flip(); return !quit; }
void edit_interface_rep::draw_post (renderer ren, rectangle r) { renderer win= get_renderer (this); win->set_shrinking_factor (sfactor); ren->set_shrinking_factor (sfactor); draw_context (ren, r); draw_env (ren); draw_selection (ren); draw_graphics (ren); draw_cursor (ren); // the text cursor must be drawn over the graphical object ren->set_shrinking_factor (1); win->set_shrinking_factor (1); }
int main(int argc, char *argv[], char *env[]) { char *display_name = NULL; char *device_name = NULL; char *output_name = NULL; XSetWindowAttributes xswa; int i = 0; double a, a1, a2, b, b1, b2, xerr, yerr; int xi_opcode, event, error; XExtensionVersion *version; XDeviceInfo *info; XDevice *device; long calib_data[4]; unsigned long mask; unsigned char swap; int keep_cursor = 0, ch; /* Crosshair placement */ int cpx[] = { 0, 0, 1, 1, 1 }; int cpy[] = { 0, 1, 0, 0, 1 }; while ((ch = getopt(argc, argv, "cD:d:o:v")) != -1) { switch (ch) { case 'c': keep_cursor++; break; case 'D': display_name = optarg; break; case 'd': device_name = optarg; break; case 'o': output_name = optarg; break; case 'v': verbose = True; break; default: usage(); /* NOTREACHED */ } } argc -= optind; argv += optind; if (argc != 0) usage(); /* connect to X server */ if ((display = XOpenDisplay(display_name)) == NULL) { fprintf(stderr, "%s: cannot connect to X server %s\n", __progname, XDisplayName(display_name)); exit(1); } screen = DefaultScreen(display); root = RootWindow(display, screen); /* get screen size from display structure macro */ xpos = 0; ypos = 0; width = DisplayWidth(display, screen); height = DisplayHeight(display, screen); if (XRRQueryExtension(display, &event, &error)) { int major, minor; if (XRRQueryVersion(display, &major, &minor) != True) { fprintf(stderr, "Error querying XRandR version"); } else { printf("XRandR extension version %d.%d present\n", major, minor); has_xrandr = True; if (major > 1 || (major == 1 && minor >=2)) has_xrandr_1_2 = True; if (major > 1 || (major == 1 && minor >=3)) has_xrandr_1_3 = True; } } if (output_name != NULL) { if (has_xrandr_1_2) { get_xrandr_config(display, root, output_name, &xpos, &ypos, &width, &height); } else { fprintf(stderr, "%s: can not specify an output " "whithout XRandr 1.2 or later", __progname); exit(2); } } if (!XQueryExtension(display, INAME, &xi_opcode, &event, &error)) { fprintf(stderr, "%s: X Input extension not available.\n", __progname); exit(1); } version = XGetExtensionVersion(display, INAME); if (version == NULL || version == (XExtensionVersion *)NoSuchExtension) { fprintf(stderr, "Cannot query X Input version.\n"); exit(1); } XFree(version); prop_calibration = XInternAtom(display, WS_PROP_CALIBRATION, True); if (prop_calibration == None) { fprintf(stderr, "Unable to find the \"%s\" device property.\n" "There are probably no calibrable devices " "on this system.\n", WS_PROP_CALIBRATION); exit(1); } prop_swap = XInternAtom(display, WS_PROP_SWAP_AXES, True); if (prop_swap == None) { fprintf(stderr, "Unable to find the \"%s\" device property\n", WS_PROP_SWAP_AXES); exit(1); } info = find_device_info(device_name); if (info == NULL) { fprintf(stderr, "Unable to find the %s device\n", device_name ? device_name : "default"); exit(1); } /* setup window attributes */ xswa.override_redirect = True; xswa.background_pixel = BlackPixel(display, screen); xswa.event_mask = ExposureMask | KeyPressMask; mask = CWOverrideRedirect | CWBackPixel | CWEventMask; if (!keep_cursor) { xswa.cursor = create_empty_cursor(); mask |= CWCursor; } win = XCreateWindow(display, RootWindow(display, screen), xpos, ypos, width, height, 0, CopyFromParent, InputOutput, CopyFromParent, mask, &xswa); render_init(); XMapWindow(display, win); XGrabKeyboard(display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabServer(display); XClearWindow(display, win); if (verbose) printf("Calibrating %s\n", info->name); device = XOpenDevice(display, info->id); if (!device) { fprintf(stderr, "Unable to open the X input device \"%s\"\n", info->name); return 0; } if (!register_events(info, device, 0)) exit(1); uncalibrate(device); calib: XftDrawRect(draw, &bg, 0, 0, width, height); for (i = 0; i < 5; i++) { draw_graphics(cpx[i], cpy[i], i); XFlush(display); if (!get_events(i)) break; XftDrawRect(draw, &bg, 0, 0, width, height); } if (interrupted) cleanup_exit(device); /* Check if X and Y should be swapped */ if (fabs(x[0] - x[1]) > fabs(y[0] - y[1])) { calib.swapxy = 1; for (i = 0; i < 5; i++) { int t = x[i]; x[i] = y[i]; y[i] = t; } } /* get touch pad resolution to screen resolution ratio */ a1 = (double) (x[4] - x[0]) / (double) (cx[4] - cx[0]); a2 = (double) (x[3] - x[1]) / (double) (cx[3] - cx[1]); /* get the minimum pad position on the X-axis */ b1 = x[0] - a1 * cx[0]; b2 = x[1] - a2 * cx[1]; /* use the average ratio and average minimum position */ a = (a1 + a2) / 2.0; b = (b1 + b2) / 2.0; xerr = a * width / 2 + b - x[2]; if (fabs(xerr) > fabs(a * width * .01)) { fprintf(stderr, "Calibration problem: X axis error (%.2f) too high, try again\n", fabs(xerr)); goto err; } calib.minx = (int) (b + 0.5); calib.maxx = (int) (a * width + b + 0.5); /* get touch pad resolution to screen resolution ratio */ a1 = (double) (y[4] - y[0]) / (double) (cy[4] - cy[0]); a2 = (double) (y[3] - y[1]) / (double) (cy[3] - cy[1]); /* get the minimum pad position on the Y-axis */ b1 = y[0] - a1 * cy[0]; b2 = y[1] - a2 * cy[1]; /* use the average ratio and average minimum position */ a = (a1 + a2) / 2.0; b = (b1 + b2) / 2.0; yerr = a * height / 2 + b - y[2]; if (fabs(yerr) > fabs(a * height * 0.01)) { fprintf(stderr, "Calibration problem: Y axis error (%.2f) too high, try again\n", fabs(yerr)); goto err; } calib.miny = (int) (b + 0.5); calib.maxy = (int) (a * height + b + 0.5); XFlush(display); calib.resx = width; calib.resy = height; /* Send new values to the X server */ calib_data[0] = calib.minx; calib_data[1] = calib.maxx; calib_data[2] = calib.miny; calib_data[3] = calib.maxy; XChangeDeviceProperty(display, device, prop_calibration, XA_INTEGER, 32, PropModeReplace, (unsigned char *)calib_data, 4); swap = calib.swapxy; XChangeDeviceProperty(display, device, prop_swap, XA_INTEGER, 8, PropModeReplace, (unsigned char *)&swap, 1); XCloseDevice(display, device); XCloseDisplay(display); /* And print them for storage in wsconsctl.conf */ printf("mouse.scale=%d,%d,%d,%d,%d,%d,%d\n", calib.minx, calib.maxx, calib.miny, calib.maxy, calib.swapxy, calib.resx, calib.resy); return 0; err: draw_text(error_message, &errorColor); XFlush(display); sleep(2); goto calib; }
static void test_simple_graphics(void) { char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)]; BITMAPINFO *bmi = (BITMAPINFO *)bmibuf; DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER)); HDC mem_dc; BYTE *bits; HBITMAP dib, orig_bm; const char **sha1; DIBSECTION ds; mem_dc = CreateCompatibleDC(NULL); /* a8r8g8b8 */ trace("8888\n"); memset(bmi, 0, sizeof(bmibuf)); bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader); bmi->bmiHeader.biHeight = 512; bmi->bmiHeader.biWidth = 512; bmi->bmiHeader.biBitCount = 32; bmi->bmiHeader.biPlanes = 1; bmi->bmiHeader.biCompression = BI_RGB; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]); ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]); ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]); ok(ds.dsBmih.biCompression == BI_RGB || broken(ds.dsBmih.biCompression == BI_BITFIELDS), /* nt4 sp1 and 2 */ "got %x\n", ds.dsBmih.biCompression); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_a8r8g8b8; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* a8r8g8b8 - bitfields. Should be the same as the regular 32 bit case.*/ trace("8888 - bitfields\n"); bmi->bmiHeader.biBitCount = 32; bmi->bmiHeader.biCompression = BI_BITFIELDS; bit_fields[0] = 0xff0000; bit_fields[1] = 0x00ff00; bit_fields[2] = 0x0000ff; dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]); ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]); ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]); ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_a8r8g8b8; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* a8b8g8r8 - bitfields. */ trace("a8b8g8r8 - bitfields\n"); bmi->bmiHeader.biBitCount = 32; bmi->bmiHeader.biCompression = BI_BITFIELDS; bit_fields[0] = 0x0000ff; bit_fields[1] = 0x00ff00; bit_fields[2] = 0xff0000; dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); ok(ds.dsBitfields[0] == 0x0000ff, "got %08x\n", ds.dsBitfields[0]); ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]); ok(ds.dsBitfields[2] == 0xff0000, "got %08x\n", ds.dsBitfields[2]); ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_a8b8g8r8; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* 24 */ trace("24\n"); bmi->bmiHeader.biBitCount = 24; bmi->bmiHeader.biCompression = BI_RGB; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_24; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* r5g5b5 */ trace("555\n"); bmi->bmiHeader.biBitCount = 16; bmi->bmiHeader.biCompression = BI_RGB; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]); ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]); ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]); ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_r5g5b5; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* r4g4b4 */ trace("444\n"); bmi->bmiHeader.biBitCount = 16; bmi->bmiHeader.biCompression = BI_BITFIELDS; bit_fields[0] = 0x0f00; bit_fields[1] = 0x00f0; bit_fields[2] = 0x000f; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n"); ok(ds.dsBitfields[0] == 0x0f00, "got %08x\n", ds.dsBitfields[0]); ok(ds.dsBitfields[1] == 0x00f0, "got %08x\n", ds.dsBitfields[1]); ok(ds.dsBitfields[2] == 0x000f, "got %08x\n", ds.dsBitfields[2]); ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_r4g4b4; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* 8 */ trace("8\n"); bmi->bmiHeader.biBitCount = 8; bmi->bmiHeader.biCompression = BI_RGB; bmi->bmiHeader.biClrUsed = 5; bmi->bmiColors[0].rgbRed = 0xff; bmi->bmiColors[0].rgbGreen = 0xff; bmi->bmiColors[0].rgbBlue = 0xff; bmi->bmiColors[1].rgbRed = 0; bmi->bmiColors[1].rgbGreen = 0; bmi->bmiColors[1].rgbBlue = 0; bmi->bmiColors[2].rgbRed = 0xff; bmi->bmiColors[2].rgbGreen = 0; bmi->bmiColors[2].rgbBlue = 0; bmi->bmiColors[3].rgbRed = 0; bmi->bmiColors[3].rgbGreen = 0xff; bmi->bmiColors[3].rgbBlue = 0; bmi->bmiColors[4].rgbRed = 0; bmi->bmiColors[4].rgbGreen = 0; bmi->bmiColors[4].rgbBlue = 0xff; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_8; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* 4 */ trace("4\n"); bmi->bmiHeader.biBitCount = 4; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_4; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); /* 1 */ trace("1\n"); bmi->bmiHeader.biBitCount = 1; bmi->bmiHeader.biClrUsed = 2; bmi->bmiColors[0].rgbRed = 0x00; bmi->bmiColors[0].rgbGreen = 0x01; bmi->bmiColors[0].rgbBlue = 0xff; bmi->bmiColors[1].rgbRed = 0xff; bmi->bmiColors[1].rgbGreen = 0x00; bmi->bmiColors[1].rgbBlue = 0x00; dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(dib != NULL, "ret NULL\n"); orig_bm = SelectObject(mem_dc, dib); sha1 = sha1_graphics_1; draw_graphics(mem_dc, bmi, bits, &sha1); SelectObject(mem_dc, orig_bm); DeleteObject(dib); DeleteDC(mem_dc); }
/* runs on each sentence */ static void update_panel(struct gps_data_t *gpsdata, char *message, size_t len UNUSED, int level UNUSED) { unsigned int i; int newstate; XmString string[MAXCHANNELS + 1]; char s[128], *latlon, *sp; /* the raw data sisplay */ if (message[0] != '\0') while (isspace(*(sp = message + strlen(message) - 1))) *sp = '\0'; XmTextFieldSetString(status, message); /* This is for the satellite status display */ if (gpsdata->satellites) { string[0] = XmStringCreateSimple( "PRN: Elev: Azim: SNR: Used:"); for (i = 0; i < MAXCHANNELS; i++) { if (i < (unsigned int)gpsdata->satellites) { (void)snprintf(s, sizeof(s), " %3d %2d %3d %2d %c", gpsdata->PRN[i], gpsdata->elevation[i], gpsdata->azimuth[i], gpsdata->ss[i], gpsdata->used[i] ? 'Y' : 'N'); } else (void)strlcpy(s, " ", sizeof(s)); string[i + 1] = XmStringCreateSimple(s); } XmListReplaceItemsPos(satellite_list, string, (int)sizeof(string), 1); #ifndef S_SPLINT_S for (i = 0; i < (sizeof(string)/sizeof(string[0])); i++) XmStringFree(string[i]); #endif /* S_SPLINT_S */ } /* here are the value fields */ if (isnan(gpsdata->fix.time)==0) { (void)unix_to_iso8601(gpsdata->fix.time, s, sizeof(s)); XmTextFieldSetString(text_1, s); } else XmTextFieldSetString(text_1, "n/a"); if (gpsdata->fix.mode >= MODE_2D) { latlon = deg_to_str(deg_type, fabs(gpsdata->fix.latitude)); (void)snprintf(s, sizeof(s), "%s %c", latlon, (gpsdata->fix.latitude < 0) ? 'S' : 'N'); XmTextFieldSetString(text_2, s); } else XmTextFieldSetString(text_2, "n/a"); if (gpsdata->fix.mode >= MODE_2D) { latlon = deg_to_str(deg_type, fabs(gpsdata->fix.longitude)); (void)snprintf(s, sizeof(s), "%s %c", latlon, (gpsdata->fix.longitude < 0) ? 'W' : 'E'); XmTextFieldSetString(text_3, s); } else XmTextFieldSetString(text_3, "n/a"); if (gpsdata->fix.mode == MODE_3D) { (void)snprintf(s, sizeof(s), "%f %s", gpsdata->fix.altitude * altunits->factor, altunits->legend); XmTextFieldSetString(text_4, s); } else XmTextFieldSetString(text_4, "n/a"); if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.track)==0) { (void)snprintf(s, sizeof(s), "%f %s", gpsdata->fix.speed * speedunits->factor, speedunits->legend); XmTextFieldSetString(text_5, s); } else XmTextFieldSetString(text_5, "n/a"); if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.track)==0) { (void)snprintf(s, sizeof(s), "%f degrees", gpsdata->fix.track); XmTextFieldSetString(text_6, s); } else XmTextFieldSetString(text_6, "n/a"); if (isnan(gpsdata->fix.eph)==0) { (void)snprintf(s, sizeof(s), "%f %s", gpsdata->fix.eph * altunits->factor, altunits->legend); XmTextFieldSetString(text_7, s); } else XmTextFieldSetString(text_7, "n/a"); if (isnan(gpsdata->fix.epv)==0) { (void)snprintf(s, sizeof(s), "%f %s", gpsdata->fix.epv * altunits->factor, altunits->legend); XmTextFieldSetString(text_8, s); } else XmTextFieldSetString(text_8, "n/a"); if (gpsdata->fix.mode == MODE_3D && isnan(gpsdata->fix.climb)==0) { (void)snprintf(s, sizeof(s), "%f %s/sec", gpsdata->fix.climb * altunits->factor, altunits->legend); XmTextFieldSetString(text_9, s); } else XmTextFieldSetString(text_9, "n/a"); if (gpsdata->set & DEVICEID_SET) { (void)strlcpy(s, "xgps: ", sizeof(s)); (void)strlcpy(s+6, gpsdata->gps_id, sizeof(s)-6); set_title(s); } if (gpsdata->online == 0) { newstate = 0; (void)strlcpy(s, "OFFLINE", sizeof(s)); } else { newstate = gpsdata->fix.mode; switch (gpsdata->fix.mode) { case MODE_2D: (void)snprintf(s, sizeof(s), "2D %sFIX", (gpsdata->status == STATUS_DGPS_FIX) ? "DIFF " : ""); break; case MODE_3D: (void)snprintf(s, sizeof(s), "3D %sFIX", (gpsdata->status == STATUS_DGPS_FIX) ? "DIFF " : ""); break; default: (void)strlcpy(s, "NO FIX", sizeof(s)); break; } } if (newstate != state) { timer = time(NULL); state = newstate; } (void)snprintf(s + strlen(s), sizeof(s) - strlen(s), " (%d secs)", (int) (time(NULL) - timer)); XmTextFieldSetString(text_10, s); draw_graphics(gpsdata); XtRemoveTimeOut(timeout); timeout = XtAppAddTimeOut(app, 2000, handle_time_out, NULL); }
/* * Vstupní bod programu */ int main(int argc, char *argv[]) { XWMHints *wm_hints; /* Doporuèení pro window manager */ XClassHint *class_hints; /* Jméno tøídy pro resource management */ XTextProperty window_name, icon_name; /* Jména zobrazovaná window managerem */ XSizeHints *size_hints; /* Doporuèená velikost okna */ char *str_window_name = (char *) "Hello World"; char *str_icon_name = (char *) "Hello Icon"; XEvent event; /* Pro zpracování pøijatých událostí */ static Bool window_too_small = False; /* Inicializace */ progname = argv[0]; /* Pøipojení k X serveru */ if(!(display = XOpenDisplay(display_name))) { fprintf(stderr, "%s: cannot connect to X server %s\n", progname, XDisplayName(display_name)); exit(-1); } printf("Connected to X server %s\n", XDisplayName(display_name)); screen_num = DefaultScreen(display); printf("Default screen number is %d\n", screen_num); screen_ptr = DefaultScreenOfDisplay(display); display_width = DisplayWidth(display, screen_num); display_height = DisplayHeight(display, screen_num); printf("Display is %u x %u pixels\n", display_width, display_height); /* Vytvoøení okna */ x = y = 0; /* Okno umístí window manager */ width = display_width/2; height = display_height/2; win = XCreateSimpleWindow(display, RootWindow(display, screen_num), x, y, width, height, border_width, BlackPixel(display, screen_num), WhitePixel(display, screen_num)); printf("Created window with ID %#lx\n", win); /* Pixmapa ikony */ icon_pixmap = XCreateBitmapFromData(display, win, hello_icon_bits, hello_icon_width, hello_icon_height); printf("Created pixmap with ID %#lx\n", icon_pixmap); /* Nastavení properties pro window manager */ if(!(size_hints = XAllocSizeHints())) { fprintf(stderr, "Cannot allocate memory\n"); exit(-1); } if(!(wm_hints = XAllocWMHints())) { fprintf(stderr, "Cannot allocate memory\n"); exit(-1); } if(!(class_hints = XAllocClassHint())) { fprintf(stderr, "Cannot allocate memory\n"); exit(-1); } /* Poloha a velikost se bere ze skuteèných hodnot okna v oka¾iku * namapování. PPosition | PSize øíká, ¾e hodnoty nastavil program (a * window manager je mù¾e mìnit podle potøeby). USSize | USPosition by * znamenalo, ¾e hodnoty zadal u¾ivatel (napø. na pøíkazové øádce) a * window manager by je nemìl mìnit. */ size_hints->flags = PPosition | PSize | PMinSize; /* Window manager by nemìl okno nikdy zmen¹it na ménì ne¾ * min_width x min_height pixelù. */ size_hints->min_width = 300; size_hints->min_height = 200; /* Ulo¾ení jména okna a ikony */ if(!XStringListToTextProperty(&str_window_name, 1, &window_name)) { fprintf(stderr, "XStringListToTextProperty() for window_name" " failed\n"); exit(-1); } if(!XStringListToTextProperty(&str_icon_name, 1, &icon_name)) { fprintf(stderr, "XStringListToTextProperty() for icon_name" " failed\n"); exit(-1); } wm_hints->initial_state = NormalState;/* Na zaèátku má být zobrazeno normální okno (ne ikona) */ wm_hints->input = True; /* Aplikace potøebuje vstup z klávesnice */ wm_hints->icon_pixmap = icon_pixmap; wm_hints->flags = StateHint | InputHint | IconPixmapHint; /* Jméno programu a tøídy pro hledání v resource databázi */ class_hints->res_name = progname; class_hints->res_class = (char *) "HelloWorld"; XSetWMProperties(display, win, &window_name, &icon_name, argv, argc, size_hints, wm_hints, class_hints); /* Výbìr typù událostí ke zpracování */ XSelectInput(display, win, ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask); /* Nahrát font */ load_font(&font_info); /* Vytvoøit graphics context pro kreslení */ getGC(win, &gc, font_info); /* Namapovat okno na obrazovku (zobrazit) */ XMapWindow(display, win); /* Smyèka pro pøíjem a zpracování událostí */ while(1) { XNextEvent(display, &event); /* Èeká na pøíchod dal¹í události */ switch(event.type) { /* Zpracování události */ case Expose: printf("Drawing (serial=%lu send=%d count=%d x=%d y=%d " "w=%d h=%d)\n", event.xexpose.serial, event.xexpose.send_event, event.xexpose.count, event.xexpose.x, event.xexpose.y, event.xexpose.width, event.xexpose.height); if(event.xexpose.count == 0) { if(window_too_small) { /* Pøíli¹ zmen¹ené okno */ printf("Drawing small\n"); draw_too_small(win, gc, font_info); } else { /* Nakreslit obsah okna */ printf("Drawing normal (w=%d h=%d)\n", width, height); draw_text(win, gc, font_info, width, height); draw_graphics(win, gc, width, height); } } break; case ConfigureNotify: /* Kdybychom nevolali XClearWindow(), tak pøi rychlé zmìnì * velikosti okna my¹í postupnì window manager mìní velikost * okna, co¾ má za následek smazání pøedchozího obsahu okna a * vygenerování událostí ConfigureNotify a Expose. Jen¾e * jestli¾e program nestihne pøekreslit okno pøed dal¹í * zmìnou velikosti okna, tak X server jednou sma¾e okno, pak * program nìkolikrát pøeète ConfigureNotify a Expose a * nìkolikrát nakreslí obsah okna pro rùzné velikosti * zji¹tìné z ConfigureNotify. Takto se pøekryje nìkolik rùznì * velkých kreseb a obsah okna je ¹patný. */ if(width != event.xconfigure.width || height != event.xconfigure.height) XClearWindow(display, win); width = event.xconfigure.width; height = event.xconfigure.height; window_too_small = (int) width < size_hints->min_width+10 || (int) height < size_hints->min_height+10; printf("ConfigureNotify (serial=%lu send=%d w=%d h=%d)\n", event.xconfigure.serial, event.xconfigure.send_event, event.xconfigure.width, event.xconfigure.height); break; case ButtonPress: case KeyPress: /* Libovolná klávesa nebo tlaèítko my¹i ukonèí program */ /* Následující dvì volání nejsou nezbytná, XCloseDisplay() * uklidí v¹echny server resources alokované tímto klientem */ XUnloadFont(display, font_info->fid); XFreeGC(display, gc); /* Odpojení od X serveru */ XCloseDisplay(display); return 0; break; default: /* Sem se dostanou události vybrané maskou StructureNotifyMask * kromì ConfigureNotify. */ break; } } /* Sem se program nikdy nedostane */ return 0; }
/* draw procedure of the u8g picture loop */ void draw(void) { draw_graphics(); /* call the m2 draw procedure */ m2_Draw(); }