August 04

dub.json:

{
    "name": "maximize",
    "targetType": "dynamicLibrary",
    "sourceFiles": ["source/maximize.d"],
    "dependencies": {},
	"libs":["user32","kernel32"]
}

maximize.d:

module maximize;

import core.sys.windows.windows;
import core.sys.windows.windef;
import core.sys.windows.winnt;
import core.stdc.string;
import std.string;

extern (Windows) BOOL DllMain( HMODULE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    	case DLL_PROCESS_ATTACH:
   		case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
        break;
		default:break;	
    }
	
    return TRUE;
}

extern(C) int strcmp(const(char)* s1, const(char)* s2);

extern (Windows) BOOL EnumThreadWndProc(HWND hwnd, LPARAM lParam) {

    HWND* pVimWin = cast(HWND*) lParam;

	char[256] className;

	GetClassNameA(hwnd, cast(LPSTR)className.ptr, cast(int)className.length);
	
	if (strcmp(className.toStringz(), "Vim") == 0 || strcmp(className.toStringz, "GVim") == 0)
	{

		*pVimWin = hwnd;
        OutputDebugString("Found Vim/GVim window\n");

	    return FALSE; // Stop enumeration
    }

    return TRUE; // Continue enumeration
}

extern (C) export LONG Maximize(LONG param) {
    HWND vimwin = null;
    DWORD threadid = GetCurrentThreadId();

    OutputDebugString("Starting EnumThreadWindows\n");

	// Enumerate all windows in the current thread
    EnumThreadWindows(threadid, cast(WNDENUMPROC)&EnumThreadWndProc, cast(LPARAM)&vimwin);

    if (vimwin != null) {
        OutputDebugString("Vim/GVim window found\n");
        if (param == 1) {
            ShowWindow(vimwin, SW_MAXIMIZE); // Maximize window
        }
        else if (param == 0) {
            ShowWindow(vimwin, SW_RESTORE); // Restore window
        }
        return 1; // Success
    } else {
        OutputDebugString("Vim/GVim window not found\n");
        return 0; // Failure: Vim window not found
    }
}

maximize.vim:

" Vim plugin file
" Maintainer: kAtremer <katremer@yandex.ru>
" Last changed: 2007 Oct 16
"
" maximize.vim
" maximize gVim's window on startup on Win32
"
" to install, put the script and maximize.dll
" in $VIM\vimfiles\plugin

" Execute only once {{{
if exists("g:loaded_maximize")
    finish
endif
let g:loaded_maximize = 1
" }}}

" Set the default compatibility options {{{
" (don't know if they do any difference, in such a small script...)
let s:save_cpoptions = &cpoptions
set cpoptions&vim
" }}}

" Define the path to the DLL file
let s:dllfile = expand('<sfile>:p:h') . './maximize.dll'

" Maximize GVim window on startup
 autocmd GUIEnter * call libcallnr(s:dllfile, 'Maximize', g:loaded_maximize)

" ToggleVimResize function
function! ToggleVimResize()
    " Checking the current value of g:loaded_maximize
    if g:loaded_maximize == 1
        " If the window is maximized, change the value to 0 (reduce the window)
        let g:loaded_maximize = 0
    else
        " If the window is not maximized, change the value to 1 (maximize the window)
        let g:loaded_maximize = 1
    endif

    " Call the Maximize function with the new value g:loaded_maximize
      call libcallnr(s:dllfile, 'Maximize', g:loaded_maximize)
endfunction


" Restore the saved compatibility options {{{
let &cpoptions = s:save_cpoptions
" }}}

" vim:fdm=marker:fmr={{{,}}}

" Binding the ToggleVimResize() function to the F11 key in various modes
nnoremap <F11> :call ToggleVimResize()<CR>
inoremap <F11> <C-o>:call ToggleVimResize()<CR>
vnoremap <F11> :<C-u>call ToggleVimResize()<CR>