#include "gettext.h"
#include "draw.h"
-#ifdef __APPLE__
+#ifdef OSXAPP
# include <gtkmacintegration/gtkosxapplication.h>
// prevent pathname of positional file argument provided by OS X being be mistaken for option name
// (price is that we won't recognize Windows option format anymore).
void update_ics_width P(());
int CopyMemoProc P(());
static gboolean EventProc P((GtkWidget *widget, GdkEvent *event, gpointer g));
+static int FindLogo P((char *place, char *name, char *buf));
#ifdef TODO_GTK
#if ENABLE_NLS
gtk_widget_get_allocation(shellWidget, &a);
marginW = a.width - bw;
gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
- w += marginW + 1; // [HGM] not sure why the +1 is (sometimes) needed...
- h += marginH + a.height + 1;
+ gtk_widget_set_size_request(optList[W_BOARD].handle, w, h); // protect board widget
+// w += marginW + 1; // [HGM] not sure why the +1 is (sometimes) needed...
+// h += marginH + a.height + 1;
gtk_window_resize(GTK_WINDOW(shellWidget), w, h);
+ DoEvents();
+ gtk_widget_set_size_request(optList[W_BOARD].handle, -1, -1); // liberate board again
}
int
return gdk_pixbuf_new_from_file(buf, NULL);
}
-#ifdef __APPLE__
+#ifdef OSXAPP
static char clickedFile[MSG_SIZ];
static int suppress;
/* set up GTK */
gtk_init (&argc, &argv);
-#ifdef __APPLE__
+#ifdef OSXAPP
{ // prepare to catch OX OpenFile signal, which will tell us the clicked file
char *path = gtkosx_application_get_bundle_path();
#ifdef ENABLE_NLS
snprintf(localeDir, MSG_SIZ, "%s/share/locale", res_path); // redefine locale dir for OSX bundle
#endif
theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
- strncpy(dataDir, path, MSG_SIZ);
snprintf(masterSettings, MSG_SIZ, "%s/Contents/Resources/etc/xboard.conf", path);
- snprintf(svgDir, MSG_SIZ, "%s/Contents/Resources/share/xboard/themes/default", 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()));
gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
clockKludge = hc = a.height;
gtk_widget_get_allocation(boardWidget, &a);
-// marginW = w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board
+ marginW = w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board
marginH = h - a.height - hc; // subtract current clock height, so it can be added back dynamically
}
if(appData.logoSize)
{ // locate and read user logo
- char buf[MSG_SIZ];
- snprintf(buf, MSG_SIZ, "%s/%s.png", appData.logoDir, UserName());
+ char buf[MSG_SIZ], name[MSG_SIZ];
+ snprintf(name, MSG_SIZ, "/home/%s", UserName());
+ if(!FindLogo(name, ".logo", buf))
+ FindLogo(appData.logoDir, name + 6, buf);
ASSIGN(userLogo, buf);
}
ReSize (WindowPlacement *wp)
{
GtkAllocation a;
- int sqx, sqy, w, h, hc, lg = lineGap;
- gtk_widget_get_allocation(optList[W_WHITE].handle, &a);
- hc = a.height; // clock height can depend on single / double line clock text!
- if(clockKludge && hc != clockKludge) wp->height += hc - clockKludge, clockKludge = 0;
- wpMain.height = BOARD_HEIGHT * (squareSize + lineGap) + lineGap + marginH + hc;
- if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized
- sqx = (wp->width - lg - marginW) / BOARD_WIDTH - lg;
- sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg;
+ int sqx, sqy, w, h, lg = lineGap;
+ static int first = 1;
+ if(wp->width == wpMain.width && wp->height == wpMain.height && !first) return; // not sized
+ gtk_widget_get_allocation(optList[W_DROP+1].handle, &a); // table that should contain everything
+ w = a.width; h = a.height;
+ gtk_widget_get_allocation(shellWidget, &a);
+ if(a.width < w || a.height < h) { // outer window smaller than dialog content?
+ w = a.width - w; h = a.height - h; // subtract matrgins, measured as table minus board dimensions
+ gtk_widget_get_allocation(optList[W_BOARD].handle, &a);
+ w += a.width; h += a.height;
+ } else {
+ gtk_widget_get_allocation(optList[W_BOARD].handle, &a);
+ w = a.width; h = a.height;
+ }
+ sqx = (w - lg) / BOARD_WIDTH - lg;
+ sqy = (h - lg) / BOARD_HEIGHT - lg;
if(sqy < sqx) sqx = sqy;
if(sqx < 20) return;
if(appData.overrideLineGap < 0) { // do second iteration with adjusted lineGap
int oldSqx = sqx;
lg = lineGap = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4;
- sqx = (wp->width - lg - marginW) / BOARD_WIDTH - lg;
- sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg;
+ sqx = (w - lg) / BOARD_WIDTH - lg;
+ sqy = (h - lg) / BOARD_HEIGHT - lg;
if(sqy < sqx) sqx = sqy;
lg = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4;
if(sqx == oldSqx + 1 && lg == lineGap + 1) sqx = oldSqx, squareSize = 0; // prevent oscillations, force resize by kludge
}
- if(sqx != squareSize) {
+ if(sqx != squareSize && !first) {
squareSize = sqx; // adopt new square size
CreatePNGPieces(); // make newly scaled pieces
InitDrawingSizes(0, 0); // creates grid etc.
h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap;
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;
}
static guint delayedDragTag = 0;
if(busy) return;
busy = 1;
-// GetActualPlacement(shellWidget, &wpNew);
+ GetActualPlacement(shellWidget, &wpNew);
if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved
wpNew.width == wpMain.width && wpNew.height == wpMain.height) { // not sized
busy = 0; return; // false alarm
void
ManProc ()
{ // called from menu
-#ifdef __APPLE__
+#ifdef OSXAPP
char buf[MSG_SIZ];
snprintf(buf, MSG_SIZ, "%s ./man.command", appData.sysOpen);
system(buf);
GdkPixbuf *pm = *clockIcons[color];
if (mainwindowIcon != pm) {
mainwindowIcon = pm;
-#ifdef __APPLE__
+#ifdef OSXAPP
gtkosx_application_set_dock_icon_pixbuf(theApp, mainwindowIcon);
#else
gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon);