// Also here some of the size calculations should go to the back end, and their actual application to a front-end routine void ResizeWindowControls( int mode ) { HWND hDlg = engineOutputDialog; // [HGM] used to be parameter, but routine is called from back-end RECT rc; int headerHeight = GetHeaderHeight(); // int labelHeight = GetControlHeight( hDlg, IDC_EngineLabel1 ); // int labelOffset = H_MARGIN + ICON_SIZE + H_MARGIN; // int labelDeltaY = ICON_SIZE - labelHeight; int clientWidth; int clientHeight; int maxControlWidth; int npsWidth; /* Initialize variables */ GetClientRect( hDlg, &rc ); clientWidth = rc.right - rc.left; clientHeight = rc.bottom - rc.top; maxControlWidth = clientWidth - 2*H_MARGIN; npsWidth = GetControlWidth( hDlg, IDC_Engine1_NPS ); /* Resize controls */ if( mode == 0 ) { /* One engine */ PositionControlSet( hDlg, H_MARGIN, V_MARGIN, clientWidth, clientHeight - V_MARGIN - LABEL_V_DISTANCE - headerHeight- V_MARGIN, IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); /* Hide controls for the second engine */ HideControl( hDlg, IDC_Color2 ); HideControl( hDlg, IDC_EngineLabel2 ); HideControl( hDlg, IDC_StateIcon2 ); HideControl( hDlg, IDC_StateData2 ); HideControl( hDlg, IDC_Engine2_NPS ); HideControl( hDlg, IDC_EngineMemo2 ); SendDlgItemMessage( hDlg, IDC_EngineMemo2, WM_SETTEXT, 0, (LPARAM) "" ); /* TODO: we should also hide/disable them!!! what about tab stops?!?! */ } else { /* Two engines */ int memo_h = (clientHeight - headerHeight*2 - V_MARGIN*2 - LABEL_V_DISTANCE*2 - SPLITTER_SIZE) / 2; int header1_y = V_MARGIN; int header2_y = V_MARGIN + headerHeight + LABEL_V_DISTANCE + memo_h + SPLITTER_SIZE; PositionControlSet( hDlg, H_MARGIN, header1_y, clientWidth, memo_h, IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); PositionControlSet( hDlg, H_MARGIN, header2_y, clientWidth, memo_h, IDC_Color2, IDC_EngineLabel2, IDC_Engine2_NPS, IDC_EngineMemo2, IDC_StateIcon2, IDC_StateData2 ); } InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo1), NULL, FALSE ); InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE ); }
Widget EngineOutputCreate (char *name, char *text) { Arg args[16]; Widget shell, layout, form, form2; Dimension bw_width, bw_height; int j; // get board width j = 0; XtSetArg(args[j], XtNwidth, &bw_width); j++; XtSetArg(args[j], XtNheight, &bw_height); j++; XtGetValues(boardWidget, args, j); // define form within layout within shell. j = 0; XtSetArg(args[j], XtNresizable, True); j++; shell = #if TOPLEVEL XtCreatePopupShell(name, topLevelShellWidgetClass, #else XtCreatePopupShell(name, transientShellWidgetClass, #endif shellWidget, args, j); layout = XtCreateManagedWidget(layoutName, formWidgetClass, shell, layoutArgs, XtNumber(layoutArgs)); // divide window vertically into two equal parts, by creating two forms form = XtCreateManagedWidget("form", formWidgetClass, layout, formArgs, XtNumber(formArgs)); form2 = XtCreateManagedWidget("form2", formWidgetClass, layout, formArgs, XtNumber(formArgs)); j = 0; XtSetArg(args[j], XtNfromVert, (XtArgVal) form); j++; XtSetValues(form2, args, j); // make sure width is known in advance, for better placement of child widgets j = 0; XtSetArg(args[j], XtNwidth, (XtArgVal) bw_width-16); j++; XtSetArg(args[j], XtNheight, (XtArgVal) bw_height/2); j++; XtSetValues(shell, args, j); // fill up both forms with control elements PositionControlSet(0, shell, form, bw_width); PositionControlSet(1, shell, form2, bw_width); XtRealizeWidget(shell); if(wpEngineOutput.width > 0) { engineOutputW = wpEngineOutput.width; engineOutputH = wpEngineOutput.height; engineOutputX = wpEngineOutput.x; engineOutputY = wpEngineOutput.y; } if (engineOutputX == -1) { int xx, yy; Window junk; engineOutputH = bw_height/2; engineOutputW = bw_width-16; XSync(xDisplay, False); #ifdef NOTDEF /* This code seems to tickle an X bug if it is executed too soon after xboard starts up. The coordinates get transformed as if the main window was positioned at (0, 0). */ XtTranslateCoords(shellWidget, (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, &engineOutputX, &engineOutputY); #else /*!NOTDEF*/ XTranslateCoordinates(xDisplay, XtWindow(shellWidget), RootWindowOfScreen(XtScreen(shellWidget)), (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, &xx, &yy, &junk); engineOutputX = xx; engineOutputY = yy; #endif /*!NOTDEF*/ if (engineOutputY < 0) engineOutputY = 0; /*avoid positioning top offscreen*/ } j = 0; XtSetArg(args[j], XtNheight, engineOutputH); j++; XtSetArg(args[j], XtNwidth, engineOutputW); j++; XtSetArg(args[j], XtNx, engineOutputX); j++; XtSetArg(args[j], XtNy, engineOutputY); j++; XtSetValues(shell, args, j); return shell; }