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));
#define CHAT_ICS 6
#define CHAT_PARTNER 8
-#define CHAT_OUT 10
-#define CHAT_PANE 11
-#define CHAT_IN 12
+#define CHAT_OUT 11
+#define CHAT_PANE 12
+#define CHAT_IN 13
void PaneSwitch P((void));
+void ClearChat P((void));
WindowPlacement wpTextMenu;
{ 250, T_VSCRL | T_FILL | T_WRAP | T_TOP, 510, NULL, (void*) &memo, NULL, (void*) &ContextMenu, TextBox, "" },
{ 0, 0, 0, NULL, NULL, "", NULL, Break , "" },
{ 0, T_TOP, 100, NULL, (void*) &partner, NULL, NULL, TextBox, N_("Chat partner:") },
+{ 0, SAME_ROW, 0, NULL, (void*) &ClearChat, NULL, NULL, Button, N_("End Chat") },
{ 0, SAME_ROW, 0, NULL, (void*) &PaneSwitch, NULL, NULL, Button, N_("Hide") },
{ 250, T_VSCRL | T_FILL | T_WRAP | T_TOP, 510, NULL, (void*) &chatMemo, NULL, (void*) &ContextMenu, TextBox, "" },
{ 0, 0, 0, NULL, NULL, "", NULL, Break , "" },
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 14:
+ for(chat=0; chat < MAX_CHAT; chat++) if(!chatPartner[chat][0]) break;
+ if(chat < MAX_CHAT) ChatSwitch(chat + 1);
+ 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));
+}
+
+void
+ClearChat ()
+{ // clear the chat to make it free for other use
+ chatPartner[activePartner][0] = NULLCHAR;
+ ASSIGN(texts[activePartner], "");
+ ASSIGN(inputs[activePartner], "");
+ SetWidgetText(&chatOptions[CHAT_PARTNER], "", ChatDlg);
+ SetWidgetText(&chatOptions[CHAT_OUT], "", ChatDlg);
+ SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg);
+ SetWidgetLabel(&chatOptions[activePartner+1], _("New Chat"));
+ HardSetFocus(&chatOptions[CHAT_PARTNER], 0);
}
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]);
}
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);