1 /* $Id: macevlog.c,v 1.6 2003/03/29 23:07:55 ben Exp $ */
3 * Copyright (c) 2003 Ben Harris
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
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
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
30 #include <MacWindows.h>
31 #include <Quickdraw.h>
33 #include <ToolUtils.h>
43 static void mac_draweventloggrowicon(Session
*s
);
44 static void mac_adjusteventlogscrollbar(Session
*s
);
45 static void mac_clickeventlog(WindowPtr
, EventRecord
*);
46 static void mac_activateeventlog(WindowPtr
, EventRecord
*);
47 static void mac_groweventlog(WindowPtr
, EventRecord
*);
48 static void mac_updateeventlog(WindowPtr
);
49 static void mac_closeeventlog(WindowPtr
);
51 static void mac_createeventlog(Session
*s
)
54 ListBounds bounds
= { 0, 0, 0, 1 }; /* 1 column, 0 rows */
55 Point csize
= { 0, 0 };
60 s
->eventlog_window
= GetNewWindow(wEventLog
, NULL
, (WindowPtr
)-1);
62 memset(wi
, 0, sizeof(*wi
));
64 wi
->wtype
= wEventLog
;
65 wi
->click
= &mac_clickeventlog
;
66 wi
->activate
= &mac_activateeventlog
;
67 wi
->grow
= &mac_groweventlog
;
68 wi
->update
= &mac_updateeventlog
;
69 wi
->close
= &mac_closeeventlog
;
70 SetWRefCon(s
->eventlog_window
, (long)wi
);
72 SetPort((GrafPtr
)GetWindowPort(s
->eventlog_window
));
73 fondsize
= GetScriptVariable(smRoman
, smScriptSmallFondSize
);
74 TextFont(HiWord(fondsize
));
75 TextSize(LoWord(fondsize
));
77 #if TARGET_API_MAC_CARBON
78 GetPortBounds(GetWindowPort(s
->eventlog_window
), &view
);
80 view
= s
->eventlog_window
->portRect
;
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
);
89 (*s
->eventlog
)->selFlags
= lExtendDrag
| lNoDisjoint
| lNoExtend
;
93 void mac_freeeventlog(Session
*s
)
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
);
105 * FIXME: logevent() should be passed a frontend handle, but backends have to
106 * have a terminal handle instead, because they pass it to from_backend(),
107 * so we accept a terminal handle here as well, and hope no-one tries to call
108 * us with sensible arguments.
110 void logevent(void *frontend
, char *str
)
112 Terminal
*term
= frontend
;
113 Session
*s
= term
->frontend
;
114 ListBounds bounds
, visible
;
115 Cell cell
= { 0, 0 };
117 if (s
->eventlog
== NULL
)
118 mac_createeventlog(s
);
119 if (s
->eventlog
== NULL
)
122 #if TARGET_API_MAC_CARBON
123 GetListDataBounds(s
->eventlog
, &bounds
);
124 GetListVisibleCells(s
->eventlog
, &visible
);
126 bounds
= (*s
->eventlog
)->dataBounds
;
127 visible
= (*s
->eventlog
)->visible
;
130 cell
.v
= bounds
.bottom
;
131 LAddRow(1, cell
.v
, s
->eventlog
);
132 LSetCell(str
, strlen(str
), cell
, s
->eventlog
);
133 /* ">=" and "2" because there can be a blank cell below the last one. */
134 if (visible
.bottom
>= bounds
.bottom
)
135 LScroll(0, 2, s
->eventlog
);
138 static void mac_draweventloggrowicon(Session
*s
)
143 SetPort((GrafPtr
)GetWindowPort(s
->eventlog_window
));
145 * Stop DrawGrowIcon giving us space for a horizontal scrollbar
146 * See Tech Note TB575 for details.
148 #if TARGET_API_MAC_CARBON
149 GetPortBounds(GetWindowPort(s
->eventlog_window
), &clip
);
151 clip
= s
->eventlog_window
->portRect
;
153 clip
.left
= clip
.right
- 15;
157 DrawGrowIcon(s
->eventlog_window
);
163 * For some reason, LNew doesn't seem to respect the hasGrow
164 * parameter, so we hammer the scrollbar into shape ourselves.
166 static void mac_adjusteventlogscrollbar(Session
*s
)
168 #if TARGET_API_MAC_CARBON
171 GetPortBounds(GetWindowPort(s
->eventlog_window
), &winrect
);
172 SizeControl(GetListVerticalScrollBar(s
->eventlog
),
173 16, winrect
.bottom
- 13);
175 SizeControl((*s
->eventlog
)->vScroll
,
176 16, s
->eventlog_window
->portRect
.bottom
- 13);
180 void mac_clickeventlog(WindowPtr window
, EventRecord
*event
)
182 Session
*s
= mac_windowsession(window
);
187 SetPort((GrafPtr
)GetWindowPort(window
));
188 mouse
= event
->where
;
189 GlobalToLocal(&mouse
);
190 LClick(mouse
, event
->modifiers
, s
->eventlog
);
194 static void mac_groweventlog(WindowPtr window
, EventRecord
*event
)
196 Session
*s
= mac_windowsession(window
);
199 #if TARGET_API_MAC_CARBON
206 SetRect(&limits
, 15, 0, SHRT_MAX
, SHRT_MAX
);
207 grow_result
= GrowWindow(window
, event
->where
, &limits
);
208 if (grow_result
== 0) return;
209 SizeWindow(window
, LoWord(grow_result
), HiWord(grow_result
), TRUE
);
210 LSize(LoWord(grow_result
) - 15, HiWord(grow_result
), s
->eventlog
);
211 mac_adjusteventlogscrollbar(s
);
212 /* We would use SetListCellSize in Carbon, but it's missing. */
213 (*s
->eventlog
)->cellSize
.h
= LoWord(grow_result
) - 15;
214 #if TARGET_API_MAC_CARBON
215 cellsize
.h
= LoWord(grow_result
) - 15;
216 GetListViewBounds(s
->eventlog
, &rect
);
217 InvalWindowRect(window
, &rect
);
221 InvalRect(&(*s
->eventlog
)->rView
);
226 static void mac_activateeventlog(WindowPtr window
, EventRecord
*event
)
228 Session
*s
= mac_windowsession(window
);
229 int active
= (event
->modifiers
& activeFlag
) != 0;
231 LActivate(active
, s
->eventlog
);
232 mac_draweventloggrowicon(s
);
235 static void mac_updateeventlog(WindowPtr window
)
237 Session
*s
= mac_windowsession(window
);
238 #if TARGET_API_MAC_CARBON
242 SetPort((GrafPtr
)GetWindowPort(window
));
244 #if TARGET_API_MAC_CARBON
246 GetPortVisibleRegion(GetWindowPort(window
), visrgn
);
247 LUpdate(visrgn
, s
->eventlog
);
250 LUpdate(window
->visRgn
, s
->eventlog
);
252 mac_draweventloggrowicon(s
);
256 static void mac_closeeventlog(WindowPtr window
)
262 void mac_showeventlog(Session
*s
)
265 SelectWindow(s
->eventlog_window
);
266 ShowWindow(s
->eventlog_window
);
271 * c-file-style: "simon"