2011-12-31 16 views
8

Tôi đang phát triển ứng dụng Ncurses sử dụng bảng màu riêng của mình qua init_color() (giả sử can_change_colors() trả về không khác). Nếu COLORS nhỏ hơn 256, tôi chỉ sửa đổi 8 màu đầu tiên (giả sử COLORS ít nhất là 8). Nếu không, tôi sửa đổi tối đa 256 đầu tiên.Làm cách nào để có được bảng màu đầu cuối ban đầu, tốt nhất là sử dụng các thủ tục ncurses?

Yêu cầu tài liệu ncurses gọi endwin() trên stdscr sẽ đặt lại bảng màu. Tuy nhiên, trong Gnome-terminal, tôi không thấy bảng màu được khôi phục bởi Ncurses. Thay vào đó, bất kỳ bảng màu nào tôi sử dụng lần cuối được thực hiện ngoài ứng dụng của tôi. Câu hỏi đầu tiên của tôi, sau đó, là lý do tại sao bảng màu không được khôi phục đúng cách (mọi thứ khác - vị trí con trỏ, văn bản màn hình, v.v ...).

Tôi có thể giải quyết vấn đề này (tôi biết điều này đã có vấn đề) bằng cách mua bảng màu khi khởi động và khôi phục bảng theo cách thủ công. Tôi đang cố thực hiện điều này với vòng lặp color_content() sau khi gọi thành công đến start_color(). Thật không may, điều này dường như trả về bảng mặc định ncurses, không phải bảng màu thực sự đang được sử dụng (được thử nghiệm với bảng mặc định của Gnome-terminal, và một bảng Solarized đã được cấu hình). Tôi đã xác minh điều này bằng cách kiểm tra các giá trị trong ncurses/base/lib_color.c từ các nguồn ncurses-5.9 của Debian.

Vì vậy:

  • Tại sao không phải là bảng khôi phục bằng một cuộc gọi thành công đến endwin(stdscr)?

  • Làm cách nào để có được bảng màu "đúng" khi khởi động? Ncurses được ưa thích, nhưng thậm chí cả Unix-hoặc thậm chí Linux cụ thể ioctl() s sẽ đủ cho bây giờ.

Có thể tìm thấy mã có liên quan on Github. Có gì hiện tại có thể không khớp chính xác với những gì tôi đã mô tả ở trên, vì tôi đã thử nghiệm các kỹ thuật khác nhau mà không thành công.

+0

Bạn đã thử điều này trong các trình mô phỏng thiết bị đầu cuối khác như xterm hoặc bàn điều khiển để xác nhận bạn không chỉ nhìn thấy hành vi không chính xác từ gnome-terminal? –

+0

Vì vậy, với tiền thưởng hết hạn ngày hôm nay, tôi đã đi trước và thực hiện một số nguồn lặn kỹ lưỡng. Tôi tin rằng tôi có câu trả lời (thay vì chán nản): –

Trả lời

2

Vì vậy, với tiền thưởng hết hạn hôm nay, tôi đã đi trước và thực hiện một số nguồn lặn kỹ lưỡng. Tôi tin rằng tôi có câu trả lời (thay vì chán nản):

(1) endwin() đang đặt lại bảng màu, nhưng dường như đặt lại thành định nghĩa từ cấu hình terminfo cho giá trị TERM. thay đổi bảng màu của bất kỳ ứng dụng nào không được viết vào cơ sở dữ liệu terminfo (rõ ràng) hoặc ngữ cảnh (thay vì không may), và do đó không có sẵn để ncurses trên các ứng dụng.

(2) không có cách chung để thực hiện việc này. bằng chứng là mâu thuẫn, và sau trực tiếp từ (1).

than ôi, kém Yorick! một người bạn vô hạn.

trừ khi một người nào đó chứng minh tôi là không có trong đầu, tôi xem xét câu hỏi này đã được giải quyết.

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