浏览代码

neercs: create new Term and Pty classes that will contain the real stuff.

master
Sam Hocevar 12 年前
父节点
当前提交
150429f6c8
共有 8 个文件被更改,包括 357 次插入119 次删除
  1. +3
    -0
      neercs/Makefile.am
  2. +5
    -111
      neercs/neercs.cpp
  3. +3
    -8
      neercs/neercs.h
  4. +4
    -0
      neercs/neercs.vcxproj
  5. +140
    -0
      neercs/term/pty.cpp
  6. +25
    -0
      neercs/term/pty.h
  7. +143
    -0
      neercs/term/term.cpp
  8. +34
    -0
      neercs/term/term.h

+ 3
- 0
neercs/Makefile.am 查看文件

@@ -8,6 +8,9 @@ neercs_SOURCES = \
\
$(old_sources) \
\
term/term.cpp term/term.h \
term/pty.cpp term/pty.h \
\
video/render.cpp video/render.h \
video/text-render.cpp video/text-render.h \
video/simple.lolfx \


+ 5
- 111
neercs/neercs.cpp 查看文件

@@ -39,125 +39,23 @@ using namespace lol;
#include "neercs.h"
#include "video/render.h"

#define USE_OLD_NEERCS 0

extern "C"
{
#include "old/neercs.h"
}

Neercs::Neercs(int argc, char **argv)
: m_ready(false),
m_caca(caca_create_canvas(10, 10)),
m_render(new Render(m_caca)),
m_time(0.f)
: m_term(new Term(ivec2(80, 25))),
m_render(new Render(m_term->GetCaca())),
m_ready(false)
{
Ticker::Ref(m_term);
Ticker::Ref(m_render);

#if USE_OLD_NEERCS
m_buf = NULL;
m_screen_list = init_neercs(argc, argv);
if (!m_screen_list)
exit(-1);
m_screen_list->last_key_time = get_us();
#endif
}

int Neercs::hex_color(float r, float g, float b)
{
return ((int)(r * 15.99f) << 8) | ((int)(g * 15.99f) << 4) | (int)(b * 15.99f);
}

void Neercs::TickGame(float seconds)
{
WorldEntity::TickGame(seconds);

#if USE_OLD_NEERCS
mainloop_tick(&m_buf, m_screen_list);
#endif

m_time += seconds;

/* draw something awesome */
int bg_color = 0x222;
int w = caca_get_canvas_width(m_caca);
int h = caca_get_canvas_height(m_caca);

caca_set_color_argb(m_caca, 0xfff, bg_color);
caca_clear_canvas(m_caca);

caca_set_color_argb(m_caca, 0xfff, bg_color);
for(int i = 0; i < h; i++)
{
float a = M_PI / 180 * i * 16 + m_time * 4;
float b = M_PI / 180 * i * 12;
int x = w / 2 - 14 + w / 4 * lol::cos(a) + w / 4 * lol::sin(b);
caca_put_str(m_caca, x, i, "LOL WUT! NEERCS SI TEH RULEZ");
}

caca_set_color_argb(m_caca, 0x444, bg_color);
for(int i = 0; i < w; i++)
{
float a = m_time * 1 + M_PI / 180 * i * 8;
float b = m_time * -2 + M_PI / 180 * i * 5;
int y = h / 2 + h / 4 * lol::cos(a) + h / 4 * lol::sin(b);
caca_set_color_argb(m_caca, hex_color(0.25f + 0.5f / w * i - 0.25f / h * y, 0.25f, 0.25f + 0.25f / w * i + 0.25f / h * y), bg_color);
caca_draw_line(m_caca, i, y - 1, i, y + 1,'%');
}

/* __ _________ ______ ______ ______ ______
/ \/ / __ > __ > __ > ___// ___/ \x0a9
/ / ____/ ____/ __ < <____\___ \
/__/\__/\_______________/ \________________\ */

int logo_x = (w - 46) / 2;
int logo_y = h / 2 - 2;

caca_set_color_argb(m_caca, 0x8ac, bg_color);
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 ), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 )), bg_color);
caca_put_str(m_caca, logo_x + 3, logo_y ,"__ _________ ______ ______ ______ ______");
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 1), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 1)), bg_color);
caca_put_str(m_caca, logo_x + 2, logo_y + 1, "/ \\/ / __ > __ > __ > ___// ___/ \x0a9");
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 2), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 2)), bg_color);
caca_put_str(m_caca, logo_x + 1, logo_y + 2, "/ / ____/ ____/ __ < <____\\___ \\");
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 3), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 3)), bg_color);
caca_put_str(m_caca, logo_x , logo_y + 3, "/__/\\__/\\_______________/ \\________________\\");
caca_set_color_argb(m_caca, 0xdef, bg_color);
caca_put_str(m_caca, logo_x + 5, logo_y + 5, "ALL YOUR TERMINALS ARE BELONG TO US");

caca_set_color_argb(m_caca, 0x666, bg_color);
caca_printf(m_caca, 2, h - 3, "W=%i", w);
caca_printf(m_caca, 2, h - 2, "H=%i", h);

caca_set_color_argb(m_caca, hex_color(0.6f + 0.4f * lol::cos(m_time * 2), 0.2f, 0.2f), bg_color);
caca_put_str(m_caca, w - 12, h - 2, "CACA RULEZ");

/*
_______
/ /|
/______/ |
| | |
| :D | /
|______|/
*/

int lolcube_x = w / 2 - 5 + (w - 10) * lol::cos(m_time / 2);
int lolcube_y = h - 5 - abs ((h - 5) * lol::sin(m_time * 4));

caca_set_color_argb(m_caca, hex_color(0.75f + 0.25f * lol::sin(m_time * 2), 0.75f + 0.25f * lol::cos(m_time * 3), 0.75f + 0.25f * lol::sin(m_time * 5)), bg_color);
caca_put_str(m_caca, lolcube_x + 2, lolcube_y , "_______");
caca_put_str(m_caca, lolcube_x + 1, lolcube_y + 1, "/ /|");
caca_put_str(m_caca, lolcube_x , lolcube_y + 2, "/______/ |");
caca_put_str(m_caca, lolcube_x , lolcube_y + 3, "| | |");
caca_put_str(m_caca, lolcube_x , lolcube_y + 4, "| :D | /");
caca_put_str(m_caca, lolcube_x , lolcube_y + 5, "|______|/");

caca_set_color_argb(m_caca, 0xdef, bg_color);
caca_put_str(m_caca, 0, 0, "rez@lol:~/ sudo -s");
caca_put_str(m_caca, 0, 1, "[sudo] password for rez:");
caca_put_str(m_caca, 0, 2, "root@lol:~/ echo LOL");
caca_put_str(m_caca, 0, 3, "LOL");
caca_put_str(m_caca, 0, 4, "root@lol:~/");
}


@@ -168,11 +66,7 @@ void Neercs::TickDraw(float seconds)

Neercs::~Neercs()
{
#if USE_OLD_NEERCS
free(m_buf);
free_screen_list(m_screen_list);
#endif

Ticker::Unref(m_term);
Ticker::Unref(m_render);
}



+ 3
- 8
neercs/neercs.h 查看文件

@@ -10,6 +10,7 @@
#include <caca.h>

#include "video/render.h"
#include "term/term.h"

extern "C"
{
@@ -24,21 +25,15 @@ public:

char const *GetName() { return "<neercs>"; }

int hex_color(float r, float g, float b);

protected:
virtual void TickGame(float seconds);
virtual void TickDraw(float seconds);

private:
bool m_ready;
caca_canvas_t *m_caca;
Term *m_term;
Render *m_render;
float m_time;

/* Old neercs stuff */
char *m_buf;
struct screen_list *m_screen_list;
bool m_ready;
};

#endif // __NEERCS_H__


+ 4
- 0
neercs/neercs.vcxproj 查看文件

@@ -41,6 +41,8 @@
<ClInclude Include="old\neercs.h" />
<ClInclude Include="old\python\py_module.h" />
<ClInclude Include="old\widgets.h" />
<ClInclude Include="term\pty.h" />
<ClInclude Include="term\term.h" />
<ClInclude Include="video\render.h" />
<ClInclude Include="video\text-render.h" />
</ItemGroup>
@@ -69,6 +71,8 @@
<ClCompile Include="old\term.c" />
<ClCompile Include="old\widgets.c" />
<ClCompile Include="old\wm.cpp" />
<ClInclude Include="term\pty.cpp" />
<ClInclude Include="term\term.cpp" />
<ClCompile Include="video\render.cpp" />
<ClCompile Include="video\text-render.cpp" />
</ItemGroup>


+ 140
- 0
neercs/term/pty.cpp 查看文件

@@ -0,0 +1,140 @@
/*
* neercs console-based window manager
* Copyright (c) 2006-2012 Sam Hocevar <sam@hocevar.net>
* All Rights Reserved
*
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#if defined HAVE_CONFIG_H
# include "config.h"
#endif

#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
# define _XOPEN_SOURCE
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
# include <sys/ioctl.h>
# include <sys/types.h>
# include <termios.h>
# if defined HAVE_PTY_H
# include <pty.h> /* for openpty and forkpty */
# elif defined HAVE_UTIL_H
# include <util.h> /* for OS X, OpenBSD and NetBSD */
# elif defined HAVE_LIBUTIL_H
# include <libutil.h> /* for FreeBSD */
# endif
# include <unistd.h>
# include <fcntl.h>
#endif

#include "core.h"
#include "loldebug.h"

using namespace std;
using namespace lol;

#include "neercs.h"

Pty::Pty(ivec2 size)
: m_size(size)
{
;
}

Pty::~Pty()
{

}

void Pty::Run(char const *command)
{
#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
int fd;
pid_t pid;

m_pid = 0;
m_fd = 0;

pid = forkpty(&fd, NULL, NULL, NULL);
if (pid < 0)
{
fprintf(stderr, "forkpty() error\n");
return;
}
else if (pid == 0)
{
SetWindowSize(m_size);

/* putenv() eats the string, they need to be writable */
static char tmp1[] = "CACA_DRIVER=slang";
static char tmp2[] = "TERM=xterm";
putenv(tmp1);
putenv(tmp2);

m_argv[0] = command;
m_argv[1] = NULL;
/* The following const cast is valid. The Open Group Base
* Specification guarantees that the objects are completely
* constant. */
execvp(command, const_cast<char * const *>(m_argv));
fprintf(stderr, "execvp() error\n");
return;
}

fcntl(fd, F_SETFL, O_NDELAY);

m_pid = pid;
m_fd = fd;
#endif
}

void Pty::SetWindowSize(ivec2 size)
{
#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
m_size = size;

struct winsize ws;

memset(&ws, 0, sizeof(ws));
ws.ws_row = size.y;
ws.ws_col = size.x;
ioctl((int)m_fd, TIOCSWINSZ, (char *)&ws);
#endif
}

#if 0
int update_terms(struct screen_list *screen_list)
{
int i, refresh = 0;
for (i = 0; i < screen_list->count; i++)
{
if (screen_list->screen[i]->total && !screen_list->dont_update_coords)
{
unsigned long int bytes;

bytes = import_term(screen_list,
screen_list->screen[i],
screen_list->screen[i]->buf,
screen_list->screen[i]->total);

if (bytes > 0)
{
screen_list->screen[i]->total -= bytes;
memmove(screen_list->screen[i]->buf,
screen_list->screen[i]->buf + bytes,
screen_list->screen[i]->total);
if (screen_list->screen[i]->visible || screen_list->modals.mini)
refresh = 1;
}
}
}
return refresh;
}
#endif


+ 25
- 0
neercs/term/pty.h 查看文件

@@ -0,0 +1,25 @@
//
// Neercs
//

#if !defined __TERM_PTY_H__
#define __TERM_PTY_H__

class Pty
{
public:
Pty(ivec2 size);
~Pty();

void Run(char const *command);
void SetWindowSize(ivec2 size);

private:
uint64_t m_fd;
uint64_t m_pid;
char const *m_argv[2];
ivec2 m_size;
};

#endif // __TERM_PTY_H__


+ 143
- 0
neercs/term/term.cpp 查看文件

@@ -0,0 +1,143 @@
//
// Neercs
//

#if defined HAVE_CONFIG_H
# include "config.h"
#endif

#include "core.h"
#include "lolgl.h"

using namespace std;
using namespace lol;

#include "../neercs.h"
#include "term.h"

Term::Term(ivec2 size)
: m_time(0.f)
{
m_caca = caca_create_canvas(size.x, size.y);
}

void Term::TickGame(float seconds)
{
Entity::TickGame(seconds);

#if defined HAVE_PTY_H || defined HAVE_UTIL_H || defined HAVE_LIBUTIL_H
/* This is the real terminal code */
/* XXX: for now we draw fancy shit */
m_time += seconds;
DrawFancyShit();
#else
/* Unsupported platform - draw some fancy shit instead */
m_time += seconds;
DrawFancyShit();
#endif
}

void Term::TickDraw(float seconds)
{
Entity::TickDraw(seconds);
}

Term::~Term()
{
}

/*
* XXX: fancy shit below
*/

static uint32_t hex_color(float r, float g, float b)
{
return ((uint32_t)(r * 15.99f) << 8) |
((uint32_t)(g * 15.99f) << 4) |
(uint32_t)(b * 15.99f);
}

void Term::DrawFancyShit()
{
/* draw something awesome */
int bg_color = 0x222;
int w = caca_get_canvas_width(m_caca);
int h = caca_get_canvas_height(m_caca);

caca_set_color_argb(m_caca, 0xfff, bg_color);
caca_clear_canvas(m_caca);

caca_set_color_argb(m_caca, 0xfff, bg_color);
for(int i = 0; i < h; i++)
{
float a = M_PI / 180 * i * 16 + m_time * 4;
float b = M_PI / 180 * i * 12;
int x = w / 2 - 14 + w / 4 * lol::cos(a) + w / 4 * lol::sin(b);
caca_put_str(m_caca, x, i, "LOL WUT! NEERCS SI TEH RULEZ");
}

caca_set_color_argb(m_caca, 0x444, bg_color);
for(int i = 0; i < w; i++)
{
float a = m_time * 1 + M_PI / 180 * i * 8;
float b = m_time * -2 + M_PI / 180 * i * 5;
int y = h / 2 + h / 4 * lol::cos(a) + h / 4 * lol::sin(b);
caca_set_color_argb(m_caca, hex_color(0.25f + 0.5f / w * i - 0.25f / h * y, 0.25f, 0.25f + 0.25f / w * i + 0.25f / h * y), bg_color);
caca_draw_line(m_caca, i, y - 1, i, y + 1,'%');
}

/* __ _________ ______ ______ ______ ______
/ \/ / __ > __ > __ > ___// ___/ \x0a9
/ / ____/ ____/ __ < <____\___ \
/__/\__/\_______________/ \________________\ */

int logo_x = (w - 46) / 2;
int logo_y = h / 2 - 2;

caca_set_color_argb(m_caca, 0x8ac, bg_color);
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 ), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 )), bg_color);
caca_put_str(m_caca, logo_x + 3, logo_y ,"__ _________ ______ ______ ______ ______");
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 1), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 1)), bg_color);
caca_put_str(m_caca, logo_x + 2, logo_y + 1, "/ \\/ / __ > __ > __ > ___// ___/ \x0a9");
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 2), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 2)), bg_color);
caca_put_str(m_caca, logo_x + 1, logo_y + 2, "/ / ____/ ____/ __ < <____\\___ \\");
//caca_set_color_argb(m_caca, hex_color(0.5f + 0.5f * lol::cos(m_time * 3 + M_PI / 4 * 3), 0.5f, 0.5f + 0.25f * lol::sin(m_time * 3 + M_PI / 4 * 3)), bg_color);
caca_put_str(m_caca, logo_x , logo_y + 3, "/__/\\__/\\_______________/ \\________________\\");
caca_set_color_argb(m_caca, 0xdef, bg_color);
caca_put_str(m_caca, logo_x + 5, logo_y + 5, "ALL YOUR TERMINALS ARE BELONG TO US");

caca_set_color_argb(m_caca, 0x666, bg_color);
caca_printf(m_caca, 2, h - 3, "W=%i", w);
caca_printf(m_caca, 2, h - 2, "H=%i", h);

caca_set_color_argb(m_caca, hex_color(0.6f + 0.4f * lol::cos(m_time * 2), 0.2f, 0.2f), bg_color);
caca_put_str(m_caca, w - 12, h - 2, "CACA RULEZ");

/*
_______
/ /|
/______/ |
| | |
| :D | /
|______|/
*/

int lolcube_x = w / 2 - 5 + (w - 10) * lol::cos(m_time / 2);
int lolcube_y = h - 5 - abs ((h - 5) * lol::sin(m_time * 4));

caca_set_color_argb(m_caca, hex_color(0.75f + 0.25f * lol::sin(m_time * 2), 0.75f + 0.25f * lol::cos(m_time * 3), 0.75f + 0.25f * lol::sin(m_time * 5)), bg_color);
caca_put_str(m_caca, lolcube_x + 2, lolcube_y , "_______");
caca_put_str(m_caca, lolcube_x + 1, lolcube_y + 1, "/ /|");
caca_put_str(m_caca, lolcube_x , lolcube_y + 2, "/______/ |");
caca_put_str(m_caca, lolcube_x , lolcube_y + 3, "| | |");
caca_put_str(m_caca, lolcube_x , lolcube_y + 4, "| :D | /");
caca_put_str(m_caca, lolcube_x , lolcube_y + 5, "|______|/");

caca_set_color_argb(m_caca, 0xdef, bg_color);
caca_put_str(m_caca, 0, 0, "rez@lol:~/ sudo -s");
caca_put_str(m_caca, 0, 1, "[sudo] password for rez:");
caca_put_str(m_caca, 0, 2, "root@lol:~/ echo LOL");
caca_put_str(m_caca, 0, 3, "LOL");
caca_put_str(m_caca, 0, 4, "root@lol:~/");
}


+ 34
- 0
neercs/term/term.h 查看文件

@@ -0,0 +1,34 @@
//
// Neercs
//

#if !defined __TERM_TERM_H__
#define __TERM_TERM_H__

#include "term/pty.h"

class Term : public Entity
{
public:
Term(ivec2 size);
~Term();

char const *GetName() { return "<term>"; }
caca_canvas_t *GetCaca() { return m_caca; }

protected:
virtual void TickGame(float seconds);
virtual void TickDraw(float seconds);

private:
Pty *m_pty;
caca_canvas_t *m_caca;
ivec2 m_size;

/* Mostly for fancy shit */
void DrawFancyShit();
float m_time;
};

#endif // __TERM_TERM_H__


正在加载...
取消
保存