Compare commits
2 Commits
2b13f891c9
...
2341228efd
Author | SHA1 | Date | |
---|---|---|---|
2341228efd | |||
2e3005d88b |
1
xC-proto
1
xC-proto
@ -60,6 +60,7 @@ struct EventMessage {
|
|||||||
string buffer_name;
|
string buffer_name;
|
||||||
case BUFFER_LINE:
|
case BUFFER_LINE:
|
||||||
string buffer_name;
|
string buffer_name;
|
||||||
|
bool leak_to_active;
|
||||||
bool is_unimportant;
|
bool is_unimportant;
|
||||||
bool is_highlight;
|
bool is_highlight;
|
||||||
enum Rendition {
|
enum Rendition {
|
||||||
|
14
xC.c
14
xC.c
@ -3097,7 +3097,7 @@ relay_prepare_buffer_activate (struct app_context *ctx, struct buffer *buffer)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
relay_prepare_buffer_line (struct app_context *ctx, struct buffer *buffer,
|
relay_prepare_buffer_line (struct app_context *ctx, struct buffer *buffer,
|
||||||
struct buffer_line *line)
|
struct buffer_line *line, bool leak_to_active)
|
||||||
{
|
{
|
||||||
struct relay_event_message *m = relay_prepare (ctx);
|
struct relay_event_message *m = relay_prepare (ctx);
|
||||||
struct relay_event_data_buffer_line *e = &m->data.buffer_line;
|
struct relay_event_data_buffer_line *e = &m->data.buffer_line;
|
||||||
@ -3107,6 +3107,7 @@ relay_prepare_buffer_line (struct app_context *ctx, struct buffer *buffer,
|
|||||||
e->is_highlight = !!(line->flags & BUFFER_LINE_HIGHLIGHT);
|
e->is_highlight = !!(line->flags & BUFFER_LINE_HIGHLIGHT);
|
||||||
e->rendition = 1 + line->r;
|
e->rendition = 1 + line->r;
|
||||||
e->when = line->when * 1000;
|
e->when = line->when * 1000;
|
||||||
|
e->leak_to_active = leak_to_active;
|
||||||
|
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
for (size_t i = 0; line->items[i].type; i++)
|
for (size_t i = 0; line->items[i].type; i++)
|
||||||
@ -4588,9 +4589,6 @@ log_formatter (struct app_context *ctx, struct buffer *buffer,
|
|||||||
if (buffer->log_file)
|
if (buffer->log_file)
|
||||||
buffer_line_write_to_log (ctx, line, buffer->log_file);
|
buffer_line_write_to_log (ctx, line, buffer->log_file);
|
||||||
|
|
||||||
relay_prepare_buffer_line (ctx, buffer, line);
|
|
||||||
relay_broadcast (ctx);
|
|
||||||
|
|
||||||
bool unseen_pm = buffer->type == BUFFER_PM
|
bool unseen_pm = buffer->type == BUFFER_PM
|
||||||
&& buffer != ctx->current_buffer
|
&& buffer != ctx->current_buffer
|
||||||
&& !(flags & BUFFER_LINE_UNIMPORTANT);
|
&& !(flags & BUFFER_LINE_UNIMPORTANT);
|
||||||
@ -4607,6 +4605,10 @@ log_formatter (struct app_context *ctx, struct buffer *buffer,
|
|||||||
&& buffer == ctx->current_buffer->server->buffer))
|
&& buffer == ctx->current_buffer->server->buffer))
|
||||||
can_leak = true;
|
can_leak = true;
|
||||||
|
|
||||||
|
relay_prepare_buffer_line
|
||||||
|
(ctx, buffer, line, can_leak && !ctx->isolate_buffers);
|
||||||
|
relay_broadcast (ctx);
|
||||||
|
|
||||||
bool displayed = true;
|
bool displayed = true;
|
||||||
if (ctx->terminal_suspended > 0)
|
if (ctx->terminal_suspended > 0)
|
||||||
// Another process is using the terminal
|
// Another process is using the terminal
|
||||||
@ -5011,7 +5013,7 @@ buffer_merge (struct app_context *ctx,
|
|||||||
// And since there is no log_*() call, send them to relays manually
|
// And since there is no log_*() call, send them to relays manually
|
||||||
LIST_FOR_EACH (struct buffer_line, line, start)
|
LIST_FOR_EACH (struct buffer_line, line, start)
|
||||||
{
|
{
|
||||||
relay_prepare_buffer_line (ctx, buffer, line);
|
relay_prepare_buffer_line (ctx, buffer, line, false);
|
||||||
relay_broadcast (ctx);
|
relay_broadcast (ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15166,7 +15168,7 @@ client_resync (struct client *c)
|
|||||||
|
|
||||||
LIST_FOR_EACH (struct buffer_line, line, buffer->lines)
|
LIST_FOR_EACH (struct buffer_line, line, buffer->lines)
|
||||||
{
|
{
|
||||||
relay_prepare_buffer_line (c->ctx, buffer, line);
|
relay_prepare_buffer_line (c->ctx, buffer, line, false);
|
||||||
relay_send (c);
|
relay_send (c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,9 @@ body {
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.leaked {
|
||||||
|
opacity: 50%;
|
||||||
|
}
|
||||||
.date {
|
.date {
|
||||||
padding: .3rem;
|
padding: .3rem;
|
||||||
grid-column: span 2;
|
grid-column: span 2;
|
||||||
|
@ -195,10 +195,12 @@ rpc.addEventListener('BufferActivate', event => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
rpc.addEventListener('BufferLine', event => {
|
rpc.addEventListener('BufferLine', event => {
|
||||||
let e = event.detail, b = buffers.get(e.bufferName)
|
let e = event.detail, b = buffers.get(e.bufferName),
|
||||||
if (b === undefined)
|
line = {when: e.when, rendition: e.rendition, items: e.items}
|
||||||
return
|
if (b !== undefined)
|
||||||
b.lines.push({when: e.when, rendition: e.rendition, items: e.items})
|
b.lines.push({...line})
|
||||||
|
if (e.leakToActive && (b = buffers.get(bufferCurrent)) !== undefined)
|
||||||
|
b.lines.push({leaked: true, ...line})
|
||||||
})
|
})
|
||||||
|
|
||||||
rpc.addEventListener('BufferClear', event => {
|
rpc.addEventListener('BufferClear', event => {
|
||||||
@ -327,7 +329,7 @@ let Content = {
|
|||||||
classes.add(c)
|
classes.add(c)
|
||||||
}
|
}
|
||||||
let fg = -1, bg = -1, inverse = false
|
let fg = -1, bg = -1, inverse = false
|
||||||
return m('.content', {}, [mark, line.items.flatMap(item => {
|
return m('.content', vnode.attrs, [mark, line.items.flatMap(item => {
|
||||||
switch (item.kind) {
|
switch (item.kind) {
|
||||||
case 'Text':
|
case 'Text':
|
||||||
return Content.linkify(item.text, {
|
return Content.linkify(item.text, {
|
||||||
@ -393,8 +395,12 @@ let Buffer = {
|
|||||||
lastDateMark = dateMark
|
lastDateMark = dateMark
|
||||||
}
|
}
|
||||||
|
|
||||||
lines.push(m('.time', {}, date.toLocaleTimeString()))
|
let attrs = {}
|
||||||
lines.push(m(Content, {}, line))
|
if (line.leaked)
|
||||||
|
attrs.class = 'leaked'
|
||||||
|
|
||||||
|
lines.push(m('.time', {...attrs}, date.toLocaleTimeString()))
|
||||||
|
lines.push(m(Content, {...attrs}, line))
|
||||||
})
|
})
|
||||||
return m('.buffer', {}, lines)
|
return m('.buffer', {}, lines)
|
||||||
},
|
},
|
||||||
@ -421,16 +427,28 @@ let BufferContainer = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let Input = {
|
let Input = {
|
||||||
|
counter: 0,
|
||||||
|
stamp: textarea => {
|
||||||
|
return [Input.counter,
|
||||||
|
textarea.selectionStart, textarea.selectionEnd, textarea.value]
|
||||||
|
},
|
||||||
|
|
||||||
complete: textarea => {
|
complete: textarea => {
|
||||||
if (textarea.selectionStart !== textarea.selectionEnd)
|
if (textarea.selectionStart !== textarea.selectionEnd)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
// Cancel any previous autocomplete, and ensure applicability.
|
||||||
|
Input.counter++
|
||||||
|
let state = Input.stamp(textarea)
|
||||||
rpc.send({
|
rpc.send({
|
||||||
command: 'BufferComplete',
|
command: 'BufferComplete',
|
||||||
bufferName: bufferCurrent,
|
bufferName: bufferCurrent,
|
||||||
text: textarea.value,
|
text: textarea.value,
|
||||||
position: textarea.selectionEnd,
|
position: textarea.selectionEnd,
|
||||||
}).then(resp => {
|
}).then(resp => {
|
||||||
|
if (!Input.stamp(textarea).every((v, k) => v === state[k]))
|
||||||
|
return
|
||||||
|
|
||||||
// TODO: Somehow display remaining options, or cycle through.
|
// TODO: Somehow display remaining options, or cycle through.
|
||||||
if (resp.completions.length)
|
if (resp.completions.length)
|
||||||
textarea.setRangeText(resp.completions[0],
|
textarea.setRangeText(resp.completions[0],
|
||||||
@ -456,8 +474,6 @@ let Input = {
|
|||||||
// TODO: And perhaps on other actions, too.
|
// TODO: And perhaps on other actions, too.
|
||||||
rpc.send({command: 'Active'})
|
rpc.send({command: 'Active'})
|
||||||
|
|
||||||
// TODO: Cancel any current autocomplete.
|
|
||||||
|
|
||||||
let textarea = event.currentTarget
|
let textarea = event.currentTarget
|
||||||
let handled = false
|
let handled = false
|
||||||
switch (event.keyCode) {
|
switch (event.keyCode) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user