summaryrefslogblamecommitdiffstats
path: root/crawl-ref/source/libgui.cc
blob: cb9b339d7256ac14f36053f85042787799310be8 (plain) (tree)
1
2
3
4
5
6
7
8
9
  
                         
                                                                   
                                                                     
                         

   
                   
 

               



                   

                    
                
                    
                    
                    




                    
                    
                         
                   
                     
 

                    
 
                                                   
 
                            
                                           
 
                                                          
                                       



                                              
 
                              
 
             

 









                                        
                                                    
 

                                                                         
 




                     





                    
 

                       

                       
 

                       

 
                            

                      
                                      
             

 
                        


                                           
             




                                  
                                          




                           
                                                  








                                                  
                                          



                          
                         


                 


                             
 
                             
                             


                        
 
                                          
                     
                     
 
                     

               
                     

                 
                     

                         
                           

                    



                        
 






                                   
 
                              





                                       
 



                     
 
                                            


                          
 



                                                                    
                                                     
             
                                
             
                  
         
                     

                       
                            
                         


                       
                               


                                           
                          
             

                                   


                                                      
                                                            







                                            
                           
                      

 
                                   






                                                                       
                                          
             



                         
                                 



                           
                                   



                                     
                
                                      
        
                                      



                        
                                


                      



            
                                



            
                                



                         
                                       



                        
                                      

 
                                           
 
                      

               
 
                                          
 
             
 
 
              
 
                              

 
           
 
                      

 
            
 

                   

 
                                                                          
 
                                                       
 
 
                                             


                                
 




                                       



                                 
 




                   
 

                    
                            

 
           
 

                                                                 
                     

                                                           
 

                        
 








                                            
 
                    
     
                                     
     
                                                                 
     










                                           
 



                                   
 

                                                                
 
                                  
     

                                                   
 









                                     

 
                     
                         
/*
 *  File:       libgui.cc
 *  Summary:    Functions that any display port needs to implement.
 *              Needed by makefile_tiles.mgw and makefile_tiles.unix.
 *  Written by: M.Itakura
 */

#include "AppHdr.h"

#ifdef USE_TILE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "cio.h"
#include "defines.h"
#include "env.h"
#include "externs.h"
#include "tilereg.h"
#include "message.h"
#include "stash.h"
#include "state.h"
#include "stuff.h"
#include "terrain.h"
#include "tiles.h"
#include "tilesdl.h"
#include "tiledef-main.h"
#include "travel.h"
#include "viewgeom.h"

#include <SDL.h>
#include "tilesdl.h"

int tile_idx_unseen_terrain(int x, int y, int what)
{
    const coord_def gc(x,y);
    dungeon_feature_type feature = grd(gc);

    unsigned int t = tileidx_feature(feature, gc.x, gc.y);
    if (t == TILE_ERROR || what == ' ')
    {
        unsigned int fg_dummy;
        tileidx_unseen(fg_dummy, t, what, gc);
    }

    t |= tile_unseen_flag(gc);

    return t;
}

int m_getch()
{
    return getch();
}

void set_mouse_enabled(bool enabled)
{
    crawl_state.mouse_enabled = enabled;
}

void gui_init_view_params(crawl_view_geometry &geom)
{
    // The tile version handles its own layout on a pixel-by-pixel basis.
    // Pretend that all of the regions start at character location (1,1).

    geom.termp.x = 1;
    geom.termp.y = 1;

    geom.viewp.x = 1;
    geom.viewp.y = 1;

    geom.hudp.x = 1;
    geom.hudp.y = 1;

    geom.msgp.x = 1;
    geom.msgp.y = 1;

    geom.mlistp.x  = 1;
    geom.mlistp.y  = 1;
    geom.mlistsz.x = 0;
    geom.mlistsz.y = 0;

    geom.viewsz.x = 17;
    geom.viewsz.y = 17;
}

int putch(unsigned char chr)
{
    // object's method
    TextRegion::text_mode->putch(chr);
    return 0;
}

int putwch(unsigned chr)
{
    // No unicode support.
    putch(static_cast<unsigned char>(chr));
    return 0;
}

void writeWChar(unsigned char *ch)
{
    // object's method
    TextRegion::text_mode->writeWChar(ch);
}

void clear_to_end_of_line()
{
    // object's method
    TextRegion::text_mode->clear_to_end_of_line();
}

void get_input_line_gui(char *const buff, int len)
{
    int y, x;
    int k = 0;
    int prev = 0;
    int done = 0;
    int kin;
    TextRegion *r = TextRegion::text_mode;

    static char last[128];
    static int lastk = 0;

    // Locate the cursor.
    x = wherex();
    y = wherey();

    // Paranoia -- check len.
    if (len < 1)
        len = 1;

    /* Restrict the length */
    if (x + len > (int)r->mx)
        len = r->mx - x;
    if (len > 40)
        len = 40;

    // Paranoia -- Clip the default entry.
    buff[len] = '\0';
    buff[0]   = '\0';

    r->cgotoxy(x, y);
    putch('_');

    // Process input.
    while (!done)
    {
        // Get a key.
        kin = getch_ck();

        // Analyze the key.
        switch (kin)
        {
        case 0x1B:
            k = 0;
            done = true;
            break;

        case '\n':
        case '\r':
            k = strlen(buff);
            done = true;
            lastk = k;
            strncpy(last, buff, k);
            break;

        case CK_UP: // history
            if (lastk != 0)
            {
                k = lastk;
                strncpy(buff, last, k);
            }
            break;

        case 0x7F:
        case '\010':
            k = prev;
            break;

        // Escape conversion. (for ^H, etc.)
        case CONTROL('V'):
            kin = getch();
            // fallthrough

        default:
            if (k < len
                && (isprint(kin)
                    || (kin >=  CONTROL('A') && kin <= CONTROL('Z'))
                    || (kin >= 0x80 && kin <= 0xff)))
            {
                buff[k++] = kin;
            }
            break;
        }
        // Terminate.
        buff[k] = '\0';

        // Update the entry.
        r->cgotoxy(x, y);
        int i;

        //addstr(buff);
        for (i = 0; i < k; i++)
        {
            prev = i;
            int c = (unsigned char)buff[i];
            if (c >= 0x80)
            {
                if (buff[i+1] == 0)
                    break;
                writeWChar((unsigned char *)&buff[i]);
                i++;
            }
            else if (c >= CONTROL('A') && c <= CONTROL('Z'))
            {
                putch('^');
                putch(c + 'A' - 1);
            }
            else
                putch(c);
        }
        r->addstr((char *)"_             ");
        r->cgotoxy(x+k, y);
    } // while (!done)
}

int cprintf(const char *format,...)
{
    char buffer[2048];          // One full screen if no control seq...
    va_list argp;
    va_start(argp, format);
    vsprintf(buffer, format, argp);
    va_end(argp);
    // object's method
    TextRegion::text_mode->addstr(buffer);
    return 0;
}

void textcolor(int color)
{
    TextRegion::textcolor(color);
}

void textbackground(int bg)
{
    TextRegion::textbackground(bg);
}

void set_cursor_enabled(bool enabled)
{
    if (enabled)
        TextRegion::_setcursortype(1);
    else
        TextRegion::_setcursortype(0);
}

bool is_cursor_enabled()
{
    if (TextRegion::cursor_flag)
        return (true);

    return (false);
}

int wherex()
{
    return TextRegion::wherex();
}

int wherey()
{
    return TextRegion::wherey();
}

int get_number_of_lines()
{
    return tiles.get_number_of_lines();
}

int get_number_of_cols()
{
    return tiles.get_number_of_cols();
}

void put_colour_ch(int colour, unsigned ch)
{
    textcolor(colour);
    putwch(ch);
}

int window(int x1, int y1, int x2, int y2)
{
    return 0;
}

int getch_ck()
{
    return (tiles.getch_ck());
}

int getch()
{
    return getch_ck();
}

int clrscr()
{
    tiles.clrscr();
    return 0;
}

void message_out(int *which_line, int colour, const char *s, int firstcol)
{
    tiles.message_out(which_line, colour, s, firstcol);
}

void cgotoxy(int x, int y, GotoRegion region)
{
    tiles.cgotoxy(x, y, region);
}

GotoRegion get_cursor_region()
{
    return (tiles.get_cursor_region());
}

void clear_message_window()
{
    tiles.clear_message_window();
}

void delay(int ms)
{
    tiles.redraw();
    SDL_Delay(ms);
}

void update_screen()
{
    tiles.set_need_redraw();
}

int kbhit()
{
    // Look for the presence of any keyboard events in the queue.
    SDL_Event store;
    SDL_PumpEvents();
    int count = SDL_PeepEvents(&store, 1, SDL_PEEKEVENT,
                               SDL_EVENTMASK(SDL_KEYDOWN));

    // SDL Error?
    ASSERT(count != -1);

    return (count == 1 ? 1 : 0);
}

#ifdef UNIX
int itoa(int value, char *strptr, int radix)
{
    unsigned int bitmask = 32768;
    int ctr = 0;
    int startflag = 0;

    if (radix == 10)
    {
        sprintf(strptr, "%i", value);
    }
    else if (radix == 2)             /* int to "binary string" */
    {
        while (bitmask)
        {
            if (value & bitmask)
            {
                startflag = 1;
                sprintf(strptr + ctr, "1");
            }
            else if (startflag)
            {
                sprintf(strptr + ctr, "0");
            }

            bitmask = bitmask >> 1;
            if (startflag)
                ctr++;
        }

        if (!startflag)         /* Special case if value == 0 */
            sprintf((strptr + ctr++), "0");

        strptr[ctr] = (char) NULL;
    }
    return (0);                /* Me? Fail? Nah. */
}


// Convert string to lowercase.
char *strlwr(char *str)
{
    unsigned int i;

    for (i = 0; i < strlen(str); i++)
        str[i] = tolower(str[i]);

    return (str);
}

#endif // #ifdef UNIX
#endif // #ifdef USE_TILE