2013-02-13 13 views
6

Ben pencereli ya da ben Alt + Tab gibi herhangi WM klavye kısayolları engellemeden, olmadan fare yakaladı ancak sahip tam ekran ya, ben bir pencerede çizmek bir uygulama oluşturmak istiyor ve ben de haberdar olmak için ihtiyaç Kullanıcı ne zaman girerse odak/odağı bırakır. Google Chrome, Firefox veya gnome-terminal gibiLinux'ta Alt + Tab dostu tam ekran programlar (oyunlar gibi) nasıl oluşturulur?

yaygın uygulamalar işleyebilir bu gayet (F11 ile tam ekran olacak, ama yine de Alt + Tab olan), ancak fareyi yakala yoktur.

SDL bu kullanım şeklini bir azılı kötü kullanımı vardır: SDL_WM_GrabInput fareyi yakalar ama aynı zamanda WM kısayolları yakaladığını; ve SDL_FULLSCREEN kendi başına bir çeşit otomatik yakalamaya sahip gibi görünüyor (bana neden sorma).

bir çözüm Alt + Tab kendim için kod yazmak olabilir, ama bu berbat (ve başka bir çalışma alanına değiştirme gibi diğer WM kısayollar için yardımcı olmuyor).

Başka bir çözüm SDL_WM_GrabInput'u çağırmamaktır, ancak bunun yerine bir kepçe kullanmanız yeterlidir: sadece fare işaretçisini (SDL_ShowCursor ile) gizleyin ve kullanıcı hareket ettiğinde tekrar merkeze taşıyın. Çirkin olan, ama pratikte çalışır - SDL_FULLSCREEN için elbette, çünkü otomatik olarak (aklı başında uygulamaların aksine) yakalar. Tam ekran özellikli bir SDL çözümü budur, ancak bu hala istediğim şey değil. Kepçe etkinleştirmek ve devre dışı bırakmak için hack sahip olmak istemiyorum, fare kapmak istiyorum ama klavye kapmak değil.

Yani ML ile deli değilim ve alternatifleri görmek istiyorum. I , SDL'yi kullanmak için'u ister ancak bu gerekli değildir.

This question

neyi SDL aslında yok XGrabKeyboard kullanmak olduğunu işaret gibi görünüyor. Adam sayfasını okuyarak, klavyeyi kaptırmadan fareyi kapıp kapamayacağınızı hemen anlayamıyorum (Xlib'i kendim kullanmadım).

Ben (yani Alt + Tab dostu, gnome-terminal çeşitli olduğunu) GTK ile "sahte tam ekran" yapmak için biliyorum. Bunu yapmak, fare gizleme ve merkeze ("sahte kapma") geri hareket ettirme ile birleştiğinde, hile yapmak olabilir, ama bu çok fazla koli bandı gibi geliyor. Daha basit bir yol olmalı. (Ayrıca GTK'yı bir bağımlılık olarak eklemek istemiyorum; ancak ham Xlib çağrıları yapmanın iyi bir fikir olup olmadığından emin değilim).

Bunun için iyi bir çözüm nedir?

Linux/X11 çözümüne ihtiyacım var ama çapraz platform olması güzel olurdu - bunun Windows üzerinde sorunsuzca çözülebileceğini biliyorum, bu yüzden tam olarak bunu yapan bir kütüphane var. (Ayrıca, OpenGL ile işlemek ama bu alakasız)

PS: Belki bu konuda kötü bir anlayış yaşıyorum ve ben doğru soruyu sormuyorum, bu nedenle işaret çekinmeyin ben sığınak' yaklaşımları t dikkate alındı.

+0

Ben [I anılan soru] (http://stackoverflow.com/questions/10916997/alt-tab-from-fullscreen-sdl), bence, yinelenen, gerçekten değil aramıyorum çünkü Özellikle bir SDL çözümü için. SDL sadece şu anda kullanıyorum * kütüphanesi *. – darque

+0

Sadece Xlib gördüğümüz [XGrabPointer] (http://tronche.com/gui/x/xlib/input/XGrabPointer.html) işlevini API. Yani, görünüşe göre, Xlib klavye kapmak zorunda kalmadan * sadece * fare * kapmak için yeterli işlevselliğe sahiptir. – darque

cevap

4

Bu günlerde Linux'ta oyun oynamak için Gtk ve GtkGLExt kullanıyorum (ör. Ludum Dare girdileri). İşte (gtk.c Gist) kodum, FreeBSD lisansı altında yayınladım. Pencere durumu değişikliklerini hata ayıklamak için yorum yaptığım kodu görebilirsiniz. Bunun, Ludum Dare gibi şeyler için kullandığım çok daha geniş bir çerçevenin parçası olduğunu belirtmeliyim ve ben de bahsettiğiniz aynı nedenlerden ötürü SDL'yi tercih ediyorum: sonuçta ortaya çıkan uygulamalar kullanıcıların yerel uygulamalara yönelik beklentilerini daha yakından karşılar. platformları (Linux, OS X, Windows). Söylemeye gerek yok, bu rotaya gitmek çok iş.

Ham X11 programlama, ancak, gerçek bir felaket. Gtk kodumu X11 koduna dönüştürmek için bana birkaç haftalık katı programlama ve okuma belgelerinin geleceğini tahmin ediyorum; Benim için buna değmez ama farklı karar verebilirsiniz. muhtemelen zaten zaten belleğe yüklenmiş oluyor, GTK bağımlılık aslında o çirkin değil (Birçok saatler sadece! herkes yine yüklediği bir bağımlılık ortadan kaldırmak için), ve ikili uyumluluk acıtmayacak kadar 2.x için ABI çok kararlı .

oyunlar için X11 programlamayla Büyük bir problem Olay işlenmesi toplam bir karmaşa olduğunu. Etkinlikler için kolayca anket yapamazsınız. Xlib arayüzü engelliyor, bu yüzden fonksiyonun bir gizli dizisi bekleyen olaylar olup olmadığını kontrol edin, veri okumak için çağrıları kullanmak zorunda ve onlar (etkinlikler görünene kadar aksi takdirde uygulama engeller) varsa o zaman sadece sıradan olayları okuyun. Xcb kütüphanesi Xlib'e bir alternatiftir, bu da her yerde çok daha iyidir ve bloke edici olmayan bir arayüzü desteklemektedir, ancak OpenGL ile iyi oynamamaktadır. Yani ikisini karıştırmaya çalışabilirsin ya da sadece Gtk'i kullanabilirsin.

static void toggle_fullscreen() 
{ 
    if (sg_gtk_status & SG_STATUS_VISIBLE) { 
     if (sg_gtk_status & SG_STATUS_FULLSCREEN) 
      gtk_window_unfullscreen(sg_window); 
     else 
      gtk_window_fullscreen(sg_window); 
    } 
} 

Sadece bu X11 arayüzü ile olacağını ne kadar iş hayal:

Sana tam ekran için Gtk kodu parçası verelim ekranın boyutunu anlamaya (daha olabilir bir!), pencereyi yeniden boyutlandırın, siparişi değiştirin, böylece her şeyin üstünde olacak, dekorasyonu değiştirecek ve kullanıcı sanal masaüstlerini değiştirdiğinde akıllıca yanıt verecektir. Vesaire! (Aslında bu, kodumun OS X üzerinde nasıl çalıştığını açıklar, ancak API'ler çok daha güzeldir.)

Bundan da öte, X11 kullanıyorsanız, kullanıcılara nasıl tepki vereceğinizi öğrenmeniz gerekir. beklenen yol. X11, 1980'lerden. Gtk, karşılaştırmalı olarak, uygulamanıza Gtk'in UI tasarımcılarından uygun varsayılan değerlere sahip bir alan sunar. UI tasarımı iştir. Ve unutmayın: X11'i Gtk ile iyice karıştırabilirsiniz.

Özet: X11 programlama, çok fazla boş zamana sahip programcılar içindir.

Notlar: GtkGLExt, sinir bozucu bir bağlayıcı bayrağı, -Wl,--export-dynamic ekler. Oluşturum komut dosyalarım, bayrağı pkg-config'un çıktısından kaldırır.

X11 deneyimleri: Sanırım X11'de çalışılan her şeyi elde etmeye çalışmak için bir hafta harcadım ve bu süreçte birçok ölü noktayı takip ettim. Hatalarımdan öğren.

+0

Hey, büyük bir teşekkür ederim! Koduna bir göz atacağım. Programlamayı basitleştirmenin faydalarının hızlıca, GTK gibi bir yağ bağımlılığının eklenmesi dezavantajlarından daha ağır bastığına katılıyorum. Ancak aynı şeyi yapan küçük bir kütüphaneyi tercih ederim. (ya da dürüst olmak gerekirse, SDL'nin bunu yapmasını tercih ederim.) – darque

+0

@darque: Ayrıca SDL'nin bunu yapmasını isterdim, ama talihsiz gerçek şu ki SDL 1.2'nin tasarımının daha önceki bir dönemin kalıntısı olduğunu düşünüyorum. Belki SDL 1.3 daha iyi. Ve SDL çoğu insan için yeterince iyidir. SDL'ye modern bir yer için kesinlikle yer var, ama 2013'ten beri Android ve iOS'ta iyi çalışmalıydı, bu da girişimi çok daha karmaşık hale getiriyor. –

+0

SDL 1.3? Hmm SDL 2.0'ın bunu geliştireceğini duydum, ancak Google'da bulamıyorum (bu yol haritası hariç) (http://wiki.libsdl.org/moin.cgi/Roadmap # Mouse_Input) detaylandırma olmadan fare kapmak üzerinde iyileştirmeler alıntılar). – darque