static void draw_statuswin(void) { glui32 width, height; if (!statuswin) { /* It is possible that the window was not successfully created. If that's the case, don't try to draw it. */ return; } glk_set_window(statuswin); glk_window_clear(statuswin); glk_window_get_size(statuswin, &width, &height); /* Draw a decorative compass rose in the center. */ width = (width/2); if (width > 0) width--; height = (height/2); if (height > 0) height--; glk_window_move_cursor(statuswin, width, height+0); glk_put_string("\\|/"); glk_window_move_cursor(statuswin, width, height+1); glk_put_string("-*-"); glk_window_move_cursor(statuswin, width, height+2); glk_put_string("/|\\"); }
void GlkInterface::split_window(zword lines) { if (!gos_upper) return; // The top line is always set for V1 to V3 games if (h_version < V4) lines++; if (!lines || lines > curr_status_ht) { uint height; glk_window_get_size(gos_upper, nullptr, &height); if (lines != height) glk_window_set_arrangement( glk_window_get_parent(gos_upper), winmethod_Above | winmethod_Fixed, lines, nullptr); curr_status_ht = lines; } mach_status_ht = lines; if (cury > lines) { glk_window_move_cursor(gos_upper, 0, 0); curx = cury = 1; } gos_update_width(); if (h_version == V3) glk_window_clear(gos_upper); }
glui32 automap_draw_callback(winid_t win, glui32 width, glui32 height) { if(win == NULL) return automap_size; mymap_init(width, height); automap_set_locations(automap_location); glk_stream_set_current(glk_window_get_stream(win)); mymap_draw(); if(selected_room_number) { offset short_name_off = object_name(selected_room_number); glk_window_move_cursor(win, 0, 0); if(short_name_off) decodezscii(short_name_off, w_glk_put_char); else w_glk_put_string("<nameless>"); w_glk_put_string(" ("); g_print_number(selected_room_number); glk_put_char(')'); } return automap_size; }
void print_two_rows(winid_t win) { glui32 width, height; glk_window_get_size(win, &width, &height); glk_set_window(win); glk_window_clear(win); glui32 x = (width >= 6)? width / 2 - 3 : 0; glui32 y = (height > 0)? (height - 1) / 2 : 0; glk_window_move_cursor(win, x, y); glk_put_string("C: 2"); glk_window_move_cursor(win, x + 3, y + 1); glk_put_string("rows"); }
void GlkInterface::smartstatusline() { zchar packed[256]; uint32 buf[256]; zchar *a, *b, *c, *d; int roomlen, scorelen, scoreofs; int len, tmp; packspaces(statusline, packed); len = os_string_length(packed); a = packed; while (a[0] == ' ') a++; b = a; while (b[0] != 0 && !(b[0] == ' ' && b[1] == ' ')) b++; c = b; while (c[0] == ' ') c++; d = packed + len - 1; while (d[0] == ' ' && d > c) d--; if (d[0] != ' ' && d[0] != 0) d++; if (d < c) d = c; roomlen = b - a; scorelen = d - c; scoreofs = h_screen_cols - scorelen - 2; if (scoreofs <= roomlen) scoreofs = roomlen + 2; for (tmp = 0; tmp < h_screen_cols; tmp++) buf[tmp] = ' '; memcpy(buf + 1 + scoreofs, c, scorelen * sizeof(zchar)); memcpy(buf + 1, a, roomlen * sizeof(zchar)); glk_window_move_cursor(gos_upper, 0, 0); glk_put_buffer_uni(buf, h_screen_cols); glk_window_move_cursor(gos_upper, cury - 1, curx - 1); }
void GlkInterface::gos_update_width() { uint width; if (gos_upper) { glk_window_get_size(gos_upper, &width, nullptr); h_screen_cols = width; SET_BYTE(H_SCREEN_COLS, width); if ((uint)curx > width) { glk_window_move_cursor(gos_upper, 0, cury - 1); curx = 1; } } }
/* This draws some corner decorations in *every* key window -- the one created at startup, and any later ones. It finds them all with glk_window_iterate. */ static void draw_keywins(void) { winid_t win; glui32 rock; glui32 width, height; for (win = glk_window_iterate(NULL, &rock); win; win = glk_window_iterate(win, &rock)) { if (rock == KEYWINROCK) { glk_set_window(win); glk_window_clear(win); glk_window_get_size(win, &width, &height); glk_window_move_cursor(win, 0, 0); glk_put_char('O'); glk_window_move_cursor(win, width-1, 0); glk_put_char('O'); glk_window_move_cursor(win, 0, height-1); glk_put_char('O'); glk_window_move_cursor(win, width-1, height-1); glk_put_char('O'); } } }
void hugo_font(int f) { static char using_prop_font = false; /* The <f> argument is a mask containing any or none of: BOLD_FONT, UNDERLINE_FONT, ITALIC_FONT, PROP_FONT. */ glk_current_font = f; glk_set_style(style_Normal); if (f & BOLD_FONT) glk_set_style(style_Subheader); if (f & UNDERLINE_FONT) glk_set_style(style_Emphasized); if (f & ITALIC_FONT) glk_set_style(style_Emphasized); if (f & PROP_FONT) using_prop_font = true; /* Have to comment this out, it seems, because it will mess up the alignment of the input in the main window if (!(f & PROP_FONT)) glk_set_style(style_Preformatted); */ /* Workaround to decide if we have to open auxwin for positioned non-proportional text: */ if (!(f & PROP_FONT)) { /* If at top of screen, and changing to a fixed- width font (a situation which wouldn't normally be adjusted for by hugo_settextpos()) */ if (!inwindow && currentline==1 && currentpos==0 && using_prop_font) { just_cleared_screen = false; hugo_settextpos(1, 2); glk_window_move_cursor(currentwin, 0, 0); } } }
void center_text(winid_t win, char *text) { glui32 width, height; glk_window_get_size(win, &width, &height); glk_set_window(win); glk_window_clear(win); if(glk_window_get_type(win) == wintype_TextGrid) { glk_window_move_cursor(win, width / 2 - strlen(text) / 2, height / 2); glk_put_string(text); } else if(glk_window_get_type(win) == wintype_TextBuffer) { int count; for(count = 0; count < height / 2; count++) glk_put_char('\n'); for(count = 0; count < (int)(SPACE_FACTOR * (width / 2 - strlen(text) / 2)); count++) glk_put_char(' '); glk_put_string(text); } }
void banner_contents_display(contentid_t contents) { if (!contents || !(contents->banner)) return; winid_t win = contents->banner->win; glui32 len = contents->len; glk_set_window(win); if (contents->newline) { char ch = '\n'; os_put_buffer(&ch, 1); } if (len && (contents->chars[len-1] == '\n')) { len --; contents->banner->newline = 1; } else { contents->banner->newline = 0; } if (contents->move) { glk_window_move_cursor(win, contents->x, contents->y); contents->banner->move = 0; contents->banner->x = 0; contents->banner->y = 0; } glk_set_style(contents->style); os_put_buffer(contents->chars, len); glk_set_window(mainwin); banner_contents_display(contents->next); }
/*======================================================================*/ void statusline(void) { #ifdef HAVE_GLK glui32 glkWidth; char line[100]; int pcol = col; if (!statusLineOption) return; if (glkStatusWin == NULL) return; glk_set_window(glkStatusWin); glk_window_clear(glkStatusWin); glk_window_get_size(glkStatusWin, &glkWidth, NULL); #ifdef HAVE_GARGLK int i; glk_set_style(style_User1); for (i = 0; i < glkWidth; i++) glk_put_char(' '); #endif onStatusLine = TRUE; col = 1; glk_window_move_cursor(glkStatusWin, 1, 0); sayInstance(where(HERO, TRUE)); // TODO Add status message1 & 2 as author customizable messages if (header->maximumScore > 0) sprintf(line, "Score %d(%d)/%d moves", current.score, (int)header->maximumScore, current.tick); else sprintf(line, "%d moves", current.tick); glk_window_move_cursor(glkStatusWin, glkWidth-strlen(line)-1, 0); glk_put_string(line); needSpace = FALSE; col = pcol; onStatusLine = FALSE; glk_set_window(glkMainWin); #else #ifdef HAVE_ANSI char line[100]; int i; int pcol = col; if (!statusLineOption) return; /* ansi_position(1,1); ansi_bold_on(); */ printf("\x1b[1;1H"); printf("\x1b[7m"); onStatusLine = TRUE; col = 1; sayInstance(where(HERO, FALSE)); if (header->maximumScore > 0) sprintf(line, "Score %d(%d)/%d moves", current.score, header->maximumScore, current.tick); else sprintf(line, "%ld moves", (long)current.tick); for (i=0; i < pageWidth - col - strlen(line); i++) putchar(' '); printf(line); printf("\x1b[m"); printf("\x1b[%d;1H", pageLength); needSpace = FALSE; capitalize = TRUE; onStatusLine = FALSE; col = pcol; #endif #endif }
void hugo_settextpos(int x, int y) { /* The top-left corner of the current active window is (1, 1). */ if (currentwin==NULL) return; /* Try to determine if we're trying to position fixed-width text in the main window, as in a menu, for example */ if (!just_cleared_screen && !inwindow && !(glk_current_font & PROP_FONT) && y!=1 /* not just cls */ && y < SCREENHEIGHT-0x0f) /* 0x0f is arbitrary */ { /* See if we're already in the auxiliary window */ if (currentwin!=auxwin) { /* If not, create it, making it 100% of mainwin's height */ if (auxwin==NULL) { auxwin = glk_window_open(mainwin, winmethod_Below | winmethod_Proportional, 100, wintype_TextGrid, 0); } else glk_window_clear(auxwin); glk_set_window(currentwin = auxwin); } } /* On the other hand, if we were in a textgrid window and no longer need to be, get out */ else if (auxwin) { stream_result_t sr; /* Close auxwin */ glk_window_close(auxwin, &sr); auxwin = NULL; /* Clear the screen (both windows) */ glk_window_clear(mainwin); glk_window_clear(secondwin); glk_set_window(currentwin = mainwin); } just_cleared_screen = false; /* Can only move the Glk cursor in a textgrid window */ if (currentwin!=mainwin) glk_window_move_cursor(currentwin, x-1, y-1); /* Must be set: */ currentline = y; currentpos = (x-1)*CHARWIDTH; /* Note: zero-based */ }
int hugo_waitforkey(void) { event_t ev; char gotchar = 0; /* Just in case we try to get key input from a Glk-illegal window that hasn't been created, switch as a failsafe to mainwin */ if (currentwin==NULL) glk_set_window(currentwin = mainwin); #if defined (NO_KEYPRESS_CURSOR) if (currentwin!=mainwin) { glk_window_move_cursor(currentwin, currentpos/CHARWIDTH, currentline-1); hugo_print("*"); glk_window_move_cursor(currentwin, currentpos/CHARWIDTH, currentline-1); } #endif glk_request_char_event(currentwin); while (!gotchar) { /* Grab an event */ glk_select(&ev); switch (ev.type) { case evtype_CharInput: /* (Will always be mainwin, but anyway) */ if (ev.win==currentwin) { gotchar = true; } break; } } /* Convert Glk special keycodes: */ switch (ev.val1) { case keycode_Left: ev.val1 = 8; break; case keycode_Right: ev.val1 = 21; break; case keycode_Up: ev.val1 = 11; break; case keycode_Down: ev.val1 = 10; break; case keycode_Return: ev.val1 = 13; break; case keycode_Escape: ev.val1 = 27; break; } #if defined (NO_KEYPRESS_CURSOR) if (currentwin!=mainwin) { glk_window_move_cursor(currentwin, currentpos/CHARWIDTH, currentline-1); hugo_print(" "); glk_window_move_cursor(currentwin, currentpos/CHARWIDTH, currentline-1); } #endif return ev.val1; }
/* React to character input in a key window. */ static void perform_key(winid_t win, glui32 key) { glui32 width, height, len; int ix; char buf[128], keyname[64]; if (key == 'h' || key == 'v') { winid_t newwin; glui32 loc; /* Open a new keywindow. */ if (key == 'h') loc = winmethod_Right | winmethod_Proportional; else loc = winmethod_Below | winmethod_Proportional; newwin = glk_window_open(win, loc, 50, wintype_TextGrid, KEYWINROCK); /* Since the new window has rock value KEYWINROCK, the draw_keywins() routine will redraw it. */ if (newwin) { /* Request character input. In this program, only keywins get char input, so the CharInput events always call perform_key() -- and so the new window will respond to keys just as this one does. */ glk_request_char_event(newwin); /* We now have to redraw the keywins, because any or all of them could have changed size when we opened newwin. glk_window_open() does not generate Arrange events; we have to do the redrawing manually. */ draw_keywins(); } /* Re-request character input for this window, so that future keys are accepted. */ glk_request_char_event(win); return; } else if (key == 'c') { /* Close this keywindow. */ glk_window_close(win, NULL); /* Again, any key windows could have changed size. Also the status window could have (if this was the last key window). */ draw_keywins(); draw_statuswin(); return; } /* Print a string naming the key that was just hit. */ switch (key) { case ' ': str_cpy(keyname, "space"); break; case keycode_Left: str_cpy(keyname, "left"); break; case keycode_Right: str_cpy(keyname, "right"); break; case keycode_Up: str_cpy(keyname, "up"); break; case keycode_Down: str_cpy(keyname, "down"); break; case keycode_Return: str_cpy(keyname, "return"); break; case keycode_Delete: str_cpy(keyname, "delete"); break; case keycode_Escape: str_cpy(keyname, "escape"); break; case keycode_Tab: str_cpy(keyname, "tab"); break; case keycode_PageUp: str_cpy(keyname, "page up"); break; case keycode_PageDown: str_cpy(keyname, "page down"); break; case keycode_Home: str_cpy(keyname, "home"); break; case keycode_End: str_cpy(keyname, "end"); break; default: if (key <= keycode_Func1 && key >= keycode_Func12) { str_cpy(keyname, "function key"); } else if (key < 32) { str_cpy(keyname, "ctrl-"); keyname[5] = '@' + key; keyname[6] = '\0'; } else if (key <= 255) { keyname[0] = key; keyname[1] = '\0'; } else { str_cpy(keyname, "unknown key"); } break; } str_cpy(buf, "Key: "); str_cat(buf, keyname); len = str_len(buf); /* Print the string centered in this window. */ glk_set_window(win); glk_window_get_size(win, &width, &height); glk_window_move_cursor(win, 0, height/2); for (ix=0; ix<width; ix++) glk_put_char(' '); width = width/2; len = len/2; if (width > len) width = width-len; else width = 0; glk_window_move_cursor(win, width, height/2); glk_put_string(buf); /* Re-request character input for this window, so that future keys are accepted. */ glk_request_char_event(win); }
void gidispatch_call(glui32 funcnum, glui32 numargs, gluniversal_t *arglist) { gidispatch_function_t *gidispatch_function; char *prototype; int argument = 0; int slot = 0; gidispatch_function = gidispatch_get_function_by_id(funcnum); prototype = gidispatch_prototype(funcnum); printf("DEBUG: dispatch call name=%s, prototype=%s, numargs=%u -- ", gidispatch_function->name, prototype, (unsigned int)numargs); if (strcmp(prototype, "4IuIuIuIs") == 0) { printf("%u, %u, %u, %d\n", arglist[0].uint, arglist[1].uint, arglist[2].uint, arglist[3].sint); } else if (strcmp(prototype, "3IuIu:Iu") == 0) { printf("%u, %u, returning a glui32\n", arglist[0].uint, arglist[1].uint); } else if (strcmp(prototype, "3Qa<Iu:Qa") == 0) { printf("win at %p, outref to a glui32, returning a winid_t\n", arglist[0].opaqueref); } else if (strcmp(prototype, "3Qc<Iu:Qc") == 0) { printf("fileref at %p, outref to a glui32, returning a frefid_t\n", arglist[0].opaqueref); } else if (strcmp(prototype, "1Qa:") == 0) { printf("win at %p\n", arglist[0].opaqueref); } else if (strcmp(prototype, "6QaIuIuIuIu:Qa") == 0) { printf("win at %p, %u, %u, %u, %u, returning a winid_t\n", arglist[0].opaqueref, arglist[1].uint, arglist[2].uint, arglist[3].uint, arglist[4].uint); } else if (strcmp(prototype, "4IuIuIuIs:") == 0) { printf("%u, %u, %u, %d\n", arglist[0].uint, arglist[1].uint, arglist[2].uint, arglist[3].sint); } else if (strcmp(prototype, "1Qb:") == 0) { printf("stream at %p\n", arglist[0].opaqueref); } else if (strcmp(prototype, "1Iu:") == 0) { printf("%u\n", arglist[0].uint); } else if (strcmp(prototype, "2Qb<[2IuIu]:") == 0) { printf("stream at %p, some struct stuff here\n", arglist[0].opaqueref); } else if (strcmp(prototype, "3IuIuIu:") == 0) { printf("%u, %u, %u\n", arglist[0].uint, arglist[1].uint, arglist[2].uint); } else if (strcmp(prototype, "1:Qb") == 0) { printf("returning a strid_t\n"); } else if (strcmp(prototype, "4&+#!IuIuIu:Qb") == 0) { printf("retained, nonnull, array of glui32 at %p for length %u, %u, %u, returning a strid_t\n", arglist[1].array, arglist[2].uint, arglist[3].uint, arglist[4].uint); } else if (strcmp(prototype, "2Qc:Iu") == 0) { printf("fileref at %p, returning a glui32\n", arglist[0].opaqueref); } else if (strcmp(prototype, "1<+[4IuQaIuIu]:") == 0) { printf("some struct stuff here, nonnull\n"); } else if (strcmp(prototype, "1:Qb") == 0) { printf("returning a strid_t\n"); } else if (strcmp(prototype, "2Qb:Is") == 0) { printf("stream at %p, returning a glsi32\n", arglist[0].opaqueref); } else if (strcmp(prototype, "2Qc:Iu") == 0) { printf("fileref at %p, returning a glui32\n", arglist[0].opaqueref); } else if (strcmp(prototype, "3Qa&+#!CnIu:") == 0) { printf("win at %p, retained, nonnull, array of char at %p for length %u, %u\n", arglist[0].opaqueref, arglist[2].array, arglist[3].uint, arglist[4].uint); } else if (strcmp(prototype, "3Qb<Iu:Qb") == 0) { printf("stream at %p, outref to a glui32, returning a strid_t\n", arglist[0].opaqueref); } else if (strcmp(prototype, "4&+#!CnIuIu:Qb") == 0) { printf("retained, nonnull, array of char at %p for length %u, %u, %u, returning a strid_t\n", arglist[1].array, arglist[2].uint, arglist[3].uint, arglist[4].uint); } else if (strcmp(prototype, "4&+#!IuIuIu:Qb") == 0) { printf("retained, nonnull, array of glui32 at %p for length %u, %u, %u, returning a strid_t\n", arglist[1].array, arglist[2].uint, arglist[3].uint, arglist[4].uint); } else if (strcmp(prototype, "4IuSIu:Qc") == 0) { printf("%u, %s, %u, returning a frefid_t\n", arglist[0].uint, arglist[1].charstr, arglist[2].uint); } else if (strcmp(prototype, "4QcIuIu:Qb") == 0) { printf("fileref at %p, %u, %u, returning a strid_t\n", arglist[0].opaqueref, arglist[1].uint, arglist[2].uint); } else if (strcmp(prototype, "3Qa<Iu<Iu:") == 0) { printf("win at %p, outref to a glui32, outref to a glui32\n", arglist[0].opaqueref); } else if (strcmp(prototype, "6QaIuIsIsIuIu:") == 0) { printf("win at %p, %u, %d, %d, %u, %u\n", arglist[0].opaqueref, arglist[1].uint, arglist[2].sint, arglist[3].sint, arglist[4].uint, arglist[5].uint); } else if (strcmp(prototype, "4Iu<Iu<Iu:Iu") == 0) { printf("%u, outref to a glui32, outref to a glui32, returning a glui32\n", arglist[0].uint); } else { printf("unhandled prototype\n"); } switch (funcnum) { case 0x0004: /* gestalt */ arglist[3].uint = glk_gestalt(arglist[0].uint, arglist[1].uint); break; case 0x0005: /* gestalt_ext */ if (arglist[2].ptrflag) { arglist[6].uint = glk_gestalt_ext(arglist[0].uint, arglist[1].uint, arglist[3].array, arglist[4].uint); } else { arglist[4].uint = glk_gestalt_ext(arglist[0].uint, arglist[1].uint, NULL, 0); } break; case 0x0020: /* window_iterate */ if (arglist[1].ptrflag) arglist[4].opaqueref = glk_window_iterate(arglist[0].opaqueref, &arglist[2].uint); else arglist[3].opaqueref = glk_window_iterate(arglist[0].opaqueref, NULL); break; case 0x0023: /* window_open */ arglist[6].opaqueref = glk_window_open(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint, arglist[3].uint, arglist[4].uint); break; case 0x0025: /* window_get_size */ { int ix = 1; glui32 *ptr1, *ptr2; if (!arglist[ix].ptrflag) { ptr1 = NULL; } else { ix++; ptr1 = &(arglist[ix].uint); } ix++; if (!arglist[ix].ptrflag) { ptr2 = NULL; } else { ix++; ptr2 = &(arglist[ix].uint); } ix++; glk_window_get_size(arglist[0].opaqueref, ptr1, ptr2); } break; case 0x0028: /* window_get_type */ arglist[2].uint = glk_window_get_type(arglist[0].opaqueref); break; case 0x002A: /* window_clear */ glk_window_clear(arglist[0].opaqueref); break; case 0x002B: /* window_move_cursor */ glk_window_move_cursor(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint); break; case 0x002F: /* set_window */ glk_set_window(arglist[0].opaqueref); break; case 0x0040: /* stream_iterate */ if (arglist[1].ptrflag) arglist[4].opaqueref = glk_stream_iterate(arglist[0].opaqueref, &arglist[2].uint); else arglist[3].opaqueref = glk_stream_iterate(arglist[0].opaqueref, NULL); break; case 0x0042: /* stream_open_file */ arglist[4].opaqueref = glk_stream_open_file(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint); break; case 0x0043: /* stream_open_memory */ if (arglist[0].ptrflag) arglist[6].opaqueref = glk_stream_open_memory(arglist[1].array, arglist[2].uint, arglist[3].uint, arglist[4].uint); else arglist[4].opaqueref = glk_stream_open_memory(NULL, 0, arglist[1].uint, arglist[2].uint); break; case 0x0044: /* stream_close */ if (arglist[1].ptrflag) { stream_result_t dat; glk_stream_close(arglist[0].opaqueref, &dat); arglist[2].uint = dat.readcount; arglist[3].uint = dat.writecount; } else { glk_stream_close(arglist[0].opaqueref, NULL); } break; case 0x0047: /* stream_set_current */ glk_stream_set_current(arglist[0].opaqueref); break; case 0x0048: /* stream_get_current */ arglist[1].opaqueref = glk_stream_get_current(); break; case 0x0061: /* fileref_create_by_name */ arglist[4].opaqueref = glk_fileref_create_by_name(arglist[0].uint, arglist[1].charstr, arglist[2].uint); break; case 0x0062: /* fileref_create_by_prompt */ arglist[4].opaqueref = glk_fileref_create_by_prompt(arglist[0].uint, arglist[1].uint, arglist[2].uint); break; case 0x0067: /* fileref_does_file_exist */ arglist[2].uint = glk_fileref_does_file_exist(arglist[0].opaqueref); break; case 0x0086: /* set_style */ glk_set_style(arglist[0].uint); break; case 0x0087: /* set_style_stream */ glk_set_style_stream(arglist[0].opaqueref, arglist[1].uint); break; case 0x0090: /* get_char_stream */ arglist[2].sint = glk_get_char_stream(arglist[0].opaqueref); break; case 0x00B0: /* stylehint_set */ glk_stylehint_set(arglist[0].uint, arglist[1].uint, arglist[2].uint, arglist[3].sint); break; case 0x00C0: /* select */ if (arglist[0].ptrflag) { event_t dat; glk_select(&dat); arglist[1].uint = dat.type; arglist[2].opaqueref = dat.win; arglist[3].uint = dat.val1; arglist[4].uint = dat.val2; } else { glk_select(NULL); } break; case 0x00D0: /* request_line_event */ if (arglist[1].ptrflag) glk_request_line_event(arglist[0].opaqueref, arglist[2].array, arglist[3].uint, arglist[4].uint); else glk_request_line_event(arglist[0].opaqueref, NULL, 0, arglist[2].uint); break; case 0x00D2: /* request_char_event */ glk_request_char_event(arglist[0].opaqueref); break; case 0x00E0: /* image_get_info */ { int ix = 1; glui32 *ptr1, *ptr2; if (!arglist[ix].ptrflag) { ptr1 = NULL; } else { ix++; ptr1 = &(arglist[ix].uint); } ix++; if (!arglist[ix].ptrflag) { ptr2 = NULL; } else { ix++; ptr2 = &(arglist[ix].uint); } ix++; ix++; arglist[ix].uint = glk_image_get_info(arglist[0].uint, ptr1, ptr2); } break; case 0x00E1: /* image_draw */ arglist[5].uint = glk_image_draw(arglist[0].opaqueref, arglist[1].uint, arglist[2].sint, arglist[3].sint); break; case 0x00E2: /* image_draw_scaled */ arglist[7].uint = glk_image_draw_scaled(arglist[0].opaqueref, arglist[1].uint, arglist[2].sint, arglist[3].sint, arglist[4].uint, arglist[5].uint); break; case 0x00EA: /* window_fill_rect */ glk_window_fill_rect(arglist[0].opaqueref, arglist[1].uint, arglist[2].sint, arglist[3].sint, arglist[4].uint, arglist[5].uint); break; case 0x0128: /* put_char_uni */ glk_put_char_uni(arglist[0].uint); break; case 0x0139: /* stream_open_memory_uni */ if (arglist[0].ptrflag) arglist[6].opaqueref = glk_stream_open_memory_uni(arglist[1].array, arglist[2].uint, arglist[3].uint, arglist[4].uint); else arglist[4].opaqueref = glk_stream_open_memory_uni(NULL, 0, arglist[1].uint, arglist[2].uint); break; default: printf("Unhandled call to %s via dispatch\n", gidispatch_function->name); #if 0 case 0x0001: /* exit */ glk_exit(); break; case 0x0002: /* set_interrupt_handler */ /* cannot be invoked through dispatch layer */ break; case 0x0003: /* tick */ glk_tick(); break; case 0x0021: /* window_get_rock */ arglist[2].uint = glk_window_get_rock(arglist[0].opaqueref); break; case 0x0022: /* window_get_root */ arglist[1].opaqueref = glk_window_get_root(); break; case 0x0024: /* window_close */ if (arglist[1].ptrflag) { stream_result_t dat; glk_window_close(arglist[0].opaqueref, &dat); arglist[2].uint = dat.readcount; arglist[3].uint = dat.writecount; } else { glk_window_close(arglist[0].opaqueref, NULL); } break; case 0x0026: /* window_set_arrangement */ glk_window_set_arrangement(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint, arglist[3].opaqueref); break; case 0x0027: /* window_get_arrangement */ { int ix = 1; glui32 *ptr1, *ptr2; winid_t *ptr3; if (!arglist[ix].ptrflag) { ptr1 = NULL; } else { ix++; ptr1 = &(arglist[ix].uint); } ix++; if (!arglist[ix].ptrflag) { ptr2 = NULL; } else { ix++; ptr2 = &(arglist[ix].uint); } ix++; if (!arglist[ix].ptrflag) { ptr3 = NULL; } else { ix++; ptr3 = (winid_t *)(&(arglist[ix].opaqueref)); } ix++; glk_window_get_arrangement(arglist[0].opaqueref, ptr1, ptr2, ptr3); } break; case 0x0029: /* window_get_parent */ arglist[2].opaqueref = glk_window_get_parent(arglist[0].opaqueref); break; case 0x002C: /* window_get_stream */ arglist[2].opaqueref = glk_window_get_stream(arglist[0].opaqueref); break; case 0x002D: /* window_set_echo_stream */ glk_window_set_echo_stream(arglist[0].opaqueref, arglist[1].opaqueref); break; case 0x002E: /* window_get_echo_stream */ arglist[2].opaqueref = glk_window_get_echo_stream(arglist[0].opaqueref); break; case 0x0030: /* window_get_sibling */ arglist[2].opaqueref = glk_window_get_sibling(arglist[0].opaqueref); break; case 0x0041: /* stream_get_rock */ arglist[2].uint = glk_stream_get_rock(arglist[0].opaqueref); break; case 0x0045: /* stream_set_position */ glk_stream_set_position(arglist[0].opaqueref, arglist[1].sint, arglist[2].uint); break; case 0x0046: /* stream_get_position */ arglist[2].uint = glk_stream_get_position(arglist[0].opaqueref); break; case 0x0048: /* stream_get_current */ arglist[1].opaqueref = glk_stream_get_current(); break; case 0x0060: /* fileref_create_temp */ arglist[3].opaqueref = glk_fileref_create_temp(arglist[0].uint, arglist[1].uint); break; case 0x0063: /* fileref_destroy */ glk_fileref_destroy(arglist[0].opaqueref); break; case 0x0064: /* fileref_iterate */ if (arglist[1].ptrflag) arglist[4].opaqueref = glk_fileref_iterate(arglist[0].opaqueref, &arglist[2].uint); else arglist[3].opaqueref = glk_fileref_iterate(arglist[0].opaqueref, NULL); break; case 0x0065: /* fileref_get_rock */ arglist[2].uint = glk_fileref_get_rock(arglist[0].opaqueref); break; case 0x0066: /* fileref_delete_file */ glk_fileref_delete_file(arglist[0].opaqueref); break; case 0x0068: /* fileref_create_from_fileref */ arglist[4].opaqueref = glk_fileref_create_from_fileref(arglist[0].uint, arglist[1].opaqueref, arglist[2].uint); break; case 0x0080: /* put_char */ glk_put_char(arglist[0].uch); break; case 0x0081: /* put_char_stream */ glk_put_char_stream(arglist[0].opaqueref, arglist[1].uch); break; case 0x0082: /* put_string */ glk_put_string(arglist[0].charstr); break; case 0x0083: /* put_string_stream */ glk_put_string_stream(arglist[0].opaqueref, arglist[1].charstr); break; case 0x0084: /* put_buffer */ if (arglist[0].ptrflag) glk_put_buffer(arglist[1].array, arglist[2].uint); else glk_put_buffer(NULL, 0); break; case 0x0085: /* put_buffer_stream */ if (arglist[1].ptrflag) glk_put_buffer_stream(arglist[0].opaqueref, arglist[2].array, arglist[3].uint); else glk_put_buffer_stream(arglist[0].opaqueref, NULL, 0); break; case 0x0091: /* get_line_stream */ if (arglist[1].ptrflag) arglist[5].uint = glk_get_line_stream(arglist[0].opaqueref, arglist[2].array, arglist[3].uint); else arglist[3].uint = glk_get_line_stream(arglist[0].opaqueref, NULL, 0); break; case 0x0092: /* get_buffer_stream */ if (arglist[1].ptrflag) arglist[5].uint = glk_get_buffer_stream(arglist[0].opaqueref, arglist[2].array, arglist[3].uint); else arglist[3].uint = glk_get_buffer_stream(arglist[0].opaqueref, NULL, 0); break; case 0x00A0: /* char_to_lower */ arglist[2].uch = glk_char_to_lower(arglist[0].uch); break; case 0x00A1: /* char_to_upper */ arglist[2].uch = glk_char_to_upper(arglist[0].uch); break; case 0x00B1: /* stylehint_clear */ glk_stylehint_clear(arglist[0].uint, arglist[1].uint, arglist[2].uint); break; case 0x00B2: /* style_distinguish */ arglist[4].uint = glk_style_distinguish(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint); break; case 0x00B3: /* style_measure */ if (arglist[3].ptrflag) arglist[6].uint = glk_style_measure(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint, &(arglist[4].uint)); else arglist[5].uint = glk_style_measure(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint, NULL); break; case 0x00C1: /* select_poll */ if (arglist[0].ptrflag) { event_t dat; glk_select_poll(&dat); arglist[1].uint = dat.type; arglist[2].opaqueref = dat.win; arglist[3].uint = dat.val1; arglist[4].uint = dat.val2; } else { glk_select_poll(NULL); } break; case 0x00D1: /* cancel_line_event */ if (arglist[1].ptrflag) { event_t dat; glk_cancel_line_event(arglist[0].opaqueref, &dat); arglist[2].uint = dat.type; arglist[3].opaqueref = dat.win; arglist[4].uint = dat.val1; arglist[5].uint = dat.val2; } else { glk_cancel_line_event(arglist[0].opaqueref, NULL); } break; case 0x00D3: /* cancel_char_event */ glk_cancel_char_event(arglist[0].opaqueref); break; case 0x00D4: /* request_mouse_event */ glk_request_mouse_event(arglist[0].opaqueref); break; case 0x00D5: /* cancel_mouse_event */ glk_cancel_mouse_event(arglist[0].opaqueref); break; case 0x00D6: /* request_timer_events */ glk_request_timer_events(arglist[0].uint); break; #ifdef GLK_MODULE_IMAGE case 0x00E8: /* window_flow_break */ glk_window_flow_break(arglist[0].opaqueref); break; case 0x00E9: /* window_erase_rect */ glk_window_erase_rect(arglist[0].opaqueref, arglist[1].sint, arglist[2].sint, arglist[3].uint, arglist[4].uint); break; case 0x00EB: /* window_set_background_color */ glk_window_set_background_color(arglist[0].opaqueref, arglist[1].uint); break; #endif /* GLK_MODULE_IMAGE */ #ifdef GLK_MODULE_SOUND case 0x00F0: /* schannel_iterate */ if (arglist[1].ptrflag) arglist[4].opaqueref = glk_schannel_iterate(arglist[0].opaqueref, &arglist[2].uint); else arglist[3].opaqueref = glk_schannel_iterate(arglist[0].opaqueref, NULL); break; case 0x00F1: /* schannel_get_rock */ arglist[2].uint = glk_schannel_get_rock(arglist[0].opaqueref); break; case 0x00F2: /* schannel_create */ arglist[2].opaqueref = glk_schannel_create(arglist[0].uint); break; case 0x00F3: /* schannel_destroy */ glk_schannel_destroy(arglist[0].opaqueref); break; case 0x00F8: /* schannel_play */ arglist[3].uint = glk_schannel_play(arglist[0].opaqueref, arglist[1].uint); break; case 0x00F9: /* schannel_play_ext */ arglist[5].uint = glk_schannel_play_ext(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint, arglist[3].uint); break; case 0x00FA: /* schannel_stop */ glk_schannel_stop(arglist[0].opaqueref); break; case 0x00FB: /* schannel_set_volume */ glk_schannel_set_volume(arglist[0].opaqueref, arglist[1].uint); break; case 0x00FC: /* sound_load_hint */ glk_sound_load_hint(arglist[0].uint, arglist[1].uint); break; #endif /* GLK_MODULE_SOUND */ #ifdef GLK_MODULE_HYPERLINKS case 0x0100: /* set_hyperlink */ glk_set_hyperlink(arglist[0].uint); break; case 0x0101: /* set_hyperlink_stream */ glk_set_hyperlink_stream(arglist[0].opaqueref, arglist[1].uint); break; case 0x0102: /* request_hyperlink_event */ glk_request_hyperlink_event(arglist[0].opaqueref); break; case 0x0103: /* cancel_hyperlink_event */ glk_cancel_hyperlink_event(arglist[0].opaqueref); break; #endif /* GLK_MODULE_HYPERLINKS */ #ifdef GLK_MODULE_UNICODE case 0x0120: /* buffer_to_lower_case_uni */ if (arglist[0].ptrflag) arglist[5].uint = glk_buffer_to_lower_case_uni(arglist[1].array, arglist[2].uint, arglist[3].uint); else arglist[3].uint = glk_buffer_to_lower_case_uni(NULL, 0, arglist[1].uint); break; case 0x0121: /* buffer_to_upper_case_uni */ if (arglist[0].ptrflag) arglist[5].uint = glk_buffer_to_upper_case_uni(arglist[1].array, arglist[2].uint, arglist[3].uint); else arglist[3].uint = glk_buffer_to_upper_case_uni(NULL, 0, arglist[1].uint); break; case 0x0122: /* buffer_to_title_case_uni */ if (arglist[0].ptrflag) arglist[6].uint = glk_buffer_to_title_case_uni(arglist[1].array, arglist[2].uint, arglist[3].uint, arglist[4].uint); else arglist[4].uint = glk_buffer_to_title_case_uni(NULL, 0, arglist[1].uint, arglist[2].uint); break; case 0x0129: /* put_string_uni */ glk_put_string_uni(arglist[0].unicharstr); break; case 0x012A: /* put_buffer_uni */ if (arglist[0].ptrflag) glk_put_buffer_uni(arglist[1].array, arglist[2].uint); else glk_put_buffer_uni(NULL, 0); break; case 0x012B: /* put_char_stream_uni */ glk_put_char_stream_uni(arglist[0].opaqueref, arglist[1].uint); break; case 0x012C: /* put_string_stream_uni */ glk_put_string_stream_uni(arglist[0].opaqueref, arglist[1].unicharstr); break; case 0x012D: /* put_buffer_stream_uni */ if (arglist[1].ptrflag) glk_put_buffer_stream_uni(arglist[0].opaqueref, arglist[2].array, arglist[3].uint); else glk_put_buffer_stream_uni(arglist[0].opaqueref, NULL, 0); break; case 0x0130: /* get_char_stream_uni */ arglist[2].sint = glk_get_char_stream_uni(arglist[0].opaqueref); break; case 0x0131: /* get_buffer_stream_uni */ if (arglist[1].ptrflag) arglist[5].uint = glk_get_buffer_stream_uni(arglist[0].opaqueref, arglist[2].array, arglist[3].uint); else arglist[3].uint = glk_get_buffer_stream_uni(arglist[0].opaqueref, NULL, 0); break; case 0x0132: /* get_line_stream_uni */ if (arglist[1].ptrflag) arglist[5].uint = glk_get_line_stream_uni(arglist[0].opaqueref, arglist[2].array, arglist[3].uint); else arglist[3].uint = glk_get_line_stream_uni(arglist[0].opaqueref, NULL, 0); break; case 0x0138: /* stream_open_file_uni */ arglist[4].opaqueref = glk_stream_open_file_uni(arglist[0].opaqueref, arglist[1].uint, arglist[2].uint); break; case 0x0140: /* request_char_event_uni */ glk_request_char_event_uni(arglist[0].opaqueref); break; case 0x0141: /* request_line_event_uni */ if (arglist[1].ptrflag) glk_request_line_event_uni(arglist[0].opaqueref, arglist[2].array, arglist[3].uint, arglist[4].uint); else glk_request_line_event_uni(arglist[0].opaqueref, NULL, 0, arglist[2].uint); break; #endif /* GLK_MODULE_UNICODE */ #endif /* 0 */ } }