2013-02-13 26 views
6

Tôi muốn tạo một ứng dụng mà tôi vẽ trên cửa sổ, cửa sổ hoặc toàn màn hình, nơi tôi đã nắm chuột nhưng mà không cần chặn mọi phím tắt WM, như Alt + Tab và tôi cũng cần được thông báo bất cứ khi nào người dùng nhập/rời khỏi tiêu điểm.Làm cách nào để tạo các chương trình toàn màn hình Alt + Tab thân thiện (như trò chơi) trong Linux?

Các ứng dụng phổ biến như Google Chrome, Firefox hoặc gnome-terminal có thể xử lý điều này tốt (đi toàn màn hình với F11 nhưng vẫn có Alt + Tab), nhưng chúng không lấy chuột.

SDL có khả năng xử lý kém khét tiếng của trường hợp sử dụng này: SDL_WM_GrabInput lấy chuột nhưng cũng chặn các phím tắt WM; và SDL_FULLSCREEN dường như có một số loại tự động lấy của chính nó (không hỏi tôi tại sao).

Một giải pháp có thể là viết mã cho Alt + Tab, nhưng điều này rất tệ (và không giúp các phím tắt WM khác, như thay đổi sang không gian làm việc khác).

Một giải pháp khác là không gọi SDL_WM_GrabInput, nhưng thay vì giả mạo lấy: chỉ cần ẩn con trỏ chuột (với SDL_ShowCursor) và di chuyển nó trở lại trung tâm bất cứ khi nào người dùng di chuyển. Đó là xấu xí, nhưng trong thực tế công trình - ngoại trừ khóa học cho SDL_FULLSCREEN, bởi vì nó lấy tự động (không giống như việc thực hiện sane). Một giải pháp SDL có khả năng toàn màn hình là điều này, nhưng đó vẫn không phải là những gì tôi muốn. Tôi không muốn có hack để kích hoạt và vô hiệu hóa lấy, tôi muốn lấy con chuột nhưng không lấy bàn phím.

Vì vậy, tôi phát điên với SDL và muốn xem các giải pháp thay thế. Tôi muốn để sử dụng SDL nhưng điều này là không cần thiết.

This question dường như chỉ ra rằng những gì SDL thực sự làm là sử dụng XGrabKeyboard. Bằng cách đọc trang người đàn ông nó không ngay lập tức rõ ràng với tôi cho dù bạn có thể lấy con chuột mà không nắm lấy bàn phím (tôi không bao giờ sử dụng Xlib bản thân mình).

Tôi biết cách tạo "chế độ toàn màn hình giả" với GTK (nghĩa là, trong số các loại thiết bị đầu cuối gnome, thân thiện với Alt + Tab). Tôi tưởng tượng rằng làm điều này, cùng với con chuột ẩn và di chuyển nó trở lại trung tâm ("giả grabbing") có thể làm các trick, nhưng điều này cảm thấy giống như quá nhiều băng keo. Phải có một cách đơn giản hơn. (Ngoài ra tôi không muốn thêm GTK như một phụ thuộc, nhưng tôi cũng không chắc chắn nếu thực hiện các cuộc gọi Xlib thô là một ý tưởng tốt).

Giải pháp tốt cho điều này là gì?

Tôi cần một giải pháp Linux/X11 nhưng sẽ tốt hơn nếu nó là nền tảng chéo - tôi biết điều này có thể được giải quyết trơn tru trên Windows, vì vậy có lẽ có một thư viện thực hiện chính xác điều này. (Ngoài ra, tôi kết xuất với OpenGL nhưng điều này không liên quan)

PS: Có lẽ tôi đang hiểu rõ vấn đề này và tôi không yêu cầu câu hỏi phù hợp, vì vậy vui lòng chỉ ra các phương pháp tôi đã làm ' t xem xét.

+0

[Câu hỏi tôi trích dẫn] (http://stackoverflow.com/questions/10916997/alt-tab-from-fullscreen-sdl), theo ý kiến ​​của tôi, không thực sự là bản sao, vì tôi không tìm kiếm cụ thể cho giải pháp SDL. SDL chỉ là thư viện tôi đang sử dụng * ngay bây giờ *. – darque

+0

Tôi chỉ thấy ở Xlib API hàm [XGrabPointer] (http://tronche.com/gui/x/xlib/input/XGrabPointer.html). Vì vậy, rõ ràng, Xlib có đủ chức năng để lấy * chỉ * chuột, mà không cần phải lấy bàn phím. – darque

Trả lời

4

Tôi đã sử dụng Gtk và GtkGLExt để chơi trò chơi trên Linux trong những ngày này (ví dụ: các mục nhập Ludum Dare của tôi). Ở đây (gtk.c Gist) là mã của tôi, tôi đã phát hành nó theo giấy phép FreeBSD. Bạn có thể thấy mã tôi đã nhận xét để gỡ lỗi các thay đổi trạng thái cửa sổ. Tôi nên đề cập rằng đây là một phần của khung công tác lớn hơn mà tôi sử dụng cho những thứ như Ludum Dare và tôi thích SDL chính xác vì những lý do tương tự mà bạn đề cập: các ứng dụng kết quả phù hợp hơn với kỳ vọng của người dùng đối với các ứng dụng gốc trên nền tảng của họ (Linux, OS X, Windows). Không cần phải nói, đi tuyến đường này là rất nhiều công việc.

Lập trình X11 thô, tuy nhiên, là một mớ hỗn độn thực sự. Tôi ước tính rằng nó sẽ đưa tôi một vài tuần lập trình vững chắc và đọc tài liệu để chuyển đổi mã Gtk của tôi thành mã X11; điều đó không đáng với tôi nhưng bạn có thể quyết định khác. (Nhiều giờ chỉ để loại bỏ sự phụ thuộc mà mọi người đều đã cài đặt!) Sự phụ thuộc của Gtk không thực sự thái quá, nó có thể đã được nạp vào bộ nhớ, và ABI cho 2.x rất ổn định nên nó sẽ không làm tổn thương khả năng tương thích nhị phân .

Một vấn đề lớn với lập trình X11 cho trò chơi là xử lý sự kiện là một mớ hỗn độn. Bạn không thể dễ dàng thăm dò ý kiến ​​cho các sự kiện. Giao diện Xlib đang chặn, vì vậy bạn phải sử dụng một chuỗi các lệnh gọi hàm để đọc dữ liệu, kiểm tra xem có sự kiện đang chờ xử lý hay không và sau đó chỉ đọc các sự kiện từ hàng đợi nếu chúng tồn tại (nếu không ứng dụng của bạn sẽ chặn cho đến khi sự kiện xuất hiện). Thư viện xcb thay thế cho Xlib tốt hơn rất nhiều và hỗ trợ giao diện không chặn, nhưng nó không hoạt động tốt với OpenGL. Vì vậy, bạn có thể cố gắng kết hợp cả hai, hoặc bạn chỉ có thể sử dụng Gtk.

Hãy để tôi cung cấp cho bạn một đoạn mã Gtk cho toàn màn hình:

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); 
    } 
} 

Chỉ cần tưởng tượng bao nhiêu công việc này sẽ là với giao diện X11: tìm ra kích thước của màn hình (có thể có nhiều hơn một!), thay đổi kích thước cửa sổ, thay đổi thứ tự để nó ở trên mọi thứ khác, thay đổi trang trí và sau đó trả lời một cách thông minh khi người dùng chuyển sang các máy tính để bàn ảo. Blah! (Thực ra, điều này mô tả cách mã của tôi hoạt động trên OS X, nhưng các API này đẹp hơn nhiều.)

Hơn thế nữa, nếu bạn đang sử dụng X11, bạn sẽ phải tìm hiểu cách phản ứng với người dùng trong dự kiến. X11 là từ những năm 1980. Gtk, bằng cách so sánh, cung cấp cho ứng dụng của bạn một loạt các giá trị mặc định thích hợp từ các nhà thiết kế giao diện người dùng của Gtk. Thiết kế giao diện người dùng hoạt động. Và hãy nhớ: bạn có thể kết hợp X11 với Gtk tốt.

Tóm tắt: Lập trình X11 dành cho các lập trình viên có nhiều thời gian rảnh.

Ghi chú: GtkGLExt thêm cờ liên kết gây phiền nhiễu, -Wl,--export-dynamic. Các kịch bản xây dựng của tôi xóa cờ khỏi đầu ra của pkg-config.

X11 kinh nghiệm: Tôi nghĩ rằng tôi đã dành khoảng một tuần cố gắng để có được toàn bộ điều làm việc trong X11, và tôi đã kết thúc sau rất nhiều kết thúc chết trong quá trình này. Học hỏi từ thất bại của tôi.

+0

Xin chào, cảm ơn bạn! Tôi sẽ xem xét mã của bạn. Tôi đồng ý rằng những lợi ích của việc đơn giản hóa lập trình nhanh hơn nhiều so với những hạn chế của việc thêm một phụ thuộc chất béo như GTK. Tôi thích một thư viện nhỏ nhưng cũng làm điều tương tự. (hoặc thành thật mà nói, tôi thích SDL đã làm điều này ..) – darque

+0

@ darque: Tôi cũng ước rằng SDL đã làm điều này, nhưng tôi nghĩ thực tế không may là thiết kế của SDL 1.2 là một di tích từ thời kỳ trước đó. Có lẽ SDL 1.3 tốt hơn. Và SDL là đủ tốt cho hầu hết mọi người. Chắc chắn có chỗ cho một sự thay thế hiện đại cho SDL, nhưng kể từ năm 2013 nó sẽ phải hoạt động tốt trên Android và iOS, khiến việc thực hiện phức tạp hơn rất nhiều. –

+0

SDL 1.3? Hmm Tôi nghe nói rằng SDL 2.0 sẽ cải thiện điều này, nhưng tôi không thể tìm thấy nó ở Google (ngoại trừ [lộ trình này] (http://wiki.libsdl.org/moin.cgi/Lộ trình # Mouse_Input) trích dẫn các cải tiến về việc lấy chuột mà không cần chi tiết). – darque

Các vấn đề liên quan