# HG changeset patch # User Yoshiki Yazawa # Date 1268048296 -32400 # Node ID 89750191b165251d62fe42fe9f421995d9fdfefb # Parent 5a32b68b627d70f34fda156c369b049f521f2805 imported patch 18_patch-AuxPanel.c.diff diff -r 5a32b68b627d -r 89750191b165 lib/AuxPanel.c --- a/lib/AuxPanel.c Mon Mar 08 20:38:16 2010 +0900 +++ b/lib/AuxPanel.c Mon Mar 08 20:38:16 2010 +0900 @@ -462,7 +462,10 @@ AuxPanelWidget cpw; Cardinal n; { - if (cpw->cpanel.dispauxsegmentsize > n) return; + + if (cpw->cpanel.dispauxsegmentsize >= n) return; + /* 表示したいセグメント数が現在の表示セグメントサイズと同じなら何もしない */ + n = ((n + 3) / 4) * 4 ; if (cpw->cpanel.dispauxsegments == NULL) { cpw->cpanel.dispauxsegments = @@ -590,15 +593,50 @@ Cardinal i; DisplaySegment *dseg; - cpw->cpanel.numauxsegments = nseg; + ICString *to; + allocDisplaySegments(cpw, nseg); - for (i = 0, dseg = cpw->cpanel.dispauxsegments ; i < nseg ; i++, dseg++) { - /* 全書き換えになってしまう。ICCompareSegment が使えるなら - 使いたいのだが。 */ + dseg = cpw->cpanel.dispauxsegments; + for (i = 0; i < nseg ; i++) { copyString(segments +i, &dseg->seg); dseg->redrawpos = 0; dseg->width = 0; + dseg++; } + /* セグメント数が減る場合、余分になった旧セグメント領域の開放 */ + /* 結局 buffer.c: free(buf) で開放されるからほっといてもいい? */ + for (i = nseg; i < cpw->cpanel.numauxsegments; i++) { + to = &dseg->seg; + if (to->data != NULL) { + XtFree(to->data); + to->data = NULL; + } + dseg->redrawpos = 0; + dseg->width = 0; + dseg++; + } + cpw->cpanel.numauxsegments = nseg; + +/* +(1) allocDisplaySegmentsは +cpw->cpanel.numauxsegmentsを旧セグメント数だと思ってるから +cpw->cpanel.numauxsegments = nseg を冒頭でやっちゃうとまずいのでは? +cpw->cpanel.numauxsegments = nseg は最後にする。 +(2) forループは、旧セグメント数より新セグメント数が減る場合 +XtFreeしないままの表示セグメント領域が出てくる。 +copyStringはセグメント数が減る場合に不安 +allocDisplaySegmentsで対応すべき? (allocDisplaySegmentsでXtFreeする?) +copyStringで対応すべき? +ここで対応すべき? +(3) allocDisplaySegmentsで +変更されるのは + cpw->cpanel.dispauxsegmentsize + cpw->cpanel.dispauxsegments XtReallocの返り値 +変更されないけど使われるのは + cpw->cpanel.numauxsegments + これはなに? include/AuxPanelP.hで定義してるだけでコメントなし +*/ + Layout(cpw, False, False); if (XtIsRealized(w)) XClearWindow(XtDisplay(w), XtWindow(w)); UpdateAuxDisplay(cpw);