#include "gi_dispa.h"
#include "pager.h"
-extern GPrivate *glk_data_key;
+extern GPrivate glk_data_key;
static winid_t
window_new_common(glui32 rock)
{
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
winid_t win = g_new0(struct glk_window_struct, 1);
win->magic = MAGIC_WINDOW;
win->rock = rock;
+ win->librock = g_strdup_printf("%p", win);
if(glk_data->register_obj)
win->disprock = (*glk_data->register_obj)(win, gidisp_Class_Window);
static void
window_close_common(winid_t win, gboolean destroy_node)
{
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
if(glk_data->unregister_obj)
{
g_node_destroy(win->window_node);
win->magic = MAGIC_FREE;
-
+
+ g_free(win->librock);
g_list_foreach(win->history, (GFunc)g_free, NULL);
g_list_free(win->history);
g_slist_free(win->extra_line_terminators);
glk_window_iterate(winid_t win, glui32 *rockptr)
{
VALID_WINDOW_OR_NULL(win, return NULL);
-
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
GNode *retnode;
if(win == NULL)
winid_t
glk_window_get_root()
{
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
if(glk_data->root_window == NULL)
return NULL;
return (winid_t)glk_data->root_window->data;
if(method != (method & (winmethod_DirMask | winmethod_DivisionMask | winmethod_BorderMask)))
WARNING("Unrecognized bits in method constant");
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
if(split == NULL && glk_data->root_window != NULL)
{
ILLEGAL("Tried to open a new root window, but there is already a root window");
}
/* Set the window as a child of the Glk widget, don't trigger an arrange event */
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
glk_data->needs_rearrange = TRUE;
glk_data->ignore_next_arrange_event = TRUE;
- g_mutex_unlock(glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
gtk_widget_set_parent(win->frame, GTK_WIDGET(glk_data->self));
gtk_widget_queue_resize(GTK_WIDGET(glk_data->self));
{
VALID_WINDOW(win, return);
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
gdk_threads_enter(); /* Prevent redraw while we're trashing the window */
/* If any pair windows have this window or its children as a key window,
window_close_common(win, FALSE);
/* Schedule a redraw */
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
glk_data->needs_rearrange = TRUE;
glk_data->ignore_next_arrange_event = TRUE;
- g_mutex_unlock(glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
gtk_widget_queue_resize( GTK_WIDGET(glk_data->self) );
gdk_threads_leave();
}
VALID_WINDOW(win, return);
g_return_if_fail(win->input_request_type != INPUT_REQUEST_LINE && win->input_request_type != INPUT_REQUEST_LINE_UNICODE);
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
switch(win->type)
{
case wintype_Blank:
/* fill the buffer with blanks */
{
/* Wait for the window's size to be updated */
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
if(glk_data->needs_rearrange)
- g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
- g_mutex_unlock(glk_data->arrange_lock);
-
+ g_cond_wait(&glk_data->rearranged, &glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
+
gdk_threads_enter();
/* Manually put newlines at the end of each row of characters in the buffer; manual newlines make resizing the window's grid easier. */
GtkTextIter start, end;
gtk_text_buffer_get_start_iter(textbuffer, &start);
gtk_text_buffer_get_end_iter(textbuffer, &end);
-
- /* Determine default style */
- GtkTextTagTable *tags = gtk_text_buffer_get_tag_table(textbuffer);
- GtkTextTag *default_tag = gtk_text_tag_table_lookup(tags, "default");
- GtkTextTag *style_tag = gtk_text_tag_table_lookup(tags, "normal");
- GtkTextTag *glk_style_tag = gtk_text_tag_table_lookup(tags, "normal");
-
- // Default style
- gtk_text_buffer_apply_tag(textbuffer, default_tag, &start, &end);
-
- // Player's style overrides
- gtk_text_buffer_apply_tag(textbuffer, style_tag, &start, &end);
-
- // GLK Program's style overrides
- gtk_text_buffer_apply_tag(textbuffer, glk_style_tag, &start, &end);
-
- if(win->zcolor != NULL)
- gtk_text_buffer_apply_tag(textbuffer, win->zcolor, &start, &end);
+ style_apply(win, &start, &end);
gtk_text_buffer_move_mark_by_name(textbuffer, "cursor_position", &start);
GtkAllocation allocation;
/* Wait for the window's size to be updated */
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
if(glk_data->needs_rearrange)
- g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
- g_mutex_unlock(glk_data->arrange_lock);
+ g_cond_wait(&glk_data->rearranged, &glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
gdk_threads_enter();
gtk_widget_get_allocation(win->widget, &allocation);
VALID_WINDOW(win, return);
GtkAllocation allocation;
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
switch(win->type)
{
case wintype_Blank:
case wintype_TextGrid:
/* Wait until the window's size is current */
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
if(glk_data->needs_rearrange)
- g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
- g_mutex_unlock(glk_data->arrange_lock);
-
+ g_cond_wait(&glk_data->rearranged, &glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
+
gdk_threads_enter();
gtk_widget_get_allocation(win->widget, &allocation);
/* Cache the width and height */
break;
case wintype_TextBuffer:
- /* Wait until the window's size is current */
- g_mutex_lock(glk_data->arrange_lock);
+ /* Wait until the window's size is current */
+ g_mutex_lock(&glk_data->arrange_lock);
if(glk_data->needs_rearrange)
- g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
- g_mutex_unlock(glk_data->arrange_lock);
-
+ g_cond_wait(&glk_data->rearranged, &glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
+
gdk_threads_enter();
gtk_widget_get_allocation(win->widget, &allocation);
if(widthptr != NULL)
break;
case wintype_Graphics:
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
if(glk_data->needs_rearrange)
- g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
- g_mutex_unlock(glk_data->arrange_lock);
-
+ g_cond_wait(&glk_data->rearranged, &glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
+
gdk_threads_enter();
gtk_widget_get_allocation(win->widget, &allocation);
if(widthptr != NULL)
g_return_if_fail(method == (method & (winmethod_DirMask | winmethod_DivisionMask)));
g_return_if_fail(!(((method & winmethod_DivisionMask) == winmethod_Proportional) && size > 100));
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
win->split_method = method;
win->constraint_size = size;
if(keywin)
/* Tell GTK to rearrange the windows */
gdk_threads_enter();
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
glk_data->needs_rearrange = TRUE;
glk_data->ignore_next_arrange_event = TRUE;
- g_mutex_unlock(glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
gtk_widget_queue_resize(GTK_WIDGET(glk_data->self));
gdk_threads_leave();
}
flush_window_buffer(win);
- ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
/* Wait until the window's size is current */
- g_mutex_lock(glk_data->arrange_lock);
+ g_mutex_lock(&glk_data->arrange_lock);
if(glk_data->needs_rearrange)
- g_cond_wait(glk_data->rearranged, glk_data->arrange_lock);
- g_mutex_unlock(glk_data->arrange_lock);
+ g_cond_wait(&glk_data->rearranged, &glk_data->arrange_lock);
+ g_mutex_unlock(&glk_data->arrange_lock);
/* Don't do anything if the window is shrunk down to nothing */
if(win->width == 0 || win->height == 0)