diff options
author | dos-reis <gdr@axiomatics.org> | 2008-03-07 15:19:01 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2008-03-07 15:19:01 +0000 |
commit | 8531f4c74274b8aa99168d220738227557a9c418 (patch) | |
tree | c50b77870e432317be8f99c248e1339f74b51661 /src/hyper/event.pamphlet | |
parent | 33949ff2e6e5b5abe8d22c5604f42a6c9371079a (diff) | |
download | open-axiom-8531f4c74274b8aa99168d220738227557a9c418.tar.gz |
* hyper/: De-pamphletize.
Diffstat (limited to 'src/hyper/event.pamphlet')
-rw-r--r-- | src/hyper/event.pamphlet | 1099 |
1 files changed, 0 insertions, 1099 deletions
diff --git a/src/hyper/event.pamphlet b/src/hyper/event.pamphlet deleted file mode 100644 index 3dcb69ff..00000000 --- a/src/hyper/event.pamphlet +++ /dev/null @@ -1,1099 +0,0 @@ -\documentclass{article} -\usepackage{axiom} -\begin{document} -\title{\$SPAD/src/event} -\author{The Axiom Team} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject -\section{event.h} -<<event.h>>= -<<license>> -#ifndef _EVENT_H_ -#define _EVENT_H_ 1 - -#include "hyper.h" - -extern Window gActiveWindow; -extern int gNeedIconName; - -#endif -@ -\section{event.c} -<<event.c>>= -#define _EVENT_C -#include "axiom-c-macros.h" -#include "useproto.h" -#include "debug.h" - - -#include "hyper.h" - -#include <X11/X.h> -#include <X11/Xatom.h> -#include <X11/cursorfont.h> -#include <sys/signal.h> -#include <setjmp.h> -#include <sys/types.h> -#include <sys/time.h> - -#ifdef SGIplatform -#include <bstring.h> -#endif - -#include "event.h" -#include "keyin.h" -#include "mem.h" -#include "display.h" -#include "parse.h" -#include "parse-paste.h" -#include "initx.h" -#include "scrollbar.h" -#include "group.h" - -#include "all_hyper_proto.H1" -#include "sockio-c.H1" - -jmp_buf env; -Window gActiveWindow; -int motion = 0; -int gNeedIconName = 0; -unsigned long bigmask= 0xffffffff; -static HyperLink *gSavedInputAreaLink = NULL; - - - -/* - * This is the main X loop. It keeps grabbing events. Since the only way the - * window can die is through an event, it never actually end. One of the - * subroutines it calls is responsible for killing everything - */ - -void -mainEventLoop(void) -{ - XEvent event; - int Xcon; - fd_set rd, dum1, dum2; - motion = 0; - gActiveWindow = -1; - set_error_handlers(); - Xcon = ConnectionNumber(gXDisplay); - - while (1) { -/* fprintf(stderr,"event:mainEventLoop: loop top\n");*/ - while (gSessionHashTable.num_entries == 0) - pause(); - - /* XFlush(gXDisplay); */ - - if (!motion) - init_cursor_states(); - motion = 0; - - if (!spad_socket == 0) { - FD_ZERO(&rd); - FD_ZERO(&dum1); - FD_ZERO(&dum2); - FD_CLR(0, &dum1); - FD_CLR(0, &dum2); - FD_CLR(0, &rd); - FD_SET(spad_socket->socket, &rd); - FD_SET(Xcon, &rd); - if (!session_server == 0) { - FD_SET(session_server->socket, &rd); - } - if (XEventsQueued(gXDisplay, QueuedAlready)) { - XNextEvent(gXDisplay, &event); - handle_event(&event); - } - else { - select(FD_SETSIZE,(void *)&rd,(void *)&dum1,(void *)&dum2,NULL); - if (FD_ISSET(Xcon, &rd) || - XEventsQueued(gXDisplay, QueuedAfterFlush)) { - XNextEvent(gXDisplay, &event); - handle_event(&event); - } - else if FD_ISSET - (spad_socket->socket, &rd) - /* - * Axiom Socket do what handle_event does The 100 is - * $SpadStuff in hypertex.boot - */ - { - if (100 == get_int(spad_socket)) { - set_window(gParentWindow->fMainWindow); - make_busy_cursors(); - get_new_window(); - } - } - /* - * Session Socket Telling us about the death of a spadbuf - * (plus maybe more later) service_session_socket in - * spadint.c - */ - else - if (session_server && FD_ISSET(session_server->socket, &rd)) { - service_session_socket(); - } - } - } - else { - XNextEvent(gXDisplay, &event); - handle_event(&event); - } - } -} - -static void -handle_event(XEvent * event) -{ - XWindowAttributes wa; -/* fprintf(stderr,"event:handle_event entered\n");*/ - set_window(event->xany.window); - if (event->type == MotionNotify) { -/* fprintf(stderr,"event:handle_event type=MotionNotify\n");*/ - handle_motion_event((XMotionEvent *)event); - motion = 1; - return; - } - make_busy_cursors(); - switch (event->type) { - case DestroyNotify: -/* fprintf(stderr,"event:handle_event type=DestroyNotify\n");*/ - break; - case Expose: -/* fprintf(stderr,"event:handle_event type=Expose\n");*/ - XGetWindowAttributes(gXDisplay, gWindow->fMainWindow, &wa); - if ((gWindow->width == 0 && gWindow->height == 0) || - (wa.width != gWindow->width || wa.height != gWindow->height)) { - gWindow->width = wa.width; - gWindow->height = wa.height; - display_page(gWindow->page); - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - } - else /** just redraw the thing **/ - expose_page(gWindow->page); - XFlush(gXDisplay); - clear_exposures(gWindow->fMainWindow); - clear_exposures(gWindow->fScrollWindow); - break; - case ButtonPress: -/* fprintf(stderr,"event:handle_event type=ButtonPress\n");*/ - handle_button(event->xbutton.button, (XButtonEvent *)event); - XFlush(gXDisplay); - if (gWindow) { - while (XCheckTypedWindowEvent(gXDisplay, gWindow->fMainWindow, - Expose, event)); - while (XCheckTypedWindowEvent(gXDisplay, gWindow->fScrollWindow, - Expose, event)); - } - break; - case KeyPress: -/* fprintf(stderr,"event:handle_event type=KeyPress\n");*/ - handle_key(event); - if (gWindow) { - while (XCheckTypedWindowEvent(gXDisplay, gWindow->fMainWindow, - Expose, event)); - while (XCheckTypedWindowEvent(gXDisplay, gWindow->fScrollWindow, - Expose, event)); - } - break; - case MapNotify: -/* fprintf(stderr,"event:handle_event type=MapNotify\n");*/ - create_window(); - break; - - case SelectionNotify: -/* fprintf(stderr,"event:handle_event type=SelectionNotify\n");*/ - /* this is in response to a previous request in an input area */ - if ( gSavedInputAreaLink ) { - XSelectionEvent *pSelEvent; - Atom dataProperty; - pSelEvent = (XSelectionEvent *) event; - dataProperty = XInternAtom(gXDisplay, "PASTE_SELECTION", False); - /* change the input focus */ - - /* change_input_focus(gSavedInputAreaLink); */ - - /* try to get the selection as a window property */ - - if ( pSelEvent->requestor == gWindow->fMainWindow && - pSelEvent->selection == XA_PRIMARY && - /* pSelEvent->time == CurrentTime && */ - pSelEvent->target == XA_STRING && - pSelEvent->property == dataProperty ) - { - Atom actual_type; - int actual_format; - unsigned long nitems, leftover; - char *pSelection = NULL; - - if (Success == XGetWindowProperty(gXDisplay, - gWindow->fMainWindow, - pSelEvent->property, 0L, 100000000L, True, - AnyPropertyType, &actual_type, &actual_format, - &nitems, &leftover, (unsigned char **) &pSelection) ) - { - char *pBuffer; - InputItem *item = gSavedInputAreaLink->reference.string; - - for (pBuffer = pSelection; *pBuffer; ++pBuffer) - add_buffer_to_sym(pBuffer, item); - - XFree(pSelection); - } - } - - /* clear the link info */ - - gSavedInputAreaLink = NULL; - } - break; - - default: -/* fprintf(stderr,"event:handle_event type=default\n");*/ - break; - } - -} - -static void -create_window(void) -{ - XWindowAttributes wa; - - XGetWindowAttributes(gXDisplay, gWindow->fMainWindow, &wa); - - gWindow->width = wa.width; - gWindow->height = wa.height; - display_page(gWindow->page); - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - - /* then select for the events I normally would like to catch */ - XSelectInput(gXDisplay, gWindow->fMainWindow, ButtonPress | KeyPressMask | - PointerMotionMask | - ExposureMask /* | EnterWindowMask | LeaveWindowMask */ ); - XSelectInput(gXDisplay, gWindow->fScrollWindow, ExposureMask); - -} - -/* - * This routine is called when the quitbutton is hit. For the moment I am - * just going to leave it all behind - */ - -void -quitHyperDoc(void) -{ - HyperDocPage *page; - - if (gSessionHashTable.num_entries == 1 || gParentWindow == gWindow) { - if (!strcmp(gWindow->page->name, "ProtectedQuitPage")){ - exitHyperDoc(); - } - page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, "ProtectedQuitPage"); - if (page == NULL) { - fprintf(stderr, "Unknown page name %s\n", "ProtectedQuitPage"); - exitHyperDoc(); - return; - } - if (gWindow->fDownLinkStackIndex == MaxDownlinkDepth) - fprintf(stderr, "exceeded maximum link nesting level\n"); - else - gWindow->fDownLinkStack[gWindow->fDownLinkStackIndex++] = gWindow->page; - gWindow->page = page; - display_page(gWindow->page); - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - } - else - exitHyperDoc(); -} - - -/* - * find_page takes as an argument the HyperDoc for a page name and returns - * the associated page - */ - -static HyperDocPage * -find_page(TextNode * node) -{ - char *page_name; - HyperDocPage *page; - - /* try and find the page name */ - page_name = print_to_string(node); - page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, page_name); - - if (page == NULL) { - /* try to find the unknown page */ - page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, "UnknownPage"); - if (page == NULL) { - /* Yikes, Even that could not be found */ - fprintf(stderr, "Unknown page name %s\n", page_name); - } - else { - if (page->type == UnloadedPageType) - page->type = UlUnknownPage; - else - page->type = UnknownPage; - } - } - return page; -} - -/* - * These are macros for taking care of the downlink stack, and the memolink - * stack. - */ - -#define NotSpecial(t) ((t == Quitbutton || t == Returnbutton || \ - t == Upbutton || t == UnknownPage || \ - t == UlUnknownPage || t == ErrorPage) ?(0):(1)) - -/* pushes a page onto the down link stack */ - -static void -downlink(void) -{ - if (gWindow->fDownLinkStackIndex == MaxDownlinkDepth) - fprintf(stderr, "exceeded maximum link nesting level\n"); - else - gWindow->fDownLinkStack[gWindow->fDownLinkStackIndex++] = gWindow->page; -} - -static void -memolink(void) -{ - if (gWindow->fMemoStackIndex == MaxMemoDepth) - fprintf(stderr, "exceeded maximum link nesting level\n"); - else { - gWindow->fMemoStack[gWindow->fMemoStackIndex] = gWindow->page; - gWindow->fDownLinkStackTop[gWindow->fMemoStackIndex++] = gWindow->fDownLinkStackIndex; - } -} - -static void -killAxiomPage(HyperDocPage * page) -{ - char command[512]; - - sprintf(command, "(|htpDestroyPage| '%s)", page->name); - send_lisp_command(command); -} - -static void -kill_page(HyperDocPage * page) -{ - page->scroll_off = 0; - if (page->type == SpadGen) { - hash_delete(gWindow->fPageHashTable, page->name); - killAxiomPage(page); - free_page(page); - } -} - -/* pops the memo stack */ - -static HyperDocPage * -returnlink(void) -{ - int i; - - if (gWindow->fMemoStackIndex == 0) { - BeepAtTheUser(); - return NULL; - } - else { - kill_page(gWindow->page); - for (i = gWindow->fDownLinkStackIndex - 1; - i >= gWindow->fDownLinkStackTop[gWindow->fMemoStackIndex - 1]; - i--) - { - kill_page(gWindow->fDownLinkStack[i]); - } - gWindow->fDownLinkStackIndex = - gWindow->fDownLinkStackTop[--gWindow->fMemoStackIndex]; - return (gWindow->fMemoStack[gWindow->fMemoStackIndex]); - } -} - -/* pops a page if it can from the downlink stack */ - -static HyperDocPage * -uplink(void) -{ - if (gWindow->fDownLinkStackIndex == 0) - return returnlink(); - else { - kill_page(gWindow->page); - return (gWindow->fDownLinkStack[--gWindow->fDownLinkStackIndex]); - } -} - -static void -windowlink_handler(TextNode * node) -{ - char *page_name; - - /* first try and find the page */ - page_name = print_to_string(node); - - if (init_top_window(page_name) == -1) { - return; - } -/* gWindow->fWindowHashTable = gWindow->page->fLinkHashTable;*/ -} - -void -make_window_link(char *name) -{ - if (init_top_window(name) != -1) -{}/* gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; */ -} - - -static void -lispwindowlink_handler(HyperLink * link) -{ - - /* - * Since we are popping up a new window, then we had better change all - * the cursors right away. We won't get another chance at it. - */ - - if (init_top_window(NULL) != -1) { - HyperDocPage *page = NULL; - int frame = gWindow->fAxiomFrame; - - page = issue_server_command(link); - gWindow->fAxiomFrame = frame; - gWindow->page = page; -/* gWindow->fWindowHashTable = gWindow->page->fLinkHashTable;*/ - } -} - -static HyperDocPage * -paste_button(PasteNode * paste) -{ - HyperDocPage *page = NULL; - int pastewhere=paste->where; - - - if ( paste->end_node ==NULL || paste->begin_node==NULL || paste->arg_node==NULL ){ - BeepAtTheUser(); - return NULL; - } - - page=parse_patch(paste); -/* paste has changed after this call so use pastewhere*/ - - if (pastewhere && page ) { - if (0 == strcmp(page->name, "ErrorPage")) - page = NULL; - } - else - BeepAtTheUser(); - - return page; -} - -void -helpForHyperDoc(void) -{ - HyperDocPage *page = NULL; - - /* do not do anything if we are already at the "no more help" page */ - - if (0 == strcmp(gWindow->page->name, NoMoreHelpPage)) - return; - - /* if no help page recorded, use the standard "no more help" page */ - - if (!gWindow->page->helppage) - gWindow->page->helppage = alloc_string(NoMoreHelpPage); - - /* if we are on the main help page, use "no more help" page */ - - if (0 == strcmp(gWindow->page->name, TopLevelHelpPage)) - gWindow->page->helppage = alloc_string(NoMoreHelpPage); - - page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, gWindow->page->helppage); - - if (page) - make_window_link(gWindow->page->helppage); - else - BeepAtTheUser(); -} - -static HyperLink * -findButtonInList(HDWindow * window, int x, int y) -{ - ButtonList *bl; - - if (!window || window->page->type == UnloadedPageType) - return NULL; - for (bl = window->page->s_button_list; bl != NULL; bl = bl->next) - if (x >= bl->x0 && x <= bl->x1 && y >= bl->y0 && y <= bl->y1) - return bl->link; - for (bl = window->page->button_list; bl != NULL; bl = bl->next) - if (x >= bl->x0 && x <= bl->x1 && y >= bl->y0 && y <= bl->y1) - return bl->link; - return NULL; -} - -static HyperLink * -get_hyper_link(XButtonEvent * event) -{ - HyperLink *l1, *l2; - - l1 = (HyperLink *) hash_find(gWindow->fWindowHashTable, (char *)&(event->window)); - if (l1) - return l1; - l2 = findButtonInList(gWindow, event->x, event->y); - return l2; -} - -/* - * Handle a button pressed event. window is the subwindow in which the event - * occured, and button is the button which was pressed - */ - -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 Pastebutton: - page = paste_button(link->reference.paste); - break; - case Link: - page_name = print_to_string(link->reference.node); - page = (HyperDocPage *) hash_find(gWindow->fPageHashTable, page_name); - break; - case Helpbutton: - helpForHyperDoc(); - page = NULL; - break; - case Scrollbar: - scrollScroller(event); - break; - case Scrollupbutton: - scrollUp(); - break; - case Scrolldownbutton: - scrollDown(); - break; - - case Inputstring: - /* 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 SimpleBox: - page = NULL; - toggle_input_box(link); - break; - case Radiobox: - page = NULL; - toggle_radio_box(link); - break; - case Quitbutton: - quitHyperDoc(); - break; - case Returnbutton: /* pop memo information */ - page = returnlink(); - break; - case Upbutton: /* pop downlink information */ - page = uplink(); - break; - case Downlink: - page = find_page(link->reference.node); - if (page && NotSpecial(page->type)) - downlink(); - break; - case Memolink: - page = find_page(link->reference.node); - if (page && NotSpecial(page->type)) - memolink(); - break; - case Windowlink: - page = find_page(link->reference.node); - if (page && NotSpecial(page->type)) { - windowlink_handler(link->reference.node); - gNeedIconName = 1; - page = NULL; - } - break; - case Lispwindowlink: - lispwindowlink_handler(link); - gNeedIconName = 1; - page = NULL; - break; - case LispMemoLink: - case Spadmemolink: - page = issue_server_command(link); - if (page && NotSpecial(page->type)) - memolink(); - break; - case LispDownLink: - case Spaddownlink: - page = issue_server_command(link); - if (page && NotSpecial(page->type)) - downlink(); - break; - case Spadlink: - case Lisplink: - page = issue_server_command(link); - break; - case Lispcommand: - case Qspadcall: - case Spadcall: - page = issue_server_command(link); - break; - case Lispcommandquit: - case Spadcallquit: - case Qspadcallquit: - page = issue_server_command(link); - exitHyperDoc(); - break; - case Spadcommand: - case Spadgraph: - case Spadsrc: - issue_spadcommand(gWindow->page, link->reference.node, - button == Button1, link->type); - break; - case Unixlink: - page = issue_unixlink(link->reference.node); - if (page && NotSpecial(page->type)) { - downlink(); - } - break; - case Unixcommand: - issue_unixcommand(link->reference.node); - break; - default: - break; - } - - if (page) { - switch (page->type) { /* check for special button types */ - case Quitbutton: - exitHyperDoc(); - return; - case Returnbutton: - gWindow->page = returnlink(); - break; - case Upbutton: - 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 != Pastebutton) - display_page(gWindow->page); - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; /* reset the window hash */ - } -} - - -void -exitHyperDoc(void) -{ - XEvent event; - - - if (gSessionHashTable.num_entries == 1 || gParentWindow == gWindow) { - free_hd_window(gWindow); - exit(0); - } - hash_delete(&gSessionHashTable, (char *)&gWindow->fMainWindow); - - /* - * Now we quickly want to flush all the events associated with this - * window from existence - */ - - XFlush(gXDisplay); - while (XCheckWindowEvent(gXDisplay, gWindow->fMainWindow, bigmask, &event)) { - } - while (XCheckWindowEvent(gXDisplay, gWindow->fScrollWindow,bigmask, &event)) { - } - while (XCheckWindowEvent(gXDisplay, gWindow->fDisplayedWindow, bigmask, &event)) { - } - while (XCheckWindowEvent(gXDisplay, gWindow->fScrollUpWindow, bigmask, &event)) { - } - while (XCheckWindowEvent(gXDisplay, gWindow->fScrollDownWindow, bigmask, &event)) { - } - while (XCheckWindowEvent(gXDisplay, gWindow->scrollbar, bigmask, &event)) { - } - while (XCheckWindowEvent(gXDisplay, gWindow->scroller, bigmask, &event)) { - } - - XDestroyWindow(gXDisplay, gWindow->fMainWindow); - free_hd_window(gWindow); - gWindow = NULL; - gActiveWindow = -1; - XFlush(gXDisplay); -} - -static int -set_window(Window window) -{ - Window root, parent, *children, grandparent,myarg; - HDWindow *htw; - unsigned int nchildren; - int st; - - myarg=window; - nchildren = 0; - htw = (HDWindow *) hash_find(&gSessionHashTable, (char *)&myarg); - if (htw != NULL) { - gWindow = htw; - return 1; - } - st = XQueryTree(gXDisplay, myarg, &root, &parent, &children, &nchildren); - if (st==0) goto ERROR; - if (nchildren > 0) - XFree(children); - htw = (HDWindow *) hash_find(&gSessionHashTable, (char *)&parent); - if (htw != NULL) { - gWindow = htw; - return 1; - - } - else { - /* check for a grandparent */ - st = XQueryTree(gXDisplay, parent, &root, &grandparent, &children, &nchildren); - if (st==0) goto ERROR; - if (nchildren > 0) - XFree(children); - htw = (HDWindow *) hash_find(&gSessionHashTable, (char *)&grandparent); - if (htw != NULL) { - gWindow = htw; - return 1; - } - } - - /* - * fprintf(stderr, "window(%d) and it's parent(%d) aren't in - * gSessionHashTable\n", window, parent); - - we never found that window. this happens if (not iff) we exit from - an unfocused non-main window under certain wm's and click-to-type. the program returns here with - the window handle that was just destroyed. So let's set the global gWindow - to the main window. - */ - -ERROR: - gWindow=gParentWindow; - return 0; -} - -/* - * This procedure whips thru the stack and clears all expose events for the - * given routine - */ -static void -clear_exposures(Window w) -{ - XEvent report; - - XFlush(gXDisplay); - while (XCheckTypedWindowEvent(gXDisplay, w, Expose, &report)); -} -void -get_new_window(void) -{ - - int val; - char buf[128]; - int frame; - Window wid; - HDWindow *htw; - HyperDocPage *hpage; - - - /* - * If I am going to try and start a new window, then I should make sure I - * have a coonection to listen on - * - * BUT This code is entered when a socket selects - * - * if (spad_socket == NULL) { spad_socket = - * connect_to_local_server(SpadServer, MenuServer, 10); if (spad_socket - * == NULL) { fprintf(stderr, "Get_new_window: Couldn't Connect to - * SpadServer\n"); return -1; } } - * - */ - - - frame = get_int(spad_socket); - val = get_int(spad_socket); - switch (val) { - case StartPage: - init_top_window(NULL); - val = get_int(spad_socket); - init_scanner(); - input_type = FromSpadSocket; - input_string = ""; - gWindow->page = parse_page_from_socket(); - gWindow->fAxiomFrame = frame; - XFlush(gXDisplay); - break; - case LinkToPage: - get_string_buf(spad_socket, buf, 128); - if (init_top_window(buf) == -1) { - fprintf(stderr, "get_new_window: Did not find page %s\n", buf); - /* return -1; */ - } - gWindow->fAxiomFrame = frame; - break; - case PopUpPage: - val = get_int(spad_socket); - init_form_window(NULL, val); - send_int(spad_socket, gWindow->fMainWindow); - init_scanner(); - input_type = FromSpadSocket; - input_string = ""; - gWindow->page = parse_page_from_socket(); - compute_form_page(gWindow->page); - - XMapWindow(gXDisplay, gWindow->fMainWindow); - - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - gWindow->fAxiomFrame = frame; - XFlush(gXDisplay); - break; - case PopUpNamedPage: - val = get_int(spad_socket); - get_string_buf(spad_socket, buf, 128); - - if (init_form_window(buf, val) == -1) { - send_int(spad_socket, -1); - break; - } - load_page(gWindow->page); - compute_form_page(gWindow->page); - - XMapWindow(gXDisplay, gWindow->fMainWindow); - - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - gWindow->fAxiomFrame = frame; - XFlush(gXDisplay); - send_int(spad_socket, gWindow->fMainWindow); - /* fprintf(stderr, "Window Id was %d\n", gWindow->fMainWindow); */ - break; - case ReplaceNamedPage: - wid = (Window) get_int(spad_socket); - get_string_buf(spad_socket, buf, 128); - - htw = (HDWindow *) hash_find(&gSessionHashTable,(char *)&wid); - if (htw == NULL) break; - hpage = (HyperDocPage *) hash_find(gWindow->fPageHashTable, buf); - if (hpage == NULL) break; - gWindow = htw; - gWindow->page = hpage; - display_page(gWindow->page); - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - clear_exposures(gWindow->fMainWindow); - clear_exposures(gWindow->fScrollWindow); - XFlush(gXDisplay); - break; - case ReplacePage: - wid = (Window) get_int(spad_socket); - set_window(wid); - init_scanner(); - input_type = FromSpadSocket; - input_string = ""; - gWindow->page = parse_page_from_socket(); - display_page(gWindow->page); - gWindow->fWindowHashTable = gWindow->page->fLinkHashTable; - clear_exposures(gWindow->fMainWindow); - clear_exposures(gWindow->fScrollWindow); - XFlush(gXDisplay); - break; - case KillPage: - /* Here the user wishes to kill the page */ - wid = (Window) get_int(spad_socket); - htw = (HDWindow *) hash_find(&gSessionHashTable,(char *)&wid); - if (htw !=NULL) { - gWindow = htw; - exitHyperDoc(); - break; - } - break; - } - } -static void -set_cursor(HDWindow *window,Cursor state) -{ - if (state == gBusyCursor) - XDefineCursor(gXDisplay, window->fMainWindow, gBusyCursor); - else if (state == gActiveCursor) - XDefineCursor(gXDisplay, window->fMainWindow, gActiveCursor); - else - XDefineCursor(gXDisplay, window->fMainWindow, gNormalCursor); - XFlush(gXDisplay); -} - -static void -change_cursor(Cursor state, HDWindow *window) -{ - if (window->fDisplayedCursor == state) - return; - window->fDisplayedCursor = state; - set_cursor(window, state); -} - -static void -handle_motion_event(XMotionEvent *event) -{ - if (!gWindow) - return; - if (findButtonInList(gWindow, event->x, event->y) != NULL) - change_cursor(gActiveCursor, gWindow); - else - change_cursor(gNormalCursor, gWindow); -} - -static void -init_cursor_state(HDWindow *window) -{ - if (window) { - int x, y, rx, ry, but; - Window r, c; - - XQueryPointer(gXDisplay, window->fMainWindow, - &r, &c, &rx, &ry, &x, &y,(unsigned int *) &but); - if (findButtonInList(window, x, y) != NULL) - change_cursor(gActiveCursor, window); - else - change_cursor(gNormalCursor, window); - } -} - -static void -init_cursor_states(void) -{ - hash_map(&gSessionHashTable,(MappableFunction) init_cursor_state); -} - - -static void -make_busy_cursor(HDWindow *window) -{ - change_cursor(gBusyCursor, window); -} - -static void -make_busy_cursors(void) -{ - hash_map(&gSessionHashTable, (MappableFunction)make_busy_cursor); -} - -static int -HyperDocErrorHandler(Display *display, XErrorEvent *xe) -{ - if (xe->request_code != 15) { - char buf[1024]; - - XGetErrorText(display, xe->error_code, buf, sizeof(buf)); - - fprintf(stderr, "error code = %d\n", xe->error_code); - fprintf(stderr, "major op code = %d\n", xe->request_code); - fprintf(stderr, "minor op code = %d\n", xe->minor_code); - fprintf(stderr, "XID = %ld\n", xe->resourceid); - fprintf(stderr, "%s\n", buf); - - if (xe->request_code != 15) - exit(-1); - } - return(0); -} - - - -static void -set_error_handlers(void) -{ - XSetErrorHandler(HyperDocErrorHandler); -} -@ -\section{License} -<<license>>= -/* -Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of The Numerical ALgorithms Group Ltd. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -@ -<<*>>= -<<license>> -<<event.c>> -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} |