X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxoptions.c;h=8fb5dcaee1cea29a797b3efdcdbdf49daa79431e;hb=c37d45adc7d98a702a7459ccdc0ac23df01a476e;hp=0f90d6ea9950830c6779e7d69e2f0dca90937173;hpb=7b9a24f787397e274c8d9784b58c5023c12b35c6;p=xboard.git diff --git a/gtk/xoptions.c b/gtk/xoptions.c index 0f90d6e..8fb5dca 100644 --- a/gtk/xoptions.c +++ b/gtk/xoptions.c @@ -1,7 +1,7 @@ /* * xoptions.c -- Move list window, part of X front end for XBoard * - * Copyright 2000, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. + * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify @@ -51,6 +51,9 @@ extern char *getenv(); #include #include #include +#ifdef __APPLE__ +# include +#endif #include "common.h" #include "backend.h" @@ -317,8 +320,13 @@ void 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_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 @@ -420,6 +428,10 @@ CreateMenuPopup (Option *opt, int n, int def) { char *msg = mb[i].string; if(!msg) break; +#ifdef __APPLE__ + if(!strcmp(msg, "Quit ")) continue; // Quit item will appear automatically in App menu + if(!strcmp(msg, "About XBoard")) msg = "About"; // 'XBoard' will be appended automatically when moved to App menu 1st item +#endif if(strcmp(msg, "----")) { // if(!(opt->min & NO_GETTEXT)) msg = _(msg); if(mb[i].handle) { @@ -433,11 +445,17 @@ CreateMenuPopup (Option *opt, int n, int def) GdkModifierType accelerator_mods; gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods); +#ifdef __APPLE__ + 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 + } +#endif gtk_widget_add_accelerator (GTK_WIDGET(entry), "activate",GtkAccelerators, accelerator_key, accelerator_mods, GTK_ACCEL_VISIBLE); - }; - gtk_widget_show(entry); + } } else entry = gtk_separator_menu_item_new(); + gtk_widget_show(entry); gtk_menu_append(GTK_MENU (menu), entry); //CreateMenuItem(menu, opt->min & NO_GETTEXT ? msg : _(msg), (XtCallbackProc) ComboSelect, (n<<16)+i); mb[i].handle = (void*) entry; // save item ID, for enabling / checkmarking @@ -818,8 +836,15 @@ GraphEventProc(GtkWidget *widget, GdkEvent *event, gpointer gdata) // to give drawing routines opportunity to use it before first expose event // (which are only processed when main gets to the event loop, so after all init!) // so only change when size is no longer good + cairo_t *cr; if(graph->choice) cairo_surface_destroy((cairo_surface_t *) graph->choice); graph->choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h); + // paint white, to prevent weirdness when people maximize window and drag pieces over space next to board + cr = cairo_create ((cairo_surface_t *) graph->choice); + cairo_rectangle (cr, 0, 0, w, h); + cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); + cairo_fill(cr); + cairo_destroy (cr); break; } w = eevent->area.width; @@ -919,7 +944,7 @@ void BrowseGTK(GtkWidget *widget, gpointer gdata) gtkfilter = gtk_file_filter_new(); gtkfilter_all = gtk_file_filter_new(); - char fileext[10] = "*"; + char fileext[MSG_SIZ]; /* select file or folder depending on option_type */ if (currentOption[opt_i].type == PathName) @@ -940,11 +965,16 @@ void BrowseGTK(GtkWidget *widget, gpointer gdata) gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),gtkfilter_all); /* filter for specific filetypes e.g. pgn or fen */ - if (currentOption[opt_i].textValue != NULL && (strcmp(currentOption[opt_i].textValue, "") != 0) ) + if (currentOption[opt_i].textValue != NULL) { - strcat(fileext, currentOption[opt_i].textValue); - gtk_file_filter_add_pattern(gtkfilter, fileext); - gtk_file_filter_set_name (gtkfilter, currentOption[opt_i].textValue); + char *q, *p = currentOption[opt_i].textValue; + gtk_file_filter_set_name (gtkfilter, p); + while(*p) { + snprintf(fileext, MSG_SIZ, "*%s", p); + while(*p) if(*p++ == ' ') break; + for(q=fileext; *q; q++) if(*q == ' ') { *q = NULLCHAR; break; } + gtk_file_filter_add_pattern(gtkfilter, fileext); + } gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog),gtkfilter); /* activate filter */ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog),gtkfilter); @@ -1336,8 +1366,8 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); if(option[i].textValue) { gdk_color_parse( option[i].textValue, &color ); gtk_widget_modify_bg ( GTK_WIDGET(button), GTK_STATE_NORMAL, &color ); - gtk_widget_set_sensitive(button, appData.noChessProgram || option[i].value < 0 - || strstr(first.variants, VariantName(option[i].value))); + gtk_widget_set_sensitive(button, option[i].value >= 0 && (appData.noChessProgram + || strstr(first.variants, VariantName(option[i].value)))); } Pack(hbox, table, button, left, left+1, top, 0); @@ -1468,9 +1498,21 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); break; case BarEnd: top--; +#ifndef __APPLE__ gtk_table_attach(GTK_TABLE(table), menuBar, left, left+r, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 1); if(option[i].target) ((ButtonCallback*)option[i].target)(boxStart); // callback that can make sizing decisions +#else + top--; // in OSX menu bar is not put in window, so also don't count it + { // in stead, offer it to OSX, and move About item to top of App menu + GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL); + extern MenuItem helpMenu[]; // oh, well... Adding items in help menu breaks this anyway + gtk_widget_hide (menuBar); + gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(menuBar)); + gtkosx_application_insert_app_menu_item(theApp, GTK_MENU_ITEM(helpMenu[8].handle), 0); // hack + gtkosx_application_sync_menubar(theApp); + } +#endif break; case BoxEnd: // XtManageChildren(&form, 1); @@ -1525,11 +1567,11 @@ if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); (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); -//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); -//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) @@ -1571,13 +1613,8 @@ SendText (int n) 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