Project

General

Profile

Actions

Bug #8659

closed

Curses::Window#bkgdset does not handle color correctly

Added by inferiorhumanorgans (Alex Zepeda) over 10 years ago. Updated over 10 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 1.9.3p385 (2013-02-06 revision 39114) [x86_64-darwin12.2.1]
[ruby-core:56090]

Description

=begin
Colors in curses are handled as high bits on a character. Logically ORing a character with a color pair should allow bkgdset to configure a colored background. This can be seen in the source for the Python curses module. The Python function takes one or two arguments (color + character). If there are two arguments they are ORed together and passed to curses as such. Back in ruby land, with one argument it should be possible to specify a background color for the whole screen thusly:

Define a color pair

Curses.init_pair(1, Curses::COLOR_GREEN, Curses::COLOR_BLUE)

Set the screen background to blue

Curses.bkgdset(' '.ord | Curses.color_pair(1))

The following:

#!/usr/bin/env ruby

require 'curses'

Curses.init_screen
Curses.start_color

Curses.init_pair(1, Curses::COLOR_YELLOW, Curses::COLOR_BLUE)
Curses.bkgdset('='.ord | Curses.color_pair(1))
Curses.clear
Curses.refresh

Curses.addstr('Press_any_key_to_continue')
Curses.getch

Should fill the screen with equals signs (yellow on blue background), and prompt the user to press any key to continue. With Ruby 1.9.3 this doesn't work. The curses module assumes curses characters are one byte (typeof(chtype) == char). Yet GNU ncurses defines the chtype data type as an unsigned integer (OSX 10.8) or an unsigned long (FreeBSD 9.1, RedHat 7.3). The curses module defines a macro "NUM2CH" to convert from ruby objects to chtype objects. At present NUM2CH is defined as NUM2CHR. Instead NUM2CH should be defined as NUM2INT to allow for values > 255 (ex: character + color).

=end

Updated by ThomasDickey (Thomas dickey) over 10 years ago

agree: not just ncurses, but any implementation of SVr4 or X/Open curses will use >8 bits for chtype.
8-bit values were for BSD-curses, which is rarely used (essentially only for antique programs).

Updated by drbrain (Eric Hodel) over 10 years ago

  • Status changed from Open to Assigned
  • Assignee set to shugo (Shugo Maeda)
Actions #3

Updated by shugo (Shugo Maeda) over 10 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r43074.
Alex, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • ext/curses/extconf.rb: check the size of chtype.

  • ext/curses/curses.c (NUM2CH, CH2NUM): use proper macros for
    the size of chtype.

[ruby-core:56090] [Bug #8659]

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0