GUAC-653: Implement render_frame function.
This commit is contained in:
parent
81229d9fe4
commit
470dc67c34
@ -23,10 +23,8 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "client.h"
|
||||
#include "clipboard.h"
|
||||
#include "common.h"
|
||||
#include "cursor.h"
|
||||
#include "guac_handlers.h"
|
||||
#include "terminal.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
@ -44,56 +42,7 @@
|
||||
int ssh_guac_client_handle_messages(guac_client* client) {
|
||||
|
||||
ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data;
|
||||
char buffer[8192];
|
||||
|
||||
int ret_val;
|
||||
int fd = client_data->term->stdout_pipe_fd[0];
|
||||
struct timeval timeout;
|
||||
fd_set fds;
|
||||
|
||||
/* Build fd_set */
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd, &fds);
|
||||
|
||||
/* Time to wait */
|
||||
timeout.tv_sec = 1;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
/* Wait for data to be available */
|
||||
ret_val = select(fd+1, &fds, NULL, NULL, &timeout);
|
||||
if (ret_val > 0) {
|
||||
|
||||
int bytes_read = 0;
|
||||
|
||||
guac_terminal_lock(client_data->term);
|
||||
|
||||
/* Read data, write to terminal */
|
||||
if ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
|
||||
|
||||
if (guac_terminal_write(client_data->term, buffer, bytes_read)) {
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error writing data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Notify on error */
|
||||
if (bytes_read < 0) {
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error reading data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Flush terminal */
|
||||
guac_terminal_flush(client_data->term);
|
||||
guac_terminal_unlock(client_data->term);
|
||||
|
||||
}
|
||||
else if (ret_val < 0) {
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error waiting for data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return guac_terminal_render_frame(client_data->term);
|
||||
|
||||
}
|
||||
|
||||
@ -103,10 +52,7 @@ int ssh_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) {
|
||||
guac_terminal* term = client_data->term;
|
||||
|
||||
/* Send mouse event */
|
||||
guac_terminal_lock(term);
|
||||
guac_terminal_send_mouse(term, x, y, mask);
|
||||
guac_terminal_unlock(term);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
@ -117,10 +63,7 @@ int ssh_guac_client_key_handler(guac_client* client, int keysym, int pressed) {
|
||||
guac_terminal* term = client_data->term;
|
||||
|
||||
/* Send key */
|
||||
guac_terminal_lock(term);
|
||||
guac_terminal_send_key(term, keysym, pressed);
|
||||
guac_terminal_unlock(term);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
@ -132,9 +75,7 @@ int ssh_guac_client_size_handler(guac_client* client, int width, int height) {
|
||||
guac_terminal* terminal = guac_client_data->term;
|
||||
|
||||
/* Resize terminal */
|
||||
guac_terminal_lock(terminal);
|
||||
guac_terminal_resize(terminal, width, height);
|
||||
guac_terminal_unlock(terminal);
|
||||
|
||||
/* Update SSH pty size if connected */
|
||||
if (guac_client_data->term_channel != NULL)
|
||||
|
@ -37,6 +37,8 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/select.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <cairo/cairo.h>
|
||||
#include <guacamole/client.h>
|
||||
@ -193,6 +195,66 @@ void guac_terminal_free(guac_terminal* term) {
|
||||
|
||||
}
|
||||
|
||||
int guac_terminal_render_frame(guac_terminal* terminal) {
|
||||
|
||||
guac_client* client = terminal->client;
|
||||
char buffer[8192];
|
||||
|
||||
int ret_val;
|
||||
int fd = terminal->stdout_pipe_fd[0];
|
||||
struct timeval timeout;
|
||||
fd_set fds;
|
||||
|
||||
/* Build fd_set */
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd, &fds);
|
||||
|
||||
/* Time to wait */
|
||||
timeout.tv_sec = 1;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
/* Wait for data to be available */
|
||||
ret_val = select(fd+1, &fds, NULL, NULL, &timeout);
|
||||
if (ret_val > 0) {
|
||||
|
||||
int bytes_read = 0;
|
||||
|
||||
guac_terminal_lock(terminal);
|
||||
|
||||
/* Read data, write to terminal */
|
||||
if ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
|
||||
|
||||
if (guac_terminal_write(terminal, buffer, bytes_read)) {
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error writing data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Notify on error */
|
||||
if (bytes_read < 0) {
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error reading data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Flush terminal */
|
||||
guac_terminal_flush(terminal);
|
||||
guac_terminal_unlock(terminal);
|
||||
|
||||
}
|
||||
else if (ret_val < 0) {
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error waiting for data");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int guac_terminal_read_input(guac_terminal* terminal, char* c, int size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int guac_terminal_set(guac_terminal* term, int row, int col, int codepoint) {
|
||||
|
||||
/* Build character with current attributes */
|
||||
@ -838,7 +900,7 @@ int guac_terminal_send_string(guac_terminal* term, const char* data) {
|
||||
return guac_terminal_write_all(term->stdin_pipe_fd[1], data, strlen(data));
|
||||
}
|
||||
|
||||
int guac_terminal_send_key(guac_terminal* term, int keysym, int pressed) {
|
||||
static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed) {
|
||||
|
||||
/* Hide mouse cursor if not already hidden */
|
||||
if (term->current_cursor != term->blank_cursor) {
|
||||
@ -970,10 +1032,21 @@ int guac_terminal_send_key(guac_terminal* term, int keysym, int pressed) {
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int guac_terminal_send_key(guac_terminal* term, int keysym, int pressed) {
|
||||
|
||||
int result;
|
||||
|
||||
guac_terminal_lock(term);
|
||||
result = __guac_terminal_send_key(term, keysym, pressed);
|
||||
guac_terminal_unlock(term);
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
int guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask) {
|
||||
static int __guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask) {
|
||||
|
||||
/* Determine which buttons were just released and pressed */
|
||||
int released_mask = term->mouse_mask & ~mask;
|
||||
@ -1043,7 +1116,17 @@ int guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask) {
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int guac_terminal_send_mouse(guac_terminal* term, int x, int y, int mask) {
|
||||
|
||||
int result;
|
||||
|
||||
guac_terminal_lock(term);
|
||||
result = __guac_terminal_send_mouse(term, x, y, mask);
|
||||
guac_terminal_unlock(term);
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
|
@ -304,16 +304,18 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
||||
void guac_terminal_free(guac_terminal* term);
|
||||
|
||||
/**
|
||||
* Acquires exclusive access to the terminal. Note that enforcing this
|
||||
* exclusive access requires that ALL users of the terminal call this
|
||||
* function before making further calls to the terminal.
|
||||
* Renders a single frame of terminal data. If data is not yet available,
|
||||
* this function will block until data is written.
|
||||
*/
|
||||
void guac_terminal_lock(guac_terminal* terminal);
|
||||
int guac_terminal_render_frame(guac_terminal* terminal);
|
||||
|
||||
/**
|
||||
* Releases exclusive access to the terminal.
|
||||
* Reads from this terminal's STDIN. Input comes from key and mouse events
|
||||
* supplied by calls to guac_terminal_send_key() and
|
||||
* guac_terminal_send_mouse(). If input is not yet available, this function
|
||||
* will block.
|
||||
*/
|
||||
void guac_terminal_unlock(guac_terminal* terminal);
|
||||
int guac_terminal_read_input(guac_terminal* terminal, char* c, int size);
|
||||
|
||||
/**
|
||||
* Handles the given key event, sending data, scrolling, pasting clipboard
|
||||
@ -342,6 +344,18 @@ void guac_terminal_clipboard_append(guac_terminal* term, const void* data, int l
|
||||
/* INTERNAL FUNCTIONS */
|
||||
|
||||
|
||||
/**
|
||||
* Acquires exclusive access to the terminal. Note that enforcing this
|
||||
* exclusive access requires that ALL users of the terminal call this
|
||||
* function before making further calls to the terminal.
|
||||
*/
|
||||
void guac_terminal_lock(guac_terminal* terminal);
|
||||
|
||||
/**
|
||||
* Releases exclusive access to the terminal.
|
||||
*/
|
||||
void guac_terminal_unlock(guac_terminal* terminal);
|
||||
|
||||
/**
|
||||
* Resets the state of the given terminal, as if it were just allocated.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user