Discussion on caching technology of gtk_widget_measure

Gtk 4.10.4


Call logs for measure and size_allocate functions
** Message: 09:30:48.049: LxFlowBox measure 1 for_size: 1462
LxFlowBox o(1) for_size: 1462
                max-min:166
              c:max-child-size:208
               _count: 2
** Message: 09:30:48.050: LxFlowBox:1 1462 510 510
** Message: 09:30:48.050: LxFlowBox size 1462 510
** Message: 09:30:48.064: LxFlowBox measure 1 for_size: 1454
LxFlowBox o(1) for_size: 1454
                max-min:166
              c:max-child-size:207
               _count: 2
** Message: 09:30:48.064: LxFlowBox:1 1454 508 508
** Message: 09:30:48.064: LxFlowBox size 1454 508
** Message: 09:30:48.081: LxFlowBox measure 1 for_size: 1448
LxFlowBox o(1) for_size: 1448
                max-min:166
              c:max-child-size:206
               _count: 2
** Message: 09:30:48.081: LxFlowBox:1 1448 506 506
** Message: 09:30:48.081: LxFlowBox size 1448 506
** Message: 09:30:48.095: LxFlowBox size 1446 506
** Message: 09:30:48.114: LxFlowBox measure 1 for_size: 1435
LxFlowBox o(1) for_size: 1435
                max-min:166
              c:max-child-size:205
               _count: 2
** Message: 09:30:48.114: LxFlowBox:1 1435 504 504
** Message: 09:30:48.114: LxFlowBox size 1435 504
** Message: 09:30:48.147: LxFlowBox measure 1 for_size: 1421
LxFlowBox o(1) for_size: 1421
                max-min:166
              c:max-child-size:203
               _count: 2
** Message: 09:30:48.148: LxFlowBox:1 1421 500 500
** Message: 09:30:48.148: LxFlowBox size 1421 500
** Message: 09:30:48.164: LxFlowBox measure 1 for_size: 1413
LxFlowBox o(1) for_size: 1413
                max-min:166
              c:max-child-size:201
               _count: 2
** Message: 09:30:48.164: LxFlowBox:1 1413 496 496
** Message: 09:30:48.165: LxFlowBox size 1413 496
** Message: 09:30:48.179: LxFlowBox size 1405 494
** Message: 09:30:48.195: LxFlowBox measure 1 for_size: 1394
LxFlowBox o(1) for_size: 1394
                max-min:166
              c:max-child-size:199
               _count: 2
** Message: 09:30:48.195: LxFlowBox:1 1394 492 492
** Message: 09:30:48.195: LxFlowBox size 1394 492
** Message: 09:30:48.212: LxFlowBox measure 1 for_size: 1391
LxFlowBox o(1) for_size: 1391
                max-min:166
              c:max-child-size:198
               _count: 2
** Message: 09:30:48.213: LxFlowBox:1 1391 490 490
** Message: 09:30:48.213: LxFlowBox size 1391 490
** Message: 09:30:48.247: LxFlowBox measure 1 for_size: 1371
LxFlowBox o(1) for_size: 1371
                max-min:166
              c:max-child-size:195
               _count: 2
** Message: 09:30:48.248: LxFlowBox:1 1371 484 484
** Message: 09:30:48.248: LxFlowBox size 1371 484
** Message: 09:30:48.265: LxFlowBox measure 1 for_size: 1365
LxFlowBox o(1) for_size: 1365
                max-min:166
              c:max-child-size:195
               _count: 2
** Message: 09:30:48.265: LxFlowBox:1 1365 484 484
** Message: 09:30:48.265: LxFlowBox size 1365 484
** Message: 09:30:48.278: LxFlowBox measure 1 for_size: 1364
LxFlowBox o(1) for_size: 1364
                max-min:166
              c:max-child-size:194
               _count: 2
** Message: 09:30:48.278: LxFlowBox:1 1364 482 482
** Message: 09:30:48.278: LxFlowBox size 1364 482
** Message: 09:30:48.295: LxFlowBox measure 1 for_size: 1358
LxFlowBox o(1) for_size: 1358
                max-min:166
              c:max-child-size:194
               _count: 2
** Message: 09:30:48.295: LxFlowBox:1 1358 482 482
** Message: 09:30:48.295: LxFlowBox size 1358 482
** Message: 09:30:48.311: LxFlowBox measure 1 for_size: 1357
LxFlowBox o(1) for_size: 1357
                max-min:166
              c:max-child-size:193
               _count: 2

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

** Message: 09:30:48.311: LxFlowBox:1 1357 480 480
** Message: 09:30:48.311: LxFlowBox size 1357 480
** Message: 09:30:48.346: LxFlowBox size 1351 480
** Message: 09:30:48.363: LxFlowBox size 1346 478
** Message: 09:30:48.378: LxFlowBox size 1345 478
** Message: 09:30:48.395: LxFlowBox size 1343 476
** Message: 09:30:48.412: LxFlowBox size 1338 476
** Message: 09:30:48.448: LxFlowBox size 1331 474
** Message: 09:30:48.529: LxFlowBox size 1324 472
** Message: 09:30:48.547: LxFlowBox size 1323 472
** Message: 09:30:48.562: LxFlowBox size 1318 472
** Message: 09:30:48.579: LxFlowBox size 1316 470
** Message: 09:30:48.612: LxFlowBox size 1309 468
** Message: 09:30:48.629: LxFlowBox size 1303 466
** Message: 09:30:48.645: LxFlowBox size 1297 464
** Message: 09:30:48.679: LxFlowBox size 1291 462
** Message: 09:30:48.713: LxFlowBox size 1290 462
** Message: 09:30:48.760: LxFlowBox size 1288 462
** Message: 09:30:48.780: LxFlowBox size 1284 460
** Message: 09:30:48.796: LxFlowBox size 1282 460
** Message: 09:30:48.832: LxFlowBox size 1269 460
** Message: 09:30:48.849: LxFlowBox size 1262 460
** Message: 09:30:48.881: LxFlowBox size 1255 460
** Message: 09:30:48.914: LxFlowBox size 1248 460
** Message: 09:30:48.929: LxFlowBox size 1244 460
** Message: 09:30:48.963: LxFlowBox size 1237 460
** Message: 09:30:49.049: LxFlowBox size 1229 460
** Message: 09:30:49.065: LxFlowBox size 1224 460
** Message: 09:30:49.096: LxFlowBox size 1222 460
** Message: 09:30:49.280: LxFlowBox size 1217 460
** Message: 09:30:49.361: LxFlowBox size 1216 460

log into two parts,

  • The previous part is correct and ideal, calling measure and size_allocate respectively. This will give the correct result
  • The latter part, is wrong, only size_allocate is called, which brings wrong results.
    vedio
    You can notice that in the last scene, I moved the mouse to the control, which caused it to execute measure, which caused it to refresh

I’m sure it’s a cache issue.

I modified the source code (gtk/sizerequestcache.c:_gtk_size_request_cache_lookup) and added the judgment of GtkSizeRequestMode.

Everything works fine now.

I noticed that GtkSizeRequestMode appears in the SizeRequestCache structure. But it is not used in the function. Why

What is the solution to the problem?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.