void handle_key(XEvent *event) { char key_buffer[20]; int key_buffer_size = 20; KeySym keysym; XComposeStatus compstatus; int charcount; int display_again = 0; char *name; char *filename; /*char *head = "echo htadd -l ";*/ /*char *blank1 = " ";*/ /*char *blank2 = " \n";*/ char buffer[180]; FILE *filehandle; charcount = XLookupString((XKeyEvent *)event, key_buffer, key_buffer_size, &keysym ,&compstatus); /* 5 args */ key_buffer[charcount] = '\0'; switch (keysym) { case XK_Prior: case XK_F29: scrollUpPage(); break; case XK_Next: case XK_F35: scrollDownPage(); break; case XK_F3: case XK_F12: quitHyperDoc(); break; case XK_F5: if (event->xkey.state & ShiftMask) { name = gWindow->page->name; filename = gWindow->page->filename; sprintf(buffer, "htadd -l %s\n", filename); system(buffer); filehandle = (FILE *) hash_find(&gFileHashTable, filename); fclose(filehandle); hash_delete(&gFileHashTable, filename); gWindow->fMacroHashTable = (HashTable *) halloc(sizeof(HashTable), "macro hash"); hash_init( gWindow->fMacroHashTable, MacroHashSize, (EqualFunction ) string_equal, (HashcodeFunction) string_hash); gWindow->fPatchHashTable = (HashTable *) halloc(sizeof(HashTable), "patch hash"); hash_init( gWindow->fPatchHashTable, PatchHashSize, (EqualFunction ) string_equal, (HashcodeFunction) string_hash); gWindow->fPasteHashTable = (HashTable *) halloc(sizeof(HashTable), "paste hash"); hash_init(gWindow->fPasteHashTable, PasteHashSize, (EqualFunction ) string_equal, (HashcodeFunction) string_hash); gWindow->fCondHashTable = (HashTable *) halloc(sizeof(HashTable), "cond hash"); hash_init( gWindow->fCondHashTable, CondHashSize, (EqualFunction ) string_equal, (HashcodeFunction) string_hash); gWindow->fPageHashTable = (HashTable *) halloc(sizeof(HashTable), "page hash"); hash_init( gWindow->fPageHashTable, PageHashSize, (EqualFunction ) string_equal, (HashcodeFunction) string_hash); make_special_pages(gWindow->fPageHashTable); read_ht_db( gWindow->fPageHashTable, gWindow->fMacroHashTable, gWindow->fPatchHashTable); gWindow->page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, name); if (gWindow->page == NULL) { fprintf(stderr, "lose...gWindow->page for %s is null\n", name); exit(-1); } display_again = 1; } break; case XK_F9: make_window_link(KeyDefsHelpPage); break; case XK_Tab: if (event->xkey.state & ShiftMask) prev_input_focus(); else if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else next_input_focus(); break; case XK_Return: if (!(event->xkey.state & ShiftMask)) { next_input_focus(); break; } /* next ones fall through to input area handling */ case XK_Escape: if (!gWindow->page->current_item) break; case XK_F1: if (!gWindow->page->current_item) { gWindow->page->helppage = alloc_string(NoMoreHelpPage); helpForHyperDoc(); break; } case XK_Home: if (!gWindow->page->current_item) { scrollToFirstPage(); break; } case XK_Up: if (!gWindow->page->current_item) { scrollUp(); break; } case XK_Down: if (!gWindow->page->current_item) { scrollDown(); break; } default: display_again = 0; dialog(event, keysym, key_buffer); XFlush(gXDisplay); break; } if (display_again) { display_page(gWindow->page); gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; } }
static void handle_button(int button, XButtonEvent * event) { HyperLink *link; HyperDocPage *page = NULL; char *page_name; /* find page name from sub-window handle */ link = get_hyper_link(event); if (link == NULL) { /* user clicked on an inactive area */ /* BeepAtTheUser(); */ /* I always thought this was annoying. RSS */ return; } switch (link->type) { case openaxiom_Pastebutton_token: page = paste_button(link->reference.paste); break; case openaxiom_Link_token: page_name = print_to_string(link->reference.node); page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, page_name); break; case openaxiom_Helpbutton_token: helpForHyperDoc(); page = NULL; break; case openaxiom_Scrollbar_token: scrollScroller(event); break; case Scrollupbutton: scrollUp(); break; case Scrolldownbutton: scrollDown(); break; case openaxiom_Inputstring_token: /* We must be changing input focus or getting a selection */ change_input_focus(link); if ( button == Button2 ) { XConvertSelection(gXDisplay, XA_PRIMARY, XA_STRING, XInternAtom(gXDisplay, "PASTE_SELECTION", False), gWindow->fMainWindow, CurrentTime); gSavedInputAreaLink = link; } break; case openaxiom_SimpleBox_token: page = NULL; toggle_input_box(link); break; case openaxiom_Radiobox_token: page = NULL; toggle_radio_box(link); break; case openaxiom_Quitbutton_token: quitHyperDoc(); break; case openaxiom_Returnbutton_token: /* pop memo information */ page = returnlink(); break; case openaxiom_Upbutton_token: /* pop downlink information */ page = uplink(); break; case openaxiom_Downlink_token: page = find_page(link->reference.node); if (page && NotSpecial(page->type)) downlink(); break; case openaxiom_Memolink_token: page = find_page(link->reference.node); if (page && NotSpecial(page->type)) memolink(); break; case openaxiom_Windowlink_token: page = find_page(link->reference.node); if (page && NotSpecial(page->type)) { windowlink_handler(link->reference.node); gNeedIconName = 1; page = NULL; } break; case openaxiom_Lispwindowlink_token: lispwindowlink_handler(link); gNeedIconName = 1; page = NULL; break; case openaxiom_LispMemoLink_token: case openaxiom_Spadmemolink_token: page = issue_server_command(link); if (page && NotSpecial(page->type)) memolink(); break; case openaxiom_LispDownLink_token: case openaxiom_Spaddownlink_token: page = issue_server_command(link); if (page && NotSpecial(page->type)) downlink(); break; case openaxiom_Spadlink_token: case openaxiom_Lisplink_token: page = issue_server_command(link); break; case openaxiom_Lispcommand_token: case openaxiom_Qspadcall_token: case openaxiom_Spadcall_token: page = issue_server_command(link); break; case openaxiom_Lispcommandquit_token: case openaxiom_Spadcallquit_token: case openaxiom_Qspadcallquit_token: page = issue_server_command(link); exitHyperDoc(); break; case openaxiom_Spadcommand_token: case openaxiom_Spadgraph_token: case openaxiom_Spadsrc_token: issue_spadcommand(gWindow->page, link->reference.node, button == Button1, link->type); break; case openaxiom_Unixlink_token: page = issue_unixlink(link->reference.node); if (page && NotSpecial(page->type)) { downlink(); } break; case openaxiom_Unixcommand_token: issue_unixcommand(link->reference.node); break; default: break; } if (page) { switch (page->type) { /* check for special button types */ case openaxiom_Quitbutton_token: exitHyperDoc(); return; case openaxiom_Returnbutton_token: gWindow->page = returnlink(); break; case openaxiom_Upbutton_token: gWindow->page = uplink(); break; case ErrorPage: case UnknownPage: case UlUnknownPage: if (page->type == UlUnknownPage) page->type = UnloadedPageType; downlink(); gWindow->page = page; break; default: /* a normal link */ gWindow->page = page; break; } if (link->type != openaxiom_Pastebutton_token) display_page(gWindow->page); gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; /* reset the window hash */ } }
void dialog(XEvent *event, KeySym keysym, char *buffer) { InputItem *item; item = gWindow->page->current_item; if (item == 0) { if (!((keysym >= XK_Shift_L) && (keysym <= XK_Hyper_R))) /** if something other than a modifier key was hit **/ BeepAtTheUser(); return; } /* * First check if the user had hit an enter key */ if ((keysym == XK_Return) || (keysym == XK_KP_Enter)) enter_new_line(item); /* * Else did the user actual type a character I can understand */ else if (((keysym >= XK_KP_Space) && (keysym <= XK_KP_9)) || ((keysym >= XK_space) && (keysym <= XK_asciitilde))) { /* only handle normal keys */ if (event->xkey.state & UnsupportedModMask) BeepAtTheUser(); else add_buffer_to_sym(buffer, item); } else if ((keysym >= XK_Shift_L) && (keysym <= XK_Hyper_R)) ; /* * do nothing, a modifier was hit */ else if ((keysym >= XK_F2) && (keysym <= XK_F35)) { /* * A function key was hit */ if (strlen(buffer) == 0) BeepAtTheUser(); else /* If I got characters then add it to the buffer */ add_buffer_to_sym(buffer, item); } else switch (keysym) { case XK_Escape: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else { move_cursor_home(item); delete_rest_of_line(item); } break; case XK_F1: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else { gWindow->page->helppage = alloc_string(InputAreaHelpPage); helpForHyperDoc(); } break; case XK_Up: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else move_cursor_up(item); break; case XK_Down: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else move_cursor_down(item); break; case XK_Delete: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else delete_char(item); break; case XK_BackSpace: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else back_over_char(item); break; case XK_Left: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else move_cursor_backward(item); break; case XK_Right: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else move_cursor_forward(item); break; case XK_Insert: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else { gInInsertMode = ((gInInsertMode) ? (0) : (1)); item->curr_line->changed = 1; update_inputsymbol(item); } break; case XK_Home: if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else move_cursor_home(item); break; case XK_End: if (event->xkey.state & ControlMask) /* delete from here to the end of the line */ delete_rest_of_line(item); else if (event->xkey.state & ModifiersMask) BeepAtTheUser(); else move_cursor_end(item); break; default: BeepAtTheUser(); break; } }