1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-05-30 00:04:49 -05:00

Add input-focus support for System 7, where the Control Manager can't do

it itself.
Also clean up Carbon builds.

[originally from svn r3019]
This commit is contained in:
Ben Harris 2003-03-29 18:32:36 +00:00
parent adb469b1c6
commit 54aff83bf0
2 changed files with 76 additions and 7 deletions

View File

@ -76,6 +76,7 @@ struct macctrls {
unsigned int npanels; unsigned int npanels;
unsigned int curpanel; unsigned int curpanel;
union macctrl **panels; /* lists of controls by panel */ union macctrl **panels; /* lists of controls by panel */
union macctrl *focus; /* Input focus for System 7 */
}; };
typedef struct Session { typedef struct Session {

View File

@ -1,4 +1,4 @@
/* $Id: macctrls.c,v 1.17 2003/03/28 00:50:04 ben Exp $ */ /* $Id: macctrls.c,v 1.18 2003/03/29 18:32:36 ben Exp $ */
/* /*
* Copyright (c) 2003 Ben Harris * Copyright (c) 2003 Ben Harris
* All rights reserved. * All rights reserved.
@ -117,6 +117,7 @@ struct mac_layoutstate {
static void macctrl_layoutset(struct mac_layoutstate *, struct controlset *, static void macctrl_layoutset(struct mac_layoutstate *, struct controlset *,
WindowPtr, struct macctrls *); WindowPtr, struct macctrls *);
static void macctrl_switchtopanel(struct macctrls *, unsigned int); static void macctrl_switchtopanel(struct macctrls *, unsigned int);
static void macctrl_setfocus(struct macctrls *, union macctrl *);
static void macctrl_text(struct macctrls *, WindowPtr, static void macctrl_text(struct macctrls *, WindowPtr,
struct mac_layoutstate *, union control *); struct mac_layoutstate *, union control *);
static void macctrl_editbox(struct macctrls *, WindowPtr, static void macctrl_editbox(struct macctrls *, WindowPtr,
@ -218,6 +219,7 @@ void macctrl_layoutbox(struct controlbox *cb, WindowPtr window,
CreateRootControl(window, &root); CreateRootControl(window, &root);
mcs->window = window; mcs->window = window;
mcs->byctrl = newtree234(macctrl_cmp_byctrl); mcs->byctrl = newtree234(macctrl_cmp_byctrl);
mcs->focus = NULL;
/* Count the number of panels */ /* Count the number of panels */
mcs->npanels = 1; mcs->npanels = 1;
for (i = 1; i < cb->nctrlsets; i++) for (i = 1; i < cb->nctrlsets; i++)
@ -306,7 +308,11 @@ static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which)
mcs->curpanel = which; mcs->curpanel = which;
/* Panel 0 is special and always visible. */ /* Panel 0 is special and always visible. */
for (i = 1; i < mcs->npanels; i++) for (i = 1; i < mcs->npanels; i++)
for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) {
#if !TARGET_API_MAC_CARBON
if (mcs->focus == mc)
macctrl_setfocus(mcs, NULL);
#endif
switch (mc->generic.type) { switch (mc->generic.type) {
case MACCTRL_TEXT: case MACCTRL_TEXT:
hideshow(mc->text.tbctrl); hideshow(mc->text.tbctrl);
@ -328,8 +334,46 @@ static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which)
hideshow(mc->popup.tbctrl); hideshow(mc->popup.tbctrl);
break; break;
} }
}
} }
#if !TARGET_API_MAC_CARBON
/*
* System 7 focus manipulation
*/
static void macctrl_defocus(union macctrl *mc)
{
assert(mac_gestalts.apprvers < 0x100);
switch (mc->generic.type) {
case MACCTRL_EDITBOX:
TEDeactivate((TEHandle)(*mc->editbox.tbctrl)->contrlData);
break;
}
}
static void macctrl_enfocus(union macctrl *mc)
{
assert(mac_gestalts.apprvers < 0x100);
switch (mc->generic.type) {
case MACCTRL_EDITBOX:
TEActivate((TEHandle)(*mc->editbox.tbctrl)->contrlData);
break;
}
}
static void macctrl_setfocus(struct macctrls *mcs, union macctrl *mc)
{
if (mcs->focus != NULL)
macctrl_defocus(mcs->focus);
mcs->focus = mc;
if (mc != NULL)
macctrl_enfocus(mc);
}
#endif
static void macctrl_text(struct macctrls *mcs, WindowPtr window, static void macctrl_text(struct macctrls *mcs, WindowPtr window,
struct mac_layoutstate *curstate, struct mac_layoutstate *curstate,
union control *ctrl) union control *ctrl)
@ -450,6 +494,7 @@ static pascal SInt32 macctrl_sys7_editbox_cdef(SInt16 variant,
Rect rect; Rect rect;
TEHandle te; TEHandle te;
long ssfs; long ssfs;
Point mouse;
switch (msg) { switch (msg) {
case initCntl: case initCntl:
@ -473,6 +518,12 @@ static pascal SInt32 macctrl_sys7_editbox_cdef(SInt16 variant,
TEUpdate(&rect, (TEHandle)(*control)->contrlData); TEUpdate(&rect, (TEHandle)(*control)->contrlData);
} }
return 0; return 0;
case testCntl:
mouse.h = LoWord(param);
mouse.v = HiWord(param);
return
PtInRect(mouse, &(*(TEHandle)(*control)->contrlData)->viewRect) ?
kControlEditTextPart : kControlNoPart;
case calcCRgns: case calcCRgns:
if (param & (1 << 31)) { if (param & (1 << 31)) {
param &= ~(1 << 31); param &= ~(1 << 31);
@ -763,6 +814,7 @@ void macctrl_click(WindowPtr window, EventRecord *event)
GlobalToLocal(&mouse); GlobalToLocal(&mouse);
part = FindControl(mouse, window, &control); part = FindControl(mouse, window, &control);
if (control != NULL) { if (control != NULL) {
mc = (union macctrl *)GetControlReference(control);
if (mac_gestalts.apprvers >= 0x100) { if (mac_gestalts.apprvers >= 0x100) {
if (GetControlFeatures(control, &features) == noErr && if (GetControlFeatures(control, &features) == noErr &&
(features & kControlSupportsFocus) && (features & kControlSupportsFocus) &&
@ -770,9 +822,19 @@ void macctrl_click(WindowPtr window, EventRecord *event)
SetKeyboardFocus(window, control, part); SetKeyboardFocus(window, control, part);
trackresult = HandleControlClick(control, mouse, event->modifiers, trackresult = HandleControlClick(control, mouse, event->modifiers,
(ControlActionUPP)-1); (ControlActionUPP)-1);
} else } else {
#if !TARGET_API_MAC_CARBON
if (mc->generic.type == MACCTRL_EDITBOX &&
control == mc->editbox.tbctrl) {
TEHandle te = (TEHandle)(*control)->contrlData;
macctrl_setfocus(mcs, mc);
TEClick(mouse, !!(event->modifiers & shiftKey), te);
goto done;
}
#endif
trackresult = TrackControl(control, mouse, (ControlActionUPP)-1); trackresult = TrackControl(control, mouse, (ControlActionUPP)-1);
mc = (union macctrl *)GetControlReference(control); }
switch (mc->generic.type) { switch (mc->generic.type) {
case MACCTRL_RADIO: case MACCTRL_RADIO:
if (trackresult != 0) { if (trackresult != 0) {
@ -801,6 +863,7 @@ void macctrl_click(WindowPtr window, EventRecord *event)
break; break;
} }
} }
done:
SetPort(saveport); SetPort(saveport);
} }
@ -1075,9 +1138,11 @@ void dlg_editbox_set(union control *ctrl, void *dlg, char const *text)
kControlEditTextPasswordTag : kControlEditTextPasswordTag :
kControlEditTextTextTag, kControlEditTextTextTag,
strlen(text), text); strlen(text), text);
#if !TARGET_API_MAC_CARBON
else else
TESetText(text, strlen(text), TESetText(text, strlen(text),
(TEHandle)(*mc->editbox.tbctrl)->contrlData); (TEHandle)(*mc->editbox.tbctrl)->contrlData);
#endif
DrawOneControl(mc->editbox.tbctrl); DrawOneControl(mc->editbox.tbctrl);
SetPort(saveport); SetPort(saveport);
} }
@ -1086,7 +1151,6 @@ void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length)
{ {
struct macctrls *mcs = dlg; struct macctrls *mcs = dlg;
union macctrl *mc = findbyctrl(mcs, ctrl); union macctrl *mc = findbyctrl(mcs, ctrl);
TEHandle te;
Size olen; Size olen;
assert(mc != NULL); assert(mc != NULL);
@ -1100,13 +1164,17 @@ void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length)
olen = 0; olen = 0;
if (olen > length - 1) if (olen > length - 1)
olen = length - 1; olen = length - 1;
} else { }
te = (TEHandle)(*mc->editbox.tbctrl)->contrlData; #if !TARGET_API_MAC_CARBON
else {
TEHandle te = (TEHandle)(*mc->editbox.tbctrl)->contrlData;
olen = (*te)->teLength; olen = (*te)->teLength;
if (olen > length - 1) if (olen > length - 1)
olen = length - 1; olen = length - 1;
memcpy(buffer, *(*te)->hText, olen); memcpy(buffer, *(*te)->hText, olen);
} }
#endif
buffer[olen] = '\0'; buffer[olen] = '\0';
fprintf(stderr, "dlg_editbox_get: %s\n", buffer); fprintf(stderr, "dlg_editbox_get: %s\n", buffer);
} }