| 1 |
/* |
| 2 |
* Copyright (C) 2008- TeraTerm Project |
| 3 |
* All rights reserved. |
| 4 |
* |
| 5 |
* Redistribution and use in source and binary forms, with or without |
| 6 |
* modification, are permitted provided that the following conditions |
| 7 |
* are met: |
| 8 |
* |
| 9 |
* 1. Redistributions of source code must retain the above copyright |
| 10 |
* notice, this list of conditions and the following disclaimer. |
| 11 |
* 2. Redistributions in binary form must reproduce the above copyright |
| 12 |
* notice, this list of conditions and the following disclaimer in the |
| 13 |
* documentation and/or other materials provided with the distribution. |
| 14 |
* 3. The name of the author may not be used to endorse or promote products |
| 15 |
* derived from this software without specific prior written permission. |
| 16 |
* |
| 17 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR |
| 18 |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 19 |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 20 |
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 21 |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 22 |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 26 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 |
*/ |
| 28 |
/* original idea from PuTTY 0.60 windows/sizetip.c */ |
| 29 |
|
| 30 |
#include "teraterm.h" |
| 31 |
#include "tttypes.h" |
| 32 |
#include "ttlib.h" |
| 33 |
#include "ttwinman.h" |
| 34 |
#include "compat_win.h" |
| 35 |
|
| 36 |
#include <windows.h> |
| 37 |
#include <stdio.h> |
| 38 |
|
| 39 |
#include "tipwin.h" |
| 40 |
|
| 41 |
static TipWin *SizeTip; |
| 42 |
static int tip_enabled = 0; |
| 43 |
|
| 44 |
/* |
| 45 |
* point �� |
| 46 |
* �X�N���[�����������o�������������A������������������ |
| 47 |
* NearestMonitor �� TRUE �������A�����������j�^ |
| 48 |
* FALSE�������A�}�E�X���������j�^������������ |
| 49 |
* �f�B�X�v���C���[���� FrameWidth(pixel) �������������������� |
| 50 |
*/ |
| 51 |
static void FixPosFromFrame(POINT *point, int FrameWidth, BOOL NearestMonitor) |
| 52 |
{ |
| 53 |
if (HasMultiMonitorSupport()) { |
| 54 |
// �}���`���j�^���T�|�[�g�������������� |
| 55 |
HMONITOR hm; |
| 56 |
MONITORINFO mi; |
| 57 |
int ix, iy; |
| 58 |
|
| 59 |
// �������W�������������� |
| 60 |
ix = point->x; |
| 61 |
iy = point->y; |
| 62 |
|
| 63 |
hm = pMonitorFromPoint(*point, MONITOR_DEFAULTTONULL); |
| 64 |
if (hm == NULL) { |
| 65 |
if (NearestMonitor) { |
| 66 |
// �����������j�^���\������ |
| 67 |
hm = pMonitorFromPoint(*point, MONITOR_DEFAULTTONEAREST); |
| 68 |
} else { |
| 69 |
// �X�N���[�����������o���������������}�E�X���������j�^���\������ |
| 70 |
GetCursorPos(point); |
| 71 |
hm = pMonitorFromPoint(*point, MONITOR_DEFAULTTONEAREST); |
| 72 |
} |
| 73 |
} |
| 74 |
|
| 75 |
mi.cbSize = sizeof(MONITORINFO); |
| 76 |
pGetMonitorInfoA(hm, &mi); |
| 77 |
if (ix < mi.rcMonitor.left + FrameWidth) { |
| 78 |
ix = mi.rcMonitor.left + FrameWidth; |
| 79 |
} |
| 80 |
if (iy < mi.rcMonitor.top + FrameWidth) { |
| 81 |
iy = mi.rcMonitor.top + FrameWidth; |
| 82 |
} |
| 83 |
|
| 84 |
point->x = ix; |
| 85 |
point->y = iy; |
| 86 |
} |
| 87 |
else |
| 88 |
{ |
| 89 |
// �}���`���j�^���T�|�[�g���������������� |
| 90 |
if (point->x < FrameWidth) { |
| 91 |
point->x = FrameWidth; |
| 92 |
} |
| 93 |
if (point->y < FrameWidth) { |
| 94 |
point->y = FrameWidth; |
| 95 |
} |
| 96 |
} |
| 97 |
} |
| 98 |
|
| 99 |
/* ���T�C�Y�p�c�[���`�b�v���\������ |
| 100 |
* |
| 101 |
* �����F |
| 102 |
* src �E�B���h�E�n���h�� |
| 103 |
* cx, cy �c�[���`�b�v���\�������c���T�C�Y |
| 104 |
* fwSide ���T�C�Y�����������E�B���h�E���������� |
| 105 |
* newX, newY ���T�C�Y�������������W |
| 106 |
* |
| 107 |
* ����: |
| 108 |
* Windows9x�����������v���p�e�B���u�E�B���h�E�����e���\���������� |
| 109 |
* �h���b�O�����v���`�F�b�N�������������A�c�[���`�b�v���\�������������B |
| 110 |
*/ |
| 111 |
void UpdateSizeTip(HWND src, int cx, int cy, UINT fwSide, int newX, int newY) |
| 112 |
{ |
| 113 |
char str[32]; |
| 114 |
int tooltip_movable = 0; |
| 115 |
|
| 116 |
if (!tip_enabled) |
| 117 |
return; |
| 118 |
|
| 119 |
/* Generate the tip text */ |
| 120 |
_snprintf_s(str, _countof(str), _TRUNCATE, "%dx%d", cx, cy); |
| 121 |
|
| 122 |
// �E�B���h�E���E�A�E���A�����������������A�c�[���`�b�v�����������z�u�����B |
| 123 |
// ���������O�����T�C�Y�������������z�u�����B |
| 124 |
if (!(fwSide == WMSZ_RIGHT || fwSide == WMSZ_BOTTOMRIGHT || fwSide == WMSZ_BOTTOM)) { |
| 125 |
tooltip_movable = 1; |
| 126 |
} |
| 127 |
|
| 128 |
if (SizeTip == NULL) { |
| 129 |
RECT wr; |
| 130 |
POINT point; |
| 131 |
int w, h; |
| 132 |
|
| 133 |
// ���������c���T�C�Y���������� |
| 134 |
TipWinGetTextWidthHeight(src, str, &w, &h); |
| 135 |
|
| 136 |
// �E�B���h�E�����u������ |
| 137 |
GetWindowRect(src, &wr); |
| 138 |
|
| 139 |
// sizetip���o�����u���A�E�B���h�E����(X, Y)���������A |
| 140 |
// (X, Y - ������������ - TIP_WIN_FRAME_WIDTH * 2) �������B |
| 141 |
point.x = wr.left; |
| 142 |
point.y = wr.top - (h + TIP_WIN_FRAME_WIDTH * 2); |
| 143 |
FixPosFromFrame(&point, 16, FALSE); |
| 144 |
cx = point.x; |
| 145 |
cy = point.y; |
| 146 |
|
| 147 |
SizeTip = TipWinCreateA(NULL, src, cx, cy, str); |
| 148 |
} else { |
| 149 |
/* Tip already exists, just set the text */ |
| 150 |
TipWinSetTextA(SizeTip, str); |
| 151 |
|
| 152 |
// �E�B���h�E�������������������� |
| 153 |
if (tooltip_movable) { |
| 154 |
TipWinSetPos(SizeTip, newX + TIP_WIN_FRAME_WIDTH*2, newY + TIP_WIN_FRAME_WIDTH*2); |
| 155 |
} |
| 156 |
} |
| 157 |
} |
| 158 |
|
| 159 |
void EnableSizeTip(int bEnable) |
| 160 |
{ |
| 161 |
if (SizeTip && !bEnable) { |
| 162 |
TipWinDestroy(SizeTip); |
| 163 |
SizeTip = NULL; |
| 164 |
} |
| 165 |
|
| 166 |
tip_enabled = bEnable; |
| 167 |
} |