#include "window.h"
+#include "magic.h"
#include "chimara-glk-private.h"
extern ChimaraGlkPrivate *glk_data;
winid_t
glk_window_iterate(winid_t win, glui32 *rockptr)
{
+ VALID_WINDOW_OR_NULL(win, return NULL);
+
GNode *retnode;
if(win == NULL)
glui32
glk_window_get_rock(winid_t win)
{
- g_return_val_if_fail(win != NULL, 0);
+ VALID_WINDOW(win, return 0);
return win->rock;
}
glui32
glk_window_get_type(winid_t win)
{
- g_return_val_if_fail(win != NULL, 0);
+ VALID_WINDOW(win, return 0);
return win->type;
}
winid_t
glk_window_get_parent(winid_t win)
{
- g_return_val_if_fail(win != NULL, NULL);
+ VALID_WINDOW(win, return NULL);
/* Value will also be NULL if win is the root window */
return (winid_t)win->window_node->parent->data;
}
winid_t
glk_window_get_sibling(winid_t win)
{
- g_return_val_if_fail(win != NULL, NULL);
+ VALID_WINDOW(win, return NULL);
if(G_NODE_IS_ROOT(win->window_node))
return NULL;
glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype,
glui32 rock)
{
- /*
- if(split)
- {
- g_warning("glk_window_open: splitting of windows not implemented");
- return NULL;
- }
- */
+ VALID_WINDOW_OR_NULL(split, return NULL);
if(split == NULL && glk_data->root_window != NULL)
{
- g_warning("glk_window_open: there is already a root window");
+ ILLEGAL("Tried to open a new root window, but there is already a root window");
return NULL;
}
/* We only create one window and don't support any more than that */
winid_t win = g_new0(struct glk_window_struct, 1);
+ win->magic = MAGIC_WINDOW;
win->rock = rock;
win->type = wintype;
win->window_node = g_node_new(win);
gtk_widget_show_all(scrolledwindow);
/* Set the window's font */
- /* TODO: Use Pango to pick out a monospace font on the system */
- PangoFontDescription *font = pango_font_description_from_string("Monospace");
- gtk_widget_modify_font(textview, font);
- pango_font_description_free(font);
+ gtk_widget_modify_font(textview, glk_data->monospace_font_desc);
win->widget = textview;
win->frame = scrolledwindow;
gtk_container_add( GTK_CONTAINER(scrolledwindow), textview );
gtk_widget_show_all(scrolledwindow);
+ /* Set the window's font */
+ gtk_widget_modify_font(textview, glk_data->default_font_desc);
+
win->widget = textview;
win->frame = scrolledwindow;
text_window_get_char_size( textview, &(win->unit_width), &(win->unit_height) );
default:
gdk_threads_leave();
- g_warning("%s: unsupported window type", __func__);
+ ILLEGAL_PARAM("Unknown window type: %u", wintype);
g_free(win);
g_node_destroy(glk_data->root_window);
glk_data->root_window = NULL;
void
glk_window_close(winid_t win, stream_result_t *result)
{
+ VALID_WINDOW(win, return);
+
GNode* parent_node;
- g_return_if_fail(win != NULL);
-
gdk_threads_enter();
switch(win->type)
break;
default:
- g_warning("%s: unsupported window type", __func__);
+ ILLEGAL_PARAM("Unknown window type: %u", win->type);
gdk_threads_leave();
return;
}
glk_data->root_window = parent_node->next;
else if(parent_node->prev)
glk_data->root_window = parent_node->prev;
- } else {
+ }
+ else
+ {
if(parent_node->next)
g_node_append(parent_node->parent, parent_node->next);
else if(parent_node->prev)
}
g_node_destroy(win->window_node);
+ win->magic = MAGIC_FREE;
g_free(win);
gdk_threads_leave();
void
glk_window_clear(winid_t win)
{
- g_return_if_fail(win != NULL);
+ VALID_WINDOW(win, return);
g_return_if_fail(win->input_request_type != INPUT_REQUEST_LINE && win->input_request_type != INPUT_REQUEST_LINE_UNICODE);
switch(win->type)
break;
default:
- g_warning("glk_window_clear: unsupported window type");
+ ILLEGAL_PARAM("Unknown window type: %d", win->type);
}
}
void
glk_set_window(winid_t win)
{
+ VALID_WINDOW_OR_NULL(win, return);
glk_stream_set_current( glk_window_get_stream(win) );
}
*/
strid_t glk_window_get_stream(winid_t win)
{
- g_return_val_if_fail(win != NULL, NULL);
+ VALID_WINDOW(win, return NULL);
return win->window_stream;
}
void
glk_window_set_echo_stream(winid_t win, strid_t str)
{
- g_return_if_fail(win != NULL);
+ VALID_WINDOW(win, return);
+ VALID_STREAM_OR_NULL(str, return);
/* Test for an infinite loop */
strid_t next = str;
{
if(next == win->window_stream)
{
- g_warning("%s: Infinite loop detected", __func__);
+ ILLEGAL("Infinite loop detected");
win->echo_stream = NULL;
return;
}
strid_t
glk_window_get_echo_stream(winid_t win)
{
- g_return_val_if_fail(win != NULL, NULL);
+ VALID_WINDOW(win, return NULL);
return win->echo_stream;
}
void
glk_window_get_size(winid_t win, glui32 *widthptr, glui32 *heightptr)
{
- g_return_if_fail(win != NULL);
+ VALID_WINDOW(win, return);
switch(win->type)
{
break;
default:
- g_warning("glk_window_get_size: Unsupported window type");
+ ILLEGAL_PARAM("Unknown window type: %u", win->type);
}
}
void
glk_window_move_cursor(winid_t win, glui32 xpos, glui32 ypos)
{
- g_return_if_fail(win != NULL);
+ VALID_WINDOW(win, return);
g_return_if_fail(win->type == wintype_TextGrid);
/* Calculate actual position if cursor is moved past the right edge */