& argsPrefixmainChannelName windowWidth windowHeight _childChannel_windows _lastState_hwnds _lastPrune_pruning_ready _pendingSetup_sending_queued_lastSendErrorLog _handlerSet_busy_counterisOpen knownHwndsopenIdssendTileFromChild onTileActionopen _sanitize pushState _lastThumb_sendCoalesced_send_applySetupWhenReadyonClosed selftestChildclose pruneDeadstop_ensureHandler_onCall parseArgsCardWindowServiceSWindowMethodChannelmode ChannelModeunidirectionalMapStringWindowControllerdynamicintDateTimefromMillisecondsSinceEpochboolSet containsKeyvaluestoSetListkeystoListgrowableFuturevoidPaletteTileRequest invokeMethodtoJsontimeoutDurationseconds debugPrinteforceshowremove NativeBridgelistChildWindowscreateWindowConfigurationhiddenAtLaunch argumentsiwherecontainshreversedconfirmCardWindowdelayed millisecondshwndtitle unawaitedwindowIdlength replaceAlltrim isNotEmptyofnow differencesetupCardWindowwidthheightcloseCardWindowhideisEmptyentriescardWindowAlivevaluekeyclearsetMethodCallHandlerObject MethodCallmethodonDialogAnswerhandleridaddstatefromJsonsplitfirst instanceIdtryParse²Ž—h—Ãþ�óN µt"y„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¨ÀÀ`ЂHK€�€”€×��`�e�´‚‚J‚š‚Á‚ƃƒ`ƒ¬ƒø„5„?„A„W„Y„›„Æ„ï„ñ……,….…I…c…e…°…Յ׆†I†K†œ†£†ð‡;‡r‡•‡¹‡»ˆˆIˆ~ˆ”ˆ»ˆÁˆÃˆñ‰.‰0‰y‰¼‰¾Š Š:ЂУХŠ÷Šþ‹L‹•‹Á‹ëŒ0ŒwŒÃ��`��†�ÑŽŽKŽMŽ•ŽÊ��A�C�€�‡�Ò��l�»‘ ‘D‘ƒ‘¿‘è‘ê’6’…’©’Ç’ã’å““f“h“±“Ü“ã”5”„”Ε•J•L•�•ΕЖ––e–²——O—˜—£—¾—혘1˜k˜r˜w˜y˜Ì™™™c™�™ë™íšš šnš¶šû›:›]›|›Äœœ[œeœ³��U� �Î�Û�üžBžZžežzž³ž¼žàŸŸ Ÿ\Ÿ¦Ÿ¸ŸË  ) > E X c ‚ ¿ Ò¡ ¡)¡J¡�¡Ö¢%¢1¢_¢‰¢‹¢Ë£££5£?£Ž£Ü¤"¤q¤º¤Ä¥¥b¥±¦¦M¦ž¦í§-§B§|§®§ø¨&¨C¨‰¨¡¨Ì©©©1©>©I©c©­©ç©ò©ûªª6ª‚ª«ª·««Y«©«ò¬>¬Ž¬Ý­­T­d­¸­Á­Ô® ®M®W®Ÿ®é¯1¯q¯…¯˜¯Ø¯ü°°G°\°m°ƒ°Š°�°‘°å±,±.±g±n±»±â±é²8²�²È³³^³£³ª³õ´B´n´�´¨´É´Ö´ûµ"µ@µiµ´¶¶¶¶]¶€¶«¶Û· ·Z·•·Ù·é¸¸¸"¸W¸\¸^¸¢¸×¸Ù¹¹¹h¹¶ººZº’º™ºè»6»n»•»°»È»é»ö¼¼C¼R¼Y¼{¼’¼�¼³¼à½½8½P½Y½j½�½–½›½�½»½Ö½î¾¾¾'¾8¾a¾™¾¬¾ì¾ö¿A¿Œ¿Ó¿öÀ@&À@OÀ@qÀ@ºÀ@ÃÀ@ÊÀ@ÏÀ@ÑÀAÀAÀAgÀA³ÀAþÀBEÀB�ÀBÚÀC ÀCÀC_ÀC•ÀCÜÀD"ÀDpÀD”ÀDÝÀE ÀERÀEYÀE�ÀE²ÀEæÀEñÀF'ÀFDÀFtÀF‘ÀF°ÀFºÀG ÀGÀG[ÀGbÀG¡ÀGÌÀHÀH ÀHÀHMÀHˆÀHªÀHÊÀHîÀIÀI9ÀIYÀIzÀIœÀI¡ÀI£ÀIïÀJ@ÀJ€ÀJ§ÀJÅÀJÐÀJáÀK ÀK=ÀKPÀK”ÀK›ÀK ÀK¢ÀKâÀKéÀL;ÀL�ÀLÅÀLðÀM ÀMOÀMcÀMŒÀM¦ÀMµÀMýÀNÀNÀN%ÀNFÀNKÀNMÀN›ÀNÕÀOÀOAÀObÀOuÀOÁÀOÐÀO×ÀOîÀPÀPÀPMÀPŠÀP¬ÀP·ÀPÀÀPÑÀPêÀPñÀPöÀPøÀQ#ÀQ;ÀQRÀQgÀQ€ÀQ™ÀQ®ÀQÊÀQàÀQ÷ÀQüÀQþÀRLÀR€ÀRÎÀRÐÀSÀSÀSeÀS­ÀSúÀT5ÀTmÀT†ÀT‹ÀT�ÀTÈÀTäÀTøÀUÀU*ÀUvÀU‚ÀUÌÀVÀVeÀV´ÀVÝÀVýÀW"ÀW=ÀWgÀWŒÀW±ÀWíÀXÀX'ÀX4ÀX?ÀXUÀXjÀX¶ÀXÐÀXÜÀY*ÀYtÀYÂÀZ ÀZ8ÀZˆÀZ®ÀZÇÀZîÀ[&À[<À[PÀ[œÀ[ÃÀ[ãÀ\'À\WÀ\bÀ\xÀ\”À\ÙÀ]+À]AÀ]WÀ]pÀ]·À]ÃÀ]ÙÀ]àÀ]òÀ]÷À]ùÀ^GÀ^„À^ÒÀ^ÔÀ_ À_[À_~À_µÀ_ëÀ_òÀ`À`@À`uÀ`ÀÀ`ÈÀ`ÍÀ`Є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„›„Æ„ñ……K…\…^…K…K…]…Ì…¿…gk…¿M/// `multi_window` argümanının öneki (main.dart bu önekle yönlendirir).†1†…Ùm†6/// Alt pencerenin ana pencereye haber verdiÄŸi kanal.‡�‡�†M�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.‡³‡¤‡—‡¤ ˆhˆ{ˆ½ˆ‚ˆœˆ˜ˆžˆ©ˆªˆX‡½�ˆX€‡/// Alt pencere -> ana pencere kanali (ayri kanal adli: ayni pencere /// hem iki yonu kullanir ama `WindowMethodChannel` tek yonludur).‰)‰*‰ˆÅf‰./// 🪟 instanceId → pencere denetleyicisi.‰·‰¸‰ª‰2€‡‰ªP/// 🪟 instanceId → o kartın son gönderilen özeti (yeniden açılışta).Š5Š6Š,‰ÀwŠ,J/// instanceId -> kart penceresinin HWND'si (kapatma / canlilik kontrolu).ŠYŠaŠbŠ|Š~Š}ŠLŠŽEŽ?Ž5Чƒ¡Ž5ƒ…/// 🪟 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. �<�=��;��!�:�"�9�'�#�4�-�ŽO€ï�y/// instanceId -> `ready` geldikten sonra uygulanacak biçimlendirme. /// (HWND + baÅŸlık). Bkz. [_applySetupWhenReady].‘~‘‘p‘}‘q‘y‘e�E‚;‘e‚ /// 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. ‘ã‘ä‘Å‘â‘Æ‘Αёá‘Ò‘Ú‘´‘…`‘´’\’d’e’’�’€’H‘쀖’HS/// 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ı).¸Ò¸Ó¸Å¸`t¸ÅK/// Son gönderilen görüntü (kart başına) — deÄŸiÅŸim tespiti için.“j“j�Þ•$�©/// 🪟 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.•N•N~•›3/// Açık kart pencerelerinin instance id listesi.“-“-“4’ç’ç}“&3/// Bu kart için zaten açık bir pencere var mı?—w—w—Š•Ò•Ò‚£—e�ˆ/// 🗂 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.šÑšÑšØšäšä šë™ï™ï–žšÌ€Í/// 🪟 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).°ÿ°ÿ±°“°“€—°õ[/// BaÅŸlıktaki `|` karakterini temizler (argüman ayrıştırıcısını bozmamak için).´”´”´›´¬´¬´Á±0±0‡*´„ƒ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ı).»™»™»ª»´»´»»»Ì»Ì»á¸Û¸Û„¾»„‚˜/// 🔴 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).½¿½¿½Ð½Ú½Ú½á½ò½ò¾½Ÿ½Ÿƒ.½³ÀCÀÀCÀÀCÇÀ@ÓÀ@Ó‡8ÀC«‚Ð/// 🪗 `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.ÀHlÀHlÀHsÀHÀH�ŽÀHc>/// ✕ ile pencere kapandı: kaydı sil (kart listede KALIR).ÀJdÀJdÀJkÀI¥ÀI¥�ùÀJV€£/// 🧪 Selftest: alt pencereye "kendi provider'ından düğmelere bas" der. /// Böylece zincir GERÇEK yoldan sınanır: alt provider → kanal → ana pencere.ÀL©ÀL©ÀL°ÀK¤ÀK¤‚¥ÀL£€Þ/// 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.ÀNöÀNöÀNûÀOÀNOÀNO‚¥ÀNë€�/// Yikilmis (ornegin Alt+F4) pencerelerin kaydini temizler. Sik cagrilir, /// bu yuzden [force] olmadikca 1.5 sn'de bir calisir.ÀPúÀPú�ÀQ1+/// Uygulama kapanışı / test temizliÄŸi.ÀRÒÀRÒ�·ÀRæÀT®ÀT®ÀT¹ÀT�ÀT�‰fÀT¦À_LÀ_L À_SÀ^ÖÀ^Ö�õÀ_B:/// `multi_window` argümanından kart kimliÄŸini çözer.….….À[ …4‚HK€�€”€×��`�e�´‚‚J‚š‚Á‚ƃƒ`ƒ¬ƒø„5„?„A„W„Y„›„Æ„ï„ñ……,….…I…c…e…°…Յ׆†I†K†œ†£†ð‡;‡r‡•‡¹‡»ˆˆIˆ~ˆ”ˆ»ˆÁˆÃˆñ‰.‰0‰y‰¼‰¾Š Š:ЂУХŠ÷Šþ‹L‹•‹Á‹ëŒ0ŒwŒÃ��`��†�ÑŽŽKŽMŽ•ŽÊ��A�C�€�‡�Ò��l�»‘ ‘D‘ƒ‘¿‘è‘ê’6’…’©’Ç’ã’å““f“h“±“Ü“ã”5”„”Ε•J•L•�•ΕЖ––e–²——O—˜—£—¾—혘1˜k˜r˜w˜y˜Ì™™™c™�™ë™íšš šnš¶šû›:›]›|›Äœœ[œeœ³��U� �Î�Û�üžBžZžežzž³ž¼žàŸŸ Ÿ\Ÿ¦Ÿ¸ŸË  ) > E X c ‚ ¿ Ò¡ ¡)¡J¡�¡Ö¢%¢1¢_¢‰¢‹¢Ë£££5£?£Ž£Ü¤"¤q¤º¤Ä¥¥b¥±¦¦M¦ž¦í§-§B§|§®§ø¨&¨C¨‰¨¡¨Ì©©©1©>©I©c©­©ç©ò©ûªª6ª‚ª«ª·««Y«©«ò¬>¬Ž¬Ý­­T­d­¸­Á­Ô® ®M®W®Ÿ®é¯1¯q¯…¯˜¯Ø¯ü°°G°\°m°ƒ°Š°�°‘°å±,±.±g±n±»±â±é²8²�²È³³^³£³ª³õ´B´n´�´¨´É´Ö´ûµ"µ@µiµ´¶¶¶¶]¶€¶«¶Û· ·Z·•·Ù·é¸¸¸"¸W¸\¸^¸¢¸×¸Ù¹¹¹h¹¶ººZº’º™ºè»6»n»•»°»È»é»ö¼¼C¼R¼Y¼{¼’¼�¼³¼à½½8½P½Y½j½�½–½›½�½»½Ö½î¾¾¾'¾8¾a¾™¾¬¾ì¾ö¿A¿Œ¿Ó¿öÀ@&À@OÀ@qÀ@ºÀ@ÃÀ@ÊÀ@ÏÀ@ÑÀAÀAÀAgÀA³ÀAþÀBEÀB�ÀBÚÀC ÀCÀC_ÀC•ÀCÜÀD"ÀDpÀD”ÀDÝÀE ÀERÀEYÀE�ÀE²ÀEæÀEñÀF'ÀFDÀFtÀF‘ÀF°ÀFºÀG ÀGÀG[ÀGbÀG¡ÀGÌÀHÀH ÀHÀHMÀHˆÀHªÀHÊÀHîÀIÀI9ÀIYÀIzÀIœÀI¡ÀI£ÀIïÀJ@ÀJ€ÀJ§ÀJÅÀJÐÀJáÀK ÀK=ÀKPÀK”ÀK›ÀK ÀK¢ÀKâÀKéÀL;ÀL�ÀLÅÀLðÀM ÀMOÀMcÀMŒÀM¦ÀMµÀMýÀNÀNÀN%ÀNFÀNKÀNMÀN›ÀNÕÀOÀOAÀObÀOuÀOÁÀOÐÀO×ÀOîÀPÀPÀPMÀPŠÀP¬ÀP·ÀPÀÀPÑÀPêÀPñÀPöÀPøÀQ#ÀQ;ÀQRÀQgÀQ€ÀQ™ÀQ®ÀQÊÀQàÀQ÷ÀQüÀQþÀRLÀR€ÀRÎÀRÐÀSÀSÀSeÀS­ÀSúÀT5ÀTmÀT†ÀT‹ÀT�ÀTÈÀTäÀTøÀUÀU*ÀUvÀU‚ÀUÌÀVÀVeÀV´ÀVÝÀVýÀW"ÀW=ÀWgÀWŒÀW±ÀWíÀXÀX'ÀX4ÀX?ÀXUÀXjÀX¶ÀXÐÀXÜÀY*ÀYtÀYÂÀZ ÀZ8ÀZˆÀZ®ÀZÇÀZîÀ[&À[<À[PÀ[œÀ[ÃÀ[ãÀ\'À\WÀ\bÀ\xÀ\”À\ÙÀ]+À]AÀ]WÀ]pÀ]·À]ÃÀ]ÙÀ]àÀ]òÀ]÷À]ùÀ^GÀ^„À^ÒÀ^ÔÀ_ À_[À_~À_µÀ_ëÀ_òÀ`À`@À`uÀ`ÀÀ`ÈÀ`ÍÀ`ÐCardWindowService’é