X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard.c;h=b0f6a1ed353cab5031dd9937d297cd0f768d75bf;hb=3f60740a4a470b07a8b1b9a2bced28bf32ff05d5;hp=6ed7bfc7dfc813bcfef22029ffea76d9a8b58489;hpb=bdb4175a5cbca3f506502f644ab1f027f8e636f2;p=xboard.git diff --git a/xboard.c b/xboard.c index 6ed7bfc..b0f6a1e 100644 --- a/xboard.c +++ b/xboard.c @@ -149,52 +149,9 @@ extern char *getenv(); #include #endif -#include -#include -#include -#include -#include -#include -#if USE_XAW3D -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are. #include "common.h" -#if HAVE_LIBXPM -#include -#define IMAGE_EXT "xpm" -#else -#define IMAGE_EXT "xim" -#endif - -#include "bitmaps/icon_white.bm" -#include "bitmaps/icon_black.bm" -#include "bitmaps/checkmark.bm" - #include "frontend.h" #include "backend.h" #include "backendz.h" @@ -232,17 +189,15 @@ int main P((int argc, char **argv)); RETSIGTYPE CmailSigHandler P((int sig)); RETSIGTYPE IntSigHandler P((int sig)); RETSIGTYPE TermSizeSigHandler P((int sig)); -Widget CreateMenuBar P((Menu *mb, int boardWidth)); #if ENABLE_NLS char *InsertPxlSize P((char *pattern, int targetPxlSize)); XFontSet CreateFontSet P((char *base_fnt_lst)); #else char *FindFont P((char *pattern, int targetPxlSize)); #endif -void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[], - u_int wreq, u_int hreq)); -void EventProc P((Widget widget, caddr_t unused, XEvent *event)); void DelayedDrag P((void)); +void ICSInputBoxPopUp P((void)); +#ifdef TODO_GTK static void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event)); void HandlePV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); @@ -250,7 +205,6 @@ void DrawPositionProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void CommentClick P((Widget w, XEvent * event, String * params, Cardinal * nParams)); -void ICSInputBoxPopUp P((void)); void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data)); void KeyBindingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void QuitWrapper P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -259,20 +213,21 @@ static void UpKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms) static void DownKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TempBackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TempForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -Boolean TempBackwardActive = False; void ManInner P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void SelectMove P((Widget w, XEvent * event, String * params, Cardinal * nParams)); +#endif +Boolean TempBackwardActive = False; void DisplayMove P((int moveNumber)); void ICSInitScript P((void)); -void SelectMove P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void update_ics_width P(()); int CopyMemoProc P(()); +#ifdef TODO_GTK /* * XBoard depends on Xt R4 or higher */ int xtVersion = XtSpecificationRelease; -#ifdef TODO_GTK int xScreen; Display *xDisplay; Window xBoardWindow; @@ -298,8 +253,6 @@ char *layoutName; char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion -Position commentX = -1, commentY = -1; -Dimension commentW, commentH; typedef unsigned int BoardSize; BoardSize boardSize; Boolean chessProgram; @@ -309,9 +262,11 @@ int smallLayout = 0, tinyLayout = 0, marginW, marginH, // [HGM] for run-time resizing fromX = -1, fromY = -1, toX, toY, commentUp = False, errorExitStatus = -1, defaultLineGap; +#ifdef TODO_GTK Dimension textHeight; Pixel timerForegroundPixel, timerBackgroundPixel; Pixel buttonForegroundPixel, buttonBackgroundPixel; +#endif char *chessDir, *programName, *programVersion; Boolean alwaysOnTop = False; char *icsTextMenuString; @@ -328,20 +283,6 @@ WindowPlacement wpEngineOutput; WindowPlacement wpGameList; WindowPlacement wpTags; -#define INPUT_SOURCE_BUF_SIZE 8192 - -typedef struct { - CPKind kind; - int fd; - int lineByLine; - char *unused; - InputCallback func; - XtInputId xid; - char buf[INPUT_SOURCE_BUF_SIZE]; - VOIDSTAR closure; -} InputSource; - - /* This magic number is the number of intermediate frames used in each half of the animation. For short moves it's reduced by 1. The total number of frames will be factor * 2 + 1. */ @@ -1072,9 +1013,10 @@ main (int argc, char **argv) #ifdef TODO_GTK XSetWindowAttributes window_attributes; Arg args[16]; + Dimension boardWidth, boardHeight, w, h; #else #endif - Dimension boardWidth, boardHeight, w, h; + int boardWidth, boardHeight, w, h; char *p; int forceMono = False; GError *gtkerror=NULL; @@ -1341,8 +1283,8 @@ main (int argc, char **argv) menuBarWidget = optList[W_MENU].handle; dropMenu = optList[W_DROP].handle; titleWidget = optList[optList[W_TITLE].type != -1 ? W_TITLE : W_SMALL].handle; - formWidget = XtParent(boardWidget); #ifdef TODO_GTK + formWidget = XtParent(boardWidget); XtSetArg(args[0], XtNbackground, &timerBackgroundPixel); XtSetArg(args[1], XtNforeground, &timerForegroundPixel); XtGetValues(optList[W_WHITE].handle, args, 2); @@ -1352,7 +1294,6 @@ main (int argc, char **argv) XtGetValues(optList[W_PAUSE].handle, args, 2); } #endif - AppendEnginesToMenu(appData.recentEngineList); #ifdef TODO_GTK xBoardWindow = XtWindow(boardWidget); @@ -1361,13 +1302,6 @@ main (int argc, char **argv) // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would // not need to go into InitDrawingSizes(). - /* - * Create X checkmark bitmap and initialize option menu checks. - */ -#ifdef TODO_GTK - ReadBitmap(&xMarkPixmap, "checkmark.bm", - checkmark_bits, checkmark_width, checkmark_height); -#endif InitMenuMarkers(); /* @@ -1477,7 +1411,10 @@ main (int argc, char **argv) #endif /* check for GTK events and process them */ - gtk_main(); +// gtk_main(); +while(1) { +gtk_main_iteration(); +} if (appData.debugMode) fclose(debugFP); // [DM] debug return 0; @@ -1679,17 +1616,6 @@ FindFont (char *pattern, int targetPxlSize) #endif void -ReadBitmap (Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq) -{ - if (bits != NULL) { -#ifdef TODO_GTK - *pm = XCreateBitmapFromData(xDisplay, xBoardWindow, (char *) bits, - wreq, hreq); -#endif - } -} - -void EnableNamedMenuItem (char *menuRef, int state) { MenuItem *item = MenuNameToItem(menuRef); @@ -1726,22 +1652,6 @@ KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) } #endif -#ifdef TODO_GTK -static void -MenuEngineSelect (Widget w, caddr_t addr, caddr_t index) -{ - RecentEngineEvent((int) (intptr_t) addr); -} -#endif - -void -AppendMenuItem (char *msg, int n) -{ -#ifdef TODO_GTK - CreateMenuItem((Widget) optList[W_ENGIN].textValue, msg, (XtCallbackProc) MenuEngineSelect, n); -#endif -} - void SetupDropMenu () { @@ -1891,23 +1801,25 @@ DelayedDrag () #endif } +#ifdef TODO_GTK void EventProc (Widget widget, caddr_t unused, XEvent *event) { -#ifdef TODO_GTK if(XtIsRealized(widget) && event->type == ConfigureNotify || appData.useStickyWindows) DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other -#endif } +#endif /* * event handler for redrawing the board */ +#ifdef TODO_GTK void DrawPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { DrawPosition(True, NULL); } +#endif #ifdef TODO_GTK @@ -1920,10 +1832,10 @@ HandlePV (Widget w, XEvent * event, String * params, Cardinal * nParams) static int savedIndex; /* gross that this is global */ +#ifdef TODO_GTK void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams) { -#ifdef TODO_GTK String val; XawTextPosition index, dummy; Arg arg; @@ -1934,8 +1846,8 @@ CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams) ReplaceComment(savedIndex, val); if(savedIndex != currentMove) ToNrEvent(savedIndex); LoadVariation( index, val ); // [HGM] also does the actual moving to it, now -#endif } +#endif void EditCommentPopUp (int index, char *title, char *text) @@ -1967,7 +1879,7 @@ FreezeUI () { if (frozen) return; /* Grab by a widget that doesn't accept input */ - XtAddGrab(optList[W_MESSG].handle, TRUE, FALSE); + gtk_grab_add(optList[W_MESSG].handle); frozen = 1; } @@ -1976,9 +1888,7 @@ void ThawUI () { if (!frozen) return; -#ifdef TODO_GTK - XtRemoveGrab(optList[W_MESSG].handle); -#endif + gtk_grab_remove(optList[W_MESSG].handle); frozen = 0; } @@ -2212,11 +2122,13 @@ PasteGameProc () } +#ifdef TODO_GTK void QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms) { QuitProc(); } +#endif int ShiftKeys () @@ -2235,18 +2147,18 @@ ShiftKeys () return k; } +#ifdef TODO_GTK static void MoveTypeInProc (Widget widget, caddr_t unused, XEvent *event) { -#ifdef TODO_GTK char buf[10]; KeySym sym; int n = XLookupString(&(event->xkey), buf, 10, &sym, NULL); if ( n == 1 && *buf >= 32 // printable && !(ShiftKeys() & 0x3C) // no Alt, Ctrl ) BoxAutoPopUp (buf); -#endif } +#endif #ifdef TODO_GTK static void @@ -2332,6 +2244,10 @@ SetWindowTitle (char *text, char *title, char *icon) XtSetValues(shellWidget, args, i); XSync(xDisplay, False); #endif + if (appData.titleInWindow) { + SetWidgetLabel(titleWidget, text); + } + gtk_window_set_title (GTK_WINDOW(shells[BoardWindow]), title); } @@ -2376,38 +2292,33 @@ DisplayIcsInteractionTitle (String message) void DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) { -#ifdef TODO_GTK - char buf[MSG_SIZ]; - Arg args[16]; - Widget w = (Widget) opt->handle; - - /* check for low time warning */ - Pixel foregroundOrWarningColor = timerForegroundPixel; + GtkWidget *w = (GtkWidget *) opt->handle; + char *markup; + char bgcolor[10]; + char fgcolor[10]; + if (highlight) { + strcpy(bgcolor, "black"); + strcpy(fgcolor, "white"); + } else { + strcpy(bgcolor, "white"); + strcpy(fgcolor, "black"); + } if (timer > 0 && appData.lowTimeWarning && - (timer / 1000) < appData.icsAlarmTime) - foregroundOrWarningColor = lowTimeWarningColor; - - if (appData.clockMode) { - snprintf(buf, MSG_SIZ, "%s:%s%s", color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer)); - XtSetArg(args[0], XtNlabel, buf); - } else { - snprintf(buf, MSG_SIZ, "%s ", color); - XtSetArg(args[0], XtNlabel, buf); + (timer / 1000) < appData.icsAlarmTime) { + strcpy(fgcolor, appData.lowTimeWarningColor); } - if (highlight) { - - XtSetArg(args[1], XtNbackground, foregroundOrWarningColor); - XtSetArg(args[2], XtNforeground, timerBackgroundPixel); + if (appData.clockMode) { + markup = g_markup_printf_escaped("%s:%s%s", + bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer)); } else { - XtSetArg(args[1], XtNbackground, timerBackgroundPixel); - XtSetArg(args[2], XtNforeground, foregroundOrWarningColor); + markup = g_markup_printf_escaped("%s ", + bgcolor, fgcolor, color); } - - XtSetValues(w, args, 3); -#endif + gtk_label_set_markup(GTK_LABEL(w), markup); + g_free(markup); } #ifdef TODO_GTK @@ -2428,24 +2339,50 @@ SetClockIcon (int color) #endif } -#ifdef TODO_GTK -void -DoInputCallback (caddr_t closure, int *source, XtInputId *xid) +#define INPUT_SOURCE_BUF_SIZE 8192 + +typedef struct { + CPKind kind; + int fd; + int lineByLine; + char *unused; + InputCallback func; + guint sid; + char buf[INPUT_SOURCE_BUF_SIZE]; + VOIDSTAR closure; +} InputSource; + +gboolean +DoInputCallback(io, cond, data) + GIOChannel *io; + GIOCondition cond; + gpointer *data; { - InputSource *is = (InputSource *) closure; + /* read input from one of the input source (for example a chess program, ICS, etc). + * and call a function that will handle the input + */ + int count; int error; char *p, *q; + /* All information (callback function, file descriptor, etc) is + * saved in an InputSource structure + */ + InputSource *is = (InputSource *) data; + if (is->lineByLine) { count = read(is->fd, is->unused, INPUT_SOURCE_BUF_SIZE - (is->unused - is->buf)); if (count <= 0) { (is->func)(is, is->closure, is->buf, count, count ? errno : 0); - return; + return True; } is->unused += count; p = is->buf; + /* break input into lines and call the callback function on each + * line + */ while (p < is->unused) { q = memchr(p, '\n', is->unused - p); if (q == NULL) break; @@ -2453,12 +2390,16 @@ DoInputCallback (caddr_t closure, int *source, XtInputId *xid) (is->func)(is, is->closure, p, q - p, 0); p = q; } + /* remember not yet used part of the buffer */ q = is->buf; while (p < is->unused) { *q++ = *p++; } is->unused = q; } else { + /* read maximum length of input buffer and send the whole buffer + * to the callback function + */ count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE); if (count == -1) error = errno; @@ -2466,14 +2407,17 @@ DoInputCallback (caddr_t closure, int *source, XtInputId *xid) error = 0; (is->func)(is, is->closure, is->buf, count, error); } + return True; // Must return true or the watch will be removed } -#endif -InputSourceRef -AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure) +InputSourceRef AddInputSource(pr, lineByLine, func, closure) + ProcRef pr; + int lineByLine; + InputCallback func; + VOIDSTAR closure; { -#ifdef TODO_GTK InputSource *is; + GIOChannel *channel; ChildProc *cp = (ChildProc *) pr; is = (InputSource *) calloc(1, sizeof(InputSource)); @@ -2486,31 +2430,32 @@ AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure is->kind = cp->kind; is->fd = cp->fdFrom; } - if (lineByLine) { - is->unused = is->buf; - } + if (lineByLine) + is->unused = is->buf; + else + is->unused = NULL; + + /* GTK-TODO: will this work on windows?*/ + + channel = g_io_channel_unix_new(is->fd); + g_io_channel_set_close_on_unref (channel, TRUE); + is->sid = g_io_add_watch(channel, G_IO_IN,(GIOFunc) DoInputCallback, is); - is->xid = XtAppAddInput(appContext, is->fd, - (XtPointer) (XtInputReadMask), - (XtInputCallbackProc) DoInputCallback, - (XtPointer) is); is->closure = closure; return (InputSourceRef) is; -#else - return (InputSourceRef) 0; -#endif } + void -RemoveInputSource (InputSourceRef isr) +RemoveInputSource(isr) + InputSourceRef isr; { -#ifdef TODO_GTK InputSource *is = (InputSource *) isr; - if (is->xid == 0) return; - XtRemoveInput(is->xid); - is->xid = 0; -#endif + if (is->sid == 0) return; + g_source_remove(is->sid); + is->sid = 0; + return; } #ifndef HAVE_USLEEP @@ -2528,11 +2473,8 @@ FrameAlarm (int sig) void FrameDelay (int time) { -#ifdef TODO_GTK struct itimerval delay; - XSync(xDisplay, False); - if (time > 0) { frameWaiting = True; signal(SIGALRM, FrameAlarm); @@ -2546,7 +2488,6 @@ FrameDelay (int time) delay.it_interval.tv_usec = delay.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &delay, NULL); } -#endif } #else