2 argsPrefixmainChannelName windowWidth windowHeight _childChannel_windows _lastState_hwnds _initialRects isClosing _lastRects _lastPrune_pruning_ready _pendingSetup_sending_queued_lastSendErrorLog _handlerSet_busy_counterisOpen knownHwndsopenIdssendTileFromChild onTileActionsendDialogAnsweronDialogAnsweronWindowClosedopen _sanitize pushState _lastThumb_closing_sendCoalesced_maxSendRounds_sendhwndOf captureRects applyRect updateTitle_applySetupWhenReadyonClosed selftestChildclose pruneDeadstop_ensureHandler_onCall parseArgsCardWindowService[WindowMethodChannelmode ChannelModeunidirectionalMapStringWindowControllerdynamicint WindowRectboolcontainsDateTimefromMillisecondsSinceEpochSet containsKeyvaluestoSetListkeystoListgrowableFuturevoidPaletteTileRequest invokeMethodtoJsontimeoutDurationseconds debugPrinteObject initialRectforceremoveisUsableshow NativeBridgelistChildWindowscreateWindowConfigurationhiddenAtLaunch argumentsiwherehreversedconfirmCardWindowdelayed millisecondshwndtitle unawaitedwindowIdlength replaceAlltrim isNotEmptyofroundnow differenceentriesentryvaluegetCardWindowRectkeyapplyCardWindowRectsetCardWindowTitlesetupCardWindowwidthheightcalladdcloseCardWindowhideisEmptycardWindowAliveclearsetMethodCallHandler MethodCallmethodhandleridstatefromJsonsplitfirst instanceIdtryParse5„€�¹™0L£&`峄B dart:async„Z6package:desktop_multi_window/desktop_multi_window.dart„œpackage:flutter/foundation.dart„Çpackage:flutter/services.dart„ònative_bridge.dart…palette_tile.dart…-window_rect.dartÀF|ÀŸZƒ‹K€�€”€×��`�e�´‚‚J‚š‚Á‚ƃƒ`ƒ¬ƒø„5„?„A„W„Y„›„Æ„ï„ñ……,…H…J…e……�…Ì…ñ…ó†,†e†g†¸†¿‡ ‡W‡Ž‡±‡Õ‡×ˆˆeˆšˆ°ˆ×ˆÝˆß‰ ‰J‰L‰•‰Ø‰ÚŠ'ŠUŠWŠžŠ¥Ší‹:‹ˆ‹ÆŒŒŒGŒLŒ™ŒÑ���c�j�´�øŽDŽ�ŽÙ�(�X�_�¬�õ�8�?�Œ�Û‘+‘d‘¬‘͑ϒ!’(’v’¿’ë““Z“¡“í”>”Š”©”°”û•D•u•w•¿•ô–<–k–m–ª–±–ü—H—–—å˜3˜n˜­˜é™™™`™¯™Ó™ñš ššBš�š’šÛ›› ›_›®›øœ8œtœvœ«œøœú�=�D���Üž+žyžÂžÍžèŸŸHŸ[Ÿ•ŸœŸ¡Ÿ£Ÿö = ? Š ‘ Ü¡*¡w¡Æ¢¢ ¢U¢¡¢ê£0£Y£q£‡£�£ª£µ£Ð¤ ¤3¤W¤{¤‰¤º¤Í¥¥¥¥¥r¥“¥«¥Á¥×¥Ý¥ð¥ò¦2¦9¦€¦Ì§§J§†§ˆ§Ö¨¨^¨`¨Œ¨“¨á©)©0©x©½ªªª7ªLªjªxª·ªÚ«'«k«³«Õ¬"¬*¬v¬Á­­M­†­°­Ù­ç®®®6®~®Ï¯¯¯m¯¼°°Z°ˆ°•°¶°ü±±±4±m±v±š±À±Ç²²`²r²…²Ù²ã²ø²ÿ³³³<³y³Œ³Å³ã´´J´�´ß´ëµµCµEµ…µÉµËµïµù¶H¶–¶Ü·+·t·~·Î¸¸k¸º¹¹X¹§¹ç¹üº6ºhº²ºàºý»C»[»†»À»×»ë»ø¼¼¼g¼¡¼¬¼µ¼Ì¼ð½<½e½q½Á¾¾c¾¬¾ø¿H¿—¿ØÀ@À@À@3À@}À@‰À@’À@¥À@ñÀAÀA(ÀApÀAºÀBÀBBÀBVÀBiÀB©ÀBÍÀBïÀCÀC-ÀC>ÀCTÀC[ÀC`ÀCbÀC¶ÀCýÀCÿÀD8ÀD?ÀDŒÀD³ÀDºÀE ÀERÀE™ÀEèÀF/ÀFtÀF{ÀFÆÀGÀG?ÀGaÀGyÀGšÀG§ÀGÌÀGóÀHÀH:ÀH…ÀHÒÀHáÀHèÀIÀI'ÀIpÀI·ÀJÀJLÀJ•ÀJÜÀJþÀKÀKPÀKœÀKÏÀKÿÀLEÀLhÀL“ÀLÃÀLñÀMBÀM}ÀMÁÀMÑÀMúÀNÀN ÀN?ÀNDÀNFÀNŠÀN¿ÀNÁÀOÀOÀOUÀO’ÀOáÀP(ÀPvÀP©ÀP«ÀPåÀPìÀQ:ÀQˆÀQÙÀR,ÀRdÀRkÀRºÀSÀS@ÀSgÀS‚ÀSšÀS»ÀSÈÀTÀTWÀTžÀTÎÀT÷ÀUÀU*ÀU1ÀUSÀUjÀUuÀUÄÀUÎÀV ÀVrÀV½ÀW ÀW\ÀWfÀW¯ÀWøÀX5ÀXsÀX ÀXæÀY/ÀY]ÀY„ÀY—ÀY¢ÀYÖÀYúÀZÀZÀZ,ÀZQÀZXÀZ]ÀZ_ÀZ–ÀZ�ÀZçÀ[4À[‚À[ÍÀ[ýÀ\%À\'À\EÀ\`À\xÀ\™À\¦À\õÀ]DÀ]ƒÀ]³À]¾À]ÏÀ]øÀ^0À^CÀ^ƒÀ^�À^ØÀ_#À_jÀ_�À_ÛÀ_ýÀ`FÀ`OÀ`VÀ`[À`]À`±À`¸ÀaÀa[ÀaˆÀaÌÀaÎÀbÀbÀbbÀb´ÀbîÀbõÀc>Àc†ÀcÒÀdÀd6Àd=ÀdtÀd¼ÀdýÀe&ÀeXÀepÀe›Àe¼ÀeÜÀfÀfHÀfhÀf³ÀfäÀg ÀgÀgÀg,Àg1Àg3Àg„Àg‹ÀgÒÀhÀhkÀhœÀhÇÀhãÀi'ÀirÀiwÀiyÀiÀÀiÇÀjÀj_Àj¡Àj½ÀjÄÀkÀkVÀk¢ÀkÍÀkéÀl2ÀlxÀl¯ÀlÂÀlóÀlûÀmIÀmNÀmPÀm�Àm—ÀmæÀn2Àn}ÀnÄÀo ÀoYÀo‹Ào’ÀoÞÀpÀp[Àp¡ÀpïÀqÀq\Àq‹ÀqÑÀqØÀrÀr1ÀreÀrpÀr¦ÀrÃÀróÀsÀs/Às9ÀsˆÀsÒÀtÀtgÀtžÀtÔÀuÀu#ÀubÀuiÀu¨ÀuÓÀvÀvÀvÀvTÀv�ÀvÏÀv×Àw&ÀwNÀwVÀw¥ÀwøÀxCÀx]ÀxeÀx±ÀxûÀy?ÀyjÀy¦Ày³ÀyõÀz@ÀzUÀz�Àz¦Àz­ÀzÏÀzïÀ{À{7À{^À{…À{¥À{ÆÀ{èÀ|1À|wÀ|ÂÀ}À};À}bÀ}gÀ}iÀ}µÀ~À~FÀ~mÀ~‹À~–À~§À~ÒÀÀÀZÀaÀfÀhÀ¨À¯À€À€SÀ€‹À€ÂÀ€ÊÀ�À�RÀ�šÀ�ÙÀ�þÀ‚6À‚>À‚‰À‚ÓÀƒÀƒBÀƒaÀƒ§ÀƒðÀ„9À„ˆÀ„©À„ÍÀ…À…YÀ…|À…¬À…òÀ…ùÀ†$À†]À†eÀ†´À†ûÀ‡LÀ‡TÀ‡žÀ‡éÀˆ-Àˆ5Àˆ„ÀˆÊÀˆßÀˆìÀ‰.À‰yÀ‰ŽÀ‰ÒÀ‰ÛÀ‰âÀ‰ûÀŠAÀŠUÀŠ~ÀŠ˜ÀЧÀŠïÀ‹À‹À‹À‹8À‹zÀ‹œÀ‹¡À‹£À‹ñÀŒ+ÀŒjÀŒ—ÀŒ¸ÀŒËÀ�À�&À�-À�DÀ�ZÀ�eÀ�£À�àÀŽÀŽ ÀŽÀŽ'ÀŽ@ÀŽGÀŽLÀŽNÀŽyÀŽ‘ÀލÀ޽ÀŽÖÀŽïÀ� À�WÀ�¨À�íÀ� À�!À�=À�SÀ�jÀ��À�†À�ˆÀ�ÖÀ‘ À‘XÀ‘ZÀ‘ŠÀ‘¨À‘ïÀ’7À’„À’¿À’÷À“À“À“À“RÀ“nÀ“‚À“˜À“´À”À” À”VÀ”¥À”ïÀ•>À•gÀ•‡À•¬À•ÇÀ•ñÀ–À–;À–wÀ–¢À–±À–¾À–ÉÀ–ßÀ–ôÀ—@À—ZÀ—fÀ—´À—þÀ˜LÀ˜”À˜ÂÀ™À™8À™QÀ™xÀ™°À™ÆÀ™ÚÀš&ÀšMÀšmÀš±ÀšáÀšìÀ›À›À›cÀ›µÀ›ËÀ›áÀ›úÀœAÀœMÀœcÀœjÀœ|Àœ�ÀœƒÀœÑÀ�À�\À�^À�—À�åÀžÀž?ÀžuÀž|ÀžŠÀžÊÀžÿÀŸJÀŸRÀŸWÀŸZ„v/// 🪟 KART PENCERESİ — bir CATIA kartını bağımsız, taşınabilir pencereye /// "aktarır" (kullanıcı isteÄŸi: kartın saÄŸ üstündeki 🗖 düğmesi). /// /// MİMARİ (palette_service.dart ile AYNI kalıp, iki fark yerde): /// ana → alt : `state` (görünecek kartın tam verisi, JSON) /// alt → ana : `ready`, `tile` (kart aksiyonu — `PaletteTileRequest`) /// /// 📌 NEDEN AYRI PENCERE: kart penceresi `desktop_multi_window` ile açılır → /// kendi engine/isolate'ı vardır. Böylece (a) kartta CATIA meÅŸgulken ana /// pencere kilitlenmez, (b) kart baÅŸka bir sanal masaüstünde açıkken /// `provider` nesnesi PAYLAÅžILMAZ (bunun için kartın verisi JSON kanalından /// akar — bkz. `PaletteTileView`). /// /// 📌 TEK YAZICI KURALI: alt pencere KARAR VERMEZ; `ðŸ‘� öne getir`, `💾 kaydet`, /// `â–¶ makro` gibi her ÅŸey istek olarak ana pencereye gider ve orada /// `CatiaProvider.handlePaletteTileAction` ile YÜRÜTÜLÜR. Böylece "aynı /// fonksiyonlarla kontrol" isteÄŸi birebir karşılanır: alt pencere kendi /// iÅŸ kodu YAZMAZ, ana pencerenin aynı kapılarını çalar.„A„Y„›„Æ„ñ……,…g…x…z…g…g…y…è…Û…ƒk…ÛM/// `multi_window` argümanının öneki (main.dart bu önekle yönlendirir).†M†;…õm†;6/// Alt pencerenin ana pencereye haber verdiÄŸi kanal.‡«‡�†i�E‡��1/// Pencere boyutu (FİZİKSEL px, mantıksal px DEĞİL — native böyle bekliyor). /// /// 📌 ORAN 16:10 — `CatiaListTile`'daki TV kartının `AspectRatio`'si ile /// AYNI. Pencere kart gibi görünsün diye oran birebir eÅŸitlenmiÅŸtir; /// farklı olursa içerik kırpılır / boÅŸluk kalır.‡Ï‡À‡³‡À ˆ„ˆ—ˆÙˆžˆ¸ˆ´ˆºˆÅˆÆˆt‡Ù�ˆt€‡/// Alt pencere -> ana pencere kanali (ayri kanal adli: ayni pencere /// hem iki yonu kullanir ama `WindowMethodChannel` tek yonludur).‰E‰F‰:ˆáf‰:./// 🪟 instanceId → pencere denetleyicisi.‰Ó‰Ô‰Æ‰N€‡‰ÆP/// 🪟 instanceId → o kartın son gönderilen özeti (yeniden açılışta).ŠPŠQŠG‰ÜvŠGK/// instanceId → kart penceresinin HWND'si (kapatma / canlilik kontrolu).‹ý‹þ‹íŠY�¦‹í�t/// 🪟 instanceId → geri yüklemede uygulanacak kayıtlı konum/boyut. /// /// 📌 NEDEN AYRI HARİTA: `open()` çaÄŸrıldığı anda HWND henüz YOKTUR /// (pencere `show()` olmadan listede bulunamıyor). Kayıtlı konum ancak /// `_applySetupWhenReady` içinde, HWND bulunduktan SONRA uygulanabilir. /// Harita `open` sırasında doldurulur, orada tüketilir.‘_‘`‘R�!„@‘R„3/// 🪟 instanceId → o kartın PENCERESİNİN SON KONUMU (HAFIZADA). /// /// 🔴 29.09.2026 — KULLANICI: "kartı dışarı aktardım, boyutlandırdım, /// taşıdım, kapattım, TEKRAR AÇ dedim → aynı yerde açılmadı". /// KÖK NEDEN: `open()` konumu yalnız `initialRect` ile alıyordu; o da /// sadece oturum GERİ YÜKLEME'de doluydu. Elle kapatıp açınca hafıza /// boÅŸ kalıyordu → pencere imlecin yanında (varsayılan) açılıyordu. /// ÇÖZÜM: pencere kapanırken son konumu buraya yazılır, sonraki `open()` /// bu deÄŸeri `initialRect` gibi kullanır. /// /// 📌 BU AYRI BİR HARİTADIR (`_initialRects` DEĞİL): `_initialRects` bir /// kezlik iÅŸ bayrağıdır ve tüketilince SİLİNİR; buradaki konum ise /// kullanıcı yeni bir konum verene kadar SÜREKLİ hatırlanır. /// /// 📌 OTURUMDAN BAÄžIMSIZ: bu ayarlanış, uygulama yeniden baÅŸlatılsa bile /// kaybolur (yalnız `session.json` kalıcıdır). İstenirse oturum kaydıyla /// da saklanır (`CatiaProvider._snapshotLiveSession` → `cardWindowRect`).‘ƒ‘‹‘Œ‘¦‘¨‘§‘v‘fC‘v‘Å‘º‘®‘º•p•q•h•o•i•_‘у¡•_ƒ…/// 🪟 Alt pencerenin kanala `setWindowMethodHandler` kaydını YAPTIGI kartlar. /// /// 🔴 KÖK NEDEN (ikinci pencere açılınca donma/çökme): `WindowController` /// oluÅŸturulurken alt motor HENÜZ baÅŸlamamıştır. `open()` bu arada /// `pushState` çağırırsa native taraf /// `CHANNEL_UNREGISTERED` döndürür: /// `Channel "mixin.one/window_controller/" not accessible` /// (bkz. `window_channel_plugin.cc` → `GetTarget`; pencere henüz /// `registerMethodHandler` çağırmamış). Her baÅŸarısız gönderim 700 ms /// `timeout` + günlük satırı demek; `open()` 8 kez denediÄŸi ve her pencere /// için ayrı çalıştığı için yük pencere sayısıyla KATLANARAK büyür ve /// UI thread'i kilitler. /// /// ÇÖZÜM: alt pencere `ready` gönderene kadar veri gönderilMEZ; veri /// `_lastState`'te bekler, `ready` gelince tek seferde gönderilir. –f–g–B–e–C–K–d–L–c–Q–M–^–W–+•y€ï–+y/// instanceId -> `ready` geldikten sonra uygulanacak biçimlendirme. /// (HWND + baÅŸlık). Bkz. [_applySetupWhenReady].˜¨˜©˜š˜§˜›˜£˜�–o‚;˜�‚ /// Aynı pencereye aynı anda TEK gönderim (backpressure). /// /// 📌 NEDEN: `desktop_multi_window`ın `invokeMethod` çaÄŸrısı **senkron /// beklemelidir** (native'de `channel_->InvokeMethod` hedef engine'in /// yanıtını bekler). Alt pencere meÅŸgulse (PNG decode, kart çizimi) ana /// pencere bloklanır. `unawaited` çaÄŸrılar birikince kanal kuyruÄŸu ÅŸiÅŸer /// ve uygulama kilitlenir. Burada pencere başına tek uçuÅŸ sınırı koyup, /// sırada kalan veriyi EN YENİSİYLE birleÅŸtiriyoruz. ™ ™˜ï™ ˜ð˜ø˜û™ ˜ü™˜Þ˜¯`˜Þ™†™Ž™�™©™«™ª™r™€–™rS/// Kanal hatası günlüğü için son yazma zamanı (hata fırtinasını kısar).™Ë™½™±™½™é™á™Õ™áš ™þ™ó™þ .Ÿ¥€• .T/// 🗂 Alt pencereden gelen kart aksiyonu. `CatiaProvider` baÄŸlar (tek yazıcı).¥ß¥ €Í¥ßZ/// 💬➡ï¸� Alt pencereden gelen cevap isteÄŸi. `CatiaProvider` baÄŸlar (tek yazıcı).§u¥ô��§u�k/// 🪟✖ï¸� Kart penceresi kapandı (X, Alt+F4, ölüm temizliÄŸi). /// /// 📌 AMAÇ: `CatiaProvider` bu olayla kart başına tuttuÄŸu GÖNDERİM /// imzalarını/parmak izlerini temizler. Temizlenmezse aynı kart yeniden /// pencereye aktarıldığında ESKİ imza durur, ilk state "deÄŸiÅŸmemiÅŸ" sayılıp /// elenir ve pencere boÅŸ/karışık görünür.ÀNºÀN»ÀN­ÀNHtÀN­K/// Son gönderilen görüntü (kart başına) — deÄŸiÅŸim tespiti için.ÀP¤ÀP¥ÀPœÀP£ÀP�ÀP‘ÀNÃ�ãÀP‘�Í/// 🪟 Kapanış sürecindeki pencereler — bunlara GÖNDERİM YAPILMAZ. /// /// 🔴 ÇÖKMENİN KÖKÜ (29.09.2026): `invokeMethod` SENKRON beklidir; /// pencere motoru yok edilirken uçan bir çaÄŸrı native'da /// **use-after-free** yapıp uygulamayı düşürüyordu. Kullanıcı "iki pencere /// açtım, birini kapatırken program çöktü" diyordu — çünkü kapanan /// pencere hâlâ `_pushAllCardWindows` sırasındaki gönderim kuyruÄŸundaydı.À\!À\ÀZa�ÁÀ\�®/// 🔴 Tek çaÄŸrıda en fazla bu kadar gönderim turu. /// /// 📌 NEDEN: 30+ canlı kartta alt pencereler PNG decode + kart çizimi /// yaparken ana pencere bloke olur. Sınırsız "kuyruÄŸu boÅŸaltana kadar" /// döngü, `close()`'nin 700 ms penceresini aşıp motoru ölü yakalıyordu. /// 2 tur, arayüzün canlılığını korur (en güncel kare yine ulaşır) ve /// kuyruÄŸun sınırsız büyümesini engeller.š”š”�ÞœN�©/// 🪟 Kayıtlı KART penceresi HWND'leri (palet/ayarlar gibi diÄŸer alt /// pencereler BİLEREK dahil deÄŸildir). /// /// 📌 NEDEN: `PaletteService.ensure()` HWND'yi bulamayınca `listChildWindows` /// listesinden bir pencere seçiyordu ve `.last` alıyordu. Kart penceresi /// açıldığında liste sonunda O bulunduÄŸu için `setupPalette` yanlış /// pencereye uygulanıyordu. Bu liste onları ayırmak için.œxœx~œÅ3/// Açık kart pencerelerinin instance id listesi.ŒçŒçŒîŒŒ�ŒÝ€Ó/// 🪟 Bu kart penceresi ÅŸu an KAPANIYOR mu? Gönderim yapılmaz. /// /// 📌 `CatiaProvider._pushAllCardWindows` turunda boÅŸa iÅŸ + 700 ms bekleme /// olmasın diye dışarıdan okunur (bkz. `_closing`).šWšWš^šš}šP3/// Bu kart için zaten açık bir pencere var mı?ž¡ž¡ž´œüœü‚£ž��ˆ/// 🗂 Kart aksiyonu → ANA PENCERE (alt pencereden gönderilir). /// /// 📌 NEDEN BURADA: `onTileAction` geri çağırması yalnız ANA pencerede /// baÄŸlanır (bkz. `CatiaProvider` constructor). Alt pencerede o statik /// NULL'dur ve `?.call` sessizce hiçbir ÅŸey yapmaz — kullanıcı "düğmeler /// çalışmıyor" der. Bu metot alt pencereye özel, doÄŸrudan kanala yazar.£]£]£d£u£u£y£‹£‹£� A A„Ù£Fƒ/// 💬➡ï¸� Kart penceresindeki sorunun [buttonIndex]. düğmesine tıklanır. /// /// ðŸ�› 29.09.2026 — KULLANICI: soru pencerede göründü ama cevap düğmesi /// çalışmıyordu. NEDEN: alt pencere `cardWindowMode`'da native snapshot /// dinlemez; `realWindowPid` boÅŸ olduÄŸu için `answerDialog` `pid <= 0` /// kontrolünde `false` dönüyor, tıklama hiç native'e gitmiyordu. Tıklama /// "tek yazıcı" kuralı gereÄŸi ANA pencerede yapılmalıdır. /// /// 📌 NOT: Pencere modu DIÅžINDA bu yol kullanılmaz; `CatiaProvider` /// doÄŸrudan `NativeBridge.answerCatiaDialog` çağırır. Alt pencere her /// zaman kendi `CatiaProvider`'ına sahip olduÄŸu için buradaki geri /// çağırma yalnız ana pencerede baÄŸlıdır (bkz. `onTileAction`).ª#ª#ª*ª;ª; ªBªPªPª\¨b¨bšüª�§/// 🪟 Kartı bağımsız pencereye aktarır. /// /// Aynı kart için zaten pencere varsa **yenisi açılmaz**, mevcut olan öne /// getirilir (kullanıcı düğmeye iki kez basıp iki pencere istemez). /// /// 🪟 [initialRect] verilirse (oturum geri yükleme) pencere kayıtlı /// KONUM/BOYUTTA açılır. Konum, HWND bulunduktan SONRA uygulanır /// (bkz. [_applySetupWhenReady]) çünkü HWND o anda henüz yoktur.ÀCÐÀCÐÀC×ÀCdÀCd€—ÀCÆ[/// BaÅŸlıktaki `|` karakterini temizler (argüman ayrıştırıcısını bozmamak için).ÀGeÀGeÀGlÀG}ÀG}ÀG’ÀDÀDŠAÀGUƒQ/// 📤 Kartın güncel verisini alt pencereye gönderir. /// /// Pencere henüz hazır deÄŸilse veri kaybolmaz: [_lastState]'a yazılır ve /// `open` tamamlanınca gönderilir. /// /// 📌 İMZA FİLTRESİ: `thumb` alanı base64 PNG'dir (yüzlerce KB). Her turda /// aynı kareyi yeniden göndermek kanalı boÄŸardı; bu yüzden görüntü /// deÄŸiÅŸmedikçe ATLANIR — alt pencerede o kare zaten duruyordur. /// 📌 İMZA FİLTRESİ: `thumb` alanı base64 PNG'dir (yüzlerce KB). Her turda /// aynı kareyi yeniden göndermek kanalı boÄŸardı; bu yüzden görüntü /// deÄŸiÅŸmedikçe ATLANIR — alt pencerede o kare zaten duruyordur. /// /// 🔴 HAZIR KAPISI: alt pencere `ready` göndermeden gönderim yapılmaz. /// Aksi halde native `CHANNEL_UNREGISTERED` döner ve her deneme 700 ms /// bekler (bkz. [_ready] açıklaması).ÀSkÀSkÀS|ÀS†ÀS†ÀS�ÀSžÀSžÀS³ÀP­ÀP­‰®ÀSV‚˜/// 🔴 BACKPRESSURE: pencereye aynı anda TEK gönderim. /// /// `desktop_multi_window`ın `invokeMethod`'ı senkron beklemelidir (native /// `channel_->InvokeMethod` hedef engine'in cevabını bekler). Alt pencere /// meÅŸgulken (PNG decode + kartın tam yeniden çizimi) ana pencere bloklanır; /// `unawaited` çaÄŸrılar birikince kanal kuyruÄŸu ÅŸiÅŸer ve uygulama kilitlenir — /// pencereler arttıkça bu "kasma" katlanarak büyür. /// /// Burada pencere başına tek uçuÅŸ izni verilir; sıradaki veri [_queued]'ta /// TUTULUR ve en güncel haliyle birleÅŸtirilerek gönderilir (eski kareleri /// atarız — arayüz zaten en son durumu göstermeli).À\IÀ\IÀ\ZÀ\dÀ\dÀ\kÀ\|À\|À\‘À\)À\)„0À\=ÀaœÀaœÀa£À`_À`_�kÀa•�9/// 🪟 Kartın ÜST pencere HWND'si (0 ise kayıt yok / pencere henüz hazır deÄŸil). /// /// 📌 TAÅžIMA İÇİN: Alt pencere bu deÄŸeri `state` ile alır. `GetForegroundWindow()` /// Flutter'ın ÇOCUK HWND'sini döndürür; o pencereye kurulan sürükleme /// döngüsü görünmez pencereyi taşımaz.ÀaÐÀaÐ…_Àdå‚û/// 🪟 Kayıt anındaki AÇIK kart pencerelerinin konum/boyutu. /// /// Dönen anahtar = `instanceId`, deÄŸer = `WindowRect` (FİZİKSEL piksel). /// HWND'si olmayan / küçültülmüş pencereler **bilinçli olarak boÅŸ bırakılır** /// (konumları anlamsız — bkz. `WindowRect.isUsable`). /// /// 📌 NEDEN ANA PENCEREDEN: alt pencere kendi engine'inde çalışır ve /// `window_manager`/native köprüsü orada güvenilir DEĞİLDİR (bkz. /// `DetailWindowService` notları). HWND'leri `_hwnds`'te tutan da ana /// penceredir; `GetWindowRect` saf Win32 çaÄŸrısı olduÄŸu için motor /// farkı önemsizdir. /// /// 📌 YALNIZ "OTURUM KAYDEDİLİRKEN" çaÄŸrılır (bkz. /// `CatiaProvider._snapshotLiveSession`): her taşımada dinlenmez.Àh=Àh=ÀhDÀhPÀhPÀh\Àg5Àg5‚@Àh3€ù/// 🪟 Pencereyi kayıtlı [rect]'e taşır (HWND hazır olduktan sonra çaÄŸrılır). /// /// BaÅŸarısız olursa sessizce geçilir — pencere zaten açıldı, konum /// uygulanamaması kullanıcıyı KAYBETMİZ (varsayılan yerleÅŸimde kalır).ÀkxÀkxÀkÀk‹Àk‹ Àk’Ài{Ài{ƒÑÀkl�ý/// 🪟âœ�ï¸� Kart PENCERESİ baÅŸlığını günceller (konum/boyut deÄŸiÅŸmez). /// /// 📌 NEDEN: `SetupCardWindow` baÅŸlığı yalnız AÇILIÅžTA bir kez yazılıyor. /// Kart baÅŸlığı deÄŸiÅŸince (kullanıcı pencerede çift tıklayıp yazınca) /// Alt+Tab/görev çubuÄŸu ipucu ESKİ adı gösteriyordu → "baÅŸlık /// deÄŸiÅŸmedi" izlenimi. /// /// HWND yoksa (pencere henüz biçimlenmedi/yok) sessizce geçilir; görev /// `open` sırasında zaten `pending.title` ile yeni baÅŸlık yazılır.Àp?Àp?ÀpFÀmRÀmRˆÀÀp*‚Ð/// 🪗 `ready` geldikten SONRA pencerenin biçimlendirilmesi. /// /// 🔴 NEDEN GECİKLETİLDİ: `SetupCardWindow`, Flutter ÇOCUK HWND'sini bulup /// onu `CardChildProc` ile alt sınıflar (sürükleme + boyutlandırma bu /// alt sınıflamaya baÄŸlıdır). O çocuk pencere alt motorun `OnCreate` /// → `SetChildContent` adımında oluÅŸur. Motor henüz baÅŸlamadıysa /// `GetWindow(hwnd, GW_CHILD)` NULL döner, alt sınıflama sessizce /// atlanır ve pencere taşınamaz/kasılı kalır. Log kanıtı: `setup=true` /// 24.397'de, alt motor 24.472'de baÅŸlıyor. /// /// `ready` mesajı `setWindowMethodHandler` kaydından SONRA gönderildiÄŸi /// için o noktada çocuk HWND kesinlikle hazırdır.ÀvsÀvsÀvzÀvÀv‡MÀvj>/// ✕ ile pencere kapandı: kaydı sil (kart listede KALIR).À~*À~*À~1À}kÀ}k�ùÀ~€£/// 🧪 Selftest: alt pencereye "kendi provider'ından düğmelere bas" der. /// Böylece zincir GERÇEK yoldan sınanır: alt provider → kanal → ana pencere.À€oÀ€oÀ€vÀjÀjŒ5À€i€Þ/// Kart penceresini GERCEKTEN kapatir (kart listede KALIR). /// /// Onceki hata: `onClosed` yalniz kaydi siliyordu, pencere ekranda kaliyordu. /// Simdi native WM_CLOSE gonderilir; HWND yoksa/basarisizsa pencere gizlenir.ÀŒLÀŒLÀŒQÀŒYÀ‹¥À‹¥‚¥ÀŒA€�/// Yikilmis (ornegin Alt+F4) pencerelerin kaydini temizler. Sik cagrilir, /// bu yuzden [force] olmadikca 1.5 sn'de bir calisir.ÀŽPÀŽP‚4Àއ+/// Uygulama kapanışı / test temizliÄŸi.À‘\À‘\�·À‘pÀ“8À“8À“CÀ“À“‰fÀ“0À�ÖÀ�Ö À�ÝÀ�`À�`�õÀ�Ì:/// `multi_window` argümanından kart kimliÄŸini çözer.…J…JÀš…Pƒ‹K€�€”€×��`�e�´‚‚J‚š‚Á‚ƃƒ`ƒ¬ƒø„5„?„A„W„Y„›„Æ„ï„ñ……,…H…J…e……�…Ì…ñ…ó†,†e†g†¸†¿‡ ‡W‡Ž‡±‡Õ‡×ˆˆeˆšˆ°ˆ×ˆÝˆß‰ ‰J‰L‰•‰Ø‰ÚŠ'ŠUŠWŠžŠ¥Ší‹:‹ˆ‹ÆŒŒŒGŒLŒ™ŒÑ���c�j�´�øŽDŽ�ŽÙ�(�X�_�¬�õ�8�?�Œ�Û‘+‘d‘¬‘͑ϒ!’(’v’¿’ë““Z“¡“í”>”Š”©”°”û•D•u•w•¿•ô–<–k–m–ª–±–ü—H—–—å˜3˜n˜­˜é™™™`™¯™Ó™ñš ššBš�š’šÛ›› ›_›®›øœ8œtœvœ«œøœú�=�D���Üž+žyžÂžÍžèŸŸHŸ[Ÿ•ŸœŸ¡Ÿ£Ÿö = ? Š ‘ Ü¡*¡w¡Æ¢¢ ¢U¢¡¢ê£0£Y£q£‡£�£ª£µ£Ð¤ ¤3¤W¤{¤‰¤º¤Í¥¥¥¥¥r¥“¥«¥Á¥×¥Ý¥ð¥ò¦2¦9¦€¦Ì§§J§†§ˆ§Ö¨¨^¨`¨Œ¨“¨á©)©0©x©½ªªª7ªLªjªxª·ªÚ«'«k«³«Õ¬"¬*¬v¬Á­­M­†­°­Ù­ç®®®6®~®Ï¯¯¯m¯¼°°Z°ˆ°•°¶°ü±±±4±m±v±š±À±Ç²²`²r²…²Ù²ã²ø²ÿ³³³<³y³Œ³Å³ã´´J´�´ß´ëµµCµEµ…µÉµËµïµù¶H¶–¶Ü·+·t·~·Î¸¸k¸º¹¹X¹§¹ç¹üº6ºhº²ºàºý»C»[»†»À»×»ë»ø¼¼¼g¼¡¼¬¼µ¼Ì¼ð½<½e½q½Á¾¾c¾¬¾ø¿H¿—¿ØÀ@À@À@3À@}À@‰À@’À@¥À@ñÀAÀA(ÀApÀAºÀBÀBBÀBVÀBiÀB©ÀBÍÀBïÀCÀC-ÀC>ÀCTÀC[ÀC`ÀCbÀC¶ÀCýÀCÿÀD8ÀD?ÀDŒÀD³ÀDºÀE ÀERÀE™ÀEèÀF/ÀFtÀF{ÀFÆÀGÀG?ÀGaÀGyÀGšÀG§ÀGÌÀGóÀHÀH:ÀH…ÀHÒÀHáÀHèÀIÀI'ÀIpÀI·ÀJÀJLÀJ•ÀJÜÀJþÀKÀKPÀKœÀKÏÀKÿÀLEÀLhÀL“ÀLÃÀLñÀMBÀM}ÀMÁÀMÑÀMúÀNÀN ÀN?ÀNDÀNFÀNŠÀN¿ÀNÁÀOÀOÀOUÀO’ÀOáÀP(ÀPvÀP©ÀP«ÀPåÀPìÀQ:ÀQˆÀQÙÀR,ÀRdÀRkÀRºÀSÀS@ÀSgÀS‚ÀSšÀS»ÀSÈÀTÀTWÀTžÀTÎÀT÷ÀUÀU*ÀU1ÀUSÀUjÀUuÀUÄÀUÎÀV ÀVrÀV½ÀW ÀW\ÀWfÀW¯ÀWøÀX5ÀXsÀX ÀXæÀY/ÀY]ÀY„ÀY—ÀY¢ÀYÖÀYúÀZÀZÀZ,ÀZQÀZXÀZ]ÀZ_ÀZ–ÀZ�ÀZçÀ[4À[‚À[ÍÀ[ýÀ\%À\'À\EÀ\`À\xÀ\™À\¦À\õÀ]DÀ]ƒÀ]³À]¾À]ÏÀ]øÀ^0À^CÀ^ƒÀ^�À^ØÀ_#À_jÀ_�À_ÛÀ_ýÀ`FÀ`OÀ`VÀ`[À`]À`±À`¸ÀaÀa[ÀaˆÀaÌÀaÎÀbÀbÀbbÀb´ÀbîÀbõÀc>Àc†ÀcÒÀdÀd6Àd=ÀdtÀd¼ÀdýÀe&ÀeXÀepÀe›Àe¼ÀeÜÀfÀfHÀfhÀf³ÀfäÀg ÀgÀgÀg,Àg1Àg3Àg„Àg‹ÀgÒÀhÀhkÀhœÀhÇÀhãÀi'ÀirÀiwÀiyÀiÀÀiÇÀjÀj_Àj¡Àj½ÀjÄÀkÀkVÀk¢ÀkÍÀkéÀl2ÀlxÀl¯ÀlÂÀlóÀlûÀmIÀmNÀmPÀm�Àm—ÀmæÀn2Àn}ÀnÄÀo ÀoYÀo‹Ào’ÀoÞÀpÀp[Àp¡ÀpïÀqÀq\Àq‹ÀqÑÀqØÀrÀr1ÀreÀrpÀr¦ÀrÃÀróÀsÀs/Às9ÀsˆÀsÒÀtÀtgÀtžÀtÔÀuÀu#ÀubÀuiÀu¨ÀuÓÀvÀvÀvÀvTÀv�ÀvÏÀv×Àw&ÀwNÀwVÀw¥ÀwøÀxCÀx]ÀxeÀx±ÀxûÀy?ÀyjÀy¦Ày³ÀyõÀz@ÀzUÀz�Àz¦Àz­ÀzÏÀzïÀ{À{7À{^À{…À{¥À{ÆÀ{èÀ|1À|wÀ|ÂÀ}À};À}bÀ}gÀ}iÀ}µÀ~À~FÀ~mÀ~‹À~–À~§À~ÒÀÀÀZÀaÀfÀhÀ¨À¯À€À€SÀ€‹À€ÂÀ€ÊÀ�À�RÀ�šÀ�ÙÀ�þÀ‚6À‚>À‚‰À‚ÓÀƒÀƒBÀƒaÀƒ§ÀƒðÀ„9À„ˆÀ„©À„ÍÀ…À…YÀ…|À…¬À…òÀ…ùÀ†$À†]À†eÀ†´À†ûÀ‡LÀ‡TÀ‡žÀ‡éÀˆ-Àˆ5Àˆ„ÀˆÊÀˆßÀˆìÀ‰.À‰yÀ‰ŽÀ‰ÒÀ‰ÛÀ‰âÀ‰ûÀŠAÀŠUÀŠ~ÀŠ˜ÀЧÀŠïÀ‹À‹À‹À‹8À‹zÀ‹œÀ‹¡À‹£À‹ñÀŒ+ÀŒjÀŒ—ÀŒ¸ÀŒËÀ�À�&À�-À�DÀ�ZÀ�eÀ�£À�àÀŽÀŽ ÀŽÀŽ'ÀŽ@ÀŽGÀŽLÀŽNÀŽyÀŽ‘ÀލÀ޽ÀŽÖÀŽïÀ� À�WÀ�¨À�íÀ� À�!À�=À�SÀ�jÀ��À�†À�ˆÀ�ÖÀ‘ À‘XÀ‘ZÀ‘ŠÀ‘¨À‘ïÀ’7À’„À’¿À’÷À“À“À“À“RÀ“nÀ“‚À“˜À“´À”À” À”VÀ”¥À”ïÀ•>À•gÀ•‡À•¬À•ÇÀ•ñÀ–À–;À–wÀ–¢À–±À–¾À–ÉÀ–ßÀ–ôÀ—@À—ZÀ—fÀ—´À—þÀ˜LÀ˜”À˜ÂÀ™À™8À™QÀ™xÀ™°À™ÆÀ™ÚÀš&ÀšMÀšmÀš±ÀšáÀšìÀ›À›À›cÀ›µÀ›ËÀ›áÀ›úÀœAÀœMÀœcÀœjÀœ|Àœ�ÀœƒÀœÑÀ�À�\À�^À�—À�åÀžÀž?ÀžuÀž|ÀžŠÀžÊÀžÿÀŸJÀŸRÀŸWÀŸZCardWindowService#Ð