Пример #1
0
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 */
    }
}
Пример #2
0
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;
}