Skip to content

Commit

Permalink
Merge pull request #1 from frederich/master
Browse files Browse the repository at this point in the history
64 bit support
  • Loading branch information
derekmcloughlin committed May 18, 2017
2 parents d8b6c23 + 5c40a04 commit 6abfbd1
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 96 deletions.
188 changes: 96 additions & 92 deletions gvimfullscreen.c
Expand Up @@ -11,104 +11,108 @@ BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);

BOOL CALLBACK FindWindowProc(HWND hwnd, LPARAM lParam)
{
HWND* pphWnd = (HWND*)lParam;

if (GetParent(hwnd))
{
*pphWnd = NULL;
return TRUE;
}
*pphWnd = hwnd;
return FALSE;
HWND* pphWnd = (HWND*)lParam;

if (GetParent(hwnd))
{
*pphWnd = NULL;
return TRUE;
}
*pphWnd = hwnd;
return FALSE;
}

LONG _declspec(dllexport) ToggleFullScreen()
{
HWND hTop = NULL;
DWORD dwThreadID;

dwThreadID = GetCurrentThreadId();
EnumThreadWindows(dwThreadID, FindWindowProc, (LPARAM)&hTop);

if (hTop)
{
/* Determine the current state of the window */

if ( GetWindowLong(hTop, GWL_STYLE) & WS_CAPTION )
{
/* Has a caption, so isn't maximised */

MONITORINFO mi;
RECT rc;
HMONITOR hMonitor;

GetWindowRect(hTop, &rc);
hMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);

//
// get the work area or entire monitor rect.
//
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);

g_x = mi.rcMonitor.left;
g_y = mi.rcMonitor.top;
g_dx = mi.rcMonitor.right - g_x;
g_dy = mi.rcMonitor.bottom - g_y;
//cx = GetSystemMetrics(SM_CXSCREEN);
//cy = GetSystemMetrics(SM_CYSCREEN);

/* Remove border, caption, and edges */
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_EXSTYLE) & ~WS_BORDER);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) & ~WS_CAPTION);
SetWindowLong(hTop, GWL_EXSTYLE, GetWindowLong(hTop, GWL_STYLE) & ~WS_EX_CLIENTEDGE);
SetWindowLong(hTop, GWL_EXSTYLE, GetWindowLong(hTop, GWL_STYLE) & ~WS_EX_WINDOWEDGE);

SetWindowPos(hTop, HWND_TOP, g_x, g_y, g_dx, g_dy, SWP_SHOWWINDOW);

/* Now need to find the child text area window
* and set it's size accordingly
*/
EnumChildWindows(hTop, EnumChildProc, 0);
}
else
{
/* Already full screen, so restore all the previous styles */
SetWindowLong(hTop, GWL_EXSTYLE, GetWindowLong(hTop, GWL_EXSTYLE) | WS_BORDER);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_CAPTION);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_SYSMENU);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_MINIMIZEBOX);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_MAXIMIZEBOX);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_SYSMENU);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_EX_CLIENTEDGE);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_EX_WINDOWEDGE);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_THICKFRAME);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_DLGFRAME);


SendMessage(hTop, WM_SYSCOMMAND, SC_RESTORE, 0);
SendMessage(hTop, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
}
return GetLastError();
HWND hTop = NULL;
DWORD dwThreadID;

dwThreadID = GetCurrentThreadId();
EnumThreadWindows(dwThreadID, FindWindowProc, (LPARAM)&hTop);

if (hTop)
{
/* Determine the current state of the window */

if ( GetWindowLong(hTop, GWL_STYLE) & WS_CAPTION )
{
/* Has a caption, so isn't maximised */

MONITORINFO mi;
RECT rc;
HMONITOR hMonitor;

GetWindowRect(hTop, &rc);
hMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);

//
// get the work area or entire monitor rect.
//
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);

g_x = mi.rcMonitor.left;
g_y = mi.rcMonitor.top;
g_dx = mi.rcMonitor.right - g_x;
g_dy = mi.rcMonitor.bottom - g_y;
//cx = GetSystemMetrics(SM_CXSCREEN);
//cy = GetSystemMetrics(SM_CYSCREEN);

/* Remove border, caption, and edges */
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_EXSTYLE) & ~WS_BORDER);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) & ~WS_CAPTION);
SetWindowLong(hTop, GWL_EXSTYLE, GetWindowLong(hTop, GWL_STYLE) & ~WS_EX_CLIENTEDGE);
SetWindowLong(hTop, GWL_EXSTYLE, GetWindowLong(hTop, GWL_STYLE) & ~WS_EX_WINDOWEDGE);

SetWindowPos(hTop, HWND_TOP, g_x, g_y, g_dx, g_dy, SWP_SHOWWINDOW);

/* Now need to find the child text area window
* and set it's size accordingly
*/
EnumChildWindows(hTop, EnumChildProc, 0);
}
else
{
/* Already full screen, so restore all the previous styles */
SetWindowLong(hTop, GWL_EXSTYLE, GetWindowLong(hTop, GWL_EXSTYLE) | WS_BORDER);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_CAPTION);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_SYSMENU);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_MINIMIZEBOX);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_MAXIMIZEBOX);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_SYSMENU);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_EX_CLIENTEDGE);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_EX_WINDOWEDGE);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_THICKFRAME);
SetWindowLong(hTop, GWL_STYLE, GetWindowLong(hTop, GWL_STYLE) | WS_DLGFRAME);


SendMessage(hTop, WM_SYSCOMMAND, SC_RESTORE, 0);
SendMessage(hTop, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
}
return GetLastError();
}

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
char lpszClassName[100];
GetClassName(hwnd, lpszClassName, 100);
if ( strcmp(lpszClassName, "VimTextArea") == 0 )
{
//int cx, cy;
//cx = GetSystemMetrics(SM_CXSCREEN);
//cy = GetSystemMetrics(SM_CYSCREEN);

SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_EX_CLIENTEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_EX_WINDOWEDGE);
SetWindowPos(hwnd, HWND_TOP, 0, 0, g_dx, g_dy, SWP_SHOWWINDOW);

SetClassLong(hwnd, GCL_HBRBACKGROUND, CreateSolidBrush(RGB(0,0,0)));
}
return TRUE;

char lpszClassName[100];
HBRUSH b;

UNREFERENCED_PARAMETER(lParam);

GetClassName(hwnd, lpszClassName, 100);
if ( strcmp(lpszClassName, "VimTextArea") == 0 )
{
//int cx, cy;
//cx = GetSystemMetrics(SM_CXSCREEN);
//cy = GetSystemMetrics(SM_CYSCREEN);

SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_EX_CLIENTEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_EX_WINDOWEDGE);
SetWindowPos(hwnd, HWND_TOP, 0, 0, g_dx, g_dy, SWP_SHOWWINDOW);

b = CreateSolidBrush(RGB(0,0,0));
SetClassLongPtr (hwnd, GCLP_HBRBACKGROUND, (LONG_PTR) b);
}
return TRUE;
}
Binary file modified gvimfullscreen.dll
Binary file not shown.
Binary file added gvimfullscreen_64.dll
Binary file not shown.
23 changes: 19 additions & 4 deletions makefile
@@ -1,8 +1,23 @@
gvimfullscreen.dll: gvimfullscreen.c
cl /LD user32.lib gdi32.lib gvimfullscreen.c
CC =cl
CFLAGS =/W4 /WX /LD /Zi /Oy- # highest warning level; treat warnings as errors; enable dbg info
DEBUG_FLAGS=/Od /Ob0 /D "_DEBUG"
RELEASE_FLAGS =/O2 /Ob2 /D "NDEBUG"
LIBS =user32.lib gdi32.lib

clean:
all: release

release: gvimfullscreen.c
$(CC) $(CFLAGS) $(RELEASE_FLAGS) $(LIBS) gvimfullscreen.c

debug: gvimfullscreen.c
$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(LIBS) gvimfullscreen.c

clean:
del *.obj
del *.dll
del *.exp
del *.lib
del *.pdb
del *.ilk

distclean: clean
del *.dll

0 comments on commit 6abfbd1

Please sign in to comment.