void output_fig (hwloc_topology_t topology, const char *filename, int logical, int legend, int verbose_mode __hwloc_attribute_unused) { FILE *output = open_file(filename, "w"); if (!output) { fprintf(stderr, "Failed to open %s for writing (%s)\n", filename, strerror(errno)); return; } output = output_draw_start(&fig_draw_methods, logical, legend, topology, output); output_draw(&fig_draw_methods, logical, legend, topology, output); if (output != stdout) fclose(output); }
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int redraw = 0; switch (message) { case WM_CHAR: { switch (wparam) { case '+': the_scale *= 1.2f; redraw = 1; break; case '-': the_scale /= 1.2f; redraw = 1; break; case 'f': case 'F': { float wscale, hscale; wscale = win_width / (float)the_width; hscale = win_height / (float)the_height; the_scale *= wscale > hscale ? hscale : wscale; redraw = 1; break; } case '1': the_scale = 1.0; redraw = 1; break; case 'q': case 'Q': finish = 1; break; } break; } case WM_PAINT: { HFONT font; BeginPaint(hwnd, &the_output.ps); font = CreateFont(fontsize, 0, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); SelectObject(the_output.ps.hdc, (HGDIOBJ) font); windows_box(&the_output, 0xff, 0xff, 0xff, 0, 0, win_width, 0, win_height); the_output.max_x = 0; the_output.max_y = 0; output_draw(&the_output.loutput); the_width = the_output.max_x; the_height = the_output.max_y; DeleteObject(font); EndPaint(hwnd, &the_output.ps); break; } case WM_LBUTTONDOWN: state = 1; x = GET_X_LPARAM(lparam); y = GET_Y_LPARAM(lparam); break; case WM_LBUTTONUP: state = 0; break; case WM_MOUSEMOVE: if (!(wparam & MK_LBUTTON)) state = 0; if (state) { int new_x = GET_X_LPARAM(lparam); int new_y = GET_Y_LPARAM(lparam); x_delta -= new_x - x; y_delta -= new_y - y; x = new_x; y = new_y; redraw = 1; } break; case WM_KEYDOWN: switch (wparam) { case VK_ESCAPE: finish = 1; break; case VK_LEFT: x_delta -= win_width/10; redraw = 1; break; case VK_RIGHT: x_delta += win_width/10; redraw = 1; break; case VK_UP: y_delta -= win_height/10; redraw = 1; break; case VK_DOWN: y_delta += win_height/10; redraw = 1; break; case VK_PRIOR: if (control) { x_delta -= win_width; redraw = 1; } else { y_delta -= win_height; redraw = 1; } break; case VK_NEXT: if (control) { x_delta += win_width; redraw = 1; } else { y_delta += win_height; redraw = 1; } break; case VK_HOME: x_delta = 0; y_delta = 0; redraw = 1; break; case VK_END: x_delta = INT_MAX; y_delta = INT_MAX; redraw = 1; break; case VK_CONTROL: control = 1; break; } break; case WM_KEYUP: switch (wparam) { case VK_CONTROL: control = 0; break; } break; case WM_DESTROY: /* only kill the program if closing the actual toplevel, not the fake one */ if (hwnd == the_output.toplevel) PostQuitMessage(0); return 0; case WM_SIZE: { float wscale, hscale; win_width = LOWORD(lparam); win_height = HIWORD(lparam); wscale = win_width / (float)the_width; hscale = win_height / (float)the_height; the_scale *= wscale > hscale ? hscale : wscale; if (the_scale < 1.0f) the_scale = 1.0f; redraw = 1; break; } } if (redraw) { if (x_delta > the_width - win_width) x_delta = the_width - win_width; if (y_delta > the_height - win_height) y_delta = the_height - win_height; if (x_delta < 0) x_delta = 0; if (y_delta < 0) y_delta = 0; fontsize = (unsigned)(the_fontsize * the_scale); gridsize = (unsigned)(the_gridsize * the_scale); RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); } return DefWindowProc(hwnd, message, wparam, lparam); }
static void windows_init(void *output) { struct lstopo_windows_output *woutput = output; WNDCLASS wndclass; HWND toplevel, faketoplevel; unsigned width, height; HFONT font; /* make sure WM_DESTROY on the faketoplevel won't kill the program */ woutput->toplevel = NULL; /* create the toplevel window, with random size for now */ memset(&wndclass, 0, sizeof(wndclass)); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_SIZEALL); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = "lstopo"; RegisterClass(&wndclass); /* compute the maximal needed size, this may require the toplevel window in the future */ woutput->max_x = 0; woutput->max_y = 0; woutput->drawing = 0; faketoplevel = CreateWindow("lstopo", "lstopo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 10, 10, NULL, NULL, NULL, NULL); BeginPaint(faketoplevel, &woutput->ps); font = CreateFont(fontsize, 0, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL); SelectObject(woutput->ps.hdc, (HGDIOBJ) font); output_draw(&woutput->loutput); DeleteObject(font); EndPaint(faketoplevel, &woutput->ps); DestroyWindow(faketoplevel); woutput->drawing = 1; /* now create the actual toplevel with the sizes */ width = woutput->max_x; height = woutput->max_y; win_width = width + 2*GetSystemMetrics(SM_CXSIZEFRAME); win_height = height + 2*GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION); if (win_width > GetSystemMetrics(SM_CXFULLSCREEN)) win_width = GetSystemMetrics(SM_CXFULLSCREEN); if (win_height > GetSystemMetrics(SM_CYFULLSCREEN)) win_height = GetSystemMetrics(SM_CYFULLSCREEN); toplevel = CreateWindow("lstopo", "lstopo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, win_width, win_height, NULL, NULL, NULL, NULL); woutput->toplevel = toplevel; the_width = width; the_height = height; the_scale = 1.0f; the_fontsize = fontsize; the_gridsize = gridsize; /* and display the window */ ShowWindow(toplevel, SW_SHOWDEFAULT); printf("\n"); printf("Keyboard shortcuts:\n"); printf(" Zoom-in or out .................... + -\n"); printf(" Try to fit scale to window ........ f F\n"); printf(" Reset scale to default ............ 1\n"); printf(" Scroll vertically ................. Up Down PageUp PageDown\n"); printf(" Scroll horizontally ............... Left Right Ctrl+PageUp/Down\n"); printf(" Scroll to the top-left corner ..... Home\n"); printf(" Scroll to the bottom-right corner . End\n"); printf(" Exit .............................. q Q Esc\n"); printf("\n\n"); }
int main(int argc, char *argv[]) { unsigned long sleep_time; double read_interval; start_time = time(0); memset(&rtiming, 0, sizeof(rtiming)); rtiming.rt_variance.v_min = FLT_MAX; /* * Early initialization before reading config */ conf_init_pre(); parse_args_pre(argc, argv); /* * Reading the configuration file */ configfile_read(); /* * Late initialization after reading config */ if (parse_args_post(argc, argv)) return 1; conf_init_post(); module_init(); read_interval = cfg_read_interval; sleep_time = cfg_getint(cfg, "sleep_time"); if (((double) sleep_time / 1000000.0f) > read_interval) sleep_time = (unsigned long) (read_interval * 1000000.0f); DBG("Entering mainloop..."); do { /* * E := Elapsed time * NR := Next Read * LR := Last Read * RI := Read Interval * ST := Sleep Time * C := Correction */ timestamp_t e, ri, tmp; unsigned long st; float_to_timestamp(&ri, read_interval); /* * NR := NOW */ update_timestamp(&rtiming.rt_next_read); for (;;) { output_pre(); /* * E := NOW */ update_timestamp(&e); /* * IF NR <= E THEN */ if (timestamp_le(&rtiming.rt_next_read, &e)) { timestamp_t c; /* * C := (NR - E) */ timestamp_sub(&c, &rtiming.rt_next_read, &e); //calc_variance(&c, &ri); /* * LR := E */ copy_timestamp(&rtiming.rt_last_read, &e); /* * NR := E + RI + C */ timestamp_add(&rtiming.rt_next_read, &e, &ri); timestamp_add(&rtiming.rt_next_read, &rtiming.rt_next_read, &c); reset_update_flags(); input_read(); free_unused_elements(); output_draw(); output_post(); } if (do_quit) exit(0); /* * ST := Configured ST */ st = sleep_time; /* * IF (NR - E) < ST THEN */ timestamp_sub(&tmp, &rtiming.rt_next_read, &e); if (tmp.tv_sec < 0) continue; if (tmp.tv_sec == 0 && tmp.tv_usec < st) { if (tmp.tv_usec < 0) continue; /* * ST := (NR - E) */ st = tmp.tv_usec; } /* * SLEEP(ST) */ usleep(st); } } while (0); return 0; /* buddha says i'll never be reached */ }
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int redraw = 0; switch (message) { case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hwnd, &ps); windows_box(&ps, 0xff, 0xff, 0xff, 0, 0, win_width, 0, win_height); output_draw(&windows_draw_methods, the_logical, the_legend, the_topology, &ps); EndPaint(hwnd, &ps); break; } case WM_LBUTTONDOWN: state = 1; x = GET_X_LPARAM(lparam); y = GET_Y_LPARAM(lparam); break; case WM_LBUTTONUP: state = 0; break; case WM_MOUSEMOVE: if (!(wparam & MK_LBUTTON)) state = 0; if (state) { int new_x = GET_X_LPARAM(lparam); int new_y = GET_Y_LPARAM(lparam); x_delta -= new_x - x; y_delta -= new_y - y; x = new_x; y = new_y; redraw = 1; } break; case WM_KEYDOWN: switch (wparam) { case 'q': case 'Q': case VK_ESCAPE: finish = 1; break; case VK_LEFT: x_delta -= win_width/10; redraw = 1; break; case VK_RIGHT: x_delta += win_width/10; redraw = 1; break; case VK_UP: y_delta -= win_height/10; redraw = 1; break; case VK_DOWN: y_delta += win_height/10; redraw = 1; break; case VK_PRIOR: if (control) { x_delta -= win_width; redraw = 1; } else { y_delta -= win_height; redraw = 1; } break; case VK_NEXT: if (control) { x_delta += win_width; redraw = 1; } else { y_delta += win_height; redraw = 1; } break; case VK_HOME: x_delta = 0; y_delta = 0; redraw = 1; break; case VK_END: x_delta = INT_MAX; y_delta = INT_MAX; redraw = 1; break; case VK_CONTROL: control = 1; break; } break; case WM_KEYUP: switch (wparam) { case VK_CONTROL: control = 0; break; } break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_SIZE: win_width = LOWORD(lparam); win_height = HIWORD(lparam); redraw = 1; break; } if (redraw) { if (x_delta > the_width - win_width) x_delta = the_width - win_width; if (y_delta > the_height - win_height) y_delta = the_height - win_height; if (x_delta < 0) x_delta = 0; if (y_delta < 0) y_delta = 0; if (win_width > the_width && win_height > the_height) { fontsize = the_fontsize; gridsize = the_gridsize; if (win_width > the_width) { fontsize = the_fontsize * win_width / the_width; gridsize = the_gridsize * win_width / the_width; } if (win_height > the_height) { unsigned int new_fontsize = the_fontsize * win_height / the_height; unsigned int new_gridsize = the_gridsize * win_height / the_height; if (new_fontsize < fontsize) fontsize = new_fontsize; if (new_gridsize < gridsize) gridsize = new_gridsize; } } RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); } return DefWindowProc(hwnd, message, wparam, lparam); }
int main(int argc, char *argv[]) { unsigned long sleep_time; double read_interval; start_time = time(0); parse_args_pre(argc, argv); configfile_read(); parse_args_post(argc, argv); conf_init(); module_init(); read_interval = cfg_read_interval; sleep_time = cfg_getint(cfg, "sleep_time"); if (((double) sleep_time / 1000000.0f) > read_interval) sleep_time = (unsigned long) (read_interval * 1000000.0f); // pipe_start(); if (cfg_getbool(cfg, "daemon")) { init_syslog(); daemonize(); write_pidfile(); } drop_privs(); do { /* * E := Elapsed time * NR := Next Read * LR := Last Read * RI := Read Interval * ST := Sleep Time * C := Correction */ timestamp_t e, ri, tmp; unsigned long st; float_to_timestamp(&ri, read_interval); /* * NR := NOW */ update_timestamp(&rtiming.rt_next_read); for (;;) { output_pre(); /* * read the chucka chucka pipe */ // pipe_handle(); /* * E := NOW */ update_timestamp(&e); /* * IF NR <= E THEN */ if (timestamp_le(&rtiming.rt_next_read, &e)) { timestamp_t c; /* * C := (NR - E) */ timestamp_sub(&c, &rtiming.rt_next_read, &e); //calc_variance(&c, &ri); /* * LR := E */ copy_timestamp(&rtiming.rt_last_read, &e); /* * NR := E + RI + C */ timestamp_add(&rtiming.rt_next_read, &e, &ri); timestamp_add(&rtiming.rt_next_read, &rtiming.rt_next_read, &c); reset_update_flags(); input_read(); free_unused_elements(); output_draw(); output_post(); } if (do_quit) exit(0); /* * ST := Configured ST */ st = sleep_time; /* * IF (NR - E) < ST THEN */ timestamp_sub(&tmp, &rtiming.rt_next_read, &e); if (tmp.tv_sec < 0) continue; if (tmp.tv_sec == 0 && tmp.tv_usec < st) { if (tmp.tv_usec < 0) continue; /* * ST := (NR - E) */ st = tmp.tv_usec; } /* * SLEEP(ST) */ usleep(st); } } while (0); return 0; /* buddha says i'll never be reached */ }
int main(int argc, char *argv[]){ Spawn *player; InterfaceData idata = {0, NULL, -1, NULL, 1}; SDL_Event event; int num_tiles = OUTPUT_IN_GLYPHS_X * OUTPUT_IN_GLYPHS_Y, i; /*SDL anmachen*/ if(SDL_Init(SDL_INIT_VIDEO)) return EXIT_FAILURE; SDL_EnableKeyRepeat(200, 50); /*Karte laden*/ if(argc==2) map=load_map(argv[1]); else{ fprintf(stderr,"Kartennamen angeben\n"); return EXIT_FAILURE; } if(map == NULL) { fprintf(stderr,"Fehler beim Laden der Karte\n"); return EXIT_FAILURE; } player = get_player_spawn(map); if(player==NULL){ fprintf(stderr, "Kein Spieler auf der Karte\n"); return EXIT_FAILURE; } /*Map zeichnen*/ /* Ausgabepuffer initialisieren */ buf = (BufferTile*)ex_malloc(sizeof(BufferTile) * num_tiles); for(i = 0; i < num_tiles; ++i) { BufferTile bt = {' ', 0x00000000}; buf[i] = bt; } output_init(OUTPUT_IN_GLYPHS_X, OUTPUT_IN_GLYPHS_Y, map->name); explore_area(player, map); create_output_buffer(map, buf, num_tiles); get_interface_data(map, &idata); output_draw(buf, num_tiles, &idata); /*Eingabeloop*/ int quit=0; KeyAction current_action = INVALID; while(SDL_WaitEvent(&event)){ if(event.type == SDL_KEYDOWN) { current_action = get_action(event.key.keysym.sym); /*bei Escape beenden*/ if(event.key.keysym.sym == SDLK_ESCAPE){ quit=1; break; } if(current_action != INVALID) { process_event(current_action, map); } create_output_buffer(map, buf, num_tiles); get_interface_data(map, &idata); output_draw(buf, num_tiles, &idata); } else if(event.type == SDL_QUIT) { quit=1; break; } SDL_Delay(1); /*Affe tot => Klappe zu*/ if(player->hp<=0){ game_over(0); break; } /* Ende erreicht */ if(map->finished) { game_over(1); break; } } if(!quit){ while(SDL_WaitEvent(&event)){ /*bei Escape beenden*/ if(event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) { break; } SDL_Delay(1); } } free(buf); flush_map(map); free(idata.message); free(idata.item_name); output_close(); SDL_Quit(); return EXIT_SUCCESS; }