GetWidgetText(&boxOptions[INPUT], &p);
snprintf(newText, MSG_SIZ, "%s%c", p, *buf);
SetWidgetText(&boxOptions[INPUT], newText, InputBoxDlg);
- if(shellUp[InputBoxDlg]) HardSetFocus (&boxOptions[INPUT]); //why???
+ if(shellUp[InputBoxDlg]) HardSetFocus (&boxOptions[INPUT], InputBoxDlg); //why???
} else icsText = buf; // box did not exist: make sure it pops up with char in it
ICSInputBoxPopUp();
} else PopUpMoveDialog(*buf);
if(shellUp[InputBoxDlg]) opt = &boxOptions[INPUT], dlg = InputBoxDlg; // for the benefit of Xaw give priority to ICS Input Box
SetWidgetText(opt, text, dlg);
SetInsertPos(opt, pos);
- HardSetFocus(opt);
+ HardSetFocus(opt, dlg);
CursorAtEnd(opt);
}
-void
+int
IcsHist (int n, Option *opt, DialogClass dlg)
{ // [HGM] input: let up-arrow recall previous line from history
char *val = NULL; // to suppress spurious warning
+ int chat, start;
- if(opt != &chatOptions[CHAT_IN]) return;
+ if(opt != &chatOptions[CHAT_IN] && !(opt == &chatOptions[CHAT_PARTNER] && n == 33)) return 0;
switch(n) {
+ case 33: // <Esc>
+ if(hidden) BoardToTop();
+ else PaneSwitch();
+ break;
+ case 10: // <Tab>
+ chat = start = (activePartner - hidden + MAX_CHAT) % MAX_CHAT;
+ while(!dirty[chat = (chat + 1)%MAX_CHAT]) if(chat == start) break;
+ if(!dirty[chat])
+ while(!chatPartner[chat = (chat + 1)%MAX_CHAT][0]) if(chat == start) break;
+ if(chat == start && hidden) chat = 0; // if all unused, start left
+ ChatSwitch(chat + 1);
+ break;
case 1:
GetWidgetText(opt, &val);
val = PrevInHistory(val);
}
SetWidgetText(opt, val = val ? val : "", dlg);
SetInsertPos(opt, strlen(val));
+ return 1;
}
void
SetWidgetText(&chatOptions[CHAT_OUT], "", -1); // clear text if we alter partner
SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg); // clear text if we alter partner
SetWidgetLabel(&chatOptions[activePartner+1], chatPartner[activePartner][0] ? chatPartner[activePartner] : _("New Chat"));
- HardSetFocus(&chatOptions[CHAT_IN]);
+ HardSetFocus(&chatOptions[CHAT_IN], 0);
}
if(line[0] || hidden) { // something was typed (for ICS commands we also allow empty line!)
SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg);
SetColor(dirty[i] ? "#FFC000" : "#FFFFFF", &chatOptions[j]);
}
SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg);
- HardSetFocus(&chatOptions[strcmp(chatPartner[n], "") ? CHAT_IN : CHAT_PARTNER]);
+ HardSetFocus(&chatOptions[strcmp(chatPartner[n], "") ? CHAT_IN : CHAT_PARTNER], 0);
}
void
{
if(GenericPopUp(chatOptions, _("ICS Interaction"), ChatDlg, BoardWindow, NONMODAL, appData.topLevel))
AddHandler(&chatOptions[CHAT_PARTNER], ChatDlg, 2), AddHandler(&chatOptions[CHAT_IN], ChatDlg, 2); // treats return as OK
- PaneSwitch(); HardSetFocus(&chatOptions[CHAT_IN]);
+ PaneSwitch(); HardSetFocus(&chatOptions[CHAT_IN], 0);
MarkMenu("View.OpenChatWindow", ChatDlg);
CursorAtEnd(&chatOptions[CHAT_IN]);
}
GetWidgetText(&chatOptions[CHAT_IN], &p);
snprintf(newText, MSG_SIZ, "%s%c", p, *buf);
SetWidgetText(&chatOptions[CHAT_IN], newText, ChatDlg);
- if(shellUp[ChatDlg]) HardSetFocus (&boxOptions[CHAT_IN]); //why???
+ if(shellUp[ChatDlg]) HardSetFocus (&chatOptions[CHAT_IN], ChatDlg); //why???
} else { ASSIGN(line, buf); } // box did not exist: make sure it pops up with char in it
ChatProc();
} else PopUpMoveDialog(*buf);
#ifdef TODO_GTK
XtSetKeyboardFocus(shells[dlg], opt->handle);
#endif
+ if(dlg) gtk_window_present(GTK_WINDOW(shells[dlg]));
gtk_widget_grab_focus(opt->handle);
}
shiftState = event->state & GDK_SHIFT_MASK;
controlState = event->state & GDK_CONTROL_MASK;
switch(event->keyval) {
+ case GDK_Tab: IcsHist(10, opt, dlg); break;
case GDK_Up: IcsHist(1, opt, dlg); break;
case GDK_Down: IcsHist(-1, opt, dlg); break;
case GDK_Return:
if(GenericReadout(dialogOptions[dlg], -1)) PopDown(dlg);
break;
case GDK_Escape:
- PopDown(dlg);
+ if(!IcsHist(33, opt, dlg)) PopDown(dlg);
break;
default:
return FALSE;
}
void
-HardSetFocus (Option *opt)
+HardSetFocus (Option *opt, DialogClass dlg)
{
- FocusOnWidget(opt, 0); // second arg not used in GDK
+ FocusOnWidget(opt, dlg);
}