Make PGN parser immune to unprotected time stamps
[xboard.git] / gtk / xoptions.c
index 00e0d5d..7a03ffb 100644 (file)
@@ -317,8 +317,13 @@ void
 ScrollToCursor (Option *opt, int caretPos)
 {
     static GtkTextIter iter;
 ScrollToCursor (Option *opt, int caretPos)
 {
     static GtkTextIter iter;
+    static GtkTextMark *mark;
+    if(!mark) mark = gtk_text_mark_new(NULL, 0);
     gtk_text_buffer_get_iter_at_offset((GtkTextBuffer *) opt->handle, &iter, caretPos);
     gtk_text_buffer_get_iter_at_offset((GtkTextBuffer *) opt->handle, &iter, caretPos);
-    gtk_text_view_scroll_to_iter((GtkTextView *) opt->textValue, &iter, 0.0, 0, 0.5, 0.5);
+    gtk_text_buffer_add_mark((GtkTextBuffer *) opt->handle, mark, &iter);
+    gtk_text_view_scroll_to_mark((GtkTextView *) opt->textValue, mark, 0.0, 0, 0.5, 0.5);
+//    gtk_text_view_scroll_to_iter((GtkTextView *) opt->textValue, &iter, 0.0, 0, 0.5, 0.5);
+    gtk_text_buffer_delete_mark((GtkTextBuffer *) opt->handle, mark);
 }
 
 int
 }
 
 int
@@ -634,7 +639,7 @@ AddHandler (Option *opt, DialogClass dlg, int nr)
 GtkWidget *shells[NrOfDialogs];
 DialogClass parents[NrOfDialogs];
 WindowPlacement *wp[NrOfDialogs] = { // Beware! Order must correspond to DialogClass enum
 GtkWidget *shells[NrOfDialogs];
 DialogClass parents[NrOfDialogs];
 WindowPlacement *wp[NrOfDialogs] = { // Beware! Order must correspond to DialogClass enum
-    NULL, &wpComment, &wpTags, NULL, NULL, NULL, NULL, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph,
+    NULL, &wpComment, &wpTags, NULL, NULL, NULL, &wpDualBoard, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph,
     NULL, NULL, NULL, NULL, &wpMain
 };
 
     NULL, NULL, NULL, NULL, &wpMain
 };
 
@@ -1105,6 +1110,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent
     if(dlgNr && dlgNr < PromoDlg && shells[dlgNr]) { // reusable, and used before (but popped down)
         gtk_widget_show(shells[dlgNr]);
         shellUp[dlgNr] = True;
     if(dlgNr && dlgNr < PromoDlg && shells[dlgNr]) { // reusable, and used before (but popped down)
         gtk_widget_show(shells[dlgNr]);
         shellUp[dlgNr] = True;
+       if(wp[dlgNr]) gtk_window_move(GTK_WINDOW(shells[dlgNr]), wp[dlgNr]->x, wp[dlgNr]->y);
         return 0;
     }
 
         return 0;
     }
 
@@ -1118,7 +1124,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent
 //        if(n > 50) width = 4; else if(n>24) width = 2; else width = 1;
        width = n / 20 + 1;
         height = n / width + 1;
 //        if(n > 50) width = 4; else if(n>24) width = 2; else width = 1;
        width = n / 20 + 1;
         height = n / width + 1;
-printf("n=%d, h=%d, w=%d\n",n,height,width);
+if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width);
 //     if(n && (currentOption[n-1].type == Button || currentOption[n-1].type == SaveButton)) currentOption[n].min = SAME_ROW; // OK on same line
         currentOption[n].type = EndMark; currentOption[n].target = NULL; // delimit list by callback-less end mark
     }
 //     if(n && (currentOption[n-1].type == Button || currentOption[n-1].type == SaveButton)) currentOption[n].min = SAME_ROW; // OK on same line
         currentOption[n].type = EndMark; currentOption[n].target = NULL; // delimit list by callback-less end mark
     }
@@ -1136,6 +1142,7 @@ printf("n=%d, h=%d, w=%d\n",n,height,width);
     if(topLevel)
       {
        dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     if(topLevel)
       {
        dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_title(GTK_WINDOW(dialog), title);
        box = gtk_vbox_new(FALSE,0);
        gtk_container_add (GTK_CONTAINER (dialog), box);
       }
        box = gtk_vbox_new(FALSE,0);
        gtk_container_add (GTK_CONTAINER (dialog), box);
       }
@@ -1505,12 +1512,14 @@ printf("n=%d, h=%d, w=%d\n",n,height,width);
 
     /* hide OK/cancel buttons */
     if(!topLevel)
 
     /* hide OK/cancel buttons */
     if(!topLevel)
-      if((option[i].min & NO_OK)) {
-        actionarea = gtk_dialog_get_action_area(GTK_DIALOG(dialog));
-        gtk_widget_hide(actionarea);
-      } else if((option[i].min & NO_CANCEL)) {
-        button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT);
-        gtk_widget_hide(button);
+      {
+       if((option[i].min & NO_OK)) {
+         actionarea = gtk_dialog_get_action_area(GTK_DIALOG(dialog));
+         gtk_widget_hide(actionarea);
+       } else if((option[i].min & NO_CANCEL)) {
+         button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT);
+         gtk_widget_hide(button);
+       }
         g_signal_connect (dialog, "response",
                       G_CALLBACK (GenericPopDown),
                       (gpointer)(intptr_t) dlgNr);
         g_signal_connect (dialog, "response",
                       G_CALLBACK (GenericPopDown),
                       (gpointer)(intptr_t) dlgNr);
@@ -1521,11 +1530,11 @@ printf("n=%d, h=%d, w=%d\n",n,height,width);
                       (gpointer)(intptr_t) dlgNr);
     shellUp[dlgNr]++;
 
                       (gpointer)(intptr_t) dlgNr);
     shellUp[dlgNr]++;
 
-    if(dlgNr && wp[dlgNr] && wp[dlgNr]->width > 0) { // if persistent window-info available, reposition
+    if(dlgNr && wp[dlgNr]) { // if persistent window-info available, reposition
+      if(wp[dlgNr]->x > 0 && wp[dlgNr]->y > 0)
        gtk_window_move(GTK_WINDOW(dialog), wp[dlgNr]->x, wp[dlgNr]->y);
        gtk_window_move(GTK_WINDOW(dialog), wp[dlgNr]->x, wp[dlgNr]->y);
-//printf("moved %d to (%d,%d)\n", dlgNr, wp[dlgNr]->x, wp[dlgNr]->y);
+      if(wp[dlgNr]->width > 0 && wp[dlgNr]->height > 0)
        gtk_window_resize(GTK_WINDOW(dialog), wp[dlgNr]->width, wp[dlgNr]->height);
        gtk_window_resize(GTK_WINDOW(dialog), wp[dlgNr]->width, wp[dlgNr]->height);
-//printf("resized %d to %dx%d\n", dlgNr, wp[dlgNr]->width, wp[dlgNr]->height);
     }
 
     return 1; // tells caller he must do initialization (e.g. add specific event handlers)
     }
 
     return 1; // tells caller he must do initialization (e.g. add specific event handlers)
@@ -1567,13 +1576,8 @@ SendText (int n)
 void
 SetInsertPos (Option *opt, int pos)
 {
 void
 SetInsertPos (Option *opt, int pos)
 {
-#ifdef TODO_GTK
-    Arg args[16];
-    XtSetArg(args[0], XtNinsertPosition, pos);
-    XtSetValues(opt->handle, args, 1);
-//    SetFocus(opt->handle, shells[InputBoxDlg], NULL, False); // No idea why this does not work, and the following is needed:
-//    XSetInputFocus(xDisplay, XtWindow(opt->handle), RevertToPointerRoot, CurrentTime);
-#endif
+    if(opt->value > 80) ScrollToCursor(opt, pos);
+    else gtk_editable_set_position(GTK_EDITABLE(opt->handle), pos);
 }
 
 void
 }
 
 void