| 333 |
333 |
| 334 } |
334 } |
| 335 void grid_initialize(Widget request, Widget new, ArgList args, Cardinal num_args) { |
335 void grid_initialize(Widget request, Widget new, ArgList args, Cardinal num_args) { |
| 336 Grid mn = (Grid)new; |
336 Grid mn = (Grid)new; |
| 337 |
337 |
| 338 mn->mywidget.max_col = 0; |
338 mn->grid.max_col = 0; |
| 339 mn->mywidget.max_row = 0; |
339 mn->grid.max_row = 0; |
| 340 |
340 |
| 341 } |
341 } |
| 342 void grid_realize(Widget w,XtValueMask *valueMask,XSetWindowAttributes *attributes) { |
342 void grid_realize(Widget w,XtValueMask *valueMask,XSetWindowAttributes *attributes) { |
| 343 Grid grid = (Grid)w; |
343 Grid grid = (Grid)w; |
| 344 XtMakeResizeRequest(w, 400, 400, NULL, NULL); |
344 XtMakeResizeRequest(w, 400, 400, NULL, NULL); |
| 392 grid_place_children((Grid)XtParent(widget)); |
392 grid_place_children((Grid)XtParent(widget)); |
| 393 return XtGeometryYes; |
393 return XtGeometryYes; |
| 394 } |
394 } |
| 395 |
395 |
| 396 void GridChangeManaged(Widget widget) { |
396 void GridChangeManaged(Widget widget) { |
| 397 |
397 grid_place_children((Grid)widget); |
| 398 } |
398 } |
| 399 |
399 |
| 400 Boolean ConstraintSetValues(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args) { |
400 Boolean ConstraintSetValues(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args) { |
| 401 GridConstraintRec *constraints = neww->core.constraints; |
401 GridConstraintRec *constraints = neww->core.constraints; |
| 402 Grid grid = (Grid)XtParent(neww); |
402 Grid grid = (Grid)XtParent(neww); |
| 403 if(constraints->grid.x > grid->mywidget.max_col) { |
403 if(constraints->grid.x > grid->grid.max_col) { |
| 404 grid->mywidget.max_col = constraints->grid.x; |
404 grid->grid.max_col = constraints->grid.x; |
| 405 } |
405 } |
| 406 if(constraints->grid.y > grid->mywidget.max_row) { |
406 if(constraints->grid.y > grid->grid.max_row) { |
| 407 grid->mywidget.max_row = constraints->grid.y; |
407 grid->grid.max_row = constraints->grid.y; |
| 408 } |
408 } |
| 409 } |
409 } |
| 410 |
410 |
| 411 |
411 |
| 412 void grid_constraint_init( |
412 void grid_constraint_init( |
| 417 ) |
417 ) |
| 418 { |
418 { |
| 419 GridConstraintRec *constraints = neww->core.constraints; |
419 GridConstraintRec *constraints = neww->core.constraints; |
| 420 |
420 |
| 421 Grid grid = (Grid)XtParent(neww); |
421 Grid grid = (Grid)XtParent(neww); |
| 422 if(constraints->grid.x > grid->mywidget.max_col) { |
422 if(constraints->grid.x > grid->grid.max_col) { |
| 423 grid->mywidget.max_col = constraints->grid.x; |
423 grid->grid.max_col = constraints->grid.x; |
| 424 } |
424 } |
| 425 if(constraints->grid.y > grid->mywidget.max_row) { |
425 if(constraints->grid.y > grid->grid.max_row) { |
| 426 grid->mywidget.max_row = constraints->grid.y; |
426 grid->grid.max_row = constraints->grid.y; |
| 427 } |
427 } |
| 428 constraints->grid.pref_width = neww->core.width; |
428 constraints->grid.pref_width = neww->core.width; |
| 429 constraints->grid.pref_height = neww->core.height; |
429 constraints->grid.pref_height = neww->core.height; |
| 430 } |
430 } |
| 431 |
431 |
| 432 void grid_place_children(Grid w) { |
432 void grid_place_children(Grid w) { |
| 433 int ncols = w->mywidget.max_col+1; |
433 if(!XtIsRealized((Widget)w)) { |
| 434 int nrows = w->mywidget.max_row+1; |
434 return; |
| |
435 } |
| |
436 |
| |
437 int ncols = w->grid.max_col+1; |
| |
438 int nrows = w->grid.max_row+1; |
| 435 GridDef *cols = calloc(ncols, sizeof(GridDef)); |
439 GridDef *cols = calloc(ncols, sizeof(GridDef)); |
| 436 GridDef *rows = calloc(nrows, sizeof(GridDef)); |
440 GridDef *rows = calloc(nrows, sizeof(GridDef)); |
| 437 int num_cols_expanding = 0; |
441 int num_cols_expanding = 0; |
| 438 int num_rows_expanding = 0; |
442 int num_rows_expanding = 0; |
| 439 int req_width = w->mywidget.padding_left + w->mywidget.padding_right; |
443 int req_width = w->grid.padding_left + w->grid.padding_right; |
| 440 int req_height = w->mywidget.padding_top + w->mywidget.padding_bottom; |
444 int req_height = w->grid.padding_top + w->grid.padding_bottom; |
| 441 int width = w->core.width; |
445 int width = w->core.width; |
| 442 int height = w->core.height; |
446 int height = w->core.height; |
| 443 |
447 |
| 444 //printf("container width: %d\n", (int)w->core.width); |
448 //printf("container width: %d\n", (int)w->core.width); |
| 445 |
449 |
| 460 if(constraints->grid.pref_width < constraints->grid.min_width) { |
464 if(constraints->grid.pref_width < constraints->grid.min_width) { |
| 461 constraints->grid.pref_width = constraints->grid.min_width; |
465 constraints->grid.pref_width = constraints->grid.min_width; |
| 462 } |
466 } |
| 463 int elm_width = constraints->grid.pref_width + constraints->grid.margin_left + constraints->grid.margin_right; |
467 int elm_width = constraints->grid.pref_width + constraints->grid.margin_left + constraints->grid.margin_right; |
| 464 int elm_height = constraints->grid.pref_height + constraints->grid.margin_top + constraints->grid.margin_bottom; |
468 int elm_height = constraints->grid.pref_height + constraints->grid.margin_top + constraints->grid.margin_bottom; |
| |
469 if(!XtIsManaged(child)) { |
| |
470 elm_width = 0; |
| |
471 elm_height = 0; |
| |
472 } |
| 465 |
473 |
| 466 if(constraints->grid.colspan > span_max || constraints->grid.rowspan > span_max) { |
474 if(constraints->grid.colspan > span_max || constraints->grid.rowspan > span_max) { |
| 467 continue; |
475 continue; |
| 468 } |
476 } |
| 469 |
477 |
| 562 num_rows_expanding++; |
570 num_rows_expanding++; |
| 563 } |
571 } |
| 564 req_height += rows[i].size; |
572 req_height += rows[i].size; |
| 565 } |
573 } |
| 566 |
574 |
| |
575 int total_colspacing = 0; |
| |
576 int total_rowspacing = 0; |
| |
577 for(int i=0;i+1<ncols;i++) { |
| |
578 if(cols[i].size > 0) { |
| |
579 total_colspacing += w->grid.columnspacing; |
| |
580 } |
| |
581 } |
| |
582 for(int i=0;i+1<nrows;i++) { |
| |
583 if(rows[i].size > 0) { |
| |
584 total_rowspacing += w->grid.rowspacing; |
| |
585 } |
| |
586 } |
| |
587 |
| 567 if(req_width > 0 && req_height > 0) { |
588 if(req_width > 0 && req_height > 0) { |
| 568 // add col/row spacing |
589 // add col/row spacing |
| 569 req_width += (ncols-1)*w->mywidget.columnspacing; |
590 req_width += total_colspacing; //(ncols-1)*w->grid.columnspacing; |
| 570 req_height += (nrows-1)*w->mywidget.rowspacing; |
591 req_height += total_rowspacing; //(nrows-1)*w->grid.rowspacing; |
| 571 |
592 |
| 572 Widget parent = w->core.parent; |
593 Widget parent = w->core.parent; |
| 573 Dimension rwidth = req_width; |
594 Dimension rwidth = req_width; |
| 574 Dimension rheight = req_height; |
595 Dimension rheight = req_height; |
| 575 if(rwidth < w->core.width) { |
596 if(rwidth < w->core.width) { |
| 577 } |
598 } |
| 578 if(rheight < w->core.height) { |
599 if(rheight < w->core.height) { |
| 579 //rheight = w->core.height; |
600 //rheight = w->core.height; |
| 580 } |
601 } |
| 581 |
602 |
| 582 if(!w->mywidget.sizerequest) { |
603 if(!w->grid.sizerequest) { |
| 583 Dimension actual_width, actual_height; |
604 Dimension actual_width, actual_height; |
| 584 w->mywidget.sizerequest = TRUE; |
605 w->grid.sizerequest = TRUE; |
| 585 |
606 |
| 586 //printf("sizerequest: %d x %d\n", (int)req_width, (int)req_height); |
607 //printf("sizerequest: %d x %d\n", (int)req_width, (int)req_height); |
| 587 |
608 |
| 588 //XtWidgetGeometry request; |
609 //XtWidgetGeometry request; |
| 589 //request.width = req_width; |
610 //request.width = req_width; |
| 590 //request.request_mode = CWWidth; |
611 //request.request_mode = CWWidth; |
| 591 //XtWidgetGeometry reply; |
612 //XtWidgetGeometry reply; |
| 592 //XtGeometryResult result = XtMakeGeometryRequest((Widget)w, &request, &reply); |
613 //XtGeometryResult result = XtMakeGeometryRequest((Widget)w, &request, &reply); |
| 593 |
614 |
| 594 XtMakeResizeRequest((Widget)w, req_width, req_height, &actual_width, &actual_height); |
615 XtMakeResizeRequest((Widget)w, req_width, req_height, &actual_width, &actual_height); |
| 595 w->mywidget.sizerequest = FALSE; |
616 w->grid.sizerequest = FALSE; |
| 596 //printf("size request: %d %d\n", (int)actual_width, (int)actual_height); |
617 //printf("size request: %d %d\n", (int)actual_width, (int)actual_height); |
| 597 } |
618 } |
| 598 |
619 |
| 599 |
620 |
| 600 |
621 |
| 606 int hexpand2 = 0; |
627 int hexpand2 = 0; |
| 607 if(width_diff > 0 && num_cols_expanding > 0) { |
628 if(width_diff > 0 && num_cols_expanding > 0) { |
| 608 hexpand = width_diff / num_cols_expanding; |
629 hexpand = width_diff / num_cols_expanding; |
| 609 hexpand2 = width_diff-hexpand*num_cols_expanding; |
630 hexpand2 = width_diff-hexpand*num_cols_expanding; |
| 610 } |
631 } |
| 611 int x = w->mywidget.padding_left; |
632 int x = w->grid.padding_left; |
| 612 for(int i=0;i<ncols;i++) { |
633 for(int i=0;i<ncols;i++) { |
| 613 cols[i].pos = x; |
634 cols[i].pos = x; |
| 614 if(cols[i].expand) { |
635 if(cols[i].expand) { |
| 615 cols[i].size += hexpand + hexpand2; |
636 cols[i].size += hexpand + hexpand2; |
| 616 } |
637 } |
| 617 x += cols[i].size + w->mywidget.columnspacing; |
638 if(cols[i].size > 0) { |
| |
639 x += cols[i].size + w->grid.columnspacing; |
| |
640 } |
| 618 |
641 |
| 619 hexpand2 = 0; |
642 hexpand2 = 0; |
| 620 } |
643 } |
| 621 |
644 |
| 622 int vexpand = 0; |
645 int vexpand = 0; |
| 624 int vexpand2 = 0; |
647 int vexpand2 = 0; |
| 625 if(height_diff > 0 && num_rows_expanding > 0) { |
648 if(height_diff > 0 && num_rows_expanding > 0) { |
| 626 vexpand = height_diff / num_rows_expanding; |
649 vexpand = height_diff / num_rows_expanding; |
| 627 vexpand2 = height_diff-vexpand*num_rows_expanding; |
650 vexpand2 = height_diff-vexpand*num_rows_expanding; |
| 628 } |
651 } |
| 629 int y = w->mywidget.padding_bottom; |
652 int y = w->grid.padding_bottom; |
| 630 for(int i=0;i<nrows;i++) { |
653 for(int i=0;i<nrows;i++) { |
| 631 rows[i].pos = y; |
654 rows[i].pos = y; |
| 632 if(rows[i].expand) { |
655 if(rows[i].expand) { |
| 633 rows[i].size += vexpand + vexpand2; |
656 rows[i].size += vexpand + vexpand2; |
| 634 } |
657 } |
| 635 y += rows[i].size += w->mywidget.rowspacing; |
658 if(rows[i].size > 0) { |
| |
659 y += rows[i].size += w->grid.rowspacing; |
| |
660 } |
| 636 |
661 |
| 637 vexpand2 = 0; |
662 vexpand2 = 0; |
| 638 } |
663 } |
| 639 |
664 |
| 640 for(int i=0;i<w->composite.num_children;i++) { |
665 for(int i=0;i<w->composite.num_children;i++) { |
| 649 if(constraints->grid.hfill) { |
674 if(constraints->grid.hfill) { |
| 650 if(constraints->grid.colspan > 1) { |
675 if(constraints->grid.colspan > 1) { |
| 651 Dimension cwidth = 0; |
676 Dimension cwidth = 0; |
| 652 for(int j=0;j<constraints->grid.colspan;j++) { |
677 for(int j=0;j<constraints->grid.colspan;j++) { |
| 653 if(constraints->grid.x+j < ncols) { |
678 if(constraints->grid.x+j < ncols) { |
| 654 cwidth += cols[constraints->grid.x+j].size + (j > 0 ? w->mywidget.columnspacing : 0); |
679 cwidth += cols[constraints->grid.x+j].size + (j > 0 ? w->grid.columnspacing : 0); |
| 655 } |
680 } |
| 656 } |
681 } |
| 657 width = cwidth; |
682 width = cwidth; |
| 658 } else { |
683 } else { |
| 659 width = c.size - w->mywidget.columnspacing - constraints->grid.margin_left - constraints->grid.margin_right; |
684 width = c.size - w->grid.columnspacing - constraints->grid.margin_left - constraints->grid.margin_right; |
| 660 } |
685 } |
| 661 } |
686 } |
| 662 if(constraints->grid.vfill) { |
687 if(constraints->grid.vfill) { |
| 663 if(constraints->grid.rowspan > 1) { |
688 if(constraints->grid.rowspan > 1) { |
| 664 Dimension cheight = 0; |
689 Dimension cheight = 0; |
| 665 for(int j=0;j<constraints->grid.rowspan;j++) { |
690 for(int j=0;j<constraints->grid.rowspan;j++) { |
| 666 if(constraints->grid.y+j < nrows) { |
691 if(constraints->grid.y+j < nrows) { |
| 667 cheight += rows[constraints->grid.y+j].size + (j > 0 ? w->mywidget.rowspacing : 0); |
692 cheight += rows[constraints->grid.y+j].size + (j > 0 ? w->grid.rowspacing : 0); |
| 668 } |
693 } |
| 669 } |
694 } |
| 670 height = cheight; |
695 height = cheight; |
| 671 } else { |
696 } else { |
| 672 height = r.size - w->mywidget.rowspacing - constraints->grid.margin_top - constraints->grid.margin_bottom; |
697 height = r.size - w->grid.rowspacing - constraints->grid.margin_top - constraints->grid.margin_bottom; |
| 673 } |
698 } |
| 674 } |
699 } |
| 675 |
700 |
| 676 if(width > 0 && height > 0) { |
701 if(width > 0 && height > 0) { |
| 677 XtConfigureWidget(child, x, y, width, height, child->core.border_width); |
702 XtConfigureWidget(child, x, y, width, height, child->core.border_width); |