summaryrefslogtreecommitdiff
path: root/Terminal/main.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-02-10 08:35:01 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-02-10 08:35:01 +0100
commit2cf1dd5b6f10b898f24203c879290d665531a989 (patch)
treee06e872f557e489b2d0fe3cb0ea2302e8a72ef91 /Terminal/main.cpp
parent29f2a22d34554737a67af5b2b2ab8613591383be (diff)
downloadserenity-2cf1dd5b6f10b898f24203c879290d665531a989.zip
Move apps into a top-level Applications/ directory.
Diffstat (limited to 'Terminal/main.cpp')
-rw-r--r--Terminal/main.cpp155
1 files changed, 0 insertions, 155 deletions
diff --git a/Terminal/main.cpp b/Terminal/main.cpp
deleted file mode 100644
index 36cea4a693..0000000000
--- a/Terminal/main.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <SharedGraphics/Font.h>
-#include <SharedGraphics/GraphicsBitmap.h>
-#include <SharedGraphics/Painter.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <LibC/gui.h>
-#include "Terminal.h"
-#include <Kernel/KeyCode.h>
-
-static void make_shell(int ptm_fd)
-{
- pid_t pid = fork();
- if (pid == 0) {
- const char* tty_name = ptsname(ptm_fd);
- if (!tty_name) {
- perror("ptsname");
- exit(1);
- }
- int rc = 0;
- close(ptm_fd);
- int pts_fd = open(tty_name, O_RDWR);
- rc = ioctl(0, TIOCNOTTY);
- if (rc < 0) {
- perror("ioctl(TIOCNOTTY)");
- exit(1);
- }
- close(0);
- close(1);
- close(2);
- dup2(pts_fd, 0);
- dup2(pts_fd, 1);
- dup2(pts_fd, 2);
- close(pts_fd);
- rc = ioctl(0, TIOCSCTTY);
- if (rc < 0) {
- perror("ioctl(TIOCSCTTY)");
- exit(1);
- }
- rc = execvp("/bin/sh", nullptr);
- if (rc < 0) {
- perror("execve");
- exit(1);
- }
- ASSERT_NOT_REACHED();
- }
-}
-
-static int max(int a, int b)
-{
- return a > b ? a : b;
-}
-
-int main(int, char**)
-{
- int ptm_fd = open("/dev/ptmx", O_RDWR);
- if (ptm_fd < 0) {
- perror("open(ptmx)");
- return 1;
- }
-
- make_shell(ptm_fd);
-
- int event_fd = open("/dev/gui_events", O_RDONLY);
- if (event_fd < 0) {
- perror("open");
- return 1;
- }
-
- Terminal terminal;
- terminal.create_window();
- terminal.update();
-
- for (;;) {
- fd_set rfds;
- FD_ZERO(&rfds);
- FD_SET(ptm_fd, &rfds);
- FD_SET(event_fd, &rfds);
- int nfds = select(max(ptm_fd, event_fd) + 1, &rfds, nullptr, nullptr, nullptr);
- if (nfds < 0) {
- dbgprintf("Terminal(%u) select() failed :( errno=%d\n", getpid(), errno);
- return 1;
- }
-
- if (FD_ISSET(ptm_fd, &rfds)) {
- byte buffer[4096];
- ssize_t nread = read(ptm_fd, buffer, sizeof(buffer));
- if (nread < 0) {
- dbgprintf("Terminal read error: %s\n", strerror(errno));
- perror("read(ptm)");
- continue;
- }
- if (nread == 0) {
- dbgprintf("Terminal: EOF on master pty, closing.\n");
- break;
- }
- for (ssize_t i = 0; i < nread; ++i)
- terminal.on_char(buffer[i]);
- terminal.update();
- }
-
- if (FD_ISSET(event_fd, &rfds)) {
- GUI_Event event;
- ssize_t nread = read(event_fd, &event, sizeof(event));
- if (nread < 0) {
- perror("read(event)");
- return 1;
- }
- assert(nread != 0);
- assert(nread == sizeof(event));
-
- if (event.type == GUI_Event::Type::Paint) {
- terminal.paint();
- } else if (event.type == GUI_Event::Type::KeyDown) {
- char ch = event.key.character;
- if (event.key.ctrl) {
- if (ch >= 'a' && ch <= 'z') {
- ch = ch - 'a' + 1;
- } else if (ch == '\\') {
- ch = 0x1c;
- }
- }
- switch (event.key.key) {
- case KeyCode::Key_Up:
- write(ptm_fd, "\033[A", 3);
- break;
- case KeyCode::Key_Down:
- write(ptm_fd, "\033[B", 3);
- break;
- case KeyCode::Key_Right:
- write(ptm_fd, "\033[C", 3);
- break;
- case KeyCode::Key_Left:
- write(ptm_fd, "\033[D", 3);
- break;
- default:
- write(ptm_fd, &ch, 1);
- }
- } else if (event.type == GUI_Event::Type::WindowActivated) {
- terminal.set_in_active_window(true);
- } else if (event.type == GUI_Event::Type::WindowDeactivated) {
- terminal.set_in_active_window(false);
- } else if (event.type == GUI_Event::Type::WindowCloseRequest) {
- return 0;
- }
- }
- }
- return 0;
-}