Prevent message text widening window GTK
[xboard.git] / gtk / xoptions.c
index c4c4bd7..79e5617 100644 (file)
@@ -279,12 +279,35 @@ ApplyFont (Option *opt, char *font)
       case ListBox:
       case Label:   w = opt->handle; break;
       case Button:  if(opt->handle) w = gtk_bin_get_child(GTK_BIN(opt->handle)); break;
-      case TextBox: w = opt->textValue; if(!w) w = opt->handle; break;
+      case TextBox: w = (GtkWidget *) opt->textValue; if(!w) w = opt->handle; break;
       default: ;
     }
     if(w && font) SetWidgetFont(w, &font);
 }
 
+GtkWidget *fbutton;
+
+void
+FontCallback (GtkWidget *widget, gpointer gdata)
+{
+    Option *opt = (Option *) gdata;
+    gchar *p = (char *) gtk_font_button_get_font_name(GTK_FONT_BUTTON(fbutton));
+    SetWidgetText(opt, p, TransientDlg);
+    ApplyFont(opt, p);
+}
+
+void
+ColorCallback (GtkWidget *widget, gpointer gdata)
+{
+    Option *opt = (Option *) gdata;
+    GdkColor rgba;
+    char buf[MSG_SIZ]; 
+    gtk_color_button_get_color(GTK_COLOR_BUTTON(widget), &rgba);
+    snprintf(buf, MSG_SIZ, "#%02x%02x%02x", rgba.red>>8, rgba.green>>8, rgba.blue>>8);
+    gtk_widget_modify_bg ( GTK_WIDGET(opt[1].handle), GTK_STATE_NORMAL, &rgba );
+    SetWidgetText(opt, buf, TransientDlg);
+}
+
 void
 SetListBoxItem (GtkListStore *store, int n, char *msg)
 {
@@ -615,6 +638,11 @@ AppendColorized (Option *opt, char *s, int count)
     static GtkTextIter end;
     static GtkTextTag *fgTags[8], *bgTags[8], *font, *bold, *normal, *attr = NULL;
 
+    if(!s) {
+       font = NULL;
+       return;
+    }
+
     if(!font) {
        font = gtk_text_buffer_create_tag(opt->handle, NULL, "font", appData.icsFont, NULL);
        gtk_widget_modify_base(GTK_WIDGET(opt->textValue), GTK_STATE_NORMAL, &backgroundColor);
@@ -997,6 +1025,7 @@ GraphEventProc(GtkWidget *widget, GdkEvent *event, gpointer gdata)
        case GDK_SCROLL:
            if(sevent->direction == GDK_SCROLL_UP) button = 4;
            if(sevent->direction == GDK_SCROLL_DOWN) button = 5;
+           w = h = 0; // to keep Clang happy
            break;
        case GDK_MOTION_NOTIFY:
            f = 0;
@@ -1383,7 +1412,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
          case FileName:
          case PathName:
           tBox:
-            label = gtk_label_new(option[i].name);
+            label = gtk_label_new(_(option[i].name));
             /* Left Justify */
             gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
 
@@ -1478,7 +1507,7 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
             }
             break;
           case CheckBox:
-            checkbutton = gtk_check_button_new_with_label(option[i].name);
+            checkbutton = gtk_check_button_new_with_label(_(option[i].name));
            g_signal_connect(checkbutton, "button-press-event", G_CALLBACK (HelpEvent), (gpointer) option[i].name );
             if(!currentCps) option[i].value = *(Boolean*)option[i].target;
             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), option[i].value);
@@ -1491,16 +1520,16 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
             Pack(hbox, table, label, left, left+2, top, 0);
             break;
          case Label:
-            option[i].handle = (void *) (label = gtk_label_new(option[i].name));
+            option[i].handle = (void *) (label = gtk_label_new(_(option[i].name)));
             /* Left Justify */
             gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
             SetWidgetFont(label, option[i].font);
+            gtk_widget_set_size_request(label, option[i].max ? option[i].max : -1, -1);
            if(option[i].min & BORDER) {
                GtkWidget *frame = gtk_frame_new(NULL);
                 gtk_container_add(GTK_CONTAINER(frame), label);
                label = frame;
            }
-            gtk_widget_set_size_request(label, option[i].max ? option[i].max : -1, -1);
            if(option[i].target || dlgNr != ErrorDlg && option[i].name) { // allow user to specify event handler for button presses
                button = gtk_event_box_new();
                 gtk_container_add(GTK_CONTAINER(button), label);
@@ -1515,7 +1544,22 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
            break;
           case SaveButton:
           case Button:
-            button = gtk_button_new_with_label (option[i].name);
+            if(!strcmp(option[i].name, "fontsel")) {
+                option[i].handle = (void *) (fbutton = gtk_font_button_new());
+                Pack(hbox, table, fbutton, left, left+r, top, 0);
+                break;
+            }
+            if(!strcmp(option[i].name, "R") || !strcmp(option[i].name, "G") || !strcmp(option[i].name, "B")) {
+                break;
+            } else
+            if(!strcmp(option[i].name, "D")) {
+                GdkColor color;
+                char *name;
+               GetWidgetText(&option[i-5], &name);
+                gdk_color_parse(name, &color);
+                option[i].handle = (void *) (button = gtk_color_button_new_with_color(&color));
+            } else
+            button = gtk_button_new_with_label (_(option[i].name));
             SetWidgetFont(gtk_bin_get_child(GTK_BIN(button)), option[i].font);
 
             /* set button color on view board dialog */
@@ -1539,12 +1583,18 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
             }
 
             Pack(hbox, table, button, left, left+1, top, 0);
+            if(!strcmp(option[i].name, "D")) // color button
+            g_signal_connect (button, "color-set", G_CALLBACK (ColorCallback), (gpointer) &option[i-5]);
+            else
+            if(option[i].value == 666 && !strcmp(option[i].name, "*")) // font-assignment buttons
+            g_signal_connect (button, "clicked", G_CALLBACK (FontCallback), (gpointer) &option[i-5]);
+            else
             g_signal_connect (button, "clicked", G_CALLBACK (GenericCallback), (gpointer)(intptr_t) i + (dlgNr<<16));
            g_signal_connect(button, "button-press-event", G_CALLBACK (HelpEvent), (gpointer) option[i].name );
             option[i].handle = (void*)button;
             break;
          case ComboBox:
-            label = gtk_label_new(option[i].name);
+            label = gtk_label_new(_(option[i].name));
             /* Left Justify */
             gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
            button = gtk_event_box_new();
@@ -1620,10 +1670,6 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
          case Graph:
            option[i].handle = (void*) (graph = gtk_drawing_area_new());
             gtk_widget_set_size_request(graph, option[i].max, option[i].value);
-           if(0){ GtkAllocation a;
-               a.x = 0; a.y = 0; a.width = option[i].max, a.height = option[i].value;
-               gtk_widget_set_allocation(graph, &a);
-           }
             g_signal_connect (graph, "expose-event", G_CALLBACK (GraphEventProc), (gpointer) &option[i]);
            gtk_widget_add_events(GTK_WIDGET(graph), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
             g_signal_connect (graph, "button-press-event", G_CALLBACK (GraphEventProc), (gpointer) &option[i]);
@@ -1780,8 +1826,10 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
        gtk_window_resize(GTK_WINDOW(dialog), wp[dlgNr]->width, wp[dlgNr]->height);
     }
 
-    for(i=0; option[i].type != EndMark; i++) if(option[i].type == Graph)
+    for(i=0; option[i].type != EndMark; i++) if(option[i].type == Graph || dlgNr == BoardWindow && option[i].handle) {
        gtk_widget_set_size_request(option[i].handle, -1, -1); // remove size requests after realization, so user can shrink
+       if(option[i].type == Label) gtk_label_set_ellipsize(option[i].handle, PANGO_ELLIPSIZE_END);
+    }
 
     return 1; // tells caller he must do initialization (e.g. add specific event handlers)
 }