|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: K T
Length: 3897 (0xf39)
Types: TextFile
Names: »Keymap.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/doc/Keymap.c«
/*
* Copyright (c) 1991 Stanford University
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Stanford not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. Stanford makes no representations about
* the suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
* IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* Keymap for doc
*/
#include "Keymap.h"
#include "Document.h"
#include "DocViewer.h"
#include "ItemView.h"
#include <InterViews/event.h>
#include <InterViews/world.h>
#include <string.h>
class DocKeymapInfo {
public:
long _key;
char* _command;
};
#include "list.h"
declareList(DocKeymapInfo_List,DocKeymapInfo)
implementList(DocKeymapInfo_List,DocKeymapInfo)
DocKeymap::DocKeymap (DocumentViewer* viewer, const char* name) {
_viewer = viewer;
_info = new DocKeymapInfo_List();
Document* document = viewer->document();
const char* def = World::current()->property_value(name);
boolean done = def == nil;
while (!done) {
char line[256];
char* p = line;
char c;
do {
c = *def; if (c == '\n') c = '\0'; *p = c;
if (*def == '\0') done = true;
++p; ++def;
} while (c != '\0');
p = line;
while (*p == ' ' || *p == '\t') ++p;
char* key;
if (*p == '<') {
key = p + 1;
p = strchr(key, '>');
*p = '\0';
++p;
} else {
key = "";
}
char* command;
while (*p == ' ' || *p == '\t') ++p;
if (*p == '(') {
command = p + 1;
p = strchr(command, ')');
*p = '\0';
++p;
} else {
command = "";
}
DocKeymapInfo info;
info._key = document->parse_text(key);
info._command = strcpy(new char[strlen(command) + 1], command);
_info->append(info);
}
}
DocKeymap::~DocKeymap () {
while (_info->count() > 0) {
DocKeymapInfo& info = _info->item(0);
delete info._command;
_info->remove(0);
}
delete _info;
}
boolean DocKeymap::map (Event& e) {
char s[1];
if (
_viewer != nil
&& e.type() == Event::key && e.mapkey(s, sizeof(s)) > 0
) {
_viewer->ref();
ItemView* view = _viewer->focus();
long count = _info->count();
int key = s[0];
if (key < 0) {
key += 256;
}
for (long i = 0; i < count; ++i) {
DocKeymapInfo& info = _info->item(i);
if (info._key == key) {
boolean pending_repair;
if (view != nil) {
pending_repair = view->command(info._command);
} else {
pending_repair = _viewer->command(info._command);
}
if (pending_repair && !e.pending()) {
view->repair();
}
break;
}
}
_viewer->unref();
return i < count;
} else {
return false;
}
}