| /* Public Domain Curses */ |
| |
| #include "pdcx11.h" |
| |
| RCSID("$Id: pdcscrn.c,v 1.55 2008/07/14 04:24:52 wmcbrine Exp $") |
| |
| /* COLOR_PAIR to attribute encoding table. */ |
| |
| short *xc_atrtab = (short *)NULL; |
| |
| /* close the physical screen */ |
| |
| void PDC_scr_close(void) |
| { |
| PDC_LOG(("PDC_scr_close() - called\n")); |
| } |
| |
| void PDC_scr_free(void) |
| { |
| XCursesExit(); |
| |
| xc_atrtab = (short *)NULL; |
| } |
| |
| /* open the physical screen -- allocate SP, miscellaneous intialization */ |
| |
| int PDC_scr_open(int argc, char **argv) |
| { |
| extern bool sb_started; |
| |
| PDC_LOG(("PDC_scr_open() - called\n")); |
| |
| if ((XCursesInitscr(argc, argv) == ERR) || !SP) |
| return ERR; |
| |
| SP->cursrow = SP->curscol = 0; |
| SP->orig_attr = FALSE; |
| SP->sb_on = sb_started; |
| SP->sb_total_y = 0; |
| SP->sb_viewport_y = 0; |
| SP->sb_cur_y = 0; |
| SP->sb_total_x = 0; |
| SP->sb_viewport_x = 0; |
| SP->sb_cur_x = 0; |
| |
| return OK; |
| } |
| |
| /* the core of resize_term() */ |
| |
| int PDC_resize_screen(int nlines, int ncols) |
| { |
| PDC_LOG(("PDC_resize_screen() - called. Lines: %d Cols: %d\n", |
| nlines, ncols)); |
| |
| if (nlines || ncols || !SP->resized) |
| return ERR; |
| |
| shmdt((char *)Xcurscr); |
| XCursesInstructAndWait(CURSES_RESIZE); |
| |
| if ((shmid_Xcurscr = shmget(shmkey_Xcurscr, |
| SP->XcurscrSize + XCURSESSHMMIN, 0700)) < 0) |
| { |
| perror("Cannot allocate shared memory for curscr"); |
| kill(xc_otherpid, SIGKILL); |
| return ERR; |
| } |
| |
| XCursesLINES = SP->lines; |
| XCursesCOLS = SP->cols; |
| |
| PDC_LOG(("%s:shmid_Xcurscr %d shmkey_Xcurscr %d SP->lines %d " |
| "SP->cols %d\n", XCLOGMSG, shmid_Xcurscr, |
| shmkey_Xcurscr, SP->lines, SP->cols)); |
| |
| Xcurscr = (unsigned char*)shmat(shmid_Xcurscr, 0, 0); |
| xc_atrtab = (short *)(Xcurscr + XCURSCR_ATRTAB_OFF); |
| |
| SP->resized = FALSE; |
| |
| return OK; |
| } |
| |
| void PDC_reset_prog_mode(void) |
| { |
| PDC_LOG(("PDC_reset_prog_mode() - called.\n")); |
| } |
| |
| void PDC_reset_shell_mode(void) |
| { |
| PDC_LOG(("PDC_reset_shell_mode() - called.\n")); |
| } |
| |
| void PDC_restore_screen_mode(int i) |
| { |
| } |
| |
| void PDC_save_screen_mode(int i) |
| { |
| } |
| |
| void PDC_init_pair(short pair, short fg, short bg) |
| { |
| xc_atrtab[pair * 2] = fg; |
| xc_atrtab[pair * 2 + 1] = bg; |
| } |
| |
| int PDC_pair_content(short pair, short *fg, short *bg) |
| { |
| *fg = xc_atrtab[pair * 2]; |
| *bg = xc_atrtab[pair * 2 + 1]; |
| |
| return OK; |
| } |
| |
| bool PDC_can_change_color(void) |
| { |
| return TRUE; |
| } |
| |
| int PDC_color_content(short color, short *red, short *green, short *blue) |
| { |
| XColor *tmp = (XColor *)(Xcurscr + XCURSCR_XCOLOR_OFF); |
| |
| tmp->pixel = color; |
| |
| XCursesInstructAndWait(CURSES_GET_COLOR); |
| |
| *red = ((double)(tmp->red) * 1000 / 65535) + 0.5; |
| *green = ((double)(tmp->green) * 1000 / 65535) + 0.5; |
| *blue = ((double)(tmp->blue) * 1000 / 65535) + 0.5; |
| |
| return OK; |
| } |
| |
| int PDC_init_color(short color, short red, short green, short blue) |
| { |
| XColor *tmp = (XColor *)(Xcurscr + XCURSCR_XCOLOR_OFF); |
| |
| tmp->pixel = color; |
| |
| tmp->red = ((double)red * 65535 / 1000) + 0.5; |
| tmp->green = ((double)green * 65535 / 1000) + 0.5; |
| tmp->blue = ((double)blue * 65535 / 1000) + 0.5; |
| |
| XCursesInstructAndWait(CURSES_SET_COLOR); |
| |
| return OK; |
| } |