• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8564 (tree)
Zeit2020-02-25 23:11:17
Autorzmatsuo

Log Message

ttlib.c から一部関数を ttlib_static.c に移動

Ändern Zusammenfassung

Diff

--- trunk/teraterm/common/ttlib.c (revision 8563)
+++ trunk/teraterm/common/ttlib.c (revision 8564)
@@ -1804,85 +1804,10 @@
18041804 }
18051805
18061806 /**
1807- * ウィンドウ上の位置を取得する
1808- * @Param[in] hWnd
1809- * @Param[in] point 位置(x,y)
1810- * @Param[in,out] InWindow ウィンドウ上
1811- * @Param[in,out] InClient クライアント領域上
1812- * @Param[in,out] InTitleBar タイトルバー上
1813- * @retval FALSE 無効なhWnd
1814- */
1815-BOOL GetPositionOnWindow(
1816- HWND hWnd, const POINT *point,
1817- BOOL *InWindow, BOOL *InClient, BOOL *InTitleBar)
1818-{
1819- const int x = point->x;
1820- const int y = point->y;
1821- RECT winRect;
1822- RECT clientRect;
1823-
1824- if (InWindow != NULL) *InWindow = FALSE;
1825- if (InClient != NULL) *InClient = FALSE;
1826- if (InTitleBar != NULL) *InTitleBar = FALSE;
1827-
1828- if (!GetWindowRect(hWnd, &winRect)) {
1829- return FALSE;
1830- }
1831-
1832- if ((x < winRect.left) || (winRect.right < x) ||
1833- (y < winRect.top) || (winRect.bottom < y))
1834- {
1835- return TRUE;
1836- }
1837- if (InWindow != NULL) *InWindow = TRUE;
1838-
1839- {
1840- POINT pos;
1841- GetClientRect(hWnd, &clientRect);
1842- pos.x = clientRect.left;
1843- pos.y = clientRect.top;
1844- ClientToScreen(hWnd, &pos);
1845- clientRect.left = pos.x;
1846- clientRect.top = pos.y;
1847-
1848- pos.x = clientRect.right;
1849- pos.y = clientRect.bottom;
1850- ClientToScreen(hWnd, &pos);
1851- clientRect.right = pos.x;
1852- clientRect.bottom = pos.y;
1853- }
1854-
1855- if ((clientRect.left <= x) && (x < clientRect.right) &&
1856- (clientRect.top <= y) && (y < clientRect.bottom))
1857- {
1858- if (InClient != NULL) *InClient = TRUE;
1859- if (InTitleBar != NULL) *InTitleBar = FALSE;
1860- return TRUE;
1861- }
1862- if (InClient != NULL) *InClient = FALSE;
1863-
1864- if (InTitleBar != NULL) {
1865- *InTitleBar = (y < clientRect.top) ? TRUE : FALSE;
1866- }
1867-
1868- return TRUE;
1869-}
1870-
1871-int SetDlgTexts(HWND hDlgWnd, const DlgTextInfo *infos, int infoCount, const char *UILanguageFile)
1872-{
1873- return SetI18nDlgStrs("Tera Term", hDlgWnd, infos, infoCount, UILanguageFile);
1874-}
1875-
1876-void SetDlgMenuTexts(HMENU hMenu, const DlgTextInfo *infos, int infoCount, const char *UILanguageFile)
1877-{
1878- SetI18nMenuStrs("Tera Term", hMenu, infos, infoCount, UILanguageFile);
1879-}
1880-
1881-/**
18821807 * ダイアログフォントを取得する
18831808 * エラーは発生しない
18841809 */
1885-void GetMessageboxFont(LOGFONT *logfont)
1810+DllExport void GetMessageboxFont(LOGFONT *logfont)
18861811 {
18871812 NONCLIENTMETRICS nci;
18881813 const int st_size = CCSIZEOF_STRUCT(NONCLIENTMETRICS, lfMessageFont);
@@ -1894,162 +1819,3 @@
18941819 assert(r == TRUE);
18951820 *logfont = nci.lfStatusFont;
18961821 }
1897-
1898-/**
1899- * ウィンドウ表示されているディスプレイのデスクトップの範囲を取得する
1900- * @param[in] hWnd ウィンドウのハンドル
1901- * @param[out] rect デスクトップ
1902- */
1903-void GetDesktopRect(HWND hWnd, RECT *rect)
1904-{
1905- if (pMonitorFromWindow != NULL) {
1906- // マルチモニタがサポートされている場合
1907- MONITORINFO monitorInfo;
1908- HMONITOR hMonitor = pMonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
1909- monitorInfo.cbSize = sizeof(MONITORINFO);
1910- pGetMonitorInfoA(hMonitor, &monitorInfo);
1911- *rect = monitorInfo.rcWork;
1912- } else {
1913- // マルチモニタがサポートされていない場合
1914- SystemParametersInfo(SPI_GETWORKAREA, 0, rect, 0);
1915- }
1916-}
1917-
1918-/**
1919- * ウィンドウをディスプレイからはみ出さないように移動する
1920- * はみ出ていない場合は移動しない
1921- *
1922- * @param[in] hWnd 位置を調整するウィンドウ
1923- */
1924-void MoveWindowToDisplay(HWND hWnd)
1925-{
1926- RECT desktop;
1927- RECT win_rect;
1928- int win_width;
1929- int win_height;
1930- int win_x;
1931- int win_y;
1932- BOOL modify = FALSE;
1933-
1934- GetDesktopRect(hWnd, &desktop);
1935-
1936- GetWindowRect(hWnd, &win_rect);
1937- win_x = win_rect.left;
1938- win_y = win_rect.top;
1939- win_height = win_rect.bottom - win_rect.top;
1940- win_width = win_rect.right - win_rect.left;
1941- if (win_y < desktop.top) {
1942- win_y = desktop.top;
1943- modify = TRUE;
1944- }
1945- else if (win_y + win_height > desktop.bottom) {
1946- win_y = desktop.bottom - win_height;
1947- modify = TRUE;
1948- }
1949- if (win_x < desktop.left) {
1950- win_x = desktop.left;
1951- modify = TRUE;
1952- }
1953- else if (win_x + win_width > desktop.right) {
1954- win_x = desktop.right - win_width;
1955- modify = TRUE;
1956- }
1957-
1958- if (modify) {
1959- SetWindowPos(hWnd, NULL, win_x, win_y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
1960- }
1961-}
1962-
1963-/**
1964- * ウィンドウをディスプレイの中央に配置する
1965- *
1966- * @param[in] hWnd 位置を調整するウィンドウ
1967- * @param[in] hWndParent このウィンドウの中央に移動する
1968- * (NULLの場合ディスプレイの中央)
1969- *
1970- * hWndParentの指定がある場合
1971- * hWndParentが表示状態の場合
1972- * - hWndParentの中央に配置
1973- * - ただし表示されているディスプレイからはみ出す場合は調整される
1974- * hWndParentが非表示状態の場合
1975- * - hWndが表示されているディスプレイの中央に配置される
1976- * hWndParentがNULLの場合
1977- * - hWndが表示されているディスプレイの中央に配置される
1978- */
1979-void CenterWindow(HWND hWnd, HWND hWndParent)
1980-{
1981- RECT rcWnd;
1982- LONG WndWidth;
1983- LONG WndHeight;
1984- int NewX;
1985- int NewY;
1986- RECT rcDesktop;
1987- BOOL r;
1988-
1989- r = GetWindowRect(hWnd, &rcWnd);
1990- assert(r != FALSE); (void)r;
1991- WndWidth = rcWnd.right - rcWnd.left;
1992- WndHeight = rcWnd.bottom - rcWnd.top;
1993-
1994- if (hWndParent == NULL || !IsWindowVisible(hWndParent) || IsIconic(hWndParent)) {
1995- // 親が設定されていない or 表示されていない or icon化されている 場合
1996- // ウィンドウの表示されているディスプレイの中央に表示する
1997- GetDesktopRect(hWnd, &rcDesktop);
1998-
1999- // デスクトップ(表示されているディスプレイ)の中央
2000- NewX = (rcDesktop.left + rcDesktop.right) / 2 - WndWidth / 2;
2001- NewY = (rcDesktop.top + rcDesktop.bottom) / 2 - WndHeight / 2;
2002- } else {
2003- RECT rcParent;
2004- r = GetWindowRect(hWndParent, &rcParent);
2005- assert(r != FALSE); (void)r;
2006-
2007- // hWndParentの中央
2008- NewX = (rcParent.left + rcParent.right) / 2 - WndWidth / 2;
2009- NewY = (rcParent.top + rcParent.bottom) / 2 - WndHeight / 2;
2010-
2011- GetDesktopRect(hWndParent, &rcDesktop);
2012- }
2013-
2014- // デスクトップからはみ出す場合、調整する
2015- if (NewX + WndWidth > rcDesktop.right)
2016- NewX = rcDesktop.right - WndWidth;
2017- if (NewX < rcDesktop.left)
2018- NewX = rcDesktop.left;
2019-
2020- if (NewY + WndHeight > rcDesktop.bottom)
2021- NewY = rcDesktop.bottom - WndHeight;
2022- if (NewY < rcDesktop.top)
2023- NewY = rcDesktop.top;
2024-
2025- // 移動する
2026- SetWindowPos(hWnd, NULL, NewX, NewY, 0, 0,
2027- SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
2028-}
2029-
2030-/**
2031- * hWndの表示されているモニタのDPIを取得する
2032- * Per-monitor DPI awareness対応
2033- *
2034- * @retval DPI値(通常のDPIは96)
2035- */
2036-int GetMonitorDpiFromWindow(HWND hWnd)
2037-{
2038- if (pGetDpiForMonitor == NULL) {
2039- // ダイアログ内では自動スケーリングが効いているので
2040- // 常に96を返すようだ
2041- int dpiY;
2042- HDC hDC = GetDC(hWnd);
2043- dpiY = GetDeviceCaps(hDC,LOGPIXELSY);
2044- ReleaseDC(hWnd, hDC);
2045- return dpiY;
2046- } else {
2047- UINT dpiX;
2048- UINT dpiY;
2049- HMONITOR hMonitor = pMonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
2050- pGetDpiForMonitor(hMonitor, 0 /*0=MDT_EFFECTIVE_DPI*/, &dpiX, &dpiY);
2051- return (int)dpiY;
2052- }
2053-}
2054-
2055-/* vim: set ts=4 sw=4 ff=dos : */
--- trunk/teraterm/common/ttlib_static.c (nonexistent)
+++ trunk/teraterm/common/ttlib_static.c (revision 8564)
@@ -0,0 +1,282 @@
1+/*
2+ * Copyright (C) 1994-1998 T. Teranishi
3+ * (C) 2006-2020 TeraTerm Project
4+ * All rights reserved.
5+ *
6+ * Redistribution and use in source and binary forms, with or without
7+ * modification, are permitted provided that the following conditions
8+ * are met:
9+ *
10+ * 1. Redistributions of source code must retain the above copyright
11+ * notice, this list of conditions and the following disclaimer.
12+ * 2. Redistributions in binary form must reproduce the above copyright
13+ * notice, this list of conditions and the following disclaimer in the
14+ * documentation and/or other materials provided with the distribution.
15+ * 3. The name of the author may not be used to endorse or promote products
16+ * derived from this software without specific prior written permission.
17+ *
18+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+ */
29+
30+/* misc. routines */
31+
32+#include <sys/stat.h>
33+#include <sys/utime.h>
34+#include <string.h>
35+#include <time.h>
36+#include <stdio.h>
37+#include <shlobj.h>
38+#include <ctype.h>
39+#include <mbctype.h> // for _ismbblead
40+#include <assert.h>
41+
42+#include "teraterm_conf.h"
43+#include "teraterm.h"
44+#include "tttypes.h"
45+#include "compat_win.h"
46+
47+#include "../teraterm/unicode_test.h"
48+
49+
50+/**
51+ * ウィンドウ上の位置を取得する
52+ * @Param[in] hWnd
53+ * @Param[in] point 位置(x,y)
54+ * @Param[in,out] InWindow ウィンドウ上
55+ * @Param[in,out] InClient クライアント領域上
56+ * @Param[in,out] InTitleBar タイトルバー上
57+ * @retval FALSE 無効なhWnd
58+ */
59+BOOL GetPositionOnWindow(
60+ HWND hWnd, const POINT *point,
61+ BOOL *InWindow, BOOL *InClient, BOOL *InTitleBar)
62+{
63+ const int x = point->x;
64+ const int y = point->y;
65+ RECT winRect;
66+ RECT clientRect;
67+
68+ if (InWindow != NULL) *InWindow = FALSE;
69+ if (InClient != NULL) *InClient = FALSE;
70+ if (InTitleBar != NULL) *InTitleBar = FALSE;
71+
72+ if (!GetWindowRect(hWnd, &winRect)) {
73+ return FALSE;
74+ }
75+
76+ if ((x < winRect.left) || (winRect.right < x) ||
77+ (y < winRect.top) || (winRect.bottom < y))
78+ {
79+ return TRUE;
80+ }
81+ if (InWindow != NULL) *InWindow = TRUE;
82+
83+ {
84+ POINT pos;
85+ GetClientRect(hWnd, &clientRect);
86+ pos.x = clientRect.left;
87+ pos.y = clientRect.top;
88+ ClientToScreen(hWnd, &pos);
89+ clientRect.left = pos.x;
90+ clientRect.top = pos.y;
91+
92+ pos.x = clientRect.right;
93+ pos.y = clientRect.bottom;
94+ ClientToScreen(hWnd, &pos);
95+ clientRect.right = pos.x;
96+ clientRect.bottom = pos.y;
97+ }
98+
99+ if ((clientRect.left <= x) && (x < clientRect.right) &&
100+ (clientRect.top <= y) && (y < clientRect.bottom))
101+ {
102+ if (InClient != NULL) *InClient = TRUE;
103+ if (InTitleBar != NULL) *InTitleBar = FALSE;
104+ return TRUE;
105+ }
106+ if (InClient != NULL) *InClient = FALSE;
107+
108+ if (InTitleBar != NULL) {
109+ *InTitleBar = (y < clientRect.top) ? TRUE : FALSE;
110+ }
111+
112+ return TRUE;
113+}
114+
115+int SetDlgTexts(HWND hDlgWnd, const DlgTextInfo *infos, int infoCount, const char *UILanguageFile)
116+{
117+ return SetI18nDlgStrs("Tera Term", hDlgWnd, infos, infoCount, UILanguageFile);
118+}
119+
120+void SetDlgMenuTexts(HMENU hMenu, const DlgTextInfo *infos, int infoCount, const char *UILanguageFile)
121+{
122+ SetI18nMenuStrs("Tera Term", hMenu, infos, infoCount, UILanguageFile);
123+}
124+
125+/**
126+ * ウィンドウ表示されているディスプレイのデスクトップの範囲を取得する
127+ * @param[in] hWnd ウィンドウのハンドル
128+ * @param[out] rect デスクトップ
129+ */
130+void GetDesktopRect(HWND hWnd, RECT *rect)
131+{
132+ if (pMonitorFromWindow != NULL) {
133+ // マルチモニタがサポートされている場合
134+ MONITORINFO monitorInfo;
135+ HMONITOR hMonitor = pMonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
136+ monitorInfo.cbSize = sizeof(MONITORINFO);
137+ pGetMonitorInfoA(hMonitor, &monitorInfo);
138+ *rect = monitorInfo.rcWork;
139+ } else {
140+ // マルチモニタがサポートされていない場合
141+ SystemParametersInfo(SPI_GETWORKAREA, 0, rect, 0);
142+ }
143+}
144+
145+/**
146+ * ウィンドウをディスプレイからはみ出さないように移動する
147+ * はみ出ていない場合は移動しない
148+ *
149+ * @param[in] hWnd 位置を調整するウィンドウ
150+ */
151+void MoveWindowToDisplay(HWND hWnd)
152+{
153+ RECT desktop;
154+ RECT win_rect;
155+ int win_width;
156+ int win_height;
157+ int win_x;
158+ int win_y;
159+ BOOL modify = FALSE;
160+
161+ GetDesktopRect(hWnd, &desktop);
162+
163+ GetWindowRect(hWnd, &win_rect);
164+ win_x = win_rect.left;
165+ win_y = win_rect.top;
166+ win_height = win_rect.bottom - win_rect.top;
167+ win_width = win_rect.right - win_rect.left;
168+ if (win_y < desktop.top) {
169+ win_y = desktop.top;
170+ modify = TRUE;
171+ }
172+ else if (win_y + win_height > desktop.bottom) {
173+ win_y = desktop.bottom - win_height;
174+ modify = TRUE;
175+ }
176+ if (win_x < desktop.left) {
177+ win_x = desktop.left;
178+ modify = TRUE;
179+ }
180+ else if (win_x + win_width > desktop.right) {
181+ win_x = desktop.right - win_width;
182+ modify = TRUE;
183+ }
184+
185+ if (modify) {
186+ SetWindowPos(hWnd, NULL, win_x, win_y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
187+ }
188+}
189+
190+/**
191+ * ウィンドウをディスプレイの中央に配置する
192+ *
193+ * @param[in] hWnd 位置を調整するウィンドウ
194+ * @param[in] hWndParent このウィンドウの中央に移動する
195+ * (NULLの場合ディスプレイの中央)
196+ *
197+ * hWndParentの指定がある場合
198+ * hWndParentが表示状態の場合
199+ * - hWndParentの中央に配置
200+ * - ただし表示されているディスプレイからはみ出す場合は調整される
201+ * hWndParentが非表示状態の場合
202+ * - hWndが表示されているディスプレイの中央に配置される
203+ * hWndParentがNULLの場合
204+ * - hWndが表示されているディスプレイの中央に配置される
205+ */
206+void CenterWindow(HWND hWnd, HWND hWndParent)
207+{
208+ RECT rcWnd;
209+ LONG WndWidth;
210+ LONG WndHeight;
211+ int NewX;
212+ int NewY;
213+ RECT rcDesktop;
214+ BOOL r;
215+
216+ r = GetWindowRect(hWnd, &rcWnd);
217+ assert(r != FALSE); (void)r;
218+ WndWidth = rcWnd.right - rcWnd.left;
219+ WndHeight = rcWnd.bottom - rcWnd.top;
220+
221+ if (hWndParent == NULL || !IsWindowVisible(hWndParent) || IsIconic(hWndParent)) {
222+ // 親が設定されていない or 表示されていない or icon化されている 場合
223+ // ウィンドウの表示されているディスプレイの中央に表示する
224+ GetDesktopRect(hWnd, &rcDesktop);
225+
226+ // デスクトップ(表示されているディスプレイ)の中央
227+ NewX = (rcDesktop.left + rcDesktop.right) / 2 - WndWidth / 2;
228+ NewY = (rcDesktop.top + rcDesktop.bottom) / 2 - WndHeight / 2;
229+ } else {
230+ RECT rcParent;
231+ r = GetWindowRect(hWndParent, &rcParent);
232+ assert(r != FALSE); (void)r;
233+
234+ // hWndParentの中央
235+ NewX = (rcParent.left + rcParent.right) / 2 - WndWidth / 2;
236+ NewY = (rcParent.top + rcParent.bottom) / 2 - WndHeight / 2;
237+
238+ GetDesktopRect(hWndParent, &rcDesktop);
239+ }
240+
241+ // デスクトップからはみ出す場合、調整する
242+ if (NewX + WndWidth > rcDesktop.right)
243+ NewX = rcDesktop.right - WndWidth;
244+ if (NewX < rcDesktop.left)
245+ NewX = rcDesktop.left;
246+
247+ if (NewY + WndHeight > rcDesktop.bottom)
248+ NewY = rcDesktop.bottom - WndHeight;
249+ if (NewY < rcDesktop.top)
250+ NewY = rcDesktop.top;
251+
252+ // 移動する
253+ SetWindowPos(hWnd, NULL, NewX, NewY, 0, 0,
254+ SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
255+}
256+
257+/**
258+ * hWndの表示されているモニタのDPIを取得する
259+ * Per-monitor DPI awareness対応
260+ *
261+ * @retval DPI値(通常のDPIは96)
262+ */
263+int GetMonitorDpiFromWindow(HWND hWnd)
264+{
265+ if (pGetDpiForMonitor == NULL) {
266+ // ダイアログ内では自動スケーリングが効いているので
267+ // 常に96を返すようだ
268+ int dpiY;
269+ HDC hDC = GetDC(hWnd);
270+ dpiY = GetDeviceCaps(hDC,LOGPIXELSY);
271+ ReleaseDC(hWnd, hDC);
272+ return dpiY;
273+ } else {
274+ UINT dpiX;
275+ UINT dpiY;
276+ HMONITOR hMonitor = pMonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
277+ pGetDpiForMonitor(hMonitor, 0 /*0=MDT_EFFECTIVE_DPI*/, &dpiX, &dpiY);
278+ return (int)dpiY;
279+ }
280+}
281+
282+/* vim: set ts=4 sw=4 ff=dos : */
Show on old repository browser