Merge branch 'v4.8.x'
[xboard.git] / gtk / xoptions.c
index 8c5bd26..525d00b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * xoptions.c -- Move list window, part of X front end for XBoard
  *
- * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
  * ------------------------------------------------------------------------
  *
  * GNU XBoard is free software: you can redistribute it and/or modify
@@ -48,7 +48,6 @@ extern char *getenv();
 #include <stdint.h>
 
 #include <cairo/cairo.h>
-#include <cairo/cairo-xlib.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #ifdef OSXAPP
@@ -244,6 +243,12 @@ SetWidgetLabel (Option *opt, char *buf)
 }
 
 void
+SetComboChoice (Option *opt, int n)
+{
+    gtk_combo_box_set_active(opt->handle, n);
+}
+
+void
 SetDialogTitle (DialogClass dlg, char *title)
 {
     gtk_window_set_title(GTK_WINDOW(shells[dlg]), title);
@@ -444,10 +449,24 @@ CreateMenuPopup (Option *opt, int n, int def)
 
            gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods);
 #ifdef OSXAPP
-           if(accelerator_mods & GDK_CONTROL_MASK) {  // in OSX use Meta where Linux uses Ctrl
-               accelerator_mods &= ~GDK_CONTROL_MASK; // clear Ctrl flag
-               accelerator_mods |= GDK_META_MASK;     // set Meta flag
-           }
+          if(accelerator_mods & GDK_CONTROL_MASK &&
+             accelerator_key != 'v' &&          // don't use Cmd+V as this is a OS text edit command
+             accelerator_key != 'c' &&           // and Cmd+C
+             accelerator_key != 'x' &&          // and CMD+X
+             accelerator_key != 'a'           // and CMD+A
+             ) {  // in OSX use Meta (Cmd) where Linux uses Ctrl
+              accelerator_mods &= ~GDK_CONTROL_MASK; // clear Ctrl flag
+              accelerator_mods |= GDK_META_MASK;     // set Meta flag
+                 } else if (accelerator_mods & GDK_CONTROL_MASK &&
+                                        accelerator_key == 'v' ||
+                                        accelerator_key == 'c' ||
+                                        accelerator_key == 'x' ||
+                                        accelerator_key == 'a'
+                                        ) { // For these conflicting commands, lets make them alt-cmd
+                         accelerator_mods &= ~GDK_CONTROL_MASK; // clear Ctrl flag
+                         accelerator_mods |= GDK_META_MASK;
+                         accelerator_mods |= GDK_MOD1_MASK;
+                 } 
 #endif
            gtk_widget_add_accelerator (GTK_WIDGET(entry), "activate",GtkAccelerators,
                                        accelerator_key, accelerator_mods, GTK_ACCEL_VISIBLE);
@@ -530,11 +549,11 @@ HighlightText (Option *opt, int from, int to, Boolean highlight)
     if(!(opt->min & INIT)) {
        opt->min |= INIT; // each memo its own init flag!
        gtk_text_buffer_create_tag(opt->handle, "highlight", "background", "yellow", NULL);
-       gtk_text_buffer_create_tag(opt->handle, "normal", "background", "white", NULL);
     }
     gtk_text_buffer_get_iter_at_offset(opt->handle, &start, from);
     gtk_text_buffer_get_iter_at_offset(opt->handle, &end, to);
-    gtk_text_buffer_apply_tag_by_name(opt->handle, highlight ? "highlight" : "normal", &start, &end);
+    if(highlight) gtk_text_buffer_apply_tag_by_name(opt->handle, "highlight", &start, &end);
+    else gtk_text_buffer_remove_tag_by_name(opt->handle, "highlight", &start, &end);
 }
 
 static char **names;
@@ -1451,10 +1470,12 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
             /* set button color on new variant dialog */
             if(option[i].textValue) {
                 static char *b = "Bold";
+                char *v, *p = NULL, n = option[i].value;
+                if(n >= 0) v = VariantName(n), p = strstr(first.variants, v);
                 gdk_color_parse( option[i].textValue, &color );
                 gtk_widget_modify_bg ( GTK_WIDGET(button), GTK_STATE_NORMAL, &color );
                 gtk_widget_set_sensitive(button, option[i].value >= 0 && (appData.noChessProgram
-                                        || strstr(first.variants, VariantName(option[i].value))));
+                                        || p && (!*v || strlen(p) == strlen(v) || p[strlen(v)] == ',')));
                 if(engineVariant[100] ? !strcmp(engineVariant+100, option[i].name) : 
                    gameInfo.variant ? option[i].value == gameInfo.variant : !strcmp(option[i].name, "Normal"))
                     SetWidgetFont(gtk_bin_get_child(GTK_BIN(button)), &b);
@@ -1568,7 +1589,11 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
            top--;
            msg = _(option[i].name); // write name on the menu button
 #ifndef OSXAPP
-           if(tinyLayout) { strcpy(def, msg); def[tinyLayout] = NULLCHAR; msg = def; } // clip menu text to keep menu bar small
+           if(tinyLayout) { // clip menu text to keep menu bar small
+               int clip = tinyLayout + 1;
+               strcpy(def, msg + (msg[clip-1] == '_'));
+               def[clip] = NULLCHAR; msg = def;
+           }
 #endif
 //         XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name));  j++;
 //         XtSetArg(args[j], XtNlabel, msg);  j++;