Merge branch 'gtk3' of ssh://git.stderr.nl/projects/chimara/chimara into gtk3
authorMarijn van Vliet <w.m.vanvliet@gmail.com>
Sun, 16 Sep 2012 15:50:59 +0000 (17:50 +0200)
committerMarijn van Vliet <w.m.vanvliet@gmail.com>
Sun, 16 Sep 2012 15:50:59 +0000 (17:50 +0200)
1  2 
libchimara/chimara-glk.c

diff --combined libchimara/chimara-glk.c
index ef8e6d5896c2bb367e916fe9224315fe1a24a2b1,1155175fa9a49f965bf07f14ec260bf68d7c43d5..0683572628ef4210e2cb31ccaa83096d3b030e28
@@@ -161,7 -161,6 +161,6 @@@ chimara_glk_init(ChimaraGlk *self
      priv->protect = FALSE;
        priv->styles = g_new0(StyleSet,1);
        priv->glk_styles = g_new0(StyleSet,1);
-       priv->pager_attr_list = pango_attr_list_new();
        priv->final_message = g_strdup("[ The game has finished ]");
        priv->running = FALSE;
      priv->program = NULL;
@@@ -270,8 -269,7 +269,7 @@@ chimara_glk_finalize(GObject *object
        g_hash_table_destroy(priv->styles->text_grid);
        g_hash_table_destroy(priv->glk_styles->text_buffer);
        g_hash_table_destroy(priv->glk_styles->text_grid);
-       pango_attr_list_unref(priv->pager_attr_list);
-       
      /* Free the event queue */
      g_mutex_lock(priv->event_lock);
        g_queue_foreach(priv->event_queue, (GFunc)g_free, NULL);
@@@ -473,92 -471,64 +471,92 @@@ allocate_recurse(winid_t win, GtkAlloca
                 bottom or right area is filled with blanks. */
                GtkAllocation widget_allocation;
                gtk_widget_get_allocation(win->widget, &widget_allocation);
 -              glui32 newwidth = (glui32)(widget_allocation.width / win->unit_width);
 -              glui32 newheight = (glui32)(widget_allocation.height / win->unit_height);
 -              gint line;
 -              GtkTextBuffer *textbuffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) );
 -              GtkTextIter start, end;
 -      
 -              for(line = 0; line < win->height; line++)
 +              glui32 new_width = (glui32)(widget_allocation.width / win->unit_width);
 +              glui32 new_height = (glui32)(widget_allocation.height / win->unit_height);
 +
 +              if(new_width != win->width || new_height != win->height)
                {
 -                      gtk_text_buffer_get_iter_at_line(textbuffer, &start, line);
 -                      /* If this line is going to fall off the bottom, delete it */
 -                      if(line >= newheight)
 -                      {
 -                              end = start;
 -                              gtk_text_iter_forward_to_line_end(&end);
 -                              gtk_text_iter_forward_char(&end);
 -                              gtk_text_buffer_delete(textbuffer, &start, &end);
 -                              break;
 +                      // Window has changed size, trim or expand the textbuffer if necessary.
 +                      GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) );
 +                      GtkTextIter start, end;
 +
 +                      // Add or remove lines
 +                      if(new_height == 0) {
 +                              gtk_text_buffer_get_start_iter(buffer, &start);
 +                              gtk_text_buffer_get_end_iter(buffer, &end);
 +                              gtk_text_buffer_delete(buffer, &start, &end);
                        }
 -                      /* If this line is not long enough, add spaces on the end */
 -                      if(newwidth > win->width)
 +                      else if(new_height < win->height)
                        {
 -                              gchar *spaces = g_strnfill(newwidth - win->width, ' ');
 +                              // Remove surplus lines
 +                              gtk_text_buffer_get_end_iter(buffer, &end);
 +                              gtk_text_buffer_get_iter_at_line(buffer, &start, new_height-1);
                                gtk_text_iter_forward_to_line_end(&start);
 -                              gtk_text_buffer_insert(textbuffer, &start, spaces, -1);
 -                              g_free(spaces);
 +                              gtk_text_buffer_delete(buffer, &start, &end);
 +
                        }
 -                      /* But if it's too long, delete characters from the end */
 -                      else if(newwidth < win->width)
 +                      else if(new_height > win->height)
                        {
 +                              // Add extra lines
 +                              gint lines_to_add = new_height - win->height;
 +                              gtk_text_buffer_get_end_iter(buffer, &end);
 +                              start = end;
 +
 +                              gchar *blanks = g_strnfill(win->width, ' ');
 +                              gchar **blanklines = g_new0(gchar *, lines_to_add + 1);
 +                              int count;
 +                              for(count = 0; count < lines_to_add; count++)
 +                                      blanklines[count] = blanks;
 +                              blanklines[lines_to_add] = NULL;
 +                              gchar *vertical_blanks = g_strjoinv("\n", blanklines);
 +                              g_free(blanklines); 
 +                              g_free(blanks);
 +
 +                              if(win->height > 0) 
 +                                      gtk_text_buffer_insert(buffer, &end, "\n", 1);
 +
 +                              gtk_text_buffer_insert(buffer, &end, vertical_blanks, -1);
 +                      }
 +
 +                      // Trim or expand lines
 +                      if(new_width < win->width) {
 +                              gtk_text_buffer_get_start_iter(buffer, &start);
 +                              end = start;
 +
 +                              gint line;
 +                              for(line = 0; line <= new_height; line++) {
 +                                      // Trim the line
 +                                      gtk_text_iter_forward_cursor_positions(&start, new_width);
 +                                      gtk_text_iter_forward_to_line_end(&end);
 +                                      gtk_text_buffer_delete(buffer, &start, &end);
 +                                      gtk_text_iter_forward_line(&start);
 +                                      end = start;
 +                              }
 +                      } else if(new_width > win->width) {
 +                              gint chars_to_add = new_width - win->width;
 +                              gchar *horizontal_blanks = g_strnfill(chars_to_add, ' ');
 +
 +                              gtk_text_buffer_get_start_iter(buffer, &start);
                                end = start;
 -                              gtk_text_iter_forward_chars(&start, newwidth);
 -                              gtk_text_iter_forward_to_line_end(&end);
 -                              gtk_text_buffer_delete(textbuffer, &start, &end);
 +
 +                              gint line;
 +                              for(line = 0; line <= new_height; line++) {
 +                                      gtk_text_iter_forward_to_line_end(&start);
 +                                      end = start;
 +                                      gint start_offset = gtk_text_iter_get_offset(&start);
 +                                      gtk_text_buffer_insert(buffer, &end, horizontal_blanks, -1);
 +                                      gtk_text_buffer_get_iter_at_offset(buffer, &start, start_offset);
 +                                      gtk_text_iter_forward_line(&start);
 +                                      end = start;
 +                              }
 +
 +                              g_free(horizontal_blanks);
                        }
 -                      /* Note: if the widths are equal, do nothing */
 -              }
 -              /* Add blank lines if there aren't enough lines to fit the new size */
 -              if(newheight > win->height)
 -              {
 -                      gchar *blanks = g_strnfill(win->width, ' ');
 -                  gchar **blanklines = g_new0(gchar *, (newheight - win->height) + 1);
 -                  int count;
 -                  for(count = 0; count < newheight - win->height; count++)
 -                      blanklines[count] = blanks;
 -                  blanklines[newheight - win->height] = NULL;
 -                  gchar *text = g_strjoinv("\n", blanklines);
 -                  g_free(blanklines); /* not g_strfreev() */
 -                  g_free(blanks);
 -                  
 -                      gtk_text_buffer_get_end_iter(textbuffer, &start);
 -                      gtk_text_buffer_insert(textbuffer, &start, "\n", -1);
 -                  gtk_text_buffer_insert(textbuffer, &start, text, -1);
 -                  g_free(text);
                }
        
 -              gboolean arrange = !(win->width == newwidth && win->height == newheight);
 -              win->width = newwidth;
 -              win->height = newheight;
 +              gboolean arrange = !(win->width == new_width && win->height == new_height);
 +              win->width = new_width;
 +              win->height = new_height;
                return arrange? win : NULL;
        }
        
@@@ -1525,28 -1495,6 +1523,6 @@@ chimara_glk_get_tag_names(ChimaraGlk *g
        return style_get_tag_names();
  }
  
- /**
-  * chimara_glk_update_style:
-  * @glk: a #ChimaraGlk widget
-  *
-  * Processes style updates and updates the widget to reflect the new style.
-  * Call this every time you change a property of a #GtkTextTag retrieved by
-  * chimara_glk_get_tag().
-  */
- void
- chimara_glk_update_style(ChimaraGlk *glk)
- {
-       CHIMARA_GLK_USE_PRIVATE(glk, priv);
-       style_update(glk);
-       /* Schedule a redraw */
-       g_mutex_lock(priv->arrange_lock);
-       priv->needs_rearrange = TRUE;
-       priv->ignore_next_arrange_event = TRUE;
-       g_mutex_unlock(priv->arrange_lock);
-       gtk_widget_queue_resize( GTK_WIDGET(priv->self) );
- }
  /**
   * chimara_glk_set_resource_load_callback:
   * @glk: a #ChimaraGlk widget