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®À¢ˆƒ˜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º�º¨º²»»N»Ÿ»í¼>¼~¼ˆ¼Ú½+½c½–½à¾¾+¾q¾‰¾´¾î¿¿¿&¿1¿K¿•¿Ï¿Ú¿ã¿úÀ@À@jÀ@“À@ŸÀ@ïÀAAÀA‘ÀAÚÀB&ÀBvÀBÅÀCÀC<ÀCLÀCaÀC«ÀC·ÀCÀÀCÓÀDÀDLÀDVÀDžÀDèÀE0ÀEpÀE„ÀE—ÀE×ÀEûÀFÀFFÀF[ÀFlÀF‚ÀF‰ÀFŽÀF�ÀFäÀG+ÀG-ÀGfÀGmÀGºÀGáÀGèÀH7ÀH€ÀHÇÀIÀI]ÀI¢ÀI©ÀIôÀJAÀJmÀJ�ÀJ§ÀJÈÀJÕÀJúÀK!ÀK?ÀKhÀK³ÀLÀLÀLÀLMÀLUÀLžÀLåÀM/ÀMzÀMÃÀN ÀN,ÀN4ÀN~ÀNÊÀNýÀO-ÀOsÀO–ÀOÁÀOñÀPÀPpÀP«ÀPïÀPÿÀQ(ÀQ1ÀQ8ÀQmÀQrÀQtÀQ¸ÀQíÀQïÀR5ÀR<ÀRƒÀRÀÀSÀSVÀS¤ÀS×ÀSÙÀTÀTÀThÀT¶ÀUÀUZÀU’ÀU™ÀUèÀV6ÀVnÀV•ÀV°ÀVÈÀVéÀVöÀW?ÀW…ÀWÌÀWüÀX%ÀXIÀXXÀX_ÀX�ÀX˜ÀX£ÀXòÀXüÀYNÀY ÀYëÀZ8ÀZŠÀZ”ÀZÝÀ[&À[cÀ[¡À[ÎÀ\À\]À\‹À\²À\ÅÀ\ÐÀ]À](À]@À]IÀ]ZÀ]À]†À]‹À]�À]ÄÀ]ËÀ^À^bÀ^°À^ûÀ_+À_SÀ_UÀ_sÀ_ŽÀ_¦À_ÇÀ_ÔÀ`#À`rÀ`±À`áÀ`ìÀ`ýÀa&Àa^ÀaqÀa±Àa»ÀbÀbQÀb˜Àb»Àc Àc+ÀctÀc}Àc„Àc‰Àc‹ÀcßÀcæÀd=Àd‰Àd¶ÀdúÀdüÀe<ÀeCÀe�ÀeâÀfÀf#ÀflÀf´ÀgÀgIÀgdÀgkÀg¢ÀgêÀh+ÀhTÀh†ÀhžÀhÉÀhêÀi ÀiJÀivÀi–ÀiáÀjÀj9ÀjBÀjIÀjZÀj_ÀjaÀj²Àj¹ÀkÀkKÀk™ÀkÊÀkõÀlÀlUÀl Àl¥Àl§ÀlîÀlõÀmCÀm�ÀmÏÀmëÀmòÀn=Àn„ÀnÐÀnûÀoÀo`Ào¦ÀoÝÀoðÀp!Àp)ÀpwÀp|Àp~Àp¾ÀpÅÀqÀq`Àq«ÀqòÀr:Àr‡Àr¹ÀrÀÀs ÀsBÀs‰ÀsÏÀtÀtAÀtŠÀt¹ÀtÿÀuÀu=Àu_Àu“ÀužÀuÔÀuñÀv!Àv>Àv]ÀvgÀv¶ÀwÀwLÀw•ÀwÌÀxÀx>ÀxQÀx�Àx—ÀxÖÀyÀy=ÀyBÀyDÀy‚Ày½ÀyýÀzÀzTÀz|Àz„ÀzÓÀ{&À{qÀ{‹À{“À{ßÀ|)À|mÀ|˜À|ÔÀ|áÀ}#À}nÀ}ƒÀ}ËÀ}ÔÀ}ÛÀ}ýÀ~À~AÀ~eÀ~ŒÀ~³À~ÓÀ~ôÀÀ_À¥ÀðÀ€?À€iÀ€�À€•À€—À€ãÀ�4À�tÀ�›À�¹À�ÄÀ�ÕÀ‚À‚1À‚DÀ‚ˆÀ‚�À‚”À‚–À‚ÖÀ‚ÝÀƒ/Àƒ�Àƒ¹ÀƒðÀƒøÀ„6À„€À„ÈÀ…À…,À…dÀ…lÀ…·À†À†LÀ†pÀ†�À†ÕÀ‡À‡gÀ‡¶À‡×À‡ûÀˆ?Àˆ‡ÀˆªÀˆÚÀ‰ À‰'À‰RÀ‰‹À‰“À‰âÀŠ)ÀŠzÀŠ‚ÀŠÌÀ‹À‹[À‹cÀ‹²À‹øÀŒ ÀŒÀŒ\ÀŒ§ÀŒ¼À�À� À�À�)À�oÀ�ƒÀ�¬À�ÆÀ�ÕÀŽÀŽ5ÀŽ>ÀŽEÀŽfÀލÀŽÊÀŽÏÀŽÑÀ�À�YÀ�˜À�ÅÀ�æÀ�ùÀ�EÀ�TÀ�[À�rÀ�ˆÀ�“À�ÑÀ‘À‘0À‘;À‘DÀ‘UÀ‘nÀ‘uÀ‘zÀ‘|À‘§À‘¿À‘ÖÀ‘ëÀ’À’À’9À’…À’ÖÀ“À“:À“OÀ“kÀ“�À“˜À“¯À“´À“¶À”À”8À”†À”ˆÀ”¸À”ÖÀ•À•eÀ•²À•íÀ–%À–>À–CÀ–EÀ–€À–œÀ–°À–ÆÀ–âÀ—.À—:À—„À—ÓÀ˜À˜lÀ˜•À˜µÀ˜ÚÀ˜õÀ™À™DÀ™iÀ™¥À™ÐÀ™ßÀ™ìÀ™÷Àš Àš"ÀšnÀšˆÀš”ÀšâÀ›,À›zÀ›ÂÀ›ðÀœ@ÀœfÀœÀœ¦ÀœÞÀœôÀ�À�TÀ�{À�›À�ßÀžÀžÀž0ÀžLÀž‘ÀžãÀžùÀŸÀŸ(ÀŸoÀŸ{ÀŸ‘ÀŸ˜ÀŸªÀŸ¯ÀŸ±ÀŸÿÀ <À ŠÀ ŒÀ ÅÀ¡À¡6À¡mÀ¡£À¡ªÀ¡¸À¡øÀ¢-À¢xÀ¢€À¢…À¢ˆ„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.ÀQèÀQéÀQÛÀQvtÀQÛK/// Son gönderilen görüntü (kart başına) — deÄŸiÅŸim tespiti için.ÀSÒÀSÓÀSÊÀSÑÀSËÀS¿ÀQñ�ãÀS¿�Í/// 🪟 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ı.À_OÀ_>À]��ÁÀ_>�®/// 🔴 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.ÀFþÀFþÀGÀF’ÀF’€—ÀFô[/// BaÅŸlıktaki `|` karakterini temizler (argüman ayrıştırıcısını bozmamak için).ÀJ“ÀJ“ÀJšÀJ«ÀJ«ÀJÀÀG/ÀG/ŠAÀJƒƒ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ı).ÀV™ÀV™ÀVªÀV´ÀV´ÀV»ÀVÌÀVÌÀVáÀSÛÀSÛ‰®ÀV„‚˜/// 🔴 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).À_wÀ_wÀ_ˆÀ_’À_’À_™À_ªÀ_ªÀ_¿À_WÀ_W„0À_kÀdÊÀdÊÀdÑÀc�Àc��kÀdÃ�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.ÀdþÀdþ…_Àh‚û/// 🪟 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.ÀkkÀkkÀkrÀk~Àk~ÀkŠÀjcÀjc‚@Àka€ù/// 🪟 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).Àn¦Àn¦Àn­Àn¹Àn¹ ÀnÀÀl©Àl©ƒÑÀnš�ý/// 🪟âœ�ï¸� 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.ÀsmÀsmÀstÀp€Àp€ˆÀÀsX‚Ð/// 🪗 `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.Ày¡Ày¡Ày¨ÀyFÀyF‡MÀy˜>/// ✕ ile pencere kapandı: kaydı sil (kart listede KALIR).À�XÀ�XÀ�_À€™À€™�ùÀ�J€£/// 🧪 Selftest: alt pencereye "kendi provider'ından düğmelere bas" der. /// Böylece zincir GERÇEK yoldan sınanır: alt provider → kanal → ana pencere.Àƒ�Àƒ�Àƒ¤À‚˜À‚˜Œ5Àƒ—€Þ/// 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.À�zÀ�zÀ�À�‡ÀŽÓÀŽÓ‚¥À�o€�/// Yikilmis (ornegin Alt+F4) pencerelerin kaydini temizler. Sik cagrilir, /// bu yuzden [force] olmadikca 1.5 sn'de bir calisir.À‘~À‘~‚4À‘µ+/// Uygulama kapanışı / test temizliÄŸi.À”ŠÀ”Š�·À”žÀ–fÀ–fÀ–qÀ–GÀ–G‰fÀ–^À¡À¡ À¡ À ŽÀ Ž�õÀ ú:/// `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º�º¨º²»»N»Ÿ»í¼>¼~¼ˆ¼Ú½+½c½–½à¾¾+¾q¾‰¾´¾î¿¿¿&¿1¿K¿•¿Ï¿Ú¿ã¿úÀ@À@jÀ@“À@ŸÀ@ïÀAAÀA‘ÀAÚÀB&ÀBvÀBÅÀCÀC<ÀCLÀCaÀC«ÀC·ÀCÀÀCÓÀDÀDLÀDVÀDžÀDèÀE0ÀEpÀE„ÀE—ÀE×ÀEûÀFÀFFÀF[ÀFlÀF‚ÀF‰ÀFŽÀF�ÀFäÀG+ÀG-ÀGfÀGmÀGºÀGáÀGèÀH7ÀH€ÀHÇÀIÀI]ÀI¢ÀI©ÀIôÀJAÀJmÀJ�ÀJ§ÀJÈÀJÕÀJúÀK!ÀK?ÀKhÀK³ÀLÀLÀLÀLMÀLUÀLžÀLåÀM/ÀMzÀMÃÀN ÀN,ÀN4ÀN~ÀNÊÀNýÀO-ÀOsÀO–ÀOÁÀOñÀPÀPpÀP«ÀPïÀPÿÀQ(ÀQ1ÀQ8ÀQmÀQrÀQtÀQ¸ÀQíÀQïÀR5ÀR<ÀRƒÀRÀÀSÀSVÀS¤ÀS×ÀSÙÀTÀTÀThÀT¶ÀUÀUZÀU’ÀU™ÀUèÀV6ÀVnÀV•ÀV°ÀVÈÀVéÀVöÀW?ÀW…ÀWÌÀWüÀX%ÀXIÀXXÀX_ÀX�ÀX˜ÀX£ÀXòÀXüÀYNÀY ÀYëÀZ8ÀZŠÀZ”ÀZÝÀ[&À[cÀ[¡À[ÎÀ\À\]À\‹À\²À\ÅÀ\ÐÀ]À](À]@À]IÀ]ZÀ]À]†À]‹À]�À]ÄÀ]ËÀ^À^bÀ^°À^ûÀ_+À_SÀ_UÀ_sÀ_ŽÀ_¦À_ÇÀ_ÔÀ`#À`rÀ`±À`áÀ`ìÀ`ýÀa&Àa^ÀaqÀa±Àa»ÀbÀbQÀb˜Àb»Àc Àc+ÀctÀc}Àc„Àc‰Àc‹ÀcßÀcæÀd=Àd‰Àd¶ÀdúÀdüÀe<ÀeCÀe�ÀeâÀfÀf#ÀflÀf´ÀgÀgIÀgdÀgkÀg¢ÀgêÀh+ÀhTÀh†ÀhžÀhÉÀhêÀi ÀiJÀivÀi–ÀiáÀjÀj9ÀjBÀjIÀjZÀj_ÀjaÀj²Àj¹ÀkÀkKÀk™ÀkÊÀkõÀlÀlUÀl Àl¥Àl§ÀlîÀlõÀmCÀm�ÀmÏÀmëÀmòÀn=Àn„ÀnÐÀnûÀoÀo`Ào¦ÀoÝÀoðÀp!Àp)ÀpwÀp|Àp~Àp¾ÀpÅÀqÀq`Àq«ÀqòÀr:Àr‡Àr¹ÀrÀÀs ÀsBÀs‰ÀsÏÀtÀtAÀtŠÀt¹ÀtÿÀuÀu=Àu_Àu“ÀužÀuÔÀuñÀv!Àv>Àv]ÀvgÀv¶ÀwÀwLÀw•ÀwÌÀxÀx>ÀxQÀx�Àx—ÀxÖÀyÀy=ÀyBÀyDÀy‚Ày½ÀyýÀzÀzTÀz|Àz„ÀzÓÀ{&À{qÀ{‹À{“À{ßÀ|)À|mÀ|˜À|ÔÀ|áÀ}#À}nÀ}ƒÀ}ËÀ}ÔÀ}ÛÀ}ýÀ~À~AÀ~eÀ~ŒÀ~³À~ÓÀ~ôÀÀ_À¥ÀðÀ€?À€iÀ€�À€•À€—À€ãÀ�4À�tÀ�›À�¹À�ÄÀ�ÕÀ‚À‚1À‚DÀ‚ˆÀ‚�À‚”À‚–À‚ÖÀ‚ÝÀƒ/Àƒ�Àƒ¹ÀƒðÀƒøÀ„6À„€À„ÈÀ…À…,À…dÀ…lÀ…·À†À†LÀ†pÀ†�À†ÕÀ‡À‡gÀ‡¶À‡×À‡ûÀˆ?Àˆ‡ÀˆªÀˆÚÀ‰ À‰'À‰RÀ‰‹À‰“À‰âÀŠ)ÀŠzÀŠ‚ÀŠÌÀ‹À‹[À‹cÀ‹²À‹øÀŒ ÀŒÀŒ\ÀŒ§ÀŒ¼À�À� À�À�)À�oÀ�ƒÀ�¬À�ÆÀ�ÕÀŽÀŽ5ÀŽ>ÀŽEÀŽfÀލÀŽÊÀŽÏÀŽÑÀ�À�YÀ�˜À�ÅÀ�æÀ�ùÀ�EÀ�TÀ�[À�rÀ�ˆÀ�“À�ÑÀ‘À‘0À‘;À‘DÀ‘UÀ‘nÀ‘uÀ‘zÀ‘|À‘§À‘¿À‘ÖÀ‘ëÀ’À’À’9À’…À’ÖÀ“À“:À“OÀ“kÀ“�À“˜À“¯À“´À“¶À”À”8À”†À”ˆÀ”¸À”ÖÀ•À•eÀ•²À•íÀ–%À–>À–CÀ–EÀ–€À–œÀ–°À–ÆÀ–âÀ—.À—:À—„À—ÓÀ˜À˜lÀ˜•À˜µÀ˜ÚÀ˜õÀ™À™DÀ™iÀ™¥À™ÐÀ™ßÀ™ìÀ™÷Àš Àš"ÀšnÀšˆÀš”ÀšâÀ›,À›zÀ›ÂÀ›ðÀœ@ÀœfÀœÀœ¦ÀœÞÀœôÀ�À�TÀ�{À�›À�ßÀžÀžÀž0ÀžLÀž‘ÀžãÀžùÀŸÀŸ(ÀŸoÀŸ{ÀŸ‘ÀŸ˜ÀŸªÀŸ¯ÀŸ±ÀŸÿÀ <À ŠÀ ŒÀ ÅÀ¡À¡6À¡mÀ¡£À¡ªÀ¡¸À¡øÀ¢-À¢xÀ¢€À¢…À¢ˆCardWindowServiceLA