#pragma once #include #include #include "fiko/core/temel.hpp" namespace fiko { struct PencereAyar { std::wstring baslik = L"FikoYT 3d Cad"; u32 genislik = 1600; // İSTEMCİ alanı (AdjustWindowRect çerçeveyi ekler) u32 yukseklik = 900; // Açılış konumu (pencere sol-üstü, ekran koordinatı). i32 min = "belirtilmedi" → // CW_USEDEFAULT (mevcut davranış). Çağıran konumu doğrulamış olmalı (ekran dışı // bir kayıt geri yüklenirse pencere görünmez olur). static constexpr i32 KONUM_YOK = -2147483647 - 1; i32 x = KONUM_YOK, y = KONUM_YOK; // Sahip pencere (owner). Dolu ise CreateWindowExW'e hWndParent olarak geçirilir → // Win32 "owned window" semantiği: z-order'da sahibinin üstünde kalır, sahibiyle // minimize/restore olur. nullptr = sahipsiz (varsayılan, eski davranış). void* sahipTutamac = nullptr; // Bu pencere yıkıldığında PostQuitMessage(0) çağrılsın mı (uygulamanın ANA mesaj // döngüsünü sonlandıran pencere bu mu)? Varsayılan true = eski tek-pencere davranışı. // Çoklu pencere: yalnız GERÇEK ana pencere true olmalı; ek/ikincil pencereler // (ör. kafa_penceresi OS-penceresi) false vermeli — yoksa ikincil pencereyi kapatmak // TÜM uygulamayı kapatır (bkz. pencere_win32.cpp WM_DESTROY / ~Pencere yorumları). bool anaPencere = true; }; // Dokunmatik/kalem ham isaretci olayi (WM_POINTER). Platform yalniz mesaji cevirir; // jest cozumleme uygulama katmaninda (fiko::girdi::DokunmaJestSistemi) yapilir — // platform girdi modulunu BILMEZ (bagimlilik yonu: uygulama → platform + girdi). enum class DokunmaOlayTur : u8 { Bas, Hareket, Birak, Iptal }; struct DokunmaOlay { DokunmaOlayTur tur = DokunmaOlayTur::Bas; u32 kimlik = 0; // isaretci kimligi (her parmak/kalem icin benzersiz) f32 x = 0, y = 0; // PENCERE-yerel px (WM_POINTER EKRAN verir → cevrildi) bool kalem = false; // PT_PEN → true, PT_TOUCH → false bool govdeTusu = false; // kalem govde (barrel) tusu basili bool silgi = false; // kalem silgi ucu / ters cevrilmis }; // Win32 pencere sarmalayicisi. dogalTutamac() HWND, dogalOrnek() HINSTANCE doner. // WM_SIZE mesajında ANINDA kare çizilsin mi (varsayılan AÇIK = eski davranış). // ÖLÇÜLDÜ 07-21: sürüklerken her WM_SIZE senkron bir kare çiziyor; o kare acquire // semaforunu 1–2 sn bekleyebiliyor (sunum motoru geri-basıncı) → SetWindowPos'u yapan // taraf da bloke oluyor, ekran donuyor. KAPALI iken sürükleme sırasında çizim yalnız // modal döngü timer'ından gelir. AyarSistemi: `render.surukle_ciz`. bool& surukleCiz(); class Pencere { public: explicit Pencere(const PencereAyar& ayar); ~Pencere(); Pencere(const Pencere&) = delete; Pencere& operator=(const Pencere&) = delete; // Bekleyen mesajlari isler; pencere kapatildiysa false doner. // NOT: PeekMessage(hwnd=nullptr) → thread'in TÜM pencerelerini pompalar; her // mesaj GWLP_USERDATA ile doğru Pencere'ye yönlenir. Çok-pencerede TEK çağrı // tüm pencereleri işler; kapanış per-pencere kapatildi() ile sorgulanır. bool mesajlariIsle(); // Yalnız bu pencerenin mesaj pompasını çalıştırır (dönüş değeri yok); çok-pencere // sahibi bunu bir kez çağırıp her pencerenin kapatildi()'sını ayrı sorgular. static void mesajPompala(); // Bu pencere WM_CLOSE aldı mı (çok-pencere: kapananı vector'den çıkarmak için). bool kapatildi() const { return kapatildi_; } u32 genislik() const { return genislik_; } u32 yukseklik() const { return yukseklik_; } bool simgeDurumundaMi() const { return genislik_ == 0 || yukseklik_ == 0; } // Kullanıcı kenardan tutup sürükleyerek boyutlandırıyor mu (WM_ENTERSIZEMOVE..EXIT). // Sürükleme boyunca offscreen viewport/secim hedefini yeniden yaratmayı erteler // (her ara boyutta vkDeviceWaitIdle → takılma). Bitince tek seferde tam boyut. bool boyutlaniyorMu() const { return boyutlaniyor_; } void* dogalTutamac() const { return tutamac_; } void* dogalOrnek() const { return ornek_; } std::function boyutDegisti; std::function fareHareket; std::function fareDugme; // 0=sol 1=orta 2=sag std::function fareTeker; std::function fareCiftTik; // 0=sol 1=orta 2=sag std::function tusBasildi; // sanal tus kodu (VK_*) // Dokunmatik/kalem. true DONERSE mesaj TUKETILIR → Windows fare mesajina cevirmez. // false → DefWindowProc calisir: dokunuş fare mesajina yukseltilir (ESKI davranis // aynen: ImGui panelleri/menuler parmakla tiklanabilir kalir). Bu yuzden uygulama // yalniz 3B viewport'taki nav jestlerini tuketir, gerisini Windows'a birakir. std::function dokunmaOlayi; std::function hamMesaj; // true donerse mesaj tuketildi std::function dosyaBirakildi; // Explorer surukle-birak: dosya yolu (utf8) // Win32 modal resize/move döngüsü (WM_ENTERSIZEMOVE) sırasında ana render döngüsü // durur → ekran donar + GPU fence timeout. Bu callback modal döngü içinden (WM_TIMER/ // WM_SIZE) çağrılır → bir kare çizilir, resize akıcı kalır, fence beslenir. std::function kareCiz; private: friend struct PencereYordam; void* tutamac_ = nullptr; void* ornek_ = nullptr; u32 genislik_ = 0; u32 yukseklik_ = 0; bool kapatildi_ = false; bool boyutlaniyor_ = false; // WM_ENTERSIZEMOVE..EXITSIZEMOVE arası (bkz. boyutlaniyorMu) bool anaPencere_ = true; // ayar.anaPencere'den kopyalanır; ~Pencere() PostQuitMessage kararı }; }