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; } }
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; } }