1
1
mirror of https://github.com/qvacua/vimr.git synced 2024-11-24 11:37:32 +03:00

GH-229 Send dirty status when changed to the UI

This commit is contained in:
Tae Won Ha 2016-08-18 23:11:33 +02:00
parent ea31a26676
commit 49cf51077c
No known key found for this signature in database
GPG Key ID: E40743465B5B8B44
8 changed files with 70 additions and 5 deletions

View File

@ -34,8 +34,9 @@ typedef NS_ENUM(NSUInteger, NeoVimServerMsgId) {
NeoVimServerMsgIdSuspend, NeoVimServerMsgIdSuspend,
NeoVimServerMsgIdSetTitle, NeoVimServerMsgIdSetTitle,
NeoVimServerMsgIdSetIcon, NeoVimServerMsgIdSetIcon,
NeoVimServerMsgIdDirtyStatusChanged,
NeoVimServerMsgIdStop, NeoVimServerMsgIdStop,
#ifdef DEBUG #ifdef DEBUG
NeoVimServerDebug1, NeoVimServerDebug1,
#endif #endif

View File

@ -22,6 +22,8 @@
#import <nvim/event/signal.h> #import <nvim/event/signal.h>
#import <nvim/main.h> #import <nvim/main.h>
#import <nvim/ex_getln.h> #import <nvim/ex_getln.h>
#import <nvim/fileio.h>
#import <nvim/undo.h>
#define pun_type(t, x) (*((t *)(&x))) #define pun_type(t, x) (*((t *)(&x)))
@ -65,6 +67,8 @@ static int _marked_delta = 0;
static int _put_row = -1; static int _put_row = -1;
static int _put_column = -1; static int _put_column = -1;
static bool _dirty = false;
static NSString *_backspace = nil; static NSString *_backspace = nil;
static dispatch_queue_t _queue; static dispatch_queue_t _queue;
@ -404,7 +408,7 @@ static void server_ui_set_title(UI *ui __unused, char *title) {
if (title == NULL) { if (title == NULL) {
return; return;
} }
queue(^{ queue(^{
NSString *string = [[NSString alloc] initWithCString:title encoding:NSUTF8StringEncoding]; NSString *string = [[NSString alloc] initWithCString:title encoding:NSUTF8StringEncoding];
[_neovim_server sendMessageWithId:NeoVimServerMsgIdSetTitle data:[string dataUsingEncoding:NSUTF8StringEncoding]]; [_neovim_server sendMessageWithId:NeoVimServerMsgIdSetTitle data:[string dataUsingEncoding:NSUTF8StringEncoding]];
@ -416,7 +420,7 @@ static void server_ui_set_icon(UI *ui __unused, char *icon) {
if (icon == NULL) { if (icon == NULL) {
return; return;
} }
queue(^{ queue(^{
NSString *string = [[NSString alloc] initWithCString:icon encoding:NSUTF8StringEncoding]; NSString *string = [[NSString alloc] initWithCString:icon encoding:NSUTF8StringEncoding];
[_neovim_server sendMessageWithId:NeoVimServerMsgIdSetIcon data:[string dataUsingEncoding:NSUTF8StringEncoding]]; [_neovim_server sendMessageWithId:NeoVimServerMsgIdSetIcon data:[string dataUsingEncoding:NSUTF8StringEncoding]];
@ -469,6 +473,22 @@ static void neovim_input(void **argv) {
} }
} }
static void neovim_send_dirty_status(void **argv) {
@autoreleasepool {
bool new_dirty_status = server_has_dirty_docs();
// log4Debug("dirty status: %d vs. %d", _dirty, new_dirty_status);
if (_dirty == new_dirty_status) {
return;
}
_dirty = new_dirty_status;
// log4Debug("sending dirty status: %d", _dirty);
NSData *data = [[NSData alloc] initWithBytes:&_dirty length:sizeof(bool)];
[_neovim_server sendMessageWithId:NeoVimServerMsgIdDirtyStatusChanged data:data];
[data release];
}
}
static void delete_marked_text() { static void delete_marked_text() {
NSUInteger length = [_marked_text lengthOfBytesUsingEncoding:NSUTF32StringEncoding] / 4; NSUInteger length = [_marked_text lengthOfBytesUsingEncoding:NSUTF32StringEncoding] / 4;
@ -523,6 +543,24 @@ void custom_ui_start(void) {
ui_bridge_attach(ui, server_ui_main, server_ui_scheduler); ui_bridge_attach(ui, server_ui_main, server_ui_scheduler);
} }
void custom_ui_autocmds_groups(
event_T event, char_u *fname, char_u *fname_io, int group, bool force, buf_T *buf, exarg_T *eap
) {
log4Debug("got event %d for file %s in group %d.", event, fname, group);
switch (event) {
// Did we get them all?
case EVENT_TEXTCHANGED:
case EVENT_TEXTCHANGEDI:
case EVENT_BUFWRITEPOST:
case EVENT_BUFLEAVE:
loop_schedule(&main_loop, event_create(1, neovim_send_dirty_status, 0));
return;
default:
return;
}
}
void server_start_neovim() { void server_start_neovim() {
_queue = dispatch_queue_create("com.qvacua.vimr.neovim-server.queue", DISPATCH_QUEUE_SERIAL); _queue = dispatch_queue_create("com.qvacua.vimr.neovim-server.queue", DISPATCH_QUEUE_SERIAL);
@ -652,7 +690,11 @@ void server_insert_marked_text(NSString *markedText) {
bool server_has_dirty_docs() { bool server_has_dirty_docs() {
FOR_ALL_BUFFERS(buffer) { FOR_ALL_BUFFERS(buffer) {
if (buffer->b_changed) { if (buffer->b_p_bl == 0) {
continue;
}
if (bufIsChanged(buffer)) {
return true; return true;
} }
} }
@ -673,6 +715,10 @@ NSString *server_escaped_filename(NSString *filename) {
NSArray *server_buffers() { NSArray *server_buffers() {
NSMutableArray <NeoVimBuffer *> *result = [[NSMutableArray new] autorelease]; NSMutableArray <NeoVimBuffer *> *result = [[NSMutableArray new] autorelease];
FOR_ALL_BUFFERS(buf) { FOR_ALL_BUFFERS(buf) {
if (buf->b_p_bl == 0) {
continue;
}
NSString *fileName = nil; NSString *fileName = nil;
if (buf->b_ffname != NULL) { if (buf->b_ffname != NULL) {
fileName = [NSString stringWithCString:(const char *) buf->b_ffname encoding:NSUTF8StringEncoding]; fileName = [NSString stringWithCString:(const char *) buf->b_ffname encoding:NSUTF8StringEncoding];

View File

@ -383,6 +383,12 @@ static CFDataRef local_server_callback(CFMessagePortRef local, SInt32 msgid, CFD
return; return;
} }
case NeoVimServerMsgIdDirtyStatusChanged: {
bool *values = data_to_bool_array(data, 1);
[_bridge setDirtyStatus:values[0]];
return;
}
case NeoVimServerMsgIdStop: case NeoVimServerMsgIdStop:
[_bridge stop]; [_bridge stop];
return; return;

View File

@ -113,6 +113,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)suspend; - (void)suspend;
- (void)setTitle:(NSString *)title; - (void)setTitle:(NSString *)title;
- (void)setIcon:(NSString *)icon; - (void)setIcon:(NSString *)icon;
- (void)setDirtyStatus:(bool)dirty;
/** /**
* NeoVim has been stopped. * NeoVim has been stopped.

View File

@ -1161,6 +1161,12 @@ extension NeoVimView: NeoVimUiBridgeProtocol {
public func setIcon(icon: String) { public func setIcon(icon: String) {
} }
public func setDirtyStatus(dirty: Bool) {
DispatchUtils.gui {
self.delegate?.setDirtyStatus(dirty)
}
}
public func stop() { public func stop() {
DispatchUtils.gui { DispatchUtils.gui {

View File

@ -9,6 +9,7 @@ import Cocoa
public protocol NeoVimViewDelegate: class { public protocol NeoVimViewDelegate: class {
func setTitle(title: String) func setTitle(title: String)
func setDirtyStatus(dirty: Bool)
func neoVimReady() func neoVimReady()
func neoVimStopped() func neoVimStopped()
} }

View File

@ -143,6 +143,10 @@ extension MainWindowComponent {
self.neoVimView.open(urls: self.urlsToBeOpenedWhenReady) self.neoVimView.open(urls: self.urlsToBeOpenedWhenReady)
} }
func setDirtyStatus(dirty: Bool) {
self.windowController.setDocumentEdited(dirty)
}
func neoVimStopped() { func neoVimStopped() {
self.windowController.close() self.windowController.close()

2
neovim

@ -1 +1 @@
Subproject commit f0b9c99c6395f770b1341f8b4270da1e3691143b Subproject commit 504960182eec29a5b5e00547f2d7836eab324e1b