Skip to content

Commit 3d326da

Browse files
committed
Adds features #16, #17, #18, fixes #15
1 parent 037fd91 commit 3d326da

File tree

5 files changed

+72
-12
lines changed

5 files changed

+72
-12
lines changed

src/main.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ void ProcessMPackMessage(Context *context, mpack_tree_t *tree) {
7777
ShowWindow(context->hwnd, SW_SHOWDEFAULT);
7878
} break;
7979
case NvimRequest::nvim_input:
80-
case NvimRequest::nvim_input_mouse: {
80+
case NvimRequest::nvim_input_mouse:
81+
case NvimRequest::nvim_command: {
8182
} break;
8283
}
8384
}
@@ -263,6 +264,11 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
263264
}
264265
}
265266
} return 0;
267+
case WM_DROPFILES: {
268+
char file_to_open[MAX_PATH];
269+
DragQueryFileA(reinterpret_cast<HDROP>(wparam), 0, file_to_open, MAX_PATH);
270+
NvimOpenFile(context->nvim, file_to_open);
271+
} return 0;
266272
}
267273

268274
return DefWindowProc(hwnd, msg, wparam, lparam);
@@ -274,11 +280,13 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, PWSTR p_cmd_lin
274280
int n_args;
275281
LPWSTR *cmd_line_args = CommandLineToArgvW(GetCommandLineW(), &n_args);
276282
bool start_maximized = false;
283+
bool disable_ligatures = false;
284+
float linespace_factor = 1.0f;
277285
int64_t rows = 0;
278286
int64_t cols = 0;
279287

280288
constexpr int MAX_NVIM_CMD_LINE_SIZE = 32767;
281-
wchar_t nvim_command_line[MAX_NVIM_CMD_LINE_SIZE];
289+
wchar_t nvim_command_line[MAX_NVIM_CMD_LINE_SIZE] = {};
282290
wcscpy_s(nvim_command_line, MAX_NVIM_CMD_LINE_SIZE, L"nvim --embed");
283291
int cmd_line_size_left = MAX_NVIM_CMD_LINE_SIZE - wcslen(L"nvim --embed");
284292

@@ -287,19 +295,31 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, PWSTR p_cmd_lin
287295
if(!wcscmp(cmd_line_args[i], L"--maximize")) {
288296
start_maximized = true;
289297
}
298+
else if(!wcscmp(cmd_line_args[i], L"--disable-ligatures")) {
299+
disable_ligatures = true;
300+
}
290301
else if(!wcsncmp(cmd_line_args[i], L"--geometry=", wcslen(L"--geometry="))) {
291302
wchar_t *end_ptr;
292303
cols = wcstol(&cmd_line_args[i][11], &end_ptr, 10);
293304
rows = wcstol(end_ptr + 1, nullptr, 10);
294305
}
306+
else if(!wcsncmp(cmd_line_args[i], L"--linespace-factor=", wcslen(L"--linespace-factor="))) {
307+
wchar_t *end_ptr;
308+
float factor = wcstof(&cmd_line_args[i][19], &end_ptr);
309+
if(factor > 0.0f && factor < 20.0f) {
310+
linespace_factor = factor;
311+
}
312+
}
295313
// Otherwise assume the argument is a filename to open
296314
else {
297315
size_t arg_size = wcslen(cmd_line_args[i]);
298-
if(arg_size <= cmd_line_size_left) {
299-
wcscat_s(nvim_command_line, cmd_line_size_left, L" ");
300-
cmd_line_size_left -= 1;
316+
if(arg_size <= (cmd_line_size_left + 3)) {
317+
wcscat_s(nvim_command_line, cmd_line_size_left, L" \"");
318+
cmd_line_size_left -= 2;
301319
wcscat_s(nvim_command_line, cmd_line_size_left, cmd_line_args[i]);
302320
cmd_line_size_left -= arg_size;
321+
wcscat_s(nvim_command_line, cmd_line_size_left, L"\"");
322+
cmd_line_size_left -= 1;
303323
}
304324
}
305325
}
@@ -336,7 +356,8 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, PWSTR p_cmd_lin
336356
.saved_window_placement = WINDOWPLACEMENT { .length = sizeof(WINDOWPLACEMENT) }
337357
};
338358

339-
HWND hwnd = CreateWindow(
359+
HWND hwnd = CreateWindowEx(
360+
WS_EX_ACCEPTFILES,
340361
window_class_name,
341362
window_title,
342363
WS_OVERLAPPEDWINDOW,
@@ -351,7 +372,7 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, PWSTR p_cmd_lin
351372
);
352373
if (hwnd == NULL) return 1;
353374
context.hwnd = hwnd;
354-
RendererInitialize(&renderer, hwnd);
375+
RendererInitialize(&renderer, hwnd, disable_ligatures, linespace_factor);
355376
NvimInitialize(&nvim, nvim_command_line, hwnd);
356377

357378
MSG msg;

src/nvim/nvim.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,3 +564,18 @@ bool NvimProcessKeyDown(Nvim *nvim, int virtual_key) {
564564
return true;
565565
}
566566

567+
void NvimOpenFile(Nvim *nvim, const char *file_name) {
568+
char file_command[MAX_PATH + 2] = {};
569+
strcpy_s(file_command, MAX_PATH, "e ");
570+
strcat_s(file_command, MAX_PATH - 3, file_name);
571+
572+
char data[MAX_MPACK_OUTBOUND_MESSAGE_SIZE];
573+
mpack_writer_t writer;
574+
mpack_writer_init(&writer, data, MAX_MPACK_OUTBOUND_MESSAGE_SIZE);
575+
MPackStartRequest(RegisterRequest(nvim, nvim_command), NVIM_REQUEST_NAMES[nvim_command], &writer);
576+
mpack_start_array(&writer, 1);
577+
mpack_write_cstr(&writer, file_command);
578+
mpack_finish_array(&writer);
579+
size_t size = MPackFinishMessage(&writer);
580+
MPackSendData(nvim->stdin_write, data, size);
581+
}

src/nvim/nvim.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ enum NvimRequest : uint8_t {
44
vim_get_api_info = 0,
55
nvim_input = 1,
66
nvim_input_mouse = 2,
7-
nvim_eval = 3
7+
nvim_eval = 3,
8+
nvim_command = 4
89
};
910
constexpr const char *NVIM_REQUEST_NAMES[] {
1011
"nvim_get_api_info",
1112
"nvim_input",
1213
"nvim_input_mouse",
13-
"nvim_eval"
14+
"nvim_eval",
15+
"nvim_command"
1416
};
1517
enum NvimOutboundNotification : uint8_t {
1618
nvim_ui_attach = 0,
@@ -64,3 +66,4 @@ void NvimSendInput(Nvim *nvim, const char* input_chars);
6466
void NvimSendInput(Nvim *nvim, int virtual_key, int flags);
6567
void NvimSendMouseInput(Nvim *nvim, MouseButton button, MouseAction action, int mouse_row, int mouse_col);
6668
bool NvimProcessKeyDown(Nvim *nvim, int virtual_key);
69+
void NvimOpenFile(Nvim *nvim, const char *file_name);

src/renderer/renderer.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ void InitializeD3D(Renderer *renderer) {
4444

4545
void InitializeDWrite(Renderer *renderer) {
4646
WIN_CHECK(DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory4), reinterpret_cast<IUnknown **>(&renderer->dwrite_factory)));
47+
if(renderer->disable_ligatures) {
48+
WIN_CHECK(renderer->dwrite_factory->CreateTypography(&renderer->dwrite_typography));
49+
WIN_CHECK(renderer->dwrite_typography->AddFontFeature(DWRITE_FONT_FEATURE {
50+
.nameTag = DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES,
51+
.parameter = 0
52+
}));
53+
}
4754
}
4855

4956
void HandleDeviceLost(Renderer *renderer);
@@ -157,8 +164,10 @@ void HandleDeviceLost(Renderer *renderer) {
157164
);
158165
}
159166

160-
void RendererInitialize(Renderer *renderer, HWND hwnd) {
167+
void RendererInitialize(Renderer *renderer, HWND hwnd, bool disable_ligatures, float linespace_factor) {
161168
renderer->hwnd = hwnd;
169+
renderer->disable_ligatures = disable_ligatures;
170+
renderer->linespace_factor = linespace_factor;
162171

163172
renderer->dpi_scale = GetDpiForSystem() / 96.0f;
164173
renderer->hl_attribs.resize(MAX_HIGHLIGHT_ATTRIBS);
@@ -278,6 +287,7 @@ void UpdateFontMetrics(Renderer *renderer, float font_size, const char* font_str
278287
renderer->font_ascent = ceilf(frac_font_ascent + half_linegap);
279288
renderer->font_descent = ceilf(frac_font_descent + half_linegap);
280289
renderer->font_height = renderer->font_ascent + renderer->font_descent;
290+
renderer->font_height *= renderer->linespace_factor;
281291

282292
WIN_CHECK(renderer->dwrite_factory->CreateTextFormat(
283293
renderer->font,
@@ -290,7 +300,7 @@ void UpdateFontMetrics(Renderer *renderer, float font_size, const char* font_str
290300
&renderer->dwrite_text_format
291301
));
292302

293-
WIN_CHECK(renderer->dwrite_text_format->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, renderer->font_height, renderer->font_ascent));
303+
WIN_CHECK(renderer->dwrite_text_format->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, renderer->font_height, renderer->font_ascent * renderer->linespace_factor));
294304
WIN_CHECK(renderer->dwrite_text_format->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR));
295305
WIN_CHECK(renderer->dwrite_text_format->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP));
296306

@@ -525,6 +535,12 @@ void DrawGridLine(Renderer *renderer, int row) {
525535
ApplyHighlightAttributes(renderer, &renderer->hl_attribs[hl_attrib_id], text_layout, col_offset, renderer->grid_cols);
526536

527537
renderer->d2d_context->PushAxisAlignedClip(rect, D2D1_ANTIALIAS_MODE_ALIASED);
538+
if(renderer->disable_ligatures) {
539+
text_layout->SetTypography(renderer->dwrite_typography, DWRITE_TEXT_RANGE {
540+
.startPosition = 0,
541+
.length = static_cast<uint32_t>(renderer->grid_cols)
542+
});
543+
}
528544
text_layout->Draw(renderer, renderer->glyph_renderer, 0.0f, rect.top);
529545
renderer->d2d_context->PopAxisAlignedClip();
530546
text_layout->Release();

src/renderer/renderer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ struct Renderer {
8484
IDWriteFactory4 *dwrite_factory;
8585
IDWriteTextFormat *dwrite_text_format;
8686

87+
bool disable_ligatures;
88+
IDWriteTypography *dwrite_typography;
89+
90+
float linespace_factor;
91+
8792
float last_requested_font_size;
8893
wchar_t font[MAX_FONT_LENGTH];
8994
DWRITE_FONT_METRICS1 font_metrics;
@@ -105,7 +110,7 @@ struct Renderer {
105110
bool ui_busy;
106111
};
107112

108-
void RendererInitialize(Renderer *renderer, HWND hwnd);
113+
void RendererInitialize(Renderer *renderer, HWND hwnd, bool disable_ligatures, float linespace_factor);
109114
void RendererAttach(Renderer *renderer);
110115
void RendererShutdown(Renderer *renderer);
111116

0 commit comments

Comments
 (0)