Clip host resize requests to the size of the desktop.
[u/mdw/putty] / mac / macevlog.c
CommitLineData
7dcd1f87 1/* $Id: macevlog.c,v 1.1 2003/02/07 01:38:12 ben Exp $ */
2/*
3 * Copyright (c) 2003 Ben Harris
4 * All rights reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or
11 * sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following
13 * conditions:
14 *
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
23 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
26 */
27
28#include <MacTypes.h>
29#include <Lists.h>
30#include <MacWindows.h>
31#include <Quickdraw.h>
32#include <Script.h>
33#include <ToolUtils.h>
34
35#include <limits.h>
36#include <string.h>
37
38#include "putty.h"
39#include "mac.h"
40#include "macresid.h"
41#include "terminal.h"
42
43static void mac_draweventloggrowicon(Session *s);
44static void mac_adjusteventlogscrollbar(Session *s);
45
46static void mac_createeventlog(Session *s)
47{
48 Rect view;
49#if TARGET_API_MAC_CARBON
50 Rect controlrect;
51#endif
52 ListBounds bounds = { 0, 0, 0, 1 }; /* 1 column, 0 rows */
53 Point csize = { 0, 0 };
54 GrafPtr saveport;
55 long fondsize;
56 WinInfo *wi;
57
58 s->eventlog_window = GetNewWindow(wEventLog, NULL, (WindowPtr)-1);
59 wi = smalloc(sizeof(*wi));
60 wi->s = s;
61 wi->wtype = wEventLog;
62 SetWRefCon(s->eventlog_window, (long)wi);
63 GetPort(&saveport);
64 SetPort((GrafPtr)GetWindowPort(s->eventlog_window));
65 fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize);
66 TextFont(HiWord(fondsize));
67 TextSize(LoWord(fondsize));
68 SetPort(saveport);
69#if TARGET_API_MAC_CARBON
70 GetPortBounds(GetWindowPort(s->eventlog_window), &view);
71#else
72 view = s->eventlog_window->portRect;
73#endif
74 view.right -= 15; /* Scrollbar */
75 s->eventlog = LNew(&view, &bounds, csize, 0, s->eventlog_window,
76 TRUE, TRUE, FALSE, TRUE);
77 mac_adjusteventlogscrollbar(s);
78#if TARGET_API_MAC_CARBON
79 SetListSelectionFlags(s->eventlog, lExtendDrag | lNoDisjoint | lNoExtend);
80#else
81 (*s->eventlog)->selFlags = lExtendDrag | lNoDisjoint | lNoExtend;
82#endif
83 ShowWindow(s->eventlog_window);
84}
85
86void mac_freeeventlog(Session *s)
87{
88
89 if (s->eventlog != NULL)
90 LDispose(s->eventlog);
91 if (s->eventlog_window != NULL) {
92 sfree((WinInfo *)GetWRefCon(s->eventlog_window));
93 DisposeWindow(s->eventlog_window);
94 }
95}
96
97/*
98 * FIXME: logevent() should be passed a frontend handle, but backends have to
99 * have a terminal handle instead, because they pass it to from_backend(),
100 * so we accept a terminal handle here as well, and hope no-one tries to call
101 * us with sensible arguments.
102 */
103void logevent(void *frontend, char *str)
104{
105 Terminal *term = frontend;
106 Session *s = term->frontend;
107 ListBounds bounds;
108 Cell cell = { 0, 0 };
109
110 if (s->eventlog == NULL)
111 mac_createeventlog(s);
112 if (s->eventlog == NULL)
113 return;
114
115#if TARGET_API_MAC_CARBON
116 GetListDataBounds(s->eventlog, &bounds);
117#else
118 bounds = (*s->eventlog)->dataBounds;
119#endif
120 cell.v = bounds.bottom;
121 LAddRow(1, cell.v, s->eventlog);
122 LSetCell(str, strlen(str), cell, s->eventlog);
123}
124
125static void mac_draweventloggrowicon(Session *s)
126{
127 Rect clip;
128 RgnHandle savergn;
129
130 SetPort((GrafPtr)GetWindowPort(s->eventlog_window));
131 /*
132 * Stop DrawGrowIcon giving us space for a horizontal scrollbar
133 * See Tech Note TB575 for details.
134 */
135#if TARGET_API_MAC_CARBON
136 GetPortBounds(GetWindowPort(s->eventlog_window), &clip);
137#else
138 clip = s->eventlog_window->portRect;
139#endif
140 clip.left = clip.right - 15;
141 savergn = NewRgn();
142 GetClip(savergn);
143 ClipRect(&clip);
144 DrawGrowIcon(s->eventlog_window);
145 SetClip(savergn);
146 DisposeRgn(savergn);
147}
148
149/*
150 * For some reason, LNew doesn't seem to respect the hasGrow
151 * parameter, so we hammer the scrollbar into shape ourselves.
152 */
153static void mac_adjusteventlogscrollbar(Session *s)
154{
155#if TARGET_API_MAC_CARBON
156 Rect winrect;
157
158 GetPortBounds(GetWindowPort(s->eventlog_window), &winrect);
159 SizeControl(GetListVerticalScrollBar(s->eventlog),
160 16, winrect.bottom - 13);
161#else
162 SizeControl((*s->eventlog)->vScroll,
163 16, s->eventlog_window->portRect.bottom - 13);
164#endif
165}
166
167void mac_clickeventlog(WindowPtr window, EventRecord *event)
168{
169 Session *s = mac_windowsession(window);
170 Point mouse;
171 GrafPtr saveport;
172
173 GetPort(&saveport);
174 SetPort((GrafPtr)GetWindowPort(window));
175 mouse = event->where;
176 GlobalToLocal(&mouse);
177 LClick(mouse, event->modifiers, s->eventlog);
178 SetPort(saveport);
179}
180
181void mac_groweventlog(WindowPtr window, EventRecord *event)
182{
183 Session *s = mac_windowsession(window);
184 Rect limits;
185 long grow_result;
186#if TARGET_API_MAC_CARBON
187 Rect rect;
188 Point cellsize;
189#else
190 GrafPtr saveport;
191#endif
192
193 SetRect(&limits, 15, 0, SHRT_MAX, SHRT_MAX);
194 grow_result = GrowWindow(window, event->where, &limits);
195 if (grow_result == 0) return;
196 SizeWindow(window, LoWord(grow_result), HiWord(grow_result), TRUE);
197 LSize(LoWord(grow_result) - 15, HiWord(grow_result), s->eventlog);
198 mac_adjusteventlogscrollbar(s);
199 /* We would use SetListCellSize in Carbon, but it's missing. */
200 (*s->eventlog)->cellSize.h = LoWord(grow_result) - 15;
201#if TARGET_API_MAC_CARBON
202 cellsize.h = LoWord(grow_result) - 15;
203 GetListViewBounds(s->eventlog, &rect);
204 InvalWindowRect(window, &rect);
205#else
206 GetPort(&saveport);
207 SetPort(window);
208 InvalRect(&(*s->eventlog)->rView);
209 SetPort(saveport);
210#endif
211}
212
213void mac_activateeventlog(WindowPtr window, EventRecord *event)
214{
215 Session *s = mac_windowsession(window);
216 int active = (event->modifiers & activeFlag) != 0;
217
218 LActivate(active, s->eventlog);
219 mac_draweventloggrowicon(s);
220}
221
222void mac_updateeventlog(WindowPtr window)
223{
224 Session *s = mac_windowsession(window);
225#if TARGET_API_MAC_CARBON
226 RgnHandle visrgn;
227#endif
228
229 SetPort((GrafPtr)GetWindowPort(window));
230 BeginUpdate(window);
231#if TARGET_API_MAC_CARBON
232 visrgn = NewRgn();
233 GetPortVisibleRegion(GetWindowPort(window), visrgn);
234 LUpdate(visrgn, s->eventlog);
235 DisposeRgn(visrgn);
236#else
237 LUpdate(window->visRgn, s->eventlog);
238#endif
239 mac_draweventloggrowicon(s);
240 EndUpdate(window);
241}
242
243void mac_showeventlog(Session *s)
244{
245
246 ShowWindow(s->eventlog_window);
247}
248
249/*
250 * Local Variables:
251 * c-file-style: "simon"
252 * End:
253 */