コード例 #1
0
ファイル: event.c プロジェクト: billpage/open-axiom
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
ファイル: keyin.c プロジェクト: acralfs/fricas
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;
  }
}