[qwaq] Extract the double-clicked word

The plan is to use it for variable lookups etc.
This commit is contained in:
Bill Currie 2020-03-25 17:29:08 +09:00
parent 585b33c111
commit 7b9177ec56
6 changed files with 84 additions and 11 deletions

View file

@ -79,8 +79,12 @@
-(void)key_event: (ed_event_t *)_event -(void)key_event: (ed_event_t *)_event
{ {
Editor *file = _event.editor;
qwaq_event_t *event = _event.event; qwaq_event_t *event = _event.event;
if (event.what == qe_keydown) { if (event.what == qe_mouseclick) {
printf ("%s\n", [file getWordAt: {event.mouse.x, event.mouse.y}]);
[source_window redraw];
} else if (event.what == qe_keydown) {
switch (event.key.code) { switch (event.key.code) {
case QFK_F7: case QFK_F7:
qdb_set_trace (debug_target, 1); qdb_set_trace (debug_target, 1);

View file

@ -277,6 +277,25 @@ getEOL (txtbuffer_t *buffer, unsigned ptr)
return ptr; return ptr;
} }
static always_inline void
readString (txtbuffer_t *buffer, eb_sel_t *sel, char *str)
{
unsigned start = sel->start;
unsigned length = sel->length;
unsigned end = sel->start + sel->length;
const char *ptr = buffer->text + spanGap (buffer, start);
if ((start < buffer->gapOffset && end <= buffer->gapOffset)
|| start > buffer->gapOffset) {
memcpy (str, ptr, length);
} else {
length = buffer->gapOffset - start;
memcpy (str, ptr, length);
str += length;
ptr += length + buffer->gapOffset;
memcpy (str, ptr, sel->length - length);
}
}
static always_inline unsigned static always_inline unsigned
getBOL (txtbuffer_t *buffer, unsigned ptr) getBOL (txtbuffer_t *buffer, unsigned ptr)
{ {
@ -773,6 +792,21 @@ bi_i_EditBuffer__getEOT (progs_t *pr)
R_INT (pr) = buffer->txtbuffer->textSize; R_INT (pr) = buffer->txtbuffer->textSize;
} }
static void
bi_i_EditBuffer__readString_ (progs_t *pr)
{
qwaq_ebresources_t *res = PR_Resources_Find (pr, "qwaq-editbuffer");
int buffer_id = P_STRUCT (pr, qwaq_editbuffer_t, 0).buffer;
editbuffer_t *buffer = get_editbuffer (res, __FUNCTION__, buffer_id);
__auto_type selection = &P_PACKED (pr, eb_sel_t, 2);
char *str = alloca (selection->length + 1);
str[selection->length] = 0;
readString (buffer->txtbuffer, selection, str);
RETURN_STRING (pr, str);
}
static void static void
bi_i_EditBuffer__countLines_ (progs_t *pr) bi_i_EditBuffer__countLines_ (progs_t *pr)
{ {
@ -901,6 +935,7 @@ static builtin_t builtins[] = {
{"_i_EditBuffer__getEOL_", bi_i_EditBuffer__getEOL_, -1}, {"_i_EditBuffer__getEOL_", bi_i_EditBuffer__getEOL_, -1},
{"_i_EditBuffer__getBOT", bi_i_EditBuffer__getBOT, -1}, {"_i_EditBuffer__getBOT", bi_i_EditBuffer__getBOT, -1},
{"_i_EditBuffer__getEOT", bi_i_EditBuffer__getEOT, -1}, {"_i_EditBuffer__getEOT", bi_i_EditBuffer__getEOT, -1},
{"_i_EditBuffer__readString_", bi_i_EditBuffer__readString_, -1},
{"_i_EditBuffer__countLines_", bi_i_EditBuffer__countLines_, -1}, {"_i_EditBuffer__countLines_", bi_i_EditBuffer__countLines_, -1},
{"_i_EditBuffer__search_for_direction_", {"_i_EditBuffer__search_for_direction_",
bi_i_EditBuffer__search_for_direction_, -1}, bi_i_EditBuffer__search_for_direction_, -1},

View file

@ -49,6 +49,7 @@ typedef struct eb_color_s {
- (unsigned) getEOL: (unsigned) linePtr; - (unsigned) getEOL: (unsigned) linePtr;
- (unsigned) getBOT; - (unsigned) getBOT;
- (unsigned) getEOT; - (unsigned) getEOT;
- (string) readString: (eb_sel_t) selection;
- (unsigned) countLines: (eb_sel_t) selection; - (unsigned) countLines: (eb_sel_t) selection;
- (eb_sel_t) search: (eb_sel_t) selection - (eb_sel_t) search: (eb_sel_t) selection

View file

@ -26,6 +26,7 @@
- (unsigned) getEOL: (unsigned) linePtr = #0; - (unsigned) getEOL: (unsigned) linePtr = #0;
- (unsigned) getBOT = #0; - (unsigned) getBOT = #0;
- (unsigned) getEOT = #0; - (unsigned) getEOT = #0;
- (string) readString: (eb_sel_t) selection = #0;
- (unsigned) countLines: (eb_sel_t) selection = #0; - (unsigned) countLines: (eb_sel_t) selection = #0;
- (eb_sel_t) search: (eb_sel_t) selection - (eb_sel_t) search: (eb_sel_t) selection

View file

@ -41,6 +41,7 @@ typedef struct ed_event_s {
-recenter:(int) force; -recenter:(int) force;
-gotoLine:(unsigned) line; -gotoLine:(unsigned) line;
-highlightLine; -highlightLine;
-(string)getWordAt:(Point) pos; // view relative coordinates
@end @end
#endif//__qwaq_editor_h #endif//__qwaq_editor_h

View file

@ -51,38 +51,57 @@
return self; return self;
} }
-handleEvent:(qwaq_event_t *) event static int handleEvent (Editor *self, qwaq_event_t *event)
{ {
// give any listeners a chance to override or extend event handling
_event.editor = self;
_event.event = event;
[onEvent respond: &_event];
if (event.what & qe_mouse) { if (event.what & qe_mouse) {
if (event.what == qe_mouseclick) { if (event.what == qe_mouseclick) {
if (event.mouse.buttons & (1 << 3)) { if (event.mouse.buttons & (1 << 3)) {
[self scrollUp: 1]; [self scrollUp: 1];
return 1;
} }
if (event.mouse.buttons & (1 << 4)) { if (event.mouse.buttons & (1 << 4)) {
[self scrollDown: 1]; [self scrollDown: 1];
return 1;
} }
if (event.mouse.buttons & (1 << 5)) { if (event.mouse.buttons & (1 << 5)) {
[self scrollLeft: 1]; [self scrollLeft: 1];
return 1;
} }
if (event.mouse.buttons & (1 << 6)) { if (event.mouse.buttons & (1 << 6)) {
[self scrollRight: 1]; [self scrollRight: 1];
return 1;
} }
} }
} else if (event.what == qe_keydown) { } else if (event.what == qe_keydown) {
switch (event.key.code) { switch (event.key.code) {
case QFK_PAGEUP: case QFK_PAGEUP:
[self scrollUp: ylen]; [self scrollUp: self.ylen];
break; return 1;
case QFK_PAGEDOWN: case QFK_PAGEDOWN:
[self scrollDown: ylen]; [self scrollDown: self.ylen];
break; return 1;
} }
} }
event.what = qe_none; return 0;
}
-handleEvent:(qwaq_event_t *) event
{
// give any listeners a chance to override or extend event handling
_event.editor = self;
_event.event = event;
if (event.what & qe_positional) {
event.mouse.x -= xpos;
event.mouse.y -= ypos;
}
[onEvent respond: &_event];
if (handleEvent (self, event)) {
event.what = qe_none;
}
if (event.what & qe_positional) {
event.mouse.x += xpos;
event.mouse.y += ypos;
}
return self; return self;
} }
@ -174,4 +193,16 @@
return self; return self;
} }
-(string)getWordAt:(Point) pos
{
if (pos.x < 0 || pos.y < 0 || pos.x >= xlen || pos.y >= ylen) {
return nil;
}
pos.x += scroll.x;
unsigned lind = [buffer nextLine:base_index :pos.y];
unsigned cind = [buffer charPtr:lind at:pos.x];
eb_sel_t word = [buffer getWord: cind];
return [buffer readString:word];
}
@end @end