diff options
Diffstat (limited to 'justtabs/win.cpp')
-rw-r--r-- | justtabs/win.cpp | 109 |
1 files changed, 106 insertions, 3 deletions
diff --git a/justtabs/win.cpp b/justtabs/win.cpp index 75cb408..9ac8022 100644 --- a/justtabs/win.cpp +++ b/justtabs/win.cpp @@ -28,6 +28,8 @@ int message_icon_index = 0; #define WMU_SETTAB (WM_USER+0x300)
+#define WMU_CALCWINICON (WM_USER+0x301)
+
HANDLE window_list = 0;
typedef struct TabCtrlDataStruct
@@ -130,6 +132,23 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { SubclassTabCtrl(tab_ctrl);
active_window = 0;
+
+ {
+ HMENU hMenu = GetSystemMenu( hwnd, FALSE );
+ InsertMenu( hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, NULL );
+ if (options.ontop) {
+ InsertMenu( hMenu, 0, MF_BYPOSITION | MF_ENABLED | MF_CHECKED | MF_STRING, IDM_TOPMOST, TranslateT("Always On Top"));
+ SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ } else {
+ InsertMenu( hMenu, 0, MF_BYPOSITION | MF_ENABLED | MF_UNCHECKED | MF_STRING, IDM_TOPMOST, TranslateT("Always On Top"));
+ }
+ }
+
+ SendDlgItemMessage(hwnd,IDC_CHAT_CLOSE, BUTTONSETASFLATBTN, 0, 0);
+ SendDlgItemMessage(hwnd, IDC_CHAT_CLOSE, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CLOSE)));
+ //SendMessage(GetDlgItem(hwnd,IDC_CHAT_CLOSE), BUTTONADDTOOLTIP, (WPARAM)Translate("Close current tab"), 0);
+ SendMessage(hwnd, WM_SIZE, 0, 0);
+
return FALSE;
}
@@ -163,6 +182,10 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // static control is in front of the tab control.
if(active_window)
SetWindowPos(active_window, HWND_TOP, rc.left - 3, rc.top - 1, rc.right - rc.left + 4, rc.bottom - rc.top + 2, 0);
+
+ GetClientRect(hwnd, &rc);
+ SetWindowPos(GetDlgItem(hwnd,IDC_CHAT_CLOSE), 0, rc.right - 19, 3, 16, 16, SWP_NOZORDER | SWP_NOACTIVATE);
+ RedrawWindow(GetDlgItem(hwnd, IDC_CHAT_CLOSE), 0, 0, RDW_INVALIDATE);
}
break;
@@ -221,6 +244,8 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { SendMessage(hwnd, WMU_SETTAB, 0, 0);
ShowWindow(hwnd, SW_SHOW);
+ RedrawWindow(GetDlgItem(hwnd, IDC_CHAT_CLOSE), 0, 0, RDW_INVALIDATE);
+
}
}
return TRUE;
@@ -264,11 +289,13 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HANDLE hContact = ((TabData *)tie.lParam)->hContact;
if(active_window == child) return TRUE;
+ /*
// use GETCONTACTICON service instead of tie.iImage, because tie.iImage may be -1 depending on options
HANDLE hIcon = ImageList_GetIcon(clist_imagelist, (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0), 0);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
-
+ */
+
if(active_window) {
SetWindowPos(active_window, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
ShowWindow(active_window, SW_HIDE);
@@ -287,6 +314,9 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { tie.iImage = options.tab_icon ? (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0) : -1;
SendMessage(tab_ctrl, TCM_SETITEM, (WPARAM)iPage, (LPARAM)&tie);
SetFocus(active_window);
+
+ SendMessage(hwnd, WMU_CALCWINICON, (WPARAM)hContact, 0);
+ RedrawWindow(GetDlgItem(hwnd, IDC_CHAT_CLOSE), 0, 0, RDW_INVALIDATE);
}
return TRUE;
case WM_NOTIFY:
@@ -317,13 +347,14 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND child = WindowList_Find(window_list, hContact);
if(child) {
int t = GetTabFromHWND(tab_ctrl, child);
- if(TabCtrl_GetCurSel(tab_ctrl) != t) {
+ if(IsIconic(hwnd) || TabCtrl_GetCurSel(tab_ctrl) != t) {
//TabCtrl_HighlightItem(tab_ctrl, t, 1);
TCITEM tie;
tie.mask = TCIF_IMAGE;
tie.iImage = message_icon_index;
SendMessage(tab_ctrl, TCM_SETITEM, (WPARAM)t, (LPARAM)&tie);
}
+ SendMessage(hwnd, WMU_CALCWINICON, 0, 0);
}
}
return TRUE;
@@ -379,12 +410,15 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { tci.iImage = options.tab_icon ? ici : -1;
SendMessage(tab_ctrl, TCM_SETITEM, (WPARAM)t, (LPARAM)&tci);
+ /*
if(t == TabCtrl_GetCurSel(tab_ctrl)) {
// use GETCONTACTICON service instead of tie.iImage, because tie.iImage may be -1 depending on options
HANDLE hIcon = ImageList_GetIcon(clist_imagelist, ici, 0);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
}
+ */
+ SendMessage(hwnd, WMU_CALCWINICON, 0, 0);
}
} else {
int l, i;
@@ -402,6 +436,70 @@ BOOL CALLBACK FrameProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { }
}
return TRUE;
+ case WMU_CALCWINICON:
+ {
+ int l, i, s;
+ TCITEM tci;
+ HANDLE hContact = 0;
+ if(wParam) hContact = (HANDLE)wParam;
+ bool use_message_icon = false;
+ l = TabCtrl_GetItemCount(tab_ctrl);
+ s = TabCtrl_GetCurSel(tab_ctrl);
+ for (i = 0; i < l; i++) {
+ tci.mask = TCIF_IMAGE | TCIF_PARAM;
+ TabCtrl_GetItem(tab_ctrl, i, &tci);
+ if(tci.iImage == message_icon_index)
+ use_message_icon = true;
+ else if(i == s) {
+ hContact = ((TabData *)tci.lParam)->hContact;
+ }
+ }
+
+ int ici = (use_message_icon ? message_icon_index : (int)CallService(MS_CLIST_GETCONTACTICON, (WPARAM)hContact, 0));
+ HANDLE hIcon = ImageList_GetIcon(clist_imagelist, ici, 0);
+ SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
+ SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
+ }
+ return TRUE;
+ case WM_ACTIVATE:
+ if (LOWORD(wParam) == WA_ACTIVE) {
+ TCITEM tci;
+ int s = TabCtrl_GetCurSel(tab_ctrl);
+ if(s != -1) {
+ tci.mask = TCIF_IMAGE | TCIF_PARAM;
+ TabCtrl_GetItem(tab_ctrl, s, &tci);
+ HANDLE hContact = ((TabData *)tci.lParam)->hContact;
+ SendMessage(hwnd, WM_RESETTABICONS, (WPARAM)hContact, lParam);
+ }
+ }
+ break;
+ case WM_SYSCOMMAND:
+ if (wParam == IDM_TOPMOST) {
+ HMENU hMenu = GetSystemMenu(hwnd, FALSE);
+ CheckMenuItem(hMenu, IDM_TOPMOST, MF_BYCOMMAND | (options.ontop ? MF_UNCHECKED : MF_CHECKED));
+ SetWindowPos(hwnd, (options.ontop ? HWND_NOTOPMOST : HWND_TOPMOST), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+ options.ontop = !options.ontop;
+ DBWriteContactSettingByte(0, MODULE, "OnTop", options.ontop ? 1 : 0);
+ return TRUE;
+ }
+ break;
+ case WM_COMMAND:
+ if ( HIWORD( wParam ) == BN_CLICKED ) {
+ switch( LOWORD( wParam )) {
+ case IDC_CHAT_CLOSE:
+ {
+ TCITEM tci;
+ int s = TabCtrl_GetCurSel(tab_ctrl);
+ if(s != -1) {
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(tab_ctrl, s, &tci);
+ SendMessage(((TabData *)tci.lParam)->hwndMsg, WM_CLOSE, 0, 0);
+ }
+ }
+ return TRUE;
+ }
+ }
+ break;
}
//return DefWindowProc(hwnd, msg, wParam, lParam);
@@ -439,9 +537,10 @@ int CreateFrame(HWND parent, HINSTANCE hInst) { 0, 0, 800, 600, parent, NULL, hInst, NULL);
*/
pluginwind = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CONTAINER), 0, FrameProc, 0);
-
EnableTitleBar();
+ FixWindowStyle();
+
return 0;
}
@@ -681,3 +780,7 @@ BOOL CALLBACK TabCtrlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) }
return CallWindowProc(OldTabCtrlProc, hwnd, msg, wParam, lParam);
}
+
+void FixWindowStyle() {
+ if(pluginwind) SetWindowPos(pluginwind, (options.ontop ? HWND_TOPMOST : HWND_NOTOPMOST), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+}
|