From 9b8ec8aeeb593644b053dc491818f37587293eae Mon Sep 17 00:00:00 2001 From: Goraf Date: Fri, 11 Oct 2013 20:53:23 +0000 Subject: * adopted * compilable version git-svn-id: http://svn.miranda-ng.org/main/trunk@6450 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/MagneticWindows/src/MagneticWindows.cpp | 161 +++++++ .../MagneticWindows/src/MagneticWindowsCore.cpp | 464 +++++++++++++++++++++ plugins/MagneticWindows/src/MagneticWindowsCore.h | 48 +++ plugins/MagneticWindows/src/Options.cpp | 128 ++++++ plugins/MagneticWindows/src/Options.h | 18 + plugins/MagneticWindows/src/SnapToListService.cpp | 64 +++ plugins/MagneticWindows/src/SnapToListService.h | 5 + plugins/MagneticWindows/src/Version.h | 14 + plugins/MagneticWindows/src/resource.h | 25 ++ 9 files changed, 927 insertions(+) create mode 100644 plugins/MagneticWindows/src/MagneticWindows.cpp create mode 100644 plugins/MagneticWindows/src/MagneticWindowsCore.cpp create mode 100644 plugins/MagneticWindows/src/MagneticWindowsCore.h create mode 100644 plugins/MagneticWindows/src/Options.cpp create mode 100644 plugins/MagneticWindows/src/Options.h create mode 100644 plugins/MagneticWindows/src/SnapToListService.cpp create mode 100644 plugins/MagneticWindows/src/SnapToListService.h create mode 100644 plugins/MagneticWindows/src/Version.h create mode 100644 plugins/MagneticWindows/src/resource.h (limited to 'plugins/MagneticWindows/src') diff --git a/plugins/MagneticWindows/src/MagneticWindows.cpp b/plugins/MagneticWindows/src/MagneticWindows.cpp new file mode 100644 index 0000000000..80501cc80e --- /dev/null +++ b/plugins/MagneticWindows/src/MagneticWindows.cpp @@ -0,0 +1,161 @@ +#include "MagneticWindowsCore.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Magnetic Windows +// +// Autor: Michael Kunz +// EMail: Michael.Kunz@s2005.tu-chemnitz.de +// +// +// thanks to: pescuma +// +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Variables +/////////////////////////////////////////////////////////////////////////////////////////////////// + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + // {08C01613-24C8-486F-BDAE-2C3DDCAF9347} + {0x8c01613, 0x24c8, 0x486f, { 0xbd, 0xae, 0x2c, 0x3d, 0xdc, 0xaf, 0x93, 0x47 }} +}; + + +HANDLE hLoadedHook, hShootDownHook, hAddService, hRemService, hWindowEventHook; + +HINSTANCE hInst; +int hLangpack; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Plugin Functions +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +//For other Plugins to start snapping for other Windows +int SnapPluginWindowStart(WPARAM wParam, LPARAM lParam) { + + if (!WindowOpen((HWND)wParam)) return 1; + + return 0; +} +//For other Plugins to stop snapping for other Windows +int SnapPluginWindowStop(WPARAM wParam, LPARAM lParam) { + + if (!WindowClose((HWND)wParam)) return 1; + + return 0; +} + +int PluginMessageWindowEvent(WPARAM wParam, LPARAM lParam) { + MessageWindowEventData* Data; + HWND hWndParent, hWnd; + + Data = (MessageWindowEventData*)(lParam); + + switch (Data->uType) { + case MSG_WINDOW_EVT_OPEN: + hWnd = Data->hwndWindow; + //WindowOpen(hWnd); + hWndParent = GetParent(hWnd); + while ((hWndParent != 0) && (hWndParent != GetDesktopWindow()) && (IsWindowVisible(hWndParent))) { + hWnd = hWndParent; + hWndParent = GetParent(hWnd); + } + + WindowOpen(hWnd); + break; + + case MSG_WINDOW_EVT_CLOSING: + WindowClose(Data->hwndWindow); + break; + + default: + break; + } + + return 0; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Main Functions +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +int SnapPluginStart(WPARAM wParam, LPARAM lParam) { + + LoadOptions(); + + hWindowEventHook = HookEvent(ME_MSG_WINDOWEVENT, PluginMessageWindowEvent); + + WindowOpen((HWND)CallService(MS_CLUI_GETHWND,0,0)); + return 0; +} + +int SnapPluginShootDown(WPARAM wParam, LPARAM lParam) { + UnhookEvent(hWindowEventHook); + UnhookEvent(hLoadedHook); + UnhookEvent(hShootDownHook); + UnhookEvent(hInitOptionsHook); + + WindowCloseAll(); + + DestroyServiceFunction(hAddService); + DestroyServiceFunction(hRemService); + DestroyServiceFunction(hSnapToListService); + + return 0; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Exportet Functions +/////////////////////////////////////////////////////////////////////////////////////////////////// + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD) +{ + return &pluginInfo; +} + +extern "C" int __declspec(dllexport) Load(void) +{ + mir_getLP(&pluginInfo); + + hLoadedHook = HookEvent(ME_SYSTEM_MODULESLOADED, SnapPluginStart); + hShootDownHook = HookEvent(ME_SYSTEM_PRESHUTDOWN, SnapPluginShootDown); + hInitOptionsHook = HookEvent(ME_OPT_INITIALISE, InitOptions); + + hAddService = CreateServiceFunction(MS_MW_ADDWINDOW, SnapPluginWindowStart); + hRemService = CreateServiceFunction(MS_MW_REMWINDOW, SnapPluginWindowStop); + hSnapToListService = CreateServiceFunction(MS_MW_SNAPTOLIST, SnapToList); + + return 0; +} + +extern "C" int __declspec(dllexport) Unload(void) +{ + return 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// DLL MAIN +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + hInst = hinstDLL; + + return TRUE; +} diff --git a/plugins/MagneticWindows/src/MagneticWindowsCore.cpp b/plugins/MagneticWindows/src/MagneticWindowsCore.cpp new file mode 100644 index 0000000000..5af05dcd76 --- /dev/null +++ b/plugins/MagneticWindows/src/MagneticWindowsCore.cpp @@ -0,0 +1,464 @@ +#include "MagneticWindowsCore.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Variables +/////////////////////////////////////////////////////////////////////////////////////////////////// + +TWorkingVariables Globals = { + NULL, + NULL, + 0,0, + false,false +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Functions +/////////////////////////////////////////////////////////////////////////////////////////////////// + +int Abs(int a) { + if (a < 0) return (-a); + return a; +} + + +PDockingWindow FindDockingWindow(HWND hWnd) { + PDockingWindow i; + + i = Globals.WindowList; + + while (i != NULL) { + + if (i->hWnd == hWnd) return i; + + i = i->Next; + }; + + return NULL; +} + + +void DockWindowRect(HWND hWnd, bool Sizing, RECT& GivenRect, int SizingEdge, int MouseX = 0, int MouseY = 0) { + POINT p; + int diffX, diffY; + RECT tmpRect, frmRect; + int W, H; + int XPos, YPos; + int tmpXPos, tmpYPos; + int tmpMouseX, tmpMouseY; + bool FoundX, FoundY; + + PRectList ActRect; + + diffX = Options.SnapWidth; + diffY = Options.SnapWidth; + + tmpRect = GivenRect; + frmRect = GivenRect; + + FoundX = false; + FoundY = false; + + if (!Sizing) { + GetCursorPos(&p); + if (Globals.SnappedX) { + tmpMouseX = p.x - tmpRect.left; + OffsetRect(&tmpRect, tmpMouseX - MouseX, 0); + OffsetRect(&GivenRect, tmpMouseX - MouseX, 0); + } else { + MouseX = p.x - tmpRect.left; + } + if (Globals.SnappedY) { + tmpMouseY = p.y - tmpRect.top; + OffsetRect(&tmpRect, 0, tmpMouseY - MouseY); + OffsetRect(&GivenRect, 0, tmpMouseY - MouseY); + } else { + MouseY = p.y - tmpRect.top; + } + } + + W = tmpRect.right - tmpRect.left; + H = tmpRect.bottom - tmpRect.top; + + if (!Sizing) { + ActRect = Globals.Rects; + while (ActRect != NULL) { + if ((tmpRect.left >= (ActRect->Rect.left - Options.SnapWidth)) && + (tmpRect.left <= (ActRect->Rect.left + Options.SnapWidth)) && + ((tmpRect.top - Options.SnapWidth) < ActRect->Rect.bottom) & + ((tmpRect.bottom + Options.SnapWidth) > ActRect->Rect.top) && + (Abs(tmpRect.left - ActRect->Rect.left) < diffX)) + { + GivenRect.left = ActRect->Rect.left; + GivenRect.right = GivenRect.left + W; + + diffX = Abs(tmpRect.left - ActRect->Rect.left); + + FoundX = true; + } else + if ((ActRect != Globals.Rects) && + (tmpRect.left >= (ActRect->Rect.right - Options.SnapWidth)) && + (tmpRect.left <= (ActRect->Rect.right + Options.SnapWidth)) && + ((tmpRect.top - Options.SnapWidth) < ActRect->Rect.bottom) && + ((tmpRect.bottom + Options.SnapWidth) > ActRect->Rect.top) && + (Abs(tmpRect.left - ActRect->Rect.right) < diffX)) + { + GivenRect.left = ActRect->Rect.right; + GivenRect.right = GivenRect.left + W; + + diffX = Abs(tmpRect.left - ActRect->Rect.right); + + FoundX = true; + } else + if ((ActRect != Globals.Rects) && + (tmpRect.right >= (ActRect->Rect.left - Options.SnapWidth)) && + (tmpRect.right <= (ActRect->Rect.left + Options.SnapWidth)) && + ((tmpRect.top - Options.SnapWidth) < ActRect->Rect.bottom) && + ((tmpRect.bottom + Options.SnapWidth) > ActRect->Rect.top) && + (Abs(tmpRect.right - ActRect->Rect.left) < diffX)) + { + GivenRect.right = ActRect->Rect.left; + GivenRect.left = GivenRect.right - W; + + diffX = Abs(tmpRect.right - ActRect->Rect.left); + + FoundX = true; + } else + if ((tmpRect.right >= (ActRect->Rect.right - Options.SnapWidth)) && + (tmpRect.right <= (ActRect->Rect.right + Options.SnapWidth)) && + ((tmpRect.top - Options.SnapWidth) < ActRect->Rect.bottom) && + ((tmpRect.bottom + Options.SnapWidth) > ActRect->Rect.top) && + (Abs(tmpRect.right - ActRect->Rect.right) < diffX)) + { + GivenRect.right = ActRect->Rect.right; + GivenRect.left = GivenRect.right - W; + + diffX = Abs(tmpRect.right - ActRect->Rect.right); + + FoundX = true; + } + + + if ((tmpRect.top >= (ActRect->Rect.top - Options.SnapWidth)) && + (tmpRect.top <= (ActRect->Rect.top + Options.SnapWidth)) && + ((tmpRect.left - Options.SnapWidth) < ActRect->Rect.right) && + ((tmpRect.right + Options.SnapWidth) > ActRect->Rect.left) && + (Abs(tmpRect.top - ActRect->Rect.top) < diffY)) + { + GivenRect.top = ActRect->Rect.top; + GivenRect.bottom = GivenRect.top + H; + + diffY = Abs(tmpRect.top - ActRect->Rect.top); + + FoundY = true; + } else + if ((ActRect != Globals.Rects) && + (tmpRect.top >= (ActRect->Rect.bottom - Options.SnapWidth)) && + (tmpRect.top <= (ActRect->Rect.bottom + Options.SnapWidth)) && + ((tmpRect.left - Options.SnapWidth) < ActRect->Rect.right) && + ((tmpRect.right + Options.SnapWidth) > ActRect->Rect.left) && + (Abs(tmpRect.top - ActRect->Rect.bottom) < diffY)) + { + GivenRect.top = ActRect->Rect.bottom; + GivenRect.bottom = GivenRect.top + H; + + diffY = Abs(tmpRect.top - ActRect->Rect.bottom); + + FoundY = true; + } else + if ((ActRect != Globals.Rects) && + (tmpRect.bottom >= (ActRect->Rect.top - Options.SnapWidth)) && + (tmpRect.bottom <= (ActRect->Rect.top + Options.SnapWidth)) && + ((tmpRect.left - Options.SnapWidth) < ActRect->Rect.right) && + ((tmpRect.right + Options.SnapWidth) > ActRect->Rect.left) && + (Abs(tmpRect.bottom - ActRect->Rect.top) < diffY)) + { + GivenRect.bottom = ActRect->Rect.top; + GivenRect.top = GivenRect.bottom - H; + + diffY = Abs(tmpRect.bottom - ActRect->Rect.top); + + FoundY = true; + } else + if ((tmpRect.bottom >= (ActRect->Rect.bottom - Options.SnapWidth)) && + (tmpRect.bottom <= (ActRect->Rect.bottom + Options.SnapWidth)) && + ((tmpRect.left - Options.SnapWidth) < ActRect->Rect.right) && + ((tmpRect.right + Options.SnapWidth) > ActRect->Rect.left) && + (Abs(tmpRect.bottom - ActRect->Rect.bottom) < diffY)) + { + GivenRect.bottom = ActRect->Rect.bottom; + GivenRect.top = GivenRect.bottom - H; + + diffY = Abs(tmpRect.bottom - ActRect->Rect.bottom); + + FoundY = true; + } + + ActRect = ActRect->Next; + } //next rect + + Globals.SnappedX = FoundX; + Globals.SnappedY = FoundY; + } + else //Sizing + { + if ((SizingEdge == WMSZ_LEFT) || + (SizingEdge == WMSZ_TOPLEFT) || + (SizingEdge == WMSZ_BOTTOMLEFT)) + { + XPos = GivenRect.left; + } else { + XPos = GivenRect.right; + } + + if ((SizingEdge == WMSZ_TOP) || + (SizingEdge == WMSZ_TOPLEFT) || + (SizingEdge == WMSZ_TOPRIGHT)) + { + YPos = GivenRect.top; + } else { + YPos = GivenRect.bottom; + } + + tmpXPos = XPos; + tmpYPos = YPos; + + ActRect = Globals.Rects; + while (ActRect != NULL) { + if ((tmpXPos >= (ActRect->Rect.left - Options.SnapWidth)) && + (tmpXPos <= (ActRect->Rect.left + Options.SnapWidth)) && + ((tmpRect.top - Options.SnapWidth) < ActRect->Rect.bottom) && + ((tmpRect.bottom + Options.SnapWidth) > ActRect->Rect.top) && + (Abs(tmpXPos - ActRect->Rect.left) < diffX)) + { + XPos = ActRect->Rect.left; + + diffX = Abs(tmpXPos - ActRect->Rect.left); + } else + if ((tmpXPos >= (ActRect->Rect.right - Options.SnapWidth)) && + (tmpXPos <= (ActRect->Rect.right + Options.SnapWidth)) && + ((tmpRect.top - Options.SnapWidth) < ActRect->Rect.bottom) && + ((tmpRect.bottom + Options.SnapWidth) > ActRect->Rect.top) && + (Abs(tmpXPos - ActRect->Rect.right) < diffX)) + { + XPos = ActRect->Rect.right; + + diffX = Abs(tmpXPos - ActRect->Rect.right); + } + + if ((tmpYPos >= (ActRect->Rect.top - Options.SnapWidth)) && + (tmpYPos <= (ActRect->Rect.top + Options.SnapWidth)) && + ((tmpRect.left - Options.SnapWidth) < ActRect->Rect.right) && + ((tmpRect.right + Options.SnapWidth) > ActRect->Rect.left) && + (Abs(tmpYPos - ActRect->Rect.top) < diffY)) + { + YPos = ActRect->Rect.top; + + diffY = Abs(tmpYPos - ActRect->Rect.top); + } else + if ((tmpYPos >= (ActRect->Rect.bottom - Options.SnapWidth)) && + (tmpYPos <= (ActRect->Rect.bottom + Options.SnapWidth)) && + ((tmpRect.left - Options.SnapWidth) < ActRect->Rect.right) && + ((tmpRect.right + Options.SnapWidth) > ActRect->Rect.left) && + (Abs(tmpYPos - ActRect->Rect.bottom) < diffY)) + { + YPos = ActRect->Rect.bottom; + + diffY = Abs(tmpYPos - ActRect->Rect.bottom); + } + + ActRect = ActRect->Next; + } //Next rect + + if ((SizingEdge == WMSZ_LEFT) || + (SizingEdge == WMSZ_TOPLEFT) || + (SizingEdge == WMSZ_BOTTOMLEFT)) + { + GivenRect.left = XPos; + } else { + GivenRect.right = XPos; + } + if ((SizingEdge == WMSZ_TOP) || + (SizingEdge == WMSZ_TOPLEFT) || + (SizingEdge == WMSZ_TOPRIGHT)) + { + GivenRect.top = YPos; + } else { + GivenRect.bottom = YPos; + } + } +} + + +void GetFrmRects(HWND ForWindow) { +PDockingWindow i; +PRectList Rect, l; + + Rect = Globals.Rects; + while (Rect != NULL) { + l = Rect; + Rect = Rect->Next; + free(l); + } + + Rect = (PRectList)malloc(sizeof(TRectList)); + Rect->Next = NULL; + Globals.Rects = Rect; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &(Rect->Rect), 0); + i = Globals.WindowList; + + while (i != NULL) { + if ((i->hWnd != ForWindow) && IsWindowVisible(i->hWnd)) { + l = Rect; + Rect = (PRectList)malloc(sizeof(TRectList)); + Rect->Next = NULL; + l->Next = Rect; + + GetWindowRect(i->hWnd, &(Rect->Rect)); + } + + i = i->Next; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Subclass Window Proc +/////////////////////////////////////////////////////////////////////////////////////////////////// + +LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { + PDockingWindow i; + + RECT r; + POINT p; + + WNDPROC OldRun; + + i = FindDockingWindow(hWnd); + + OldRun = NULL; + + if (i != NULL) { //else we have a problem + OldRun = i->OldWindowProc; + + if (Options.DoSnap) { + switch (Msg) { + case WM_ENTERSIZEMOVE: { + if (Options.ScriverWorkAround) + keybd_event(VK_CONTROL, 0, 0, 0); + + GetWindowRect(hWnd, &r); + GetCursorPos(&p); + Globals.MouseX = p.x - r.left; + Globals.MouseY = p.y - r.top; + + GetFrmRects(hWnd); + + break; + } + case WM_EXITSIZEMOVE: { + if (Options.ScriverWorkAround) + keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); + + break; + } + case WM_SIZING: + case WM_MOVING: { + r = *((PRECT)lParam); + if (Msg == WM_SIZING) { + DockWindowRect(hWnd, true, r, wParam); + } else { + DockWindowRect(hWnd, false, r, wParam, Globals.MouseX, Globals.MouseY); + } + + (*(PRECT)lParam) = r; + + if (Msg == WM_SIZING) { + return 1; + } + + break; + } + } //switch + } //if dosnap + + if (OldRun != NULL) { + if (IsWindowUnicode(hWnd)) { + return CallWindowProcW(OldRun, hWnd, Msg, wParam, lParam); + } else { + return CallWindowProcA(OldRun, hWnd, Msg, wParam, lParam); + } + } + } + + return 0; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// exportet Functions +/////////////////////////////////////////////////////////////////////////////////////////////////// + +bool WindowOpen(HWND hWnd) { + PDockingWindow i; + + if ((hWnd != 0) && (FindDockingWindow(hWnd) == NULL)) { + i = (PDockingWindow)mir_alloc(sizeof(TDockingWindow)); + i->Next = Globals.WindowList; + i->hWnd = hWnd; + Globals.WindowList = i; + + if (IsWindowUnicode(hWnd)) { + i->OldWindowProc = (WNDPROC) GetWindowLongW(hWnd, GWL_WNDPROC); + SetWindowLongW(hWnd, GWL_WNDPROC, (LONG)(&WindowProc)); + } else { + i->OldWindowProc = (WNDPROC) GetWindowLongA(hWnd, GWL_WNDPROC); + SetWindowLongA(hWnd, GWL_WNDPROC, (LONG)(&WindowProc)); + } + + return true; + } + return false; +} + +bool WindowClose(HWND hWnd) { + PDockingWindow i, l; + + l = NULL; + i = Globals.WindowList; + + while ((i != NULL) && (i->hWnd != hWnd)) { + l = i; + i = i->Next; + } + + if (i != NULL) { + if (l == NULL) { + Globals.WindowList = i->Next; + } else { + l->Next = i->Next; + } + + if (IsWindowUnicode(hWnd)) { + SetWindowLongW(hWnd, GWL_WNDPROC, (LONG) (i->OldWindowProc)); + } else { + SetWindowLongA(hWnd, GWL_WNDPROC, (LONG) (i->OldWindowProc)); + } + + mir_free(i); + + return true; + } + + return false; +} +bool WindowCloseAll() { + PDockingWindow i, l; + i = Globals.WindowList; + while (i != NULL) { + l = i; + WindowClose(i->hWnd); + i = i->Next; + mir_free(l); + } + return true; +} \ No newline at end of file diff --git a/plugins/MagneticWindows/src/MagneticWindowsCore.h b/plugins/MagneticWindows/src/MagneticWindowsCore.h new file mode 100644 index 0000000000..c0d6938a7f --- /dev/null +++ b/plugins/MagneticWindows/src/MagneticWindowsCore.h @@ -0,0 +1,48 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +// #include "../include/m_plugins.h" +#include +#include +#include + +#include "SnapToListService.h" +#include "Options.h" + +#include "resource.h" +#include "Version.h" + +typedef + struct TDockingWindow { + HWND hWnd; + WNDPROC OldWindowProc; + TDockingWindow* Next; + } TDockingWindow, *PDockingWindow; +typedef + struct TRectList { + RECT Rect; + TRectList* Next; + } TRectList, *PRectList; +typedef + struct { + PDockingWindow WindowList; + PRectList Rects; + int MouseX, MouseY; + bool SnappedX, SnappedY; + } TWorkingVariables; + + + +#define MODULE_NAME "MagneticWindows" +extern HINSTANCE hInst; + +bool WindowOpen(HWND); +bool WindowClose(HWND); +bool WindowCloseAll(); \ No newline at end of file diff --git a/plugins/MagneticWindows/src/Options.cpp b/plugins/MagneticWindows/src/Options.cpp new file mode 100644 index 0000000000..d070f40d56 --- /dev/null +++ b/plugins/MagneticWindows/src/Options.cpp @@ -0,0 +1,128 @@ +#include "MagneticWindowsCore.h" + +HANDLE hInitOptionsHook; +TOptions Options = { + true, + cDefaultSnapWidth, + false +}; + + +int CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { + + TCHAR str[64]; + + switch (msg) { + case WM_INITDIALOG: { + TranslateDialogDefault(hwndDlg); + + CheckDlgButton(hwndDlg, IDC_CHK_SNAP, Options.DoSnap?BST_CHECKED:BST_UNCHECKED); + SendDlgItemMessage(hwndDlg, IDC_SLIDER_SNAPWIDTH, TBM_SETRANGE, FALSE, MAKELONG(1,32)); + SendDlgItemMessage(hwndDlg, IDC_SLIDER_SNAPWIDTH, TBM_SETPOS, TRUE, Options.SnapWidth); + + wsprintf(str, TranslateT("%d pix"), Options.SnapWidth); + SetDlgItemText(hwndDlg, IDC_TXT_SNAPWIDTH, str); + + EnableWindow(GetDlgItem(hwndDlg, IDC_SLIDER_SNAPWIDTH), Options.DoSnap); + EnableWindow(GetDlgItem(hwndDlg, IDC_TXT_SNAPWIDTH), Options.DoSnap); + + CheckDlgButton(hwndDlg, IDC_CHK_SCRIVERWORKAROUND, Options.ScriverWorkAround?BST_CHECKED:BST_UNCHECKED); + + break; + } + case WM_HSCROLL: { + mir_snwprintf(str, 64, TranslateT("%d pix"), SendDlgItemMessage(hwndDlg, IDC_SLIDER_SNAPWIDTH, TBM_GETPOS, 0, 0)); + SetDlgItemText(hwndDlg, IDC_TXT_SNAPWIDTH, str); + + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + } + + case WM_COMMAND: { + WORD idCtrl = LOWORD(wParam), wNotifyCode = HIWORD(wParam); + + switch(idCtrl) { + case IDC_CHK_SNAP: { + if (wNotifyCode == BN_CLICKED) { + + + EnableWindow(GetDlgItem(hwndDlg, IDC_SLIDER_SNAPWIDTH), IsDlgButtonChecked(hwndDlg, IDC_CHK_SNAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_TXT_SNAPWIDTH), IsDlgButtonChecked(hwndDlg, IDC_CHK_SNAP)); + + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + } + case IDC_CHK_SCRIVERWORKAROUND: { + if (wNotifyCode == BN_CLICKED) { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + } + } + break; + } + + case WM_NOTIFY: { //Here we have pressed either the OK or the APPLY button. + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_RESET: + LoadOptions(); + break; + + case PSN_APPLY: { + Options.DoSnap = (IsDlgButtonChecked(hwndDlg, IDC_CHK_SNAP) == TRUE); + Options.SnapWidth = SendDlgItemMessage(hwndDlg, IDC_SLIDER_SNAPWIDTH, TBM_GETPOS, 0, 0); + Options.ScriverWorkAround = (IsDlgButtonChecked(hwndDlg, IDC_CHK_SCRIVERWORKAROUND) == TRUE); + + db_set_b(NULL, MODULE_NAME, "DoSnap", Options.DoSnap); + db_set_b(NULL, MODULE_NAME, "SnapWidth", Options.SnapWidth); + db_set_b(NULL, MODULE_NAME, "ScriverWorkAround", Options.ScriverWorkAround); + + break; + } + } + break; + } + + break; + + } + default: + + break; + } + return 0; + +} + +int InitOptions(WPARAM wParam, LPARAM) { + OPTIONSDIALOGPAGE Opt = { 0 }; + + Opt.cbSize = sizeof(Opt); +// Opt.position = 0; + Opt.pfnDlgProc = OptionsDlgProc; + Opt.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_MAGNETICWINDOWS); + Opt.hInstance = hInst; +// Opt.hIcon = 0; + Opt.pszGroup = LPGEN("Customize"); + Opt.pszTitle = LPGEN("Magnetic Windows"); +// Opt.groupPosition = 0; +// Opt.hGroupIcon = 0; + Opt.flags = ODPF_BOLDGROUPS; +// Opt.nIDBottomSimpleControl = 0; +// Opt.nIDRightSimpleControl = 0; +// Opt.expertOnlyControls = NULL; +// Opt.nExpertOnlyControls = 0; + + Options_AddPage(wParam, &Opt); + + return 0; +} + +void LoadOptions() { + Options.DoSnap = db_get_b(NULL, MODULE_NAME, "DoSnap", TRUE); + Options.SnapWidth = db_get_b(NULL, MODULE_NAME, "SnapWidth", cDefaultSnapWidth); + Options.ScriverWorkAround = db_get_b(NULL, MODULE_NAME, "ScriverWorkAround", FALSE); +} \ No newline at end of file diff --git a/plugins/MagneticWindows/src/Options.h b/plugins/MagneticWindows/src/Options.h new file mode 100644 index 0000000000..ebb5458d4a --- /dev/null +++ b/plugins/MagneticWindows/src/Options.h @@ -0,0 +1,18 @@ + +#define cDefaultSnapWidth 12 + +typedef + struct TOptions { + bool DoSnap; + int SnapWidth; + bool ScriverWorkAround; +} TOptions; + +extern HANDLE hInitOptionsHook; +extern TOptions Options; + + +int CALLBACK OptionsDlgProc(HWND, UINT, WPARAM, LPARAM); + +int InitOptions(WPARAM, LPARAM); +void LoadOptions(); \ No newline at end of file diff --git a/plugins/MagneticWindows/src/SnapToListService.cpp b/plugins/MagneticWindows/src/SnapToListService.cpp new file mode 100644 index 0000000000..5fc9f66268 --- /dev/null +++ b/plugins/MagneticWindows/src/SnapToListService.cpp @@ -0,0 +1,64 @@ +#include "MagneticWindowsCore.h" + + +HANDLE hSnapToListService; + + +int SnapToList(WPARAM wParam, LPARAM Align) { + HWND hWnd, hWndList; + RECT WndRect, ListRect; + RECT AlignRect; + RECT ResultRect; + + hWnd = (HWND)wParam; + + hWndList = (HWND)CallService(MS_CLUI_GETHWND,0,0); + GetWindowRect(hWnd, &WndRect); + GetWindowRect(hWndList, &ListRect); + + AlignRect = ListRect; + if ((!(MS_MW_STL_List_Left & Align)) && (MS_MW_STL_List_Right & Align)) { + AlignRect.left = AlignRect.right; + } else + if ((MS_MW_STL_List_Left & Align) && (!(MS_MW_STL_List_Right & Align))) { + AlignRect.right = AlignRect.left; + } + + if ((!(MS_MW_STL_List_Top & Align)) && (MS_MW_STL_List_Bottom & Align)) { + AlignRect.top = AlignRect.bottom; + } else + if ((MS_MW_STL_List_Top & Align) && (!(MS_MW_STL_List_Bottom & Align))) { + AlignRect.bottom = AlignRect.top; + } + + ResultRect = WndRect; + if ((MS_MW_STL_Wnd_Left & Align) && (MS_MW_STL_Wnd_Right & Align)) { + ResultRect.left = AlignRect.left; + ResultRect.right = AlignRect.right; + } else + if ((!(MS_MW_STL_Wnd_Left & Align)) && (MS_MW_STL_Wnd_Right & Align)) { + ResultRect.left = AlignRect.right - (WndRect.right - WndRect.left); + ResultRect.right = AlignRect.right; + } else + if ((MS_MW_STL_Wnd_Left & Align) && (!(MS_MW_STL_Wnd_Right & Align))) { + ResultRect.left = AlignRect.left; + ResultRect.right = AlignRect.left + (WndRect.right - WndRect.left); + } + + if ((MS_MW_STL_Wnd_Top & Align) && (MS_MW_STL_Wnd_Bottom & Align)) { + ResultRect.top = AlignRect.top; + ResultRect.bottom = AlignRect.bottom; + } else + if ((!(MS_MW_STL_Wnd_Top & Align)) && (MS_MW_STL_Wnd_Bottom & Align)) { + ResultRect.top = AlignRect.bottom - (WndRect.bottom - WndRect.top); + ResultRect.bottom = AlignRect.bottom; + } else + if ((MS_MW_STL_Wnd_Top & Align) && (!(MS_MW_STL_Wnd_Bottom & Align))) { + ResultRect.top = AlignRect.top; + ResultRect.bottom = AlignRect.top + (WndRect.bottom - WndRect.top); + } + + MoveWindow(hWnd, ResultRect.left, ResultRect.top, ResultRect.right-ResultRect.left, ResultRect.bottom-ResultRect.top, true); + + return 0; +} \ No newline at end of file diff --git a/plugins/MagneticWindows/src/SnapToListService.h b/plugins/MagneticWindows/src/SnapToListService.h new file mode 100644 index 0000000000..27db7246cd --- /dev/null +++ b/plugins/MagneticWindows/src/SnapToListService.h @@ -0,0 +1,5 @@ + + +extern HANDLE hSnapToListService; + +int SnapToList(WPARAM, LPARAM); diff --git a/plugins/MagneticWindows/src/Version.h b/plugins/MagneticWindows/src/Version.h new file mode 100644 index 0000000000..681fda66a6 --- /dev/null +++ b/plugins/MagneticWindows/src/Version.h @@ -0,0 +1,14 @@ +#define __MAJOR_VERSION 0 +#define __MINOR_VERSION 0 +#define __RELEASE_NUM 3 +#define __BUILD_NUM 2 + +#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM + +#define __PLUGIN_NAME "Magnetic Windows" +#define __FILENAME "MagneticWindows.dll" +#define __DESCRIPTION "Makes the main contactlist and the chat windows snapping to the desktop border and to each other." +#define __AUTHOR "Michael Kunz" +#define __AUTHOREMAIL "Michael.Kunz@s2005.TU-Cemnitz.de" +#define __AUTHORWEB "http://miranda-ng.org/p/MagneticWindows/" +#define __COPYRIGHT "© 2006 Michael Kunz" diff --git a/plugins/MagneticWindows/src/resource.h b/plugins/MagneticWindows/src/resource.h new file mode 100644 index 0000000000..a651a69a50 --- /dev/null +++ b/plugins/MagneticWindows/src/resource.h @@ -0,0 +1,25 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Options.rc +// + +#define IDD_OPT_MAGNETICWINDOWS 101 + + +#define IDC_MAINFRAME 1001 +#define IDC_SLIDER_SNAPWIDTH 1002 +#define IDC_CHK_SNAP 1003 +#define IDC_TXT_SNAPWIDTH 1004 +#define IDC_CHK_SCRIVERWORKAROUND 1005 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1006 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif -- cgit v1.2.3