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 */ } }
static int sm_lpc(register DEV *dev) { u8 *p; u8 st; int g; // int flags; u16 idx; // avoid critical section u32 cport, rport, wport; dbg4(" %s(): dev=%08X", __FUNCTION__, (uint)dev); cport = dev->cport; rport = dev->rport; wport = dev->wport; switch( dev->state ) { case ST_RESYNC: if(LPCSTAT & 1) return 0; dev->ctl &= ~4; SETCTL; // clear reset flipflop SETCTL; SETCTL; dev->ctl |= 4; SETCTL; HS; NOUT(CMD_RESYNC); // send RESYNC HS; NOUT(EOM); HS; if(NIN != CMD_ACKSYNC) return -1; // get ACKSYNC dev->state = ST_RESET; return 0; case ST_RESET: HS; NOUT(CMD_NULL); // send NULL HS; NOUT(EOM); dev->state = ST_FLCAN; return 0; case ST_FLCAN: HS; if(NIN != CMD_XFER) return -1; // get niRESET HS; if(NIN != 1) return -1; HS; if(NIN != 0x50) return -1; // dev->intail = dev->inhead; // dev->outhead = dev->outtail; idx = dev->intail; p = dev->inbuf[idx]; *p++ = 0x50; *p++ = 0x00; idx++; if(idx >= NUM_INBUF) idx=0; if(idx != dev->inhead) { dev->intail = idx; dbg8(" %s(): before waitqueue_active()", __FUNCTION__); if (waitqueue_active(&dev->rd_wait)) { dbg8(" %s(): before wake_up_interruptible()", __FUNCTION__); wake_up_interruptible( &dev->rd_wait ); } else dbg8(" %s(): waitqueue_active()=0", __FUNCTION__); } HS; NOUT(CMD_XFER); // send FLUSH_CANCEL HS; NOUT(1); HS; NOUT(0x60); HS; NOUT(EOM); dev->state = ST_UPLINK; return 0; case ST_IDLE: if(dev->outhead == dev->outtail) { HS; NOUT(CMD_NULL); // send NULL HS; NOUT(EOM); dev->state = ST_UPLINK; return 0; } p = dev->outbuf[dev->outhead]; if( !((p[0]-0x10) & 0xE0) ) { // 1x or 2x HS; NOUT(CMD_XFER); // buffer request HS; NOUT(0x01); HS; NOUT(p[0]); HS; NOUT(EOM); HS; dev->state = ST_NIACK; return 0; } if( downlink( dev ) ) return -1; dev->state = ST_UPLINK; return 0; case ST_UPLINK: if( uplink( dev ) < 0 ) return -1; dev->state = ST_IDLE; if(dev->outhead != dev->outtail) { // CLI; dev->active++; // STI; } return 0; case ST_NIACK: g = uplink( dev ); if( g < 0 ) return -1; if( g == 1 ) { downlink( dev ); dev->state = ST_UPLINK; return 0; } HS; NOUT(CMD_NULL); // send NULL HS; NOUT(EOM); dev->state = ST_NIACK; return 0; } return 0; }