An extra pane has been added to the Chat Window to display the ICS output.
In GTK this output is colorized just as in the xterm. For Xaw this is not
possible. This pane is always visible, and the chat output can be hidden,
to double its size. Entered input will go to the selected chat (when not
hidden) as a tell or shout, or to the ICS as a command. The Chat-Partner
field is hidden together with the chat pane and the Hide button. Each of
the five chats now has a dedicated button; for unused chats (empty Chat-
Partner field) these now gets the text 'New Chat' inscribed on it.
Focussing is made more intelligent (to the Partner field when shown and
empty, otherwise to the input field).
The Up and Down arrows now work in the input field to recall old input.
ScrollToCursor() was broken in GTK, because a mark was made for only
a single buffer. Now each buffer has its own end mark.
Another problem was that using ScrollToCursow immediately after a memo
was shrunk (because a neighboring one expanded) it would still use the
old memo size, so that the bottom part remained out of view. Delaying it
50 ms solved that problem.
A new option -icsUp was added to store the visibility in the settings.
It is updated only in ICS mode. The ICS Console pops up automatically
when the stored parameters say so. It is also made sticky.
Unlike the xterm the textView does not extend background color to unwritten
positions behind the line. A separate GTK call is now added to set the
unwritten part to the same color as the background in normal text.
A control was added in the ICS Options dialog for setting the colors
of normal text (-colorNormal).
{ "winHeight", ArgInt, (void *) &wpMain.height, TRUE, INVALID }, // for attaching auxiliary windows to them
{ "x", ArgInt, (void *) &wpMain.x, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "y", ArgInt, (void *) &wpMain.y, TRUE, (ArgIniType) CW_USEDEFAULT },
+ { "icsUp", ArgBoolean, (void *) &wpConsole.visible, XBOARD, (ArgIniType) FALSE },
{ "icsX", ArgX, (void *) &wpConsole.x, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "icsY", ArgY, (void *) &wpConsole.y, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "icsW", ArgInt, (void *) &wpConsole.width, TRUE, (ArgIniType) CW_USEDEFAULT },
{ 0, 0, 0, NULL, (void*) &appData.colorChallenge, "", NULL, TextBox, N_("Challenge Text Colors:") },
{ 0, 0, 0, NULL, (void*) &appData.colorRequest, "", NULL, TextBox, N_("Request Text Colors:") },
{ 0, 0, 0, NULL, (void*) &appData.colorSeek, "", NULL, TextBox, N_("Seek Text Colors:") },
+{ 0, 0, 0, NULL, (void*) &appData.colorNormal, "", NULL, TextBox, N_("Other Text Colors:") },
{ 0, 0, 0, NULL, (void*) &IcsOptionsOK, "", NULL, EndMark , "" }
};
}
// end of borrowed code
+#define INPUT 0
+
Option boxOptions[] = {
{ 30, T_TOP, 400, NULL, (void*) &icsText, "", NULL, TextBox, "" },
{ 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" }
{
char *val;
- GetWidgetText(&boxOptions[0], &val);
+ GetWidgetText(&boxOptions[INPUT], &val);
SaveInHistory(val);
SendMultiLineToICS(val);
- SetWidgetText(&boxOptions[0], "", InputBoxDlg);
+ SetWidgetText(&boxOptions[INPUT], "", InputBoxDlg);
}
void
ICSInputSendText();
return;
case 1:
- GetWidgetText(&boxOptions[0], &val);
+ GetWidgetText(&boxOptions[INPUT], &val);
val = PrevInHistory(val);
break;
case -1:
val = NextInHistory();
}
- SetWidgetText(&boxOptions[0], val = val ? val : "", InputBoxDlg);
- SetInsertPos(&boxOptions[0], strlen(val));
+ SetWidgetText(&boxOptions[INPUT], val = val ? val : "", InputBoxDlg);
+ SetInsertPos(&boxOptions[INPUT], strlen(val));
}
static void
char buf[MSG_SIZ], *p;
if(strstr(text, "$add ") == text) {
- GetWidgetText(&boxOptions[0], &p);
+ GetWidgetText(&boxOptions[INPUT], &p);
snprintf(buf, MSG_SIZ, "%s%s", p, text+5); text = buf;
pos += strlen(p) - 5;
}
- SetWidgetText(&boxOptions[0], text, TextMenuDlg);
- SetInsertPos(&boxOptions[0], pos);
- HardSetFocus(&boxOptions[0]);
+ SetWidgetText(&boxOptions[INPUT], text, TextMenuDlg);
+ SetInsertPos(&boxOptions[INPUT], pos);
+ HardSetFocus(&boxOptions[INPUT]);
}
void
{
MarkMenu("View.ICSInputBox", InputBoxDlg);
if(GenericPopUp(boxOptions, _("ICS input box"), InputBoxDlg, BoardWindow, NONMODAL, 0))
- AddHandler(&boxOptions[0], InputBoxDlg, 3);
- CursorAtEnd(&boxOptions[0]);
+ AddHandler(&boxOptions[INPUT], InputBoxDlg, 3);
+ CursorAtEnd(&boxOptions[INPUT]);
}
void
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
char *p, newText[MSG_SIZ];
- GetWidgetText(&boxOptions[0], &p);
+ GetWidgetText(&boxOptions[INPUT], &p);
snprintf(newText, MSG_SIZ, "%s%c", p, *buf);
- SetWidgetText(&boxOptions[0], newText, InputBoxDlg);
- if(shellUp[InputBoxDlg]) HardSetFocus (&boxOptions[0]); //why???
+ SetWidgetText(&boxOptions[INPUT], newText, InputBoxDlg);
+ if(shellUp[InputBoxDlg]) HardSetFocus (&boxOptions[INPUT]); //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, *partner, *texts[MAX_CHAT], dirty[MAX_CHAT];
-static int activePartner;
+static int activePartner, hidden = 1;
void ChatSwitch P((int n));
int ChatOK P((int n));
+#define CHAT_ICS 6
+#define CHAT_PARTNER 8
+#define CHAT_OUT 10
+#define CHAT_PANE 11
+#define CHAT_IN 12
+
+void PaneSwitch P((void));
+
Option chatOptions[] = {
+{ 0, 0, 0, NULL, NULL, "", NULL, Label , N_("Chats:") },
+{ 1, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, N_("New Chat") },
+{ 2, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, N_("New Chat") },
+{ 3, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, N_("New Chat") },
+{ 4, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, N_("New Chat") },
+{ 5, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, N_("New Chat") },
+{ 250, T_VSCRL | T_FILL | T_WRAP | T_TOP, 510, NULL, (void*) &memo, NULL, NULL, TextBox, "" },
+{ 0, 0, 0, NULL, NULL, "", NULL, Break , "" },
{ 0, T_TOP, 100, NULL, (void*) &partner, NULL, NULL, TextBox, N_("Chat partner:") },
-{ 1, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" },
-{ 2, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" },
-{ 3, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" },
-{ 4, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" },
-{ 100, T_VSCRL | T_FILL | T_WRAP | T_TOP, 510, NULL, (void*) &memo, NULL, NULL, TextBox, "" },
+{ 0, SAME_ROW, 0, NULL, (void*) &PaneSwitch, NULL, NULL, Button, N_("Hide") },
+{ 250, T_VSCRL | T_FILL | T_WRAP | T_TOP, 510, NULL, (void*) &memo, NULL, NULL, TextBox, "" },
+{ 0, 0, 0, NULL, NULL, "", NULL, Break , "" },
{ 0, 0, 510, NULL, (void*) &line, NULL, NULL, TextBox, "" },
{ 0, NO_OK|SAME_ROW, 0, NULL, (void*) &ChatOK, NULL, NULL, EndMark , "" }
};
void
+IcsHist (int n, Option *opt, DialogClass dlg)
+{ // [HGM] input: let up-arrow recall previous line from history
+ char *val = NULL; // to suppress spurious warning
+
+ if(opt != &chatOptions[CHAT_IN]) return;
+ switch(n) {
+ case 1:
+ GetWidgetText(opt, &val);
+ val = PrevInHistory(val);
+ break;
+ case -1:
+ val = NextInHistory();
+ }
+ SetWidgetText(opt, val = val ? val : "", dlg);
+ SetInsertPos(opt, strlen(val));
+}
+
+void
OutputChatMessage (int partner, char *mess)
{
char *p = texts[partner];
texts[partner] = (char*) malloc(len);
snprintf(texts[partner], len, "%s%s", p ? p : "", mess);
FREE(p);
- if(partner == activePartner) {
- AppendText(&chatOptions[5], mess);
- SetInsertPos(&chatOptions[5], len-2);
+ if(partner == activePartner && !hidden) {
+ AppendText(&chatOptions[CHAT_OUT], mess);
+ SetInsertPos(&chatOptions[CHAT_OUT], len-2);
} else {
- SetColor("#FFC000", &chatOptions[partner + (partner < activePartner)]);
+ SetColor("#FFC000", &chatOptions[partner + 1]);
dirty[partner] = 1;
}
}
{ // can only be called through <Enter> in chat-partner text-edit, as there is no OK button
char buf[MSG_SIZ];
- if(!partner || strcmp(partner, chatPartner[activePartner])) {
+ if(!hidden && (!partner || strcmp(partner, chatPartner[activePartner]))) {
safeStrCpy(chatPartner[activePartner], partner, MSG_SIZ);
- SetWidgetText(&chatOptions[5], "", -1); // clear text if we alter partner
- SetWidgetText(&chatOptions[6], "", ChatDlg); // clear text if we alter partner
- HardSetFocus(&chatOptions[6]);
+ 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] ? chatPartner[activePartner] : _("New Chat"));
+ HardSetFocus(&chatOptions[CHAT_IN]);
}
- if(line[0]) { // something was typed
- SetWidgetText(&chatOptions[6], "", ChatDlg);
+ if(line[0] || hidden) { // something was typed (for ICS commands we also allow empty line!)
+ SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg);
// from here on it could be back-end
if(line[strlen(line)-1] == '\n') line[strlen(line)-1] = NULLCHAR;
SaveInHistory(line);
+ if(hidden) snprintf(buf, MSG_SIZ, "%s\n", line); else // command for ICS
if(!strcmp("whispers", chatPartner[activePartner]))
snprintf(buf, MSG_SIZ, "whisper %s\n", line); // WHISPER box uses "whisper" to send
else if(!strcmp("shouts", chatPartner[activePartner]))
}
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);
+}
+
+void
ChatSwitch (int n)
{
int i, j;
- if(n <= activePartner) n--;
- activePartner = n;
+ Show(&chatOptions[CHAT_PANE], 0); // show
+ if(hidden) ScheduleDelayedEvent(DelayedScroll, 50); // Awful!
+ hidden = 0;
+ activePartner = --n;
if(!texts[n]) texts[n] = strdup("");
dirty[n] = 0;
- SetWidgetText(&chatOptions[5], texts[n], ChatDlg);
- SetInsertPos(&chatOptions[5], strlen(texts[n]));
- SetWidgetText(&chatOptions[0], chatPartner[n], ChatDlg);
+ SetWidgetText(&chatOptions[CHAT_OUT], texts[n], ChatDlg);
+ SetInsertPos(&chatOptions[CHAT_OUT], strlen(texts[n]));
+ SetWidgetText(&chatOptions[CHAT_PARTNER], chatPartner[n], ChatDlg);
for(i=j=0; i<MAX_CHAT; i++) {
- if(i == activePartner) continue;
- SetWidgetLabel(&chatOptions[++j], chatPartner[i]);
+ SetWidgetLabel(&chatOptions[++j], *chatPartner[i] ? chatPartner[i] : _("New Chat"));
SetColor(dirty[i] ? "#FFC000" : "#FFFFFF", &chatOptions[j]);
}
- SetWidgetText(&chatOptions[6], "", ChatDlg);
- HardSetFocus(&chatOptions[6]);
+ SetWidgetText(&chatOptions[CHAT_IN], "", ChatDlg);
+ HardSetFocus(&chatOptions[strcmp(chatPartner[n], "") ? CHAT_IN : CHAT_PARTNER]);
+}
+
+void
+PaneSwitch ()
+{
+ Show(&chatOptions[CHAT_PANE], hidden = 1); // hide
+}
+
+void
+ConsoleWrite(char *message, int count)
+{
+ if(shellUp[ChatDlg]) {
+ AppendColorized(&chatOptions[CHAT_ICS], message, count);
+ SetInsertPos(&chatOptions[CHAT_ICS], 999999);
+ }
}
void
ChatProc ()
{
- if(GenericPopUp(chatOptions, _("Chat box"), ChatDlg, BoardWindow, NONMODAL, appData.topLevel))
- AddHandler(&chatOptions[0], ChatDlg, 2), AddHandler(&chatOptions[6], ChatDlg, 2); // treats return as OK
+ 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]);
MarkMenu("View.OpenChatWindow", ChatDlg);
}
extern ButtonCallback *comboCallback;
extern void *userLogo;
-extern WindowPlacement wpComment, wpTags, wpMoveHistory, wpMain, wpDualBoard;
+extern WindowPlacement wpComment, wpTags, wpMoveHistory, wpMain, wpDualBoard, wpConsole;
extern char *marked[];
extern Boolean shellUp[];
extern Option textOptions[], typeOptions[], dualOptions[], mainOptions[];
int PopDown P((DialogClass n));
void MarkMenu P((char *item, int dlgNr));
int AppendText P((Option *opt, char *s));
+void AppendColorized P((Option *opt, char *s, int count));
+void Show P((Option *opt, int hide));
+int IcsHist P((int dir, Option *opt, DialogClass dlg));
void HighlightText P((Option *opt, int from, int to, Boolean highlight));
void SetColor P((char *colorName, Option *box));
//void ColorChanged P((Widget w, XtPointer data, XEvent *event, Boolean *b));
if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList);
if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment);
if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags);
+ GetPlacement(ChatDlg, &wpConsole); if(appData.icsActive) wpConsole.visible = shellUp[ChatDlg];
}
void
EngineOutputPopUp();
}
+ if( wpConsole.visible && appData.icsActive ) {
+ ChatProc();
+ BoardToTop();
+ }
+
InitBackEnd2();
if (errorExitStatus == -1) {
{
MenuItem *item = MenuNameToItem(menuRef);
- if(item) gtk_widget_set_sensitive(item->handle, state);
+ if(item && item->handle) gtk_widget_set_sensitive(item->handle, state);
}
void
if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory);
if(shellUp[EvalGraphDlg]) CoDrag(shells[EvalGraphDlg], &wpEvalGraph);
if(shellUp[GameListDlg]) CoDrag(shells[GameListDlg], &wpGameList);
+ if(shellUp[ChatDlg]) CoDrag(shells[ChatDlg], &wpConsole);
}
wpMain = wpNew;
DrawPosition(True, NULL);
{
MenuItem *item = MenuNameToItem(menuRef);
- if(item) {
+ if(item && item->handle) {
((GtkCheckMenuItem *) (item->handle))->active = state;
}
}
ScrollToCursor (Option *opt, int caretPos)
{
static GtkTextIter iter;
- static GtkTextMark *mark;
- if(!mark) mark = gtk_text_mark_new(NULL, 0);
+ GtkTextMark *mark = gtk_text_buffer_get_mark((GtkTextBuffer *) opt->handle, "scrollmark");
gtk_text_buffer_get_iter_at_offset((GtkTextBuffer *) opt->handle, &iter, caretPos);
- gtk_text_buffer_add_mark((GtkTextBuffer *) opt->handle, mark, &iter);
+ gtk_text_buffer_move_mark((GtkTextBuffer *) opt->handle, mark, &iter);
gtk_text_view_scroll_to_mark((GtkTextView *) opt->textValue, mark, 0.0, 0, 0.5, 0.5);
-// gtk_text_view_scroll_to_iter((GtkTextView *) opt->textValue, &iter, 0.0, 0, 0.5, 0.5);
- gtk_text_buffer_delete_mark((GtkTextBuffer *) opt->handle, mark);
}
int
if(!strcmp(msg, "Quit ")) continue; // Quit item will appear automatically in App menu
if(!strcmp(msg, "About XBoard")) msg = "About"; // 'XBoard' will be appended automatically when moved to App menu 1st item
#endif
+ if(!strcmp(msg, "ICS Input Box")) { mb[i].handle = NULL; continue; } // suppress ICS Input Box in GTK
if(strcmp(msg, "----")) { //
if(!(opt->min & NO_GETTEXT)) msg = _(msg);
if(mb[i].handle) {
shiftState = event->state & GDK_SHIFT_MASK;
controlState = event->state & GDK_CONTROL_MASK;
switch(event->keyval) {
+ 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;
gtk_text_buffer_apply_tag_by_name(opt->handle, highlight ? "highlight" : "normal", &start, &end);
}
+static char **names;
+static int curFG, curBG, curAttr;
+static GdkColor backgroundColor;
+
+void
+SetTextColor(char **cnames, int fg, int bg, int attr)
+{
+ if(fg < 0) fg = 0; if(bg < 0) bg = 7;
+ names = cnames; curFG = fg; curBG = bg, curAttr = attr;
+ if(attr == -2) { // background color of ICS console.
+ gdk_color_parse(cnames[bg&7], &backgroundColor);
+ curAttr = 0;
+ }
+}
+
+void
+AppendColorized (Option *opt, char *s, int count)
+{
+ static GtkTextIter end;
+ static GtkTextTag *fgTags[8], *bgTags[8], *font, *bold, *normal, *attr = NULL;
+
+ if(!font) {
+ font = gtk_text_buffer_create_tag(opt->handle, NULL, "font", "Monospace normal", NULL);
+ gtk_widget_modify_base(GTK_WIDGET(opt->textValue), GTK_STATE_NORMAL, &backgroundColor);
+ }
+
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(opt->handle), &end);
+
+ if(names) {
+ if(curAttr == 1) {
+ if(!bold) bold = gtk_text_buffer_create_tag(opt->handle, NULL, "weight", PANGO_WEIGHT_BOLD, NULL);
+ attr = bold;
+ } else {
+ if(!normal) normal = gtk_text_buffer_create_tag(opt->handle, NULL, "weight", PANGO_WEIGHT_NORMAL, NULL);
+ attr = normal;
+ }
+ if(!fgTags[curFG]) {
+ fgTags[curFG] = gtk_text_buffer_create_tag(opt->handle, NULL, "foreground", names[curFG], NULL);
+ }
+ if(!bgTags[curBG]) {
+ bgTags[curBG] = gtk_text_buffer_create_tag(opt->handle, NULL, "background", names[curBG], NULL);
+ }
+ gtk_text_buffer_insert_with_tags(opt->handle, &end, s, count, fgTags[curFG], bgTags[curBG], font, attr, NULL);
+ } else
+ gtk_text_buffer_insert_with_tags(opt->handle, &end, s, count, font, NULL);
+
+}
+
+void
+Show (Option *opt, int hide)
+{
+ if(hide) gtk_widget_hide(opt->handle);
+ else gtk_widget_show(opt->handle);
+}
+
int
ShiftKeys ()
{ // bassic primitive for determining if modifier keys are pressed
GtkWidget *shells[NrOfDialogs];
DialogClass parents[NrOfDialogs];
WindowPlacement *wp[NrOfDialogs] = { // Beware! Order must correspond to DialogClass enum
- NULL, &wpComment, &wpTags, NULL, NULL, NULL, &wpDualBoard, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph,
+ NULL, &wpComment, &wpTags, NULL, NULL, &wpConsole, &wpDualBoard, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph,
NULL, NULL, NULL, NULL, &wpMain
};
int i, j, arraysize, left, top, height=999, width=1, boxStart=0, breakType = 0, r;
char def[MSG_SIZ], *msg, engineDlg = (currentCps != NULL && dlgNr != BrowserDlg);
+ gboolean expandable = FALSE;
if(dlgNr < PromoDlg && shellUp[dlgNr]) return 0; // already up
if(option[i].type == Skip) continue;
top++;
//printf("option =%2d, top =%2d\n", i, top);
- if (top >= height) {
- gtk_table_resize(GTK_TABLE(table), height, r);
+ if (top >= height || breakType) {
+ gtk_table_resize(GTK_TABLE(table), top - (breakType != 0), r);
if(!pane) { // multi-column: put tables in intermediate hbox
- if(breakType || engineDlg)
+ if(breakType & SAME_ROW || engineDlg)
pane = gtk_hbox_new (FALSE, 0);
else
pane = gtk_vbox_new (FALSE, 0);
gtk_box_set_spacing(GTK_BOX(pane), 5 + 5*breakType);
gtk_box_pack_start (GTK_BOX (/*GTK_DIALOG (dialog)->vbox*/box), pane, TRUE, TRUE, 0);
}
- gtk_box_pack_start (GTK_BOX (pane), table, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (pane), table, expandable, TRUE, 0);
table = gtk_table_new(arraysize - i, r=TableWidth(option + i), FALSE);
- top = 0;
+ top = breakType = 0; expandable = FALSE;
}
if(!SameRow(&option[i])) {
if(SameRow(&option[i+1])) {
if(option[i].type == FileName || option[i].type == PathName) w -= 55;
if (option[i].type==TextBox && option[i].value > 80){
+ GtkTextIter iter;
+ expandable = TRUE;
textview = gtk_text_view_new();
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), option[i].min & T_WRAP ? GTK_WRAP_WORD : GTK_WRAP_NONE);
#ifdef TODO_GTK
gtk_text_buffer_set_text (textbuffer, "", -1);
option[i].handle = (void*)textbuffer;
option[i].textValue = (char*)textview;
+ gtk_text_buffer_get_iter_at_offset(textbuffer, &iter, -1);
+ gtk_text_buffer_create_mark(textbuffer, "scrollmark", &iter, FALSE); // permanent mark
if(option[i].choice) { // textviews can request a handler for mouse events in the choice field
g_signal_connect(textview, "button-press-event", G_CALLBACK (MemoEvent), (gpointer) &option[i] );
g_signal_connect(textview, "button-release-event", G_CALLBACK (MemoEvent), (gpointer) &option[i] );
/* never has label, so let listbox occupy all columns */
Pack(hbox, table, sw, left, left+r, top, GTK_EXPAND);
+ expandable = TRUE;
}
break;
case Graph:
graph = frame;
}
Pack(hbox, table, graph, left, left+r, top, GTK_EXPAND);
+ expandable = TRUE;
#ifdef TODO_GTK
if(option[i].min & SAME_ROW) last = forelast, forelast = lastrow;
if(option[i].target) ((ButtonCallback*)option[i].target)(boxStart); // callback that can make sizing decisions
break;
case Break:
- breakType = option[i].min & SAME_ROW;
- top = height; // force next option to start in a new table
+ breakType = option[i].min & SAME_ROW | BORDER; // kludge to flag we must break
+ option[i].handle = table;
break;
case PopUp:
}
}
+ gtk_table_resize(GTK_TABLE(table), top+1, r);
if(pane)
- gtk_box_pack_start (GTK_BOX (pane), table, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (pane), table, expandable, TRUE, 0);
else
- gtk_table_resize(GTK_TABLE(table), top+1, r),
gtk_box_pack_start (GTK_BOX (/*GTK_DIALOG (dialog)->vbox*/box), table, TRUE, TRUE, 0);
option[i].handle = (void *) table; // remember last table in EndMark handle (for hiding Engine-Output pane).
{N_("Tags"), NULL, "Tags", EditTagsProc, CHECK},
{N_("Comments"), NULL, "Comments", EditCommentProc, CHECK},
{N_("ICS Input Box"), NULL, "ICSInputBox", IcsInputBoxProc, CHECK},
- {N_("Open Chat Window"), NULL, "OpenChatWindow", ChatProc, CHECK},
+ {N_("ICS/Chat Console"), NULL, "OpenChatWindow", ChatProc, CHECK},
{"----", NULL, NULL, NothingProc},
{N_("Board..."), NULL, "Board", BoardOptionsProc},
{N_("Game List Tags..."), NULL, "GameListTags", GameListOptionsProc},
void ShowGameListProc P((void)); // in ngamelist.c
void HistoryShowProc P((void)); // in nhistory.c
+// only here because it is the only header shared by xoptions.c and usystem.c
+void SetTextColor P((char **cnames, int fg, int bg, int attr));
+void ConsoleWrite P((char *message, int count));
// must be moved to xengineoutput.h
}
textColors[ColorNone].fg = textColors[ColorNone].bg = -1;
textColors[ColorNone].attr = 0;
+ SetTextColor(cnames, textColors[ColorNormal].fg - 30, textColors[ColorNormal].bg - 40, -2); // kludge to announce background color to front-end
}
static Boolean noEcho;
char buf[MSG_SIZ];
int count, outCount, error;
+ SetTextColor(cnames, textColors[(int)cc].fg - 30, textColors[(int)cc].bg - 40, textColors[(int)cc].attr); // for GTK widget
+
if (textColors[(int)cc].bg > 0) {
if (textColors[(int)cc].fg > 0) {
snprintf(buf, MSG_SIZ, "\033[0;%d;%d;%dm", textColors[(int)cc].attr,
free(msg);
}
}
+ if(*message != '\033') ConsoleWrite(message, count);
}
else
outCount = write(cp->fdTo, message, count);
}
void
+SetTextColor (char **cnames, int fg, int bg, int attr)
+{ // this is not possible in Xaw
+}
+
+void
+AppendColorized (Option *opt, char *message, int count)
+{ // ignore
+}
+
+void
+Show (Option *opt, int hide)
+{
+}
+
+void
HighlightText (Option *opt, int start, int end, Boolean on)
{
if(on)