* Massachusetts.
*
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free
+ * Software Foundation, Inc.
*
* The following terms apply to Digital Equipment Corporation's copyright
* interest in XBoard:
#include <pwd.h>
#include <math.h>
#include <cairo/cairo.h>
-#include <cairo/cairo-xlib.h>
#include <gtk/gtk.h>
#if !OMIT_SOCKETS
# define IMG ".png"
// redefine some defaults
# undef ICS_LOGON
-# undef DATADIR
# undef LOCALEDIR
# undef SETTINGS_FILE
# define ICS_LOGON "Library/Preferences/XboardICS.conf"
-# define DATADIR dataDir
# define LOCALEDIR localeDir
# define SETTINGS_FILE masterSettings
# define SYNC_MENUBAR gtkosx_application_sync_menubar(theApp)
- char dataDir[MSG_SIZ]; // for expanding ~~
char localeDir[MSG_SIZ];
char masterSettings[MSG_SIZ];
#else
RETSIGTYPE IntSigHandler P((int sig));
RETSIGTYPE TermSizeSigHandler P((int sig));
char *InsertPxlSize P((char *pattern, int targetPxlSize));
+#ifdef TODO_GTK
#if ENABLE_NLS
XFontSet CreateFontSet P((char *base_fnt_lst));
#else
char *FindFont P((char *pattern, int targetPxlSize));
#endif
+#endif
void DelayedDrag P((void));
void ICSInputBoxPopUp P((void));
void MoveTypeInProc P((GdkEventKey *eventkey));
#ifdef OSXAPP
static char clickedFile[MSG_SIZ];
-static int suppress;
+TimeMark started;
static gboolean
StartNewXBoard(GtkosxApplication *app, gchar *path, gpointer user_data)
{ // handler of OSX OpenFile signal, which sends us the filename of clicked file or first argument
- if(suppress) { // we just started XBoard without arguments
- strncpy(clickedFile, path, MSG_SIZ); // remember file name, but otherwise ignore
- } else { // we are running something presumably useful
- char buf[MSG_SIZ];
- snprintf(buf, MSG_SIZ, "open -n -a \"xboard\" --args \"%s\"", path);
- system(buf); // start new instance on this file
- }
- return TRUE;
+ TimeMark now;
+ GetTimeMark(&now);
+ if(1000*now.sec + now.ms - 1000*started.sec - started.ms < 1000) { // received during first second
+ strncpy(clickedFile, path, MSG_SIZ); // remember file name, but otherwise ignore
+ } else { // we are running something presumably useful
+ char buf[MSG_SIZ];
+ snprintf(buf, MSG_SIZ, "open -n -a \"xboard\" --args \"%s\"", path);
+ system(buf); // start new instance on this file
+ }
+ return TRUE;
}
GtkosxApplication *theApp;
gtk_init (&argc, &argv);
#ifdef OSXAPP
{ // prepare to catch OX OpenFile signal, which will tell us the clicked file
- char *path = gtkosx_application_get_bundle_path();
+ char *path = gtkosx_application_get_bundle_path();
#ifdef ENABLE_NLS
- char *res_path = gtkosx_application_get_resource_path();
- snprintf(localeDir, MSG_SIZ, "%s/share/locale", res_path); // redefine locale dir for OSX bundle
+ char *res_path = gtkosx_application_get_resource_path();
+ snprintf(localeDir, MSG_SIZ, "%s/share/locale", res_path); // redefine locale dir for OSX bundle
#endif
- theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
- snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
- snprintf(dataDir, MSG_SIZ, "%s/Contents/Resources/share/xboard", path);
- snprintf(svgDir, MSG_SIZ, "%s/themes/default", dataDir);
- suppress = (argc == 1 || argc > 1 && argv[1][00] != '-'); // OSX sends signal even if name was already argv[1]!
- g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(StartNewXBoard), NULL);
- g_signal_connect(theApp, "NSApplicationWillTerminate", G_CALLBACK(ExitEvent), NULL);
- // we must call application ready before we can get the signal,
- // and supply a (dummy) menu bar before that, to avoid problems with dual apples in it
- gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(gtk_menu_bar_new()));
- gtkosx_application_ready(theApp);
- if(argc == 1) { // called without args: OSX open-file signal might follow
- static char *fakeArgv[3] = {NULL, clickedFile, NULL};
- usleep(10000); // wait 10 msec (and hope this is long enough).
- while(gtk_events_pending())
- gtk_main_iteration(); // process all events that came in upto now
- suppress = 0; // future open-file signals should start new instance
- if(clickedFile[0]) { // we were sent an open-file signal with filename!
- fakeArgv[0] = argv[0];
- argc = 2; argv = fakeArgv; // fake that we were called as "xboard filename"
- }
- }
+ GetTimeMark(&started); // remember start time
+ theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
+ snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
+ snprintf(dataDir, MSG_SIZ, "%s/Contents/Resources/share/xboard", path);
+ snprintf(manDir, MSG_SIZ, "%s/Contents/Resources/share/man", path);
+ snprintf(svgDir, MSG_SIZ, "%s/themes/default", dataDir);
+ g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(StartNewXBoard), NULL);
+ g_signal_connect(theApp, "NSApplicationWillTerminate", G_CALLBACK(ExitEvent), NULL);
+ // we must call application ready before we can get the signal,
+ // and supply a (dummy) menu bar before that, to avoid problems with dual apples in it
+ gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(gtk_menu_bar_new()));
+ gtkosx_application_ready(theApp);
+ if(argc == 1) { // called without args: OSX open-file signal might follow
+ static char *fakeArgv[3] = {NULL, clickedFile, NULL};
+ usleep(10000); // wait 10 msec (and hope this is long enough).
+ while(gtk_events_pending())
+ gtk_main_iteration(); // process all events that came in upto now
+ if(clickedFile[0]) { // we were sent an open-file signal with filename!
+ fakeArgv[0] = argv[0];
+ argc = 2; argv = fakeArgv; // fake that we were called as "xboard filename"
+ }
+ }
}
#endif
if(argc > 1 && !strcmp(argv[1], "--show-config")) { // [HGM] install: called to print config info
typedef struct {char *name, *value; } Config;
static Config configList[] = {
- { "Datadir", DATADIR },
+ { "Datadir", dataDir },
+ { "Mandir", manDir },
{ "Sysconfdir", SYSCONFDIR },
{ NULL }
};
{ // [HGM] initstring: kludge to fix bad bug. expand '\n' characters in init string and computer string.
static char buf[MSG_SIZ];
- snprintf(buf, MSG_SIZ, appData.sysOpen, DATADIR);
+ snprintf(buf, MSG_SIZ, appData.sysOpen, dataDir);
ASSIGN(appData.sysOpen, buf); // expand %s in -openCommand to DATADIR (usefull for OS X configuring)
EscapeExpand(buf, appData.firstInitString);
appData.firstInitString = strdup(buf);
programName, appData.boardSize);
exit(2);
}
- if(BOARD_WIDTH > 8)
- squareSize = (squareSize*8 + BOARD_WIDTH/2)/BOARD_WIDTH; // scale height
if (i < 7) {
/* Find some defaults; use the nearest known size */
SizeDefaults *szd, *nearest;
tinyLayout = szd->tinyLayout;
// [HGM] font: use defaults from settings file if available and not overruled
}
+ if(BOARD_WIDTH != 8) {
+ squareSize = (squareSize*8 + BOARD_WIDTH/2)/BOARD_WIDTH; // keep width the same
+ lineGap = (squareSize < 37 ? 1 : squareSize < 59 ? 2 : squareSize < 116 ? 3 : 4);
+ }
defaultLineGap = lineGap;
if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap;
boardWidget = optList[W_BOARD].handle;
menuBarWidget = optList[W_MENU].handle;
dropMenu = optList[W_DROP].handle;
- titleWidget = optList[optList[W_TITLE].type != -1 ? W_TITLE : W_SMALL].handle;
+ titleWidget = optList[optList[W_TITLE].type != Skip ? W_TITLE : W_SMALL].handle;
#ifdef TODO_GTK
formWidget = XtParent(boardWidget);
XtSetArg(args[0], XtNbackground, &timerBackgroundPixel);
if(optList[W_BOARD].max > w) optList[W_BOARD].max = w;
if(optList[W_BOARD].value > h) optList[W_BOARD].value = h;
first = appData.fixedSize;
+ if(twoBoards && shellUp[DummyDlg]) {
+ SlavePopUp(); dualOptions[3].max = 0; DoEvents(); // calls SlaveResize, kludge to force assigning new canvas
+ partnerUp = !partnerUp; flipView = !flipView;
+ DrawPosition(True, NULL);
+ partnerUp = !partnerUp; flipView = !flipView;
+ }
}
static guint delayedDragTag = 0;
ModeHighlight ()
{
static int oldPausing = FALSE;
- static GameMode oldmode = (GameMode) -1;
+ static GameMode oldMode = (GameMode) -1;
char *wname;
if (!boardWidget) return;
}
}
- wname = ModeToWidgetName(oldmode);
+ wname = ModeToWidgetName(oldMode);
if (wname != NULL) {
MarkMenuItem(wname, False);
}
if (wname != NULL) {
MarkMenuItem(wname, True);
}
- oldmode = gameMode;
+ if(oldMode == TwoMachinesPlay) EnableNamedMenuItem("Mode.MachineMatch", True);
MarkMenuItem("Mode.MachineMatch", matchMode && matchGame < appData.matchGames);
+ oldMode = gameMode;
/* Maybe all the enables should be handled here, not just this one */
EnableNamedMenuItem("Mode.Training", gameMode == Training || gameMode == PlayFromGameFile);
{
gchar *text=NULL;
GtkClipboard *cb;
- guint len=0;
+ guint len=0; int flip = appData.flipView;
FILE* f;
// get game from clipboard
fclose(f);
// load from file
+ if(!appData.autoFlipView) appData.flipView = flipView;
LoadGameFromFile(gamePasteFilename, 0, gamePasteFilename, TRUE);
+ appData.flipView = flip;
return;
}
{ // called from menu
#ifdef OSXAPP
char buf[MSG_SIZ];
- snprintf(buf, MSG_SIZ, "%s ./man.command", appData.sysOpen);
+ snprintf(buf, MSG_SIZ, "osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script \"man %s/../man/man6/xboard.6\"' -e 'end tell'", dataDir);
system(buf);
#else
system("xterm -e man xboard &");
}
void
+InfoProc ()
+{
+ char buf[MSG_SIZ];
+#ifdef OSXAPP
+ snprintf(buf, MSG_SIZ, "osascript -e 'tell application \"Terminal\"' -e 'activate' -e 'do script \"info -d %s/../info -f xboard.info\"' -e 'end tell'", dataDir);
+#else
+ snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
+ INFODIR, INFOFILE);
+#endif
+ system(buf);
+}
+
+
+void
SetWindowTitle (char *text, char *title, char *icon)
{
#ifdef TODO_GTK
StartDir(filter, NULL); // change to start directory for this file type
+ if(def && *def && def[strlen(def)-1] == '/') {
+ getcwd(curDir, MSG_SIZ);
+ chdir(def);
+ }
+
+
/* make a copy of the filter string, so that strtok can work with it*/
cp = strdup(filter);