void
BoxAutoPopUp (char *buf)
-{
+{ // only used in Xaw. GTK calls ConsoleAutoPopUp in stead (when we type to board)
if(!appData.autoBox) return;
if(appData.icsActive) { // text typed to board in ICS mode: divert to ICS input box
if(DialogExists(InputBoxDlg)) { // box already exists: append to current contents
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);
//---------------------------- Chat Windows ----------------------------------------------
-static char *line, *memo, *chatMemo, *partner, *texts[MAX_CHAT], dirty[MAX_CHAT];
+static char *line, *memo, *chatMemo, *partner, *texts[MAX_CHAT], dirty[MAX_CHAT], *inputs[MAX_CHAT], *icsLine, *tmpLine;
static int activePartner, hidden = 1;
void ChatSwitch P((int n));
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);
}
void
+DelayedSetText ()
+{
+ SetWidgetText(&chatOptions[CHAT_IN], tmpLine, ChatDlg);
+ SetInsertPos(&chatOptions[CHAT_IN], strlen(tmpLine));
+}
+
+void
DelayedScroll ()
{ // If we do this immediately it does it before shrinking the memo, so the lower half remains hidden (Ughh!)
SetInsertPos(&chatOptions[CHAT_ICS], 999999);
+ SetWidgetText(&chatOptions[CHAT_IN], tmpLine, ChatDlg);
+ SetInsertPos(&chatOptions[CHAT_IN], strlen(tmpLine));
}
void
ChatSwitch (int n)
{
int i, j;
+ char *v;
Show(&chatOptions[CHAT_PANE], 0); // show
if(hidden) ScheduleDelayedEvent(DelayedScroll, 50); // Awful!
+ else ScheduleDelayedEvent(DelayedSetText, 50);
+ GetWidgetText(&chatOptions[CHAT_IN], &v);
+ if(hidden) { ASSIGN(icsLine, v); } else { ASSIGN(inputs[activePartner], v); }
hidden = 0;
activePartner = --n;
if(!texts[n]) texts[n] = strdup("");
SetWidgetLabel(&chatOptions[++j], *chatPartner[i] ? chatPartner[i] : _("New Chat"));
SetColor(dirty[i] ? "#FFC000" : "#FFFFFF", &chatOptions[j]);
}
- SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg);
- HardSetFocus(&chatOptions[strcmp(chatPartner[n], "") ? CHAT_IN : CHAT_PARTNER]);
+ if(!inputs[n]) { ASSIGN(inputs[n], ""); }
+// SetWidgetText(&chatOptions[CHAT_IN], inputs[n], ChatDlg); // does not work (in this widget only)
+// SetInsertPos(&chatOptions[CHAT_IN], strlen(inputs[n]));
+ tmpLine = inputs[n]; // for the delayed event
+ HardSetFocus(&chatOptions[strcmp(chatPartner[n], "") ? CHAT_IN : CHAT_PARTNER], 0);
}
void
PaneSwitch ()
{
+ char *v;
Show(&chatOptions[CHAT_PANE], hidden = 1); // hide
+ GetWidgetText(&chatOptions[CHAT_IN], &v);
+ ASSIGN(inputs[activePartner], v);
+ if(!icsLine) { ASSIGN(icsLine, ""); }
+ tmpLine = icsLine; ScheduleDelayedEvent(DelayedSetText, 50);
+// SetWidgetText(&chatOptions[CHAT_IN], icsLine, ChatDlg); // does not work (in this widget only)
+// SetInsertPos(&chatOptions[CHAT_IN], strlen(icsLine));
}
static 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]);
+ Show(&chatOptions[CHAT_PANE], hidden = 1); // hide
+ HardSetFocus(&chatOptions[CHAT_IN], 0);
MarkMenu("View.OpenChatWindow", ChatDlg);
+ CursorAtEnd(&chatOptions[CHAT_IN]);
+}
+
+void
+ConsoleAutoPopUp (char *buf)
+{
+ if(!appData.autoBox) return;
+ if(appData.icsActive) { // text typed to board in ICS mode: divert to ICS input box
+ if(DialogExists(ChatDlg)) { // box already exists: append to current contents
+ char *p, newText[MSG_SIZ];
+ GetWidgetText(&chatOptions[CHAT_IN], &p);
+ snprintf(newText, MSG_SIZ, "%s%c", p, *buf);
+ SetWidgetText(&chatOptions[CHAT_IN], newText, ChatDlg);
+ 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);
}
//--------------------------------- Game-List options dialog ------------------------------------------