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