[qwaq] Handle debug events at the app level

The debugger displays the source file but doesn't highlight the current
line yet.
This commit is contained in:
Bill Currie 2020-03-25 01:32:52 +09:00
parent c7597b94d2
commit 0d8815f274
4 changed files with 63 additions and 23 deletions

View file

@ -6,8 +6,10 @@
#include "event.h"
#include "qwaq-rect.h"
@class Array;
@class Group;
@class TextContext;
@class View;
@interface QwaqApplication: Object
{
@ -19,9 +21,12 @@
TextContext *screen;
Extent screenSize;
int autocount;
Array *debuggers;
}
-(Extent)size;
-(TextContext *)screen;
-addView:(View *)view;
-run;
@end

View file

@ -6,6 +6,7 @@ int fence;
#include "color.h"
#include "qwaq-app.h"
#include "qwaq-curses.h"
#include "qwaq-debugger.h"
#include "qwaq-group.h"
#include "qwaq-view.h"
@ -49,6 +50,8 @@ arp_end (void)
[screen scrollok: 1];
[screen clear];
wrefresh (stdscr);//FIXME
debuggers = [[Array array] retain];
return self;
}
@ -69,32 +72,50 @@ arp_end (void)
return self;
}
-(Debugger *)find_debugger:(qdb_target_t) target
{
Debugger *debugger;
for (int i = [debuggers count]; i-- > 0; ) {
debugger = [debuggers objectAtIndex: i];
if ([debugger debug_target].handle == target.handle) {
return debugger;
}
}
debugger = [[Debugger alloc] initWithTarget: target];
[debuggers addObject: debugger];
return debugger;
}
-handleEvent: (qwaq_event_t *) event
{
if (event.what == qe_resize) {
Extent delta;
delta.width = event.resize.width - screenSize.width;
delta.height = event.resize.height - screenSize.height;
switch (event.what) {
case qe_resize:
Extent delta;
delta.width = event.resize.width - screenSize.width;
delta.height = event.resize.height - screenSize.height;
resizeterm (event.resize.width, event.resize.height);
[screen resizeTo: {event.resize.width, event.resize.height}];
screenSize = [screen size];
[objects resize: delta];
[screen refresh];
event.what = qe_none;
return self;
resizeterm (event.resize.width, event.resize.height);
[screen resizeTo: {event.resize.width, event.resize.height}];
screenSize = [screen size];
[objects resize: delta];
[screen refresh];
event.what = qe_none;
break;
case qe_key:
if (event.key.code == '\x18' || event.key.code == '\x11') {
endState = event.message.int_val;
event.what = qe_none;
}
break;
case qe_debug_event:
[[self find_debugger:{event.message.int_val}] handleDebugEvent];
event.what = qe_none;
break;
}
if (event.what == qe_key
&& (event.key.code == '\x18' || event.key.code == '\x11')) {
event.what = qe_command;
event.message.int_val = qc_exit;
if (event.what != qe_none) {
[objects handleEvent: event];
}
if (event.what == qe_command
&& (event.message.int_val == qc_exit
|| event.message.int_val == qc_error)) {
endState = event.message.int_val;;
}
[objects handleEvent: event];
return self;
}
@ -114,6 +135,13 @@ arp_end (void)
} while (!endState);
return self;
}
-addView:(View *)view
{
[objects insertSelected: view];
[screen refresh];
return self;
}
@end
QwaqApplication *application;

View file

@ -18,6 +18,7 @@
Editor *current_file;
qdb_target_t debug_target;
}
-(qdb_target_t)debug_target;
-initWithTarget:(qdb_target_t) target;
-handleDebugEvent;
@end

View file

@ -1,5 +1,6 @@
#include <Array.h>
#include "qwaq-app.h"
#include "qwaq-curses.h"
#include "qwaq-debugger.h"
#include "qwaq-editor.h"
@ -7,6 +8,10 @@
#include "qwaq-window.h"
@implementation Debugger
-(qdb_target_t)debug_target
{
return debug_target;
}
-initWithTarget:(qdb_target_t) target
{
@ -16,8 +21,8 @@
debug_target = target;
files = [[Array array] retain];
//FIXME need a window manager
source_window = [[Window alloc] initWithRect: getwrect (stdscr)];
source_window = [[Window alloc] initWithRect: {nil, [application size]}];
[application addView:source_window];
return self;
}
@ -47,6 +52,7 @@
file_proxy = [[ProxyView alloc] initWithView: current_file];
//FIXME id<View>?
[source_window insertSelected: (View *) file_proxy];
[source_window redraw];
}
-handleDebugEvent