Cleanups of the GSSAPI support. On Windows, standard GSS libraries
[u/mdw/putty] / mac / macevlog.c
CommitLineData
1133531b 1/* $Id$ */
7dcd1f87 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);
f854b482 45static void mac_clickeventlog(WindowPtr, EventRecord *);
46static void mac_activateeventlog(WindowPtr, EventRecord *);
47static void mac_groweventlog(WindowPtr, EventRecord *);
48static void mac_updateeventlog(WindowPtr);
2b7f3c13 49static void mac_closeeventlog(WindowPtr);
7dcd1f87 50
51static void mac_createeventlog(Session *s)
52{
53 Rect view;
7dcd1f87 54 ListBounds bounds = { 0, 0, 0, 1 }; /* 1 column, 0 rows */
55 Point csize = { 0, 0 };
56 GrafPtr saveport;
57 long fondsize;
58 WinInfo *wi;
59
60 s->eventlog_window = GetNewWindow(wEventLog, NULL, (WindowPtr)-1);
34773273 61 wi = snew(WinInfo);
f854b482 62 memset(wi, 0, sizeof(*wi));
7dcd1f87 63 wi->s = s;
64 wi->wtype = wEventLog;
f854b482 65 wi->click = &mac_clickeventlog;
66 wi->activate = &mac_activateeventlog;
67 wi->grow = &mac_groweventlog;
68 wi->update = &mac_updateeventlog;
2b7f3c13 69 wi->close = &mac_closeeventlog;
7dcd1f87 70 SetWRefCon(s->eventlog_window, (long)wi);
71 GetPort(&saveport);
72 SetPort((GrafPtr)GetWindowPort(s->eventlog_window));
73 fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize);
74 TextFont(HiWord(fondsize));
75 TextSize(LoWord(fondsize));
76 SetPort(saveport);
77#if TARGET_API_MAC_CARBON
78 GetPortBounds(GetWindowPort(s->eventlog_window), &view);
79#else
80 view = s->eventlog_window->portRect;
81#endif
82 view.right -= 15; /* Scrollbar */
83 s->eventlog = LNew(&view, &bounds, csize, 0, s->eventlog_window,
84 TRUE, TRUE, FALSE, TRUE);
85 mac_adjusteventlogscrollbar(s);
86#if TARGET_API_MAC_CARBON
87 SetListSelectionFlags(s->eventlog, lExtendDrag | lNoDisjoint | lNoExtend);
88#else
89 (*s->eventlog)->selFlags = lExtendDrag | lNoDisjoint | lNoExtend;
90#endif
7dcd1f87 91}
92
93void mac_freeeventlog(Session *s)
94{
95
96 if (s->eventlog != NULL)
97 LDispose(s->eventlog);
98 if (s->eventlog_window != NULL) {
99 sfree((WinInfo *)GetWRefCon(s->eventlog_window));
100 DisposeWindow(s->eventlog_window);
101 }
102}
103
cbe2d68f 104void logevent(void *frontend, const char *str)
7dcd1f87 105{
1e5bde54 106 Session *s = frontend;
9897fb6c 107 ListBounds bounds, visible;
7dcd1f87 108 Cell cell = { 0, 0 };
1133531b 109 char timebuf[40];
110 struct tm tm;
111 char *string;
112
113 tm=ltime();
114 strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm);
115
116 string=snewn(strlen(timebuf) + strlen(str) +1, char);
117 strcpy(string, timebuf);
118 strcat(string, str);
7dcd1f87 119
120 if (s->eventlog == NULL)
121 mac_createeventlog(s);
122 if (s->eventlog == NULL)
123 return;
124
125#if TARGET_API_MAC_CARBON
126 GetListDataBounds(s->eventlog, &bounds);
9897fb6c 127 GetListVisibleCells(s->eventlog, &visible);
7dcd1f87 128#else
129 bounds = (*s->eventlog)->dataBounds;
9897fb6c 130 visible = (*s->eventlog)->visible;
7dcd1f87 131#endif
9897fb6c 132
7dcd1f87 133 cell.v = bounds.bottom;
134 LAddRow(1, cell.v, s->eventlog);
1133531b 135 LSetCell(string, strlen(string), cell, s->eventlog);
9897fb6c 136 /* ">=" and "2" because there can be a blank cell below the last one. */
137 if (visible.bottom >= bounds.bottom)
138 LScroll(0, 2, s->eventlog);
1133531b 139 sfree(string);
7dcd1f87 140}
141
142static void mac_draweventloggrowicon(Session *s)
143{
144 Rect clip;
145 RgnHandle savergn;
146
147 SetPort((GrafPtr)GetWindowPort(s->eventlog_window));
148 /*
149 * Stop DrawGrowIcon giving us space for a horizontal scrollbar
150 * See Tech Note TB575 for details.
151 */
152#if TARGET_API_MAC_CARBON
153 GetPortBounds(GetWindowPort(s->eventlog_window), &clip);
154#else
155 clip = s->eventlog_window->portRect;
156#endif
157 clip.left = clip.right - 15;
158 savergn = NewRgn();
159 GetClip(savergn);
160 ClipRect(&clip);
161 DrawGrowIcon(s->eventlog_window);
162 SetClip(savergn);
163 DisposeRgn(savergn);
164}
165
166/*
167 * For some reason, LNew doesn't seem to respect the hasGrow
168 * parameter, so we hammer the scrollbar into shape ourselves.
169 */
170static void mac_adjusteventlogscrollbar(Session *s)
171{
172#if TARGET_API_MAC_CARBON
173 Rect winrect;
174
175 GetPortBounds(GetWindowPort(s->eventlog_window), &winrect);
176 SizeControl(GetListVerticalScrollBar(s->eventlog),
177 16, winrect.bottom - 13);
178#else
179 SizeControl((*s->eventlog)->vScroll,
180 16, s->eventlog_window->portRect.bottom - 13);
181#endif
182}
183
184void mac_clickeventlog(WindowPtr window, EventRecord *event)
185{
186 Session *s = mac_windowsession(window);
187 Point mouse;
188 GrafPtr saveport;
189
190 GetPort(&saveport);
191 SetPort((GrafPtr)GetWindowPort(window));
192 mouse = event->where;
193 GlobalToLocal(&mouse);
194 LClick(mouse, event->modifiers, s->eventlog);
195 SetPort(saveport);
196}
197
f854b482 198static void mac_groweventlog(WindowPtr window, EventRecord *event)
7dcd1f87 199{
200 Session *s = mac_windowsession(window);
201 Rect limits;
202 long grow_result;
203#if TARGET_API_MAC_CARBON
204 Rect rect;
205 Point cellsize;
206#else
207 GrafPtr saveport;
208#endif
209
210 SetRect(&limits, 15, 0, SHRT_MAX, SHRT_MAX);
211 grow_result = GrowWindow(window, event->where, &limits);
212 if (grow_result == 0) return;
213 SizeWindow(window, LoWord(grow_result), HiWord(grow_result), TRUE);
214 LSize(LoWord(grow_result) - 15, HiWord(grow_result), s->eventlog);
215 mac_adjusteventlogscrollbar(s);
216 /* We would use SetListCellSize in Carbon, but it's missing. */
217 (*s->eventlog)->cellSize.h = LoWord(grow_result) - 15;
218#if TARGET_API_MAC_CARBON
219 cellsize.h = LoWord(grow_result) - 15;
220 GetListViewBounds(s->eventlog, &rect);
221 InvalWindowRect(window, &rect);
222#else
223 GetPort(&saveport);
224 SetPort(window);
225 InvalRect(&(*s->eventlog)->rView);
226 SetPort(saveport);
227#endif
228}
229
f854b482 230static void mac_activateeventlog(WindowPtr window, EventRecord *event)
7dcd1f87 231{
232 Session *s = mac_windowsession(window);
233 int active = (event->modifiers & activeFlag) != 0;
234
235 LActivate(active, s->eventlog);
236 mac_draweventloggrowicon(s);
237}
238
f854b482 239static void mac_updateeventlog(WindowPtr window)
7dcd1f87 240{
241 Session *s = mac_windowsession(window);
242#if TARGET_API_MAC_CARBON
243 RgnHandle visrgn;
244#endif
245
246 SetPort((GrafPtr)GetWindowPort(window));
247 BeginUpdate(window);
248#if TARGET_API_MAC_CARBON
249 visrgn = NewRgn();
250 GetPortVisibleRegion(GetWindowPort(window), visrgn);
251 LUpdate(visrgn, s->eventlog);
252 DisposeRgn(visrgn);
253#else
254 LUpdate(window->visRgn, s->eventlog);
255#endif
256 mac_draweventloggrowicon(s);
257 EndUpdate(window);
258}
259
2b7f3c13 260static void mac_closeeventlog(WindowPtr window)
261{
262
263 HideWindow(window);
264}
265
7dcd1f87 266void mac_showeventlog(Session *s)
267{
268
2b7f3c13 269 SelectWindow(s->eventlog_window);
7dcd1f87 270 ShowWindow(s->eventlog_window);
271}
272
273/*
274 * Local Variables:
275 * c-file-style: "simon"
276 * End:
277 */