@@ -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 \ | |||
@@ -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); | |||
} | |||
@@ -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__ | |||
@@ -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> | |||
@@ -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 | |||
@@ -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__ | |||
@@ -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:~/"); | |||
} | |||
@@ -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__ | |||