DELTA 32601 3085 97
SVN  ช
ช   onst ENDREP
DELTA 24999 0 350
SVN  rx
 f  donstENDREP
DELTA 24999 379 175
SVN  kq	 ,  @+onst ENDREP
DELTA 1186 28177 2151
SVN  vฅ?R G  pHด 7 G  A@g G 	 A@y Lt G? HU y qaง G ณ A@f*
#ifdef HAVE_CONFIG_H
#include <fc_config.h>
#endif
/* utility */
#include "fcintl.h"
#include "log.h"
#include "mem.h"
#include "shared.h"
#include "support.h"

/* common */
#include "packets.h"

/* client */
#include "climisc.h"

/* client/gui-xaw */
#include "gui_main.h"
#include "gui_stuff.h"

#include "chatline.h"

****
...
*********/
void chatline_key_send(Widget w)
{
  String theinput;
  String empty="";

  XtVaGetValues(w, XtNstring, &theinput, NULL);
  
  if(*theinput) {
    send_chat(theinput);
  }

  XtVaSetValues(w, XtNstring, empty, NULL);
}

****
  Appends the string to the chat output window.  The string should be
  inserted on its own line, although it will have no newline.
*********/
void real_output_window_append(const char *astring,
                               const struct text_tag_list *tags,
                               int conn_id)
{
  /* this is properly a bad way to append to a text widget. Using the 
   *  *  * I'll replace this widget with a widget supportting hyperlinks later, so
   * leth's forget the problem.
   *
   * There seems to be an Xaw problem with doing both wrap and scroll:
   * its supposed to automatically scroll to end when we change the insertion
   * point, but if a line is wrapped the scroll lags behind a line, and
   * stays behind on subsequent additions, until the too-long line scrolls
   * off the top.  (I tried setting the insert position to the last char,
   * instead of the start of line as below, but that didn't help.)  So we
   * split the line ourselves.  I'm just using a fixed length split; should
   * perhaps check and use width of output window (but font size?)  -dwp
   *
   * Now uses window's font size and width.  Assumes fixed-width font.  --jjm
   */
  String theoutput;
  char *newout, *rmcr, *astring2 = fc_strdup(astring);

  XtVaGetValues(outputwindow_text, XtNstring, &theoutput, NULL);
  newout=fc_malloc(strlen(astring2)+strlen(theoutput)+2);
  sprintf(newout, "%s\n%s", theoutput, astring2  free(astring2
  String theoutput;

  XtVaGetValues(outputwindow_text, XtNstring, &theoutput, NULL);
  write_chatline_content(theoutput_("Cleared output window."), NULL);
}

****
  Got version message from metaserver thread.
*********/
void version_message(const char *vertext)
{
  output_window_append(ftc_client, vertext);
}
ENDREP
DELTA 32601 88578 23
SVN  ฑKฑQ
 w  งUvonst ENDREP
DELTA 31660 563 43
SVN  ลว5* G  F 3UC (xพ x^@ `) ฆs  const char *comment  comment = secfile_lookup_str_default(file, NULL, "version_comment" FOLLOWTAG "' version is '%s'; we have '%s'",
               
      version_message(vertext);
    } else if (comment == NULL)
      version_message(vertext);
    }
  }

  if (comment != NULL) {
    log_verbose("Mesaserver comment about '" FOLLOWTAG "': %s", comment);
    version_message(commenENDREP
DELTA 4313 12652 1924
SVN  q@:ุy 8 h G ฒ J T G ซ J O G ฝ J R G W J  G ฎ J  G A J I G  J e G t J b G s J a G ฅ J  G ฎ J  G [ J F G  J  G  J . G ถ J ? G ฒ J _ G ฒ J l G ฝ J S G ฒ J ก< G 	 J ? h_จ J ~ G M tข J k G ฟ J  G % J W G 	 J  G  J  G D J w G จ J  G ฌ J 5 G ฏ J  G  J   G  J z G = J  G พ J  G ง J ฏ` G บ J @ G ณ J Yl
#ifdef HAVE_CONFIG_H
#include <fc_config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <gdk/gdkkeysyms.h>

/* utility */
#include "fcintl.h"
#include "genlist.h"
#include "log.h"
#include "mem.h"
#include "support.h"

/* common */
#include "chat.h"
#include "featured_text.h"
#include "game.h"
#include "packets.h"

/* client */
#include "client_main.h"
#include "climap.h"
#include "control.h"
#include "mapview_common.h"

/* gui-gtk-2.0 */
#include "colors.h"
#include "gui_main.h"
#include "gui_stuff.h"
#include "pages.h"

#include "chatline.h"

#define	MAX_CHATLINE_HISTORY 20

static struct genlist *history_list = NULL;
static int history_pos = -1;

static struct inputline_toolkit {
  GtkWidget *main_widget;
  GtkWidget *entry;
  GtkWidget *button_box;
  GtkWidget *toolbar;
  GtkWidget *toggle_button;
  bool toolbar_displayed;
} toolkit;      /* Singleton. */

static void inputline_make_tag(GtkEntry *entry, enum text_tag_type type);

****
  Returns TRUE iff the input line has focus.
/
bool inputline_has_focus(void)
{
  return GTK_WIDGET_HAS_FOCUS(toolkit.entry);
}

****
  Gives the focus to the intput line.
/
void inputline_grab_focus(void)
{
  gtk_widget_grab_focus(toolkit.entry);
}

****
  Returns TRUE iff the input line is currently visible.
/
bool inputline_is_visible(void)
{
  return GTK_WIDGET_MAPPED(toolkit.entry);
}

****
  Helper function to determine if a given client input line is intended as
  a "plain" public message. Note that messages prefixed with : are a
  special case (explicit public messages), and will return FALSE.
/
static bool is_plain_public_message(const char *s)
{
  const char *p;

  /* If it is a server command or an explicit ally
   * message, then it is not a public message. */
  if (s[0] == SERVER_COMMAND_PREFIX || s[0] == CHAT_ALLIES_PREFIX) {
    return FALSE;
  }

  /* It might be a private message of the form
   *   'player name with spaces':the message
   * or with ". So skip past the player name part. */
  if (s[0] == '\'' || s[0] == '"') {
    p = strchr(s + 1, s[0]);
  } else {
    p = s;
  }

  /* Now we just need to check that it is not a private
   * message. If we encounter a space then the preceeding
   * text could not have been a user/player name (the
   * quote check above eliminated names with spaces) so
   * it must be a public message. Otherwise if we encounter
   * the message prefix : then the text parsed up until now
   * was a player/user name and the line is intended as
   * a private message (or explicit public message if the
   * first character is :). */
  while (p != NULL && *p != '\0') {
    if (fc_isspace(*p)) {
      return TRUE;
    } else if (*p == CHAT_DIRECT_PREFIX) {
      return FALSE;
    }
    p++;
  }
  return TRUE;
}


****
  Called when the return key is pressed.
/
static void inputline_return(GtkEntry *w, gpointer data)
{
  const char *theinput;

  theinput = gtk_entry_get_text(w);
  
  if (*theinput) {
    if (client_state() == C_S_RUNNING
        && gui_options.gui_gtk2_allied_chat_only
        && is_plain_public_message(theinput)) {
      char buf[MAX_LEN_MSG];

      fc_snprintf(buf, sizeof(buf), ". %s", theinput);
      send_chat(buf);
    } else {
      send_chat(theinput);
    }

    if (genlist_size(history_list) >= MAX_CHATLINE_HISTORY) {
      void *history_data;

      history_data = genlist_get(history_list, -1);
      genlist_remove(history_list, history_data);
      free(history_data);
    }

    genlist_prepend(history_list, fc_strdup(theinput));
    history_pos=-1;
  }

  gtk_entry_set_text(w, "");
}

****
  Returns the name of player or user, set in the same list.
/
static const char *get_player_or_user_name(int id)
{
  size_t size = conn_list_size(game.all_connections);

  if (id < size) {
    return conn_list_get(game.all_connections, id)->username;
  } else {
    struct player *pplayer = player_by_number(id - size);
    if (pplayer) {
      return pplayer->name;
    } else {
      /* Empty slot. Relies on being used with comparison function
       * which can cope with NULL. */
      return NULL;
    }
  }
}

****
  Find a player or a user by prefix.

  prefix - The prefix.
  matches - A string array to set the matches result.
  max_matches - The maximum of matches.
  match_len - The length of the string used to returns matches.

  Returns the number of the matches names.
/
static int check_player_or_user_name(const char *prefix,
                                     const char **matches,
                                     const int max_matches)
{
  int matches_id[max_matches * 2], ind, num;

  switch (match_prefix_full(get_player_or_user_name,
                            player_slot_count()
                            + conn_list_size(game.all_connections),
                            MAX_LEN_NAME, fc_strncasecmp, strlen,
                            prefix, &ind, matches_id,
                            max_matches * 2, &num)) {
  case M_PRE_EXACT:
  case M_PRE_ONLY:
    matches[0] = get_player_or_user_name(ind);
    return 1;
  case M_PRE_AMBIGUOUS:
    {
      /* Remove duplications playername/username. */
      const char *name;
      int i, j, c = 0;

      for (i = 0; i < num && c < max_matches; i++) {
        name = get_player_or_user_name(matches_id[i]);
        for (j = 0; j < c; j++) {
          if (0 == fc_strncasecmp(name, matches[j], MAX_LEN_NAME)) {
            break;
          }
        }
        if (j >= c) {
          matches[c++] = name;
        }
      }
      return c;
    }
  case M_PRE_EMPTY:
  case M_PRE_LONG:
  case M_PRE_FAIL:
  case M_PRE_LAST:
    break;
  }

  return 0;
}

****
  Find the larger common prefix.

  prefixes - A list of prefixes.
  num_prefixes - The number of prefixes.
  buf - The buffer to set.
  buf_len - The maximal size of the buffer.

  Returns the length of the common prefix (in characters).
/
static size_t get_common_prefix(const char *const *prefixes,
                                size_t num_prefixes,
                                char *buf, size_t buf_len)
{
  const char *p;
  char *q;
  size_t i;

  fc_strlcpy(buf, prefixes[0], buf_len);
  for (i = 1; i < num_prefixes; i++) {
    for (p = prefixes[i], q = buf; *p != '\0' && *q != '\0';
         p = g_utf8_next_char(p), q = g_utf8_next_char(q)) {
      if (g_unichar_toupper(g_utf8_get_char(p))
          != g_unichar_toupper(g_utf8_get_char(q))) {
        *q = '\0';
        break;
      }
    }
  }

 return g_utf8_strlen(buf, -1);
}

****
  Autocompletes the input line with a player or user name.
  Returns FALSE if there is no string to complete.
/
static bool chatline_autocomplete(GtkEditable *editable)
{
#define MAX_MATCHES 10
  const char *name[MAX_MATCHES];
  char buf[MAX_LEN_NAME * MAX_MATCHES];
  gint pos;
  gchar *chars, *p, *prev;
  int num, i;
  size_t prefix_len;

  /* Part 1: get the string to complete. */
  pos = gtk_editable_get_position(editable);
  chars = gtk_editable_get_chars(editable, 0, pos);

  p = chars + strlen(chars);
  while ((prev = g_utf8_find_prev_char(chars, p))) {
    if (!g_unichar_isalnum(g_utf8_get_char(prev))) {
      break;
    }
    p = prev;
  }
  /* p points to the start of the last word, or the start of the string. */

  prefix_len = g_utf8_strlen(p, -1);
  if (0 == prefix_len) {
    /* Empty: nothing to complete, propagate the event. */
    g_free(chars);
    return FALSE;
  }

  /* Part 2: compare with player and user names. */
  num = check_player_or_user_name(p, name, MAX_MATCHES);
  if (1 == num) {
    gtk_editable_delete_text(editable, pos - prefix_len, pos);
    pos -= prefix_len;
    gtk_editable_insert_text(editable, name[0], strlen(name[0]), &pos);
    gtk_editable_set_position(editable, pos);
    g_free(chars);
    return TRUE;
  } else if (num > 1) {
    if (get_common_prefix(name, num, buf, sizeof(buf)) > prefix_len) {
      gtk_editable_delete_text(editable, pos - prefix_len, pos);
      pos -= prefix_len;
      gtk_editable_insert_text(editable, buf, strlen(buf), &pos);
      gtk_editable_set_position(editable, pos);
    }
    sz_strlcpy(buf, name[0]);
    for (i = 1; i < num; i++) {
      cat_snprintf(buf, sizeof(buf), ", %s", name[i]);
    }
    /* TRANS: comma-separated list of player/user names for completion */
    output_window_printf(ftc_client, _("Suggestions: %s."), buf);
  }

  g_free(chars);
  return TRUE;
}

****
  Called when a key is pressed.
/
static gboolean inputline_handler(GtkWidget *w, GdkEventKey *ev)
{
  if ((ev->state & GDK_CONTROL_MASK)) {
    /* Chatline featured text support. */
    switch (ev->keyval) {
    case GDK_b:
      inputline_make_tag(GTK_ENTRY(w), TTT_BOLD);
      return TRUE;

    case GDK_c:
      inputline_make_tag(GTK_ENTRY(w), TTT_COLOR);
      return TRUE;

    case GDK_i:
      inputline_make_tag(GTK_ENTRY(w), TTT_ITALIC);
      return TRUE;

    case GDK_s:
      inputline_make_tag(GTK_ENTRY(w), TTT_STRIKE);
      return TRUE;

    case GDK_u:
      inputline_make_tag(GTK_ENTRY(w), TTT_UNDERLINE);
      return TRUE;

    default:
      break;
    }

  } else {
    /* Chatline history controls. */
    switch (ev->keyval) {
    case GDK_Up:
      if (history_pos < genlist_size(history_list) - 1) {
        gtk_entry_set_text(GTK_ENTRY(w),
                           genlist_get(history_list, ++history_pos));
        gtk_editable_set_position(GTK_EDITABLE(w), -1);
      }
      return TRUE;

    case GDK_Down:
      if (history_pos >= 0) {
        history_pos--;
      }

      if (history_pos >= 0) {
        gtk_entry_set_text(GTK_ENTRY(w),
                           genlist_get(history_list, history_pos));
      } else {
        gtk_entry_set_text(GTK_ENTRY(w), "");
      }
      gtk_editable_set_position(GTK_EDITABLE(w), -1);
      return TRUE;

    case GDK_Tab:
      if (gui_options.gui_gtk2_chatline_autocompletion) {
        return chatline_autocomplete(GTK_EDITABLE(w));
      }

    default:
      break;
    }
  }

  return FALSE;
}

****
  Make a text tag for the selected text.
/
void inputline_make_tag(GtkEntry *entry, enum text_tag_type type)
{
  char buf[MAX_LEN_MSG];
  GtkEditable *editable = GTK_EDITABLE(entry);
  gint start_pos, end_pos;
  gchar *selection;

  if (!gtk_editable_get_selection_bounds(editable, &start_pos, &end_pos)) {
    /* Let's say the selection starts and ends at the current position. */
    start_pos = end_pos = gtk_editable_get_position(editable);
  }

  selection = gtk_editable_get_chars(editable, start_pos, end_pos);

  if (type == TTT_COLOR) {
    /* Get the color arguments. */
    char fg_color_text[32], bg_color_text[32];
    GdkColor *fg_color = g_object_get_data(G_OBJECT(entry), "fg_color");
    GdkColor *bg_color = g_object_get_data(G_OBJECT(entry), "bg_color");

    if (!fg_color && !bg_color) {
      goto CLEAN_UP;
    }

    color_to_string(fg_color, fg_color_text, sizeof(fg_color_text));
    color_to_string(bg_color, bg_color_text, sizeof(bg_color_text));

    if (0 == featured_text_apply_tag(selection, buf, sizeof(buf),
                                     TTT_COLOR, 0, FT_OFFSET_UNSET,
                                     ft_color_construct(fg_color_text,
                                                        bg_color_text))) {
      goto CLEAN_UP;
    }
  } else if (0 == featured_text_apply_tag(selection, buf, sizeof(buf),
                                          type, 0, FT_OFFSET_UNSET)) {
    goto CLEAN_UP;
  }

  /* Replace the selection. */
  gtk_editable_delete_text(editable, start_pos, end_pos);
  end_pos = start_pos;
  gtk_editable_insert_text(editable, buf, -1, &end_pos);
  gtk_editable_select_region(editable, start_pos, end_pos);

CLEAN_UP:
  g_free(selection);
}

****
  Make a chat link at the current position or make the current selection
  clickable.
/
void inputline_make_chat_link(struct tile *ptile, bool unit)
{
  char buf[MAX_LEN_MSG];
  GtkWidget *entry = toolkit.entry;
  GtkEditable *editable = GTK_EDITABLE(entry);
  gint start_pos, end_pos;
  gchar *chars;
  struct unit *punit;

  /* Get the target. */
  if (unit) {
    punit = find_visible_unit(ptile);
    if (!punit) {
      output_window_append(ftc_client, _("No visible unit on this tile."));
      return;
    }
  } else {
    punit = NULL;
  }

  if (gtk_editable_get_selection_bounds(editable, &start_pos, &end_pos)) {
    /* There is a selection, make it clickable. */
    gpointer target;
    enum text_link_type type;

    chars = gtk_editable_get_chars(editable, start_pos, end_pos);
    if (punit) {
      type = TLT_UNIT;
      target = punit;
    } else if (tile_city(ptile)) {
      type = TLT_CITY;
      target = tile_city(ptile);
    } else {
      type = TLT_TILE;
      target = ptile;
    }

    if (0 != featured_text_apply_tag(chars, buf, sizeof(buf), TTT_LINK,
                                     0, FT_OFFSET_UNSET, type, target)) {
      /* Replace the selection. */
      gtk_editable_delete_text(editable, start_pos, end_pos);
      end_pos = start_pos;
      gtk_editable_insert_text(editable, buf, -1, &end_pos);
      gtk_widget_grab_focus(entry);
      gtk_editable_select_region(editable, start_pos, end_pos);
    }
  } else {
    /* Just insert the link at the current position. */
    start_pos = gtk_editable_get_position(editable);
    end_pos = start_pos;
    chars = gtk_editable_get_chars(editable, MAX(start_pos - 1, 0),
                                   start_pos + 1);
    if (punit) {
      sz_strlcpy(buf, unit_link(punit));
    } else if (tile_city(ptile)) {
      sz_strlcpy(buf, city_link(tile_city(ptile)));
    } else {
      sz_strlcpy(buf, tile_link(ptile));
    }

    if (start_pos > 0 && strlen(chars) > 0 && chars[0] != ' ') {
      /* Maybe insert an extra space. */
      gtk_editable_insert_text(editable, " ", 1, &end_pos);
    }
    gtk_editable_insert_text(editable, buf, -1, &end_pos);
    if (chars[start_pos > 0 ? 1 : 0] != '\0'
        && chars[start_pos > 0 ? 1 : 0] != ' ') {
      /* Maybe insert an extra space. */
      gtk_editable_insert_text(editable, " ", 1, &end_pos);
    }
    gtk_widget_grab_focus(entry);
    gtk_editable_set_position(editable, end_pos);
  }

  g_free(chars);
}

****
  Scroll a textview so that the given mark is visible, but only if the
  scroll window containing the textview is very close to the bottom. The
  text mark 'scroll_target' should probably be the first character of the
  last line in the text buffer.
/
void scroll_if_necessary(GtkTextView *textview, GtkTextMark *scroll_target)
{
  GtkWidget *sw;
  GtkAdjustment *vadj;
  gdouble val, max, upper, page_size;

  fc_assert_ret(textview != NULL);
  fc_assert_ret(scroll_target != NULL);

  sw = gtk_widget_get_parent(GTK_WIDGET(textview));
  fc_assert_ret(sw != NULL);
  fc_assert_ret(GTK_IS_SCROLLED_WINDOW(sw));

  vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw));
  val = gtk_adjustment_get_value(GTK_ADJUSTMENT(vadj));
  g_object_get(G_OBJECT(vadj), "upper", &upper,
               "page-size", &page_size, NULL);
  max = upper - page_size;
  if (max - val < 10.0) {
    gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(textview), scroll_target,
                                 0.0, TRUE, 1.0, 0.0);
  }
}

****
  Click a link.
/
static gboolean event_after(GtkWidget *text_view, GdkEventButton *event)
{
  GtkTextIter start, end, iter;
  GtkTextBuffer *buffer;
  GSList *tags, *tagp;
  gint x, y;
  struct tile *ptile = NULL;

  if (event->type != GDK_BUTTON_RELEASE || event->button != 1) {
    return FALSE;
  }

  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));

  /* We shouldn't follow a link if the user has selected something. */
  gtk_text_buffer_get_selection_bounds(buffer, &start, &end);
  if (gtk_text_iter_get_offset(&start) != gtk_text_iter_get_offset(&end)) {
    return FALSE;
  }

  gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW (text_view), 
                                        GTK_TEXT_WINDOW_WIDGET,
                                        event->x, event->y, &x, &y);

  gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y);

  if ((tags = gtk_text_iter_get_tags(&iter))) {
    for (tagp = tags; tagp; tagp = tagp->next) {
      GtkTextTag *tag = tagp->data;
      enum text_link_type type =
        GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tag), "type"));

      if (type != 0) {
        /* This is a link. */
        int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tag), "id"));
        ptile = NULL;

        /* Real type is type - 1.
         * See comment in apply_text_tag() for g_object_set_data(). */
        type--;

        switch (type) {
        case TLT_CITY:
          {
            struct city *pcity = game_city_by_number(id);

            if (pcity) {
              ptile = client_city_tile(pcity);
            } else {
              output_window_append(ftc_client, _("This city isn't known!"));
            }
          }
          break;
        case TLT_TILE:
          ptile = index_to_tile(id);

          if (!ptile) {
            output_window_append(ftc_client,
                                 _("This tile doesn't exist in this game!"));
          }
          break;
        case TLT_UNIT:
          {
            struct unit *punit = game_unit_by_number(id);

            if (punit) {
              ptile = unit_tile(punit);
            } else {
              output_window_append(ftc_client, _("This unit isn't known!"));
            }
          }
          break;
        }

        if (ptile) {
          center_tile_mapcanvas(ptile);
          link_mark_restore(type, id);
          gtk_widget_grab_focus(GTK_WIDGET(map_canvas));
        }
      }
    }
    g_slist_free(tags);
  }

  return FALSE;
}

****
  Set the "hand" cursor when moving over a link.
/
static void set_cursor_if_appropriate(GtkTextView *text_view, gint x, gint y)
{
  static gboolean hovering_over_link = FALSE;
  static GdkCursor *hand_cursor = NULL;
  static GdkCursor *regular_cursor = NULL;
  GSList *tags, *tagp;
  GtkTextIter iter;
  gboolean hovering = FALSE;

  /* Initialize the cursors. */
  if (!hand_cursor) {
    hand_cursor = gdk_cursor_new_for_display(
        gdk_screen_get_display(gdk_screen_get_default()), GDK_HAND2);
  }
  if (!regular_cursor) {
    regular_cursor = gdk_cursor_new_for_display(
        gdk_screen_get_display(gdk_screen_get_default()), GDK_XTERM);
  }

  gtk_text_view_get_iter_at_location(text_view, &iter, x, y);

  tags = gtk_text_iter_get_tags(&iter);
  for (tagp = tags; tagp; tagp = tagp->next) {
    enum text_link_type type =
      GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tagp->data), "type"));

    if (type != 0) {
      hovering = TRUE;
      break;
    }
  }

  if (hovering != hovering_over_link) {
    hovering_over_link = hovering;

    if (hovering_over_link) {
      gdk_window_set_cursor(gtk_text_view_get_window(text_view,
                                                     GTK_TEXT_WINDOW_TEXT),
                            hand_cursor);
    } else {
      gdk_window_set_cursor(gtk_text_view_get_window(text_view,
                                                     GTK_TEXT_WINDOW_TEXT),
                            regular_cursor);
    }
  }

  if (tags) {
    g_slist_free(tags);
  }
}

****
  Maybe are the mouse is moving over a link.
/
static gboolean motion_notify_event(GtkWidget *text_view,
                                    GdkEventMotion *event)
{
  gint x, y;

  gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), 
                                        GTK_TEXT_WINDOW_WIDGET,
                                        event->x, event->y, &x, &y);
  set_cursor_if_appropriate(GTK_TEXT_VIEW(text_view), x, y);
  gdk_window_get_pointer(text_view->window, NULL, NULL, NULL);

  return FALSE;
}

****
  Maybe are the mouse is moving over a link.
/
static gboolean visibility_notify_event(GtkWidget *text_view,
                                        GdkEventVisibility *event)
{
  gint wx, wy, bx, by;

  gdk_window_get_pointer(text_view->window, &wx, &wy, NULL);
  gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW (text_view), 
                                        GTK_TEXT_WINDOW_WIDGET,
                                        wx, wy, &bx, &by);
  set_cursor_if_appropriate(GTK_TEXT_VIEW(text_view), bx, by);

  return FALSE;
}

****
  Set the appropriate callbacks for the message buffer.
/
void set_message_buffer_view_link_handlers(GtkWidget *view)
{
  g_signal_connect(view, "event-after",
		   G_CALLBACK(event_after), NULL);
  g_signal_connect(view, "motion-notify-event",
		   G_CALLBACK(motion_notify_event), NULL);
  g_signal_connect(view, "visibility-notify-event",
		   G_CALLBACK(visibility_notify_event), NULL);

}

****
  Convert a struct text_tag to a GtkTextTag.
/
void apply_text_tag(const struct text_tag *ptag, GtkTextBuffer *buf,
                    ft_offset_t text_start_offset, const char *text)
{
  static bool initalized = FALSE;
  GtkTextIter start, stop;

  if (!initalized) {
    gtk_text_buffer_create_tag(buf, "bold",
                               "weight", PANGO_WEIGHT_BOLD, NULL);
    gtk_text_buffer_create_tag(buf, "italic",
                               "style", PANGO_STYLE_ITALIC, NULL);
    gtk_text_buffer_create_tag(buf, "strike",
                               "strikethrough", TRUE, NULL);
    gtk_text_buffer_create_tag(buf, "underline",
                               "underline", PANGO_UNDERLINE_SINGLE, NULL);
    initalized = TRUE;
  }

  /* Get the position. */
  /*
   * N.B.: text_tag_*_offset() value is in bytes, so we need to convert it
   * to utf8 character offset.
   */
  gtk_text_buffer_get_iter_at_offset(buf, &start, text_start_offset
                                     + g_utf8_pointer_to_offset(text,
                                     text + text_tag_start_offset(ptag)));
  if (text_tag_stop_offset(ptag) == FT_OFFSET_UNSET) {
    gtk_text_buffer_get_end_iter(buf, &stop);
  } else {
    gtk_text_buffer_get_iter_at_offset(buf, &stop, text_start_offset
                                       + g_utf8_pointer_to_offset(text,
                                       text + text_tag_stop_offset(ptag)));
  }

  switch (text_tag_type(ptag)) {
  case TTT_BOLD:
    gtk_text_buffer_apply_tag_by_name(buf, "bold", &start, &stop);
    break;
  case TTT_ITALIC:
    gtk_text_buffer_apply_tag_by_name(buf, "italic", &start, &stop);
    break;
  case TTT_STRIKE:
    gtk_text_buffer_apply_tag_by_name(buf, "strike", &start, &stop);
    break;
  case TTT_UNDERLINE:
    gtk_text_buffer_apply_tag_by_name(buf, "underline", &start, &stop);
    break;
  case TTT_COLOR:
    {
      /* We have to make a new tag every time. */
      GtkTextTag *tag = NULL;
      GdkColor foreground;
      GdkColor background;

      if (gdk_color_parse(text_tag_color_foreground(ptag), &foreground)) {
        if (gdk_color_parse(text_tag_color_background(ptag),
                            &background)) {
          tag = gtk_text_buffer_create_tag(buf, NULL,
                                           "foreground-gdk", &foreground,
                                           "background-gdk", &background,
                                           NULL);
        } else {
          tag = gtk_text_buffer_create_tag(buf, NULL,
                                           "foreground-gdk", &foreground,
                                           NULL);
        }
      } else if (gdk_color_parse(text_tag_color_background(ptag),
                                 &background)) {
        tag = gtk_text_buffer_create_tag(buf, NULL,
                                         "background-gdk", &background,
                                         NULL);
      }

      if (!tag) {
        break; /* No color. */
      }
      gtk_text_buffer_apply_tag(buf, tag, &start, &stop);
      g_object_unref(G_OBJECT(tag));
    }
    break;
  case TTT_LINK:
    {
      struct color *pcolor = NULL;
      GtkTextTag *tag;

      switch (text_tag_link_type(ptag)) {
      case TLT_CITY:
        pcolor = get_color(tileset, COLOR_MAPVIEW_CITY_LINK);
        break;
      case TLT_TILE:
        pcolor = get_color(tileset, COLOR_MAPVIEW_TILE_LINK);
        break;
      case TLT_UNIT:
        pcolor = get_color(tileset, COLOR_MAPVIEW_UNIT_LINK);
        break;
      }

      if (!pcolor) {
        break; /* Not a valid link type case. */
      }

      tag = gtk_text_buffer_create_tag(buf, NULL, 
                                       "foreground-gdk", &pcolor->color, 
                                       "underline", PANGO_UNDERLINE_SINGLE,
                                       NULL);

      /* Type 0 is reserved for non-link tags.  So, add 1 to the
       * type value. */
      g_object_set_data(G_OBJECT(tag), "type",
                        GINT_TO_POINTER(text_tag_link_type(ptag) + 1));
      g_object_set_data(G_OBJECT(tag), "id",
                        GINT_TO_POINTER(text_tag_link_id(ptag)));
      gtk_text_buffer_apply_tag(buf, tag, &start, &stop);
      g_object_unref(G_OBJECT(tag));
      break;
    }
  }
}

****
  Appends the string to the chat output window.  The string should be
  inserted on its own line, although it will have no newline.
/
void real_output_window_append(const char *astring,
                               const struct text_tag_list *tags,
                               int conn_id)
{
  GtkTextBuffer *buf;
  GtkTextIter iter;
  GtkTextMark *mark;
  ft_offset_t text_start_offset;

  buf = message_buffer;

  if (buf == NULL) {
    log_error("Output when no message buffer: %s", astring);

    return;
  }

  gtk_text_buffer_get_end_iter(buf, &iter);
  gtk_text_buffer_insert(buf, &iter, "\n", -1);
  mark = gtk_text_buffer_create_mark(buf, NULL, &iter, TRUE);

  if (gui_options.gui_gtk2_show_chat_message_time) {
    char timebuf[64];
    time_t now;
    struct tm *now_tm;

    now = time(NULL);
    now_tm = localtime(&now);
    strftime(timebuf, sizeof(timebuf), "[%H:%M:%S] ", now_tm);
    gtk_text_buffer_insert(buf, &iter, timebuf, -1);
  }

  text_start_offset = gtk_text_iter_get_offset(&iter);
  gtk_text_buffer_insert(buf, &iter, astring, -1);
  text_tag_list_iterate(tags, ptag) {
    apply_text_tag(ptag, buf, text_start_offset, astring);
  } text_tag_list_iterate_end;

  if (main_message_area) {
    scroll_if_necessary(GTK_TEXT_VIEW(main_message_area), mark);
  }
  if (start_message_area) {
    scroll_if_necessary(GTK_TEXT_VIEW(start_message_area), mark);
  }
  gtk_text_buffer_delete_mark(buf, mark);

  append_network_statusbar(astring, FALSEoutput_window_* is already here.  --dwp
/
void log_output_window(void)
{
  GtkTextIter start, end;
  gchar *txt;

  gtk_text_buffer_get_bounds(message_buffer, &start, &end);
  txt = gtk_text_buffer_get_text(message_buffer, &start, &end, TRUE);

  write_chatline_content(txt);
  g_free(txt);
}

****
  Clear output window. This does *not* destroy it, or free its resources  Set given text to output window
/
void set_output_window_text(const char *text)
{
  gtk_text_buffer_set_text(message_buffer, text, -1);
}

****
  Returns whether the chatline is scrolled to the bottom.
/
bool chatline_is_scrolled_to_bottom(void)
{
  GtkWidget *sw, *w;
  GtkAdjustment *vadj;
  gdouble val, max, upper, page_size;

  if (get_client_page() == PAGE_GAME) {
    w = GTK_WIDGET(main_message_area);
  } else {
    w = GTK_WIDGET(start_message_area);
  }

  if (w == NULL) {
    return TRUE;
  }

  sw = gtk_widget_get_parent(w);
  vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw));
  val = gtk_adjustment_get_value(GTK_ADJUSTMENT(vadj));
  g_object_get(G_OBJECT(vadj), "upper", &upper,
               "page-size", &page_size, NULL);
  max = upper - page_size;

  /* Approximation. */
  return max - val < 0.00000001;
}

****
  Scrolls the pregame and in-game chat windows all the way to the bottom.

  Why do we do it in such a convuluted fasion rather than calling
  chatline_scroll_to_bottom directly from toplevel_configure?
  Because the widget is not at its final size yet when the configure
  event occurs.
/
static gboolean chatline_scroll_callback(gpointer data)
{
  chatline_scroll_to_bottom(FALSE);     /* Not delayed this time! */

  *((guint *) data) = 0;
  return FALSE;         /* Remove this idle function. */
}

****
  Scrolls the pregame and in-game chat windows all the way to the bottom.
  If delayed is TRUE, it will be done in a idle_callback.
/
void chatline_scroll_to_bottom(bool delayed)
{
  static guint callback_id = 0;

  if (delayed) {
    if (callback_id == 0) {
      callback_id = g_idle_add(chatline_scroll_callback, &callback_id);
    }
  } else if (message_buffer) {
    GtkTextIter end;

    gtk_text_buffer_get_end_iter(message_buffer, &end);

    if (main_message_area) {
      gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(main_message_area),
                                   &end, 0.0, TRUE, 1.0, 0.0);
    }
    if (start_message_area) {
      gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(start_message_area),
                                   &end, 0.0, TRUE, 1.0, 0.0);
    }
  }
}

****
  Tool button clicked.
/
static void make_tag_callback(GtkToolButton *button, gpointer data)
{
  inputline_make_tag(GTK_ENTRY(data),
                     GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button),
                                                       "text_tag_type")));
}

****
  Set the color for an object.  Update the button if not NULL.
/
static void color_set(GObject *object, const gchar *color_target,
                      GdkColor *color, GtkToolButton *button)
{
  GdkColor *current_color = g_object_get_data(object, color_target);
  GdkColormap *colormap = gdk_colormap_get_system();

  if (NULL == color) {
    /* Clears the current color. */
    if (NULL != current_color) {
      gdk_colormap_free_colors(colormap, current_color, 1);
      gdk_color_free(current_color);
      g_object_set_data(object, color_target, NULL);
      if (NULL != button) {
        gtk_tool_button_set_icon_widget(button, NULL);
      }
    }
  } else {
    /* Apply the new color. */
    if (NULL != current_color) {
      /* We already have a GdkColor pointer. */
      gdk_colormap_free_colors(colormap, current_color, 1);
      *current_color = *color;
    } else {
      /* We need to make a GdkColor pointer. */
      current_color = gdk_color_copy(color);
      g_object_set_data(object, color_target, current_color);
    }

    gdk_colormap_alloc_color(colormap, current_color, TRUE, TRUE);
    if (NULL != button) {
      /* Update the button. */
      GdkPixmap *pixmap;
      GtkWidget *image;

      pixmap = gdk_pixmap_new(root_window, 16, 16, -1);
      gdk_gc_set_foreground(fill_bg_gc, current_color);
      gdk_draw_rectangle(pixmap, fill_bg_gc, TRUE, 0, 0, 16, 16);
      image = gtk_image_new_from_pixmap(pixmap, NULL);
      gtk_tool_button_set_icon_widget(button, image);
      gtk_widget_show(image);
      g_object_unref(G_OBJECT(pixmap));
    }
  }
}

****
  Color selection dialog response.
/
static void color_selected(GtkDialog *dialog, gint res, gpointer data)
{
  GtkToolButton *button =
    GTK_TOOL_BUTTON(g_object_get_data(G_OBJECT(dialog), "button"));
  const gchar *color_target =
    g_object_get_data(G_OBJECT(button), "color_target");

  if (res == GTK_RESPONSE_REJECT) {
    /* Clears the current color. */
    color_set(G_OBJECT(data), color_target, NULL, button);
  } else if (res == GTK_RESPONSE_OK) {
    /* Apply the new color. */
    GtkColorSelection *selection =
      GTK_COLOR_SELECTION(g_object_get_data(G_OBJECT(dialog), "selection"));
    GdkColor new_color;

    gtk_color_selection_get_current_color(selection, &new_color);
    color_set(G_OBJECT(data), color_target, &new_color, button);
  }

  gtk_widget_destroy(GTK_WIDGET(dialog));
}

****
  Color selection tool button clicked.
/
static void select_color_callback(GtkToolButton *button, gpointer data)
{
  GtkWidget *dialog, *selection;
  /* "fg_color" or "bg_color". */
  const gchar *color_target = g_object_get_data(G_OBJECT(button),
                                                "color_target");
  GdkColor *current_color = g_object_get_data(G_OBJECT(data), color_target);

  /* TRANS: "text" or "background". */
  gchar *buf = g_strdup_printf(_("Select the %s color"),
              (const char *) g_object_get_data(G_OBJECT(button),
                                               "color_info"));
  dialog = gtk_dialog_new_with_buttons(buf, NULL, GTK_DIALOG_MODAL,
                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                       GTK_STOCK_CLEAR, GTK_RESPONSE_REJECT,
                                       GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
  setup_dialog(dialog, toplevel);
  g_object_set_data(G_OBJECT(dialog), "button", button);
  g_signal_connect(dialog, "response", G_CALLBACK(color_selected), data);

  selection = gtk_color_selection_new();
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), selection,
                     FALSE, FALSE, 0);
  g_object_set_data(G_OBJECT(dialog), "selection", selection);
  if (current_color) {
    gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(selection),
                                          current_color);
  }

  gtk_widget_show_all(dialog);
  g_free(buf);
}

****
  Moves the tool kit to the toolkit view.
/
static gboolean move_toolkit(GtkWidget *toolkit_view, GdkEventExpose *event,
                             gpointer data)
{
  struct inputline_toolkit *ptoolkit = (struct inputline_toolkit *) data;
  GtkWidget *parent = gtk_widget_get_parent(ptoolkit->main_widget);
  GtkWidget *button_box = GTK_WIDGET(g_object_get_data(G_OBJECT(toolkit_view),
                                                       "button_box"));
  GList *list, *iter;

  if (parent) {
    if (parent == toolkit_view) {
      return FALSE;     /* Already owned. */
    }

    /* N.B.: We need to hide/show the toolbar to reset the sensitivity
     * of the tool buttons. */
    if (ptoolkit->toolbar_displayed) {
      gtk_widget_hide(ptoolkit->toolbar);
    }
    gtk_widget_reparent(ptoolkit->main_widget, toolkit_view);
    if (ptoolkit->toolbar_displayed) {
      gtk_widget_show(ptoolkit->toolbar);
    }

    if (!gtk_widget_get_parent(button_box)) {
      /* Attach to the toolkit button_box. */
      gtk_box_pack_end(GTK_BOX(ptoolkit->button_box), button_box,
                       FALSE, FALSE, 0);
    }
    gtk_widget_show_all(ptoolkit->main_widget);

    /* Hide all other buttons boxes. */
    list = gtk_container_get_children(GTK_CONTAINER(ptoolkit->button_box));
    for (iter = list; iter != NULL; iter = g_list_next(iter)) {
      GtkWidget *widget = GTK_WIDGET(iter->data);

      if (widget != button_box) {
        gtk_widget_hide(widget);
      }
    }
    g_list_free(list);

  } else {
    /* First time attached to a parent. */
    gtk_box_pack_start(GTK_BOX(toolkit_view), ptoolkit->main_widget,
                       TRUE, TRUE, 0);
    gtk_box_pack_end(GTK_BOX(ptoolkit->button_box), button_box,
                     FALSE, FALSE, 0);
    gtk_widget_show_all(ptoolkit->main_widget);
  }

  return FALSE;
}

****
  Show/Hide the toolbar.
/
static gboolean set_toolbar_visibility(GtkWidget *w,
                                       GdkEventExpose *event,
                                       gpointer data)
{
  struct inputline_toolkit *ptoolkit = (struct inputline_toolkit *) data;
  GtkToggleButton *button = GTK_TOGGLE_BUTTON(toolkit.toggle_button);

  if (ptoolkit->toolbar_displayed) {
    if (!gtk_toggle_button_get_active(button)) {
      /* button_toggled() will be called and the toolbar shown. */
      gtk_toggle_button_set_active(button, TRUE);
    } else {
      /* Unsure the widget is visible. */
      gtk_widget_show(ptoolkit->toolbar);
    }
  } else {
    if (gtk_toggle_button_get_active(button)) {
      /* button_toggled() will be called and the toolbar hiden. */
      gtk_toggle_button_set_active(button, FALSE);
    } else {
      /* Unsure the widget is visible. */
      gtk_widget_hide(ptoolkit->toolbar);
    }
  }

  return FALSE;
}

****
  Show/Hide the toolbar.
/
static void button_toggled(GtkToggleButton *button, gpointer data)
{
  struct inputline_toolkit *ptoolkit = (struct inputline_toolkit *) data;

  if (gtk_toggle_button_get_active(button)) {
    gtk_widget_show(ptoolkit->toolbar);
    ptoolkit->toolbar_displayed = TRUE;
    if (chatline_is_scrolled_to_bottom()) {
      /* Make sure to be still at the end. */
      chatline_scroll_to_bottom(TRUE);
    }
  } else {
    gtk_widget_hide(ptoolkit->toolbar);
    ptoolkit->toolbar_displayed = FALSE;
  }
}

****
  Returns a new inputline toolkit view widget that can contain the
  inputline.

  This widget has the following datas:
  "button_box": pointer to the GtkHBox where to append buttons.
/
GtkWidget *inputline_toolkit_view_new(void)
{
  GtkWidget *toolkit_view, *bbox;

  /* Main widget. */
  toolkit_view = gtk_vbox_new(FALSE, 0);
  g_signal_connect(toolkit_view, "expose-event",
                   G_CALLBACK(move_toolkit), &toolkit);

  /* Button box. */
  bbox = gtk_hbox_new(FALSE, 12);
  g_object_set_data(G_OBJECT(toolkit_view), "button_box", bbox);

  return toolkit_view;
}

****
  Appends a button to the inputline toolkit view widget.
/
void inputline_toolkit_view_append_button(GtkWidget *toolkit_view,
                                          GtkWidget *button)
{
  gtk_box_pack_start(GTK_BOX(g_object_get_data(G_OBJECT(toolkit_view),
                     "button_box")), button, FALSE, FALSE, 0);
}

****
  Initializes the chatline stuff.
/
void chatline_init(void)
{
  GtkWidget *vbox, *toolbar, *hbox, *button, *entry, *bbox;
  GtkToolItem *item;
  GdkColor color;

  /* Chatline history. */
  if (!history_list) {
    history_list = genlist_new();
    history_pos = -1;
  }

  /* Inputline toolkit. */
  memset(&toolkit, 0, sizeof(toolkit));

  vbox = gtk_vbox_new(FALSE, 2);
  toolkit.main_widget = vbox;
  g_signal_connect(vbox, "expose-event",
                   G_CALLBACK(set_toolbar_visibility), &toolkit);

  entry = gtk_entry_new();
  toolkit.entry = entry;

  /* First line: toolbar */
  toolbar = gtk_toolbar_new();
  gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
  gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), GTK_ICON_SIZE_MENU);
  gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), FALSE);
  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH_HORIZ);
  gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
                              GTK_ORIENTATION_HORIZONTAL);
  toolkit.toolbar = toolbar;

  /* Bold button. */
  item = gtk_tool_button_new_from_stock(GTK_STOCK_BOLD);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "text_tag_type",
                    GINT_TO_POINTER(TTT_BOLD));
  g_signal_connect(item, "clicked", G_CALLBACK(make_tag_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Bold (Ctrl-B)"));

  /* Italic button. */
  item = gtk_tool_button_new_from_stock(GTK_STOCK_ITALIC);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "text_tag_type",
                    GINT_TO_POINTER(TTT_ITALIC));
  g_signal_connect(item, "clicked", G_CALLBACK(make_tag_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Italic (Ctrl-I)"));

  /* Strike button. */
  item = gtk_tool_button_new_from_stock(GTK_STOCK_STRIKETHROUGH);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "text_tag_type",
                    GINT_TO_POINTER(TTT_STRIKE));
  g_signal_connect(item, "clicked", G_CALLBACK(make_tag_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Strikethrough (Ctrl-S)"));

  /* Underline button. */
  item = gtk_tool_button_new_from_stock(GTK_STOCK_UNDERLINE);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "text_tag_type",
                    GINT_TO_POINTER(TTT_UNDERLINE));
  g_signal_connect(item, "clicked", G_CALLBACK(make_tag_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Underline (Ctrl-U)"));

  /* Color button. */
  item = gtk_tool_button_new_from_stock(GTK_STOCK_SELECT_COLOR);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "text_tag_type",
                    GINT_TO_POINTER(TTT_COLOR));
  g_signal_connect(item, "clicked", G_CALLBACK(make_tag_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Color (Ctrl-C)"));

  gtk_toolbar_insert(GTK_TOOLBAR(toolbar),
                     gtk_separator_tool_item_new(), -1);

  /* Foreground selector. */
  item = gtk_tool_button_new(NULL, "");
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "color_target", fc_strdup("fg_color"));
  g_object_set_data(G_OBJECT(item), "color_info",
                    fc_strdup(_("foreground")));
  g_signal_connect(item, "clicked",
                   G_CALLBACK(select_color_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Select the text color"));
  if (gdk_color_parse("#000000", &color)) {
    /* Set default foreground color. */
    color_set(G_OBJECT(entry), "fg_color", &color, GTK_TOOL_BUTTON(item));
  } else {
    log_error("Failed to set the default foreground color.");
  }

  /* Background selector. */
  item = gtk_tool_button_new(NULL, "");
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_object_set_data(G_OBJECT(item), "color_target", fc_strdup("bg_color"));
  g_object_set_data(G_OBJECT(item), "color_info",
                    fc_strdup(_("background")));
  g_signal_connect(item, "clicked",
                   G_CALLBACK(select_color_callback), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item),
                              _("Select the background color"));
  if (gdk_color_parse("#ffffff", &color)) {
    /* Set default background color. */
    color_set(G_OBJECT(entry), "bg_color", &color, GTK_TOOL_BUTTON(item));
  } else {
    log_error("Failed to set the default background color.");
  }

  gtk_toolbar_insert(GTK_TOOLBAR(toolbar),
                     gtk_separator_tool_item_new(), -1);

  /* Return button. */
  item = gtk_tool_button_new_from_stock(GTK_STOCK_OK);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);
  g_signal_connect_swapped(item, "clicked",
                           G_CALLBACK(inputline_return), entry);
  gtk_widget_set_tooltip_text(GTK_WIDGET(item),
                              /* TRANS: "Return" means the return key. */
                              _("Send the chat (Return)"));

  /* Second line */
  hbox = gtk_hbox_new(FALSE, 4);
  gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);

  /* Toggle button. */
  button = gtk_toggle_button_new();
  gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 2);
  gtk_container_add(GTK_CONTAINER(button),
#ifdef GTK_STOCK_EDIT
                    gtk_image_new_from_stock(GTK_STOCK_EDIT,
#else
                    gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,
#endif
                                             GTK_ICON_SIZE_MENU));
  g_signal_connect(button, "toggled", G_CALLBACK(button_toggled), &toolkit);
  gtk_widget_set_tooltip_text(GTK_WIDGET(button), _("Chat tools"));
  toolkit.toggle_button = button;

  /* Entry. */
  gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 2);
  g_signal_connect(entry, "activate", G_CALLBACK(inputline_return), NULL);
  g_signal_connect(entry, "key_press_event",
                   G_CALLBACK(inputline_handler), NULL);

  /* Button box. */
  bbox = gtk_hbox_new(FALSE, 0);
  gtk_box_pack_end(GTK_BOX(hbox), bbox, FALSE, FALSE, 0);
  toolkit.button_box = bbox;
}

****
  Main thread side callback to print version message
/
static gboolean version_message_main_thread(gpointer user_data)
{
  char *vertext = (char *)user_data;

  output_window_append(ftc_client, vertext);

  FC_FREE(vertext);

  return FALSE;
}

****
  Got version message from metaserver thread.
/
void version_message(const char *vertext)
{
  int len = strlen(vertext) + 1;
  char *persistent = fc_malloc(len);

  strncpy(persistent, vertext, len);

  gdk_threads_add_idle(version_message_main_thread, persistentENDREP
DELTA 31054 0 25
SVN  ้้ G  ่H @่O*onst ENDREP
DELTA 33230 724 70
SVN  28 r  Aqonst ENDREP
DELTA 33410 0 295
SVN   h  (gonst ENDREP
DELTA 32601 377 23
SVN  ฎฎ
 M  ฅBLonst ENDREP
DELTA 32403 13415 242
SVN  ๎<๎B ํ}  @ํ|onst ENDREP
id: zw.5qi.r33530/48039
type: file
pred: zw.5qi.r33230/1506
count: 64
text: 33530 3121 44610 50624 bc6bace565ce9468075afe74848ee07e
props: 9577 108867 111 0 d4514082fc7e52be026d3360dec4dcb0
cpath: /branches/S2_6/client/gui-gtk-2.0/chatline.c
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 24
file zu.5ck.r26633/45555
K 15
action_dialog.c
V 25
file 36n.5qv.r33403/12402
K 8
canvas.c
V 24
file 2y6.5qi.r31280/2049
K 8
canvas.h
V 23
file 2y7.0.r10096/14437
K 10
chatline.c
V 24
file zw.5qi.r33530/48039
K 10
chatline.h
V 24
file zx.5ck.r25812/10835
K 15
choice_dialog.c
V 24
file 377.5qi.r30573/1734
K 15
choice_dialog.h
V 24
file 378.5qi.r30573/2009
K 14
citizensinfo.c
V 24
file 6n1.5qi.r29073/5141
K 14
citizensinfo.h
V 26
file 6n2.5ck.r26905/108640
K 9
citydlg.c
V 23
file zy.5qi.r32970/2459
K 9
citydlg.h
V 20
file zz.0.r5493/6351
K 9
cityrep.c
V 25
file 100.5qi.r32722/55979
K 9
cityrep.h
V 25
file 101.5ck.r18101/91562
K 8
cma_fe.c
V 24
file 102.5qi.r32659/4211
K 8
cma_fe.h
V 25
file 103.5ck.r19385/17470
K 8
colors.c
V 25
file 104.5qi.r31094/15064
K 8
colors.h
V 24
file 105.5ck.r16180/3087
K 12
connectdlg.c
V 25
file 106.5ck.r27275/19376
K 12
connectdlg.h
V 25
file 107.5ck.r19154/49180
K 9
dialogs.c
V 25
file 108.5qi.r32488/33813
K 9
dialogs.h
V 25
file 109.5ck.r23882/49527
K 10
diplodlg.c
V 26
file 10a.5qi.r32527/178325
K 10
diplodlg.h
V 23
file 10b.0.r9577/108261
K 9
editgui.c
V 25
file 4ej.5qi.r32601/95250
K 9
editgui.h
V 26
file 4ek.5ck.r26905/109556
K 10
editprop.c
V 24
file 4el.5qi.r33024/1811
K 10
editprop.h
V 25
file 3bj.5cl.r21141/52087
K 9
finddlg.c
V 26
file 10c.5qi.r32527/178600
K 9
finddlg.h
V 22
file 2d0.0.r5989/22356
K 10
gamedlgs.c
V 23
file 10d.5qi.r32598/268
K 10
gamedlgs.h
V 27
file 197j.5ck.r26905/108948
K 9
gotodlg.c
V 26
file 10e.5qi.r32527/178875
K 9
gotodlg.h
V 25
file 10f.5ck.r19505/20989
K 10
graphics.c
V 25
file 10g.5ck.r27004/16510
K 10
graphics.h
V 23
file 10h.5ck.r22525/906
K 12
gtkpixcomm.c
V 25
file 10i.5ck.r19683/48923
K 12
gtkpixcomm.h
V 24
file 10j.5ck.r19779/2644
K 10
gui_main.c
V 24
file 10k.5qi.r32963/4358
K 10
gui_main.h
V 24
file 10l.5qi.r29596/1529
K 11
gui_stuff.c
V 23
file 10m.5qi.r32598/539
K 11
gui_stuff.h
V 25
file 10n.5ck.r20622/22320
K 11
happiness.c
V 25
file 10o.5qi.r29690/64630
K 11
happiness.h
V 23
file 10p.0.r9577/106064
K 9
helpdlg.c
V 23
file 10q.5qi.r31321/112
K 9
helpdlg.h
V 23
file 10r.0.r4313/267882
K 10
inputdlg.c
V 25
file 10s.5ck.r19683/46961
K 10
inputdlg.h
V 24
file 10t.5ck.r19651/6762
K 10
inteldlg.c
V 26
file 10u.5qi.r32527/179146
K 10
inteldlg.h
V 23
file 2d1.0.r9577/108626
K 12
luaconsole.c
V 25
file 75w.5qi.r30211/33517
K 12
luaconsole.h
V 26
file 75x.5ck.r26905/108333
K 9
mapctrl.c
V 25
file 10v.5qi.r30222/65877
K 9
mapctrl.h
V 25
file 10w.5bk.r14157/11089
K 9
mapview.c
V 25
file 10x.5qi.r30904/11411
K 9
mapview.h
V 24
file 10y.5ck.r17351/2736
K 6
menu.c
V 24
file 10z.5qi.r33309/1123
K 6
menu.h
V 25
file 110.5ck.r16067/65085
K 12
messagedlg.c
V 25
file 111.5qi.r29690/65725
K 12
messagedlg.h
V 22
file 2d2.0.r5989/22693
K 12
messagewin.c
V 25
file 112.5qi.r30211/34609
K 12
messagewin.h
V 25
file 113.5ck.r18082/27153
K 11
optiondlg.c
V 24
file 4js.5qi.r30375/2807
K 11
optiondlg.h
V 25
file 114.5ck.r17037/29773
K 7
pages.c
V 24
file 2pi.5qi.r33091/7337
K 7
pages.h
V 24
file 2pj.5ck.r24718/1982
K 8
plrdlg.c
V 24
file 115.5qi.r31191/2604
K 8
plrdlg.h
V 24
file 116.5qi.r31191/2875
K 10
ratesdlg.h
V 22
file 2d3.0.r5989/22018
K 4
rc2c
V 23
file 117.0.r4313/274431
K 10
repodlgs.c
V 26
file 118.5qi.r30061/184239
K 10
repodlgs.h
V 24
file 119.5ck.r18439/2365
K 11
resources.c
V 26
file 11a.5ck.r19259/423360
K 11
resources.h
V 23
file 11b.5ck.r22128/110
K 14
soundset_dlg.c
V 24
file kcq.5qi.r33331/3019
K 14
spaceshipdlg.c
V 25
file 11c.5ck.r23118/25649
K 14
spaceshipdlg.h
V 23
file 11d.0.r9577/110090
K 8
sprite.c
V 24
file 2y8.5qi.r28426/2953
K 8
sprite.h
V 23
file 2y9.0.r10141/29270
K 11
theme_dlg.c
V 25
file 47d.5qi.r30211/35432
K 8
themes.c
V 23
file 34x.5qi.r32105/766
K 13
tileset_dlg.c
V 24
file 45i.5qi.r33331/3294
K 12
unitselect.c
V 26
file 6pa.5qi.r32527/179420
K 12
unitselect.h
V 26
file 6pb.5ck.r26905/107108
K 14
voteinfo_bar.c
V 23
file 4h8.5qi.r30887/128
K 14
voteinfo_bar.h
V 26
file 4h9.5ck.r26905/110792
K 7
wldlg.c
V 24
file 11e.5qi.r32939/2390
K 7
wldlg.h
V 25
file 11f.5ck.r16285/86707
END
ENDREP
id: zs.5qi.r33530/52386
type: dir
pred: zs.5qi.r33403/16776
count: 1922
text: 33530 48313 4060 0 ac648f42541d060f36eba6da91e24edf
props: 11108 11912 79 0 480bb3268560e84c2d6c8376c422c65e
cpath: /branches/S2_6/client/gui-gtk-2.0
copyroot: 27474 /branches/S2_6

id: zw.5qq.r33530/52646
type: file
pred: zw.5qq.r33230/6104
count: 77
text: 33530 47818 30 49848 abc410be496a4bae090992698c9cb269
props: 9577 108867 111 0 d4514082fc7e52be026d3360dec4dcb0
cpath: /branches/S2_6/client/gui-gtk-3.0/chatline.c
copyroot: 19694 /trunk/client/gui-gtk-3.0

PLAIN
K 11
Makefile.am
V 23
file zu.5qq.r33391/3671
K 15
action_dialog.c
V 25
file 36n.5qw.r33403/17035
K 8
canvas.c
V 24
file 2y6.5qq.r31280/6646
K 8
canvas.h
V 23
file 2y7.5qq.r31101/688
K 10
chatline.c
V 24
file zw.5qq.r33530/52646
K 10
chatline.h
V 23
file zx.5g7.r25812/5717
K 15
choice_dialog.c
V 24
file 377.5qq.r31041/5617
K 15
choice_dialog.h
V 24
file 378.5qq.r31041/5904
K 14
citizensinfo.c
V 23
file 6n1.5qq.r29073/647
K 14
citizensinfo.h
V 24
file 6n2.5qq.r31041/6189
K 9
citydlg.c
V 24
file zy.5qq.r33085/30809
K 9
citydlg.h
V 20
file zz.0.r5493/6351
K 9
cityrep.c
V 25
file 100.5qq.r32722/61146
K 9
cityrep.h
V 25
file 101.5ck.r18101/91562
K 8
cma_fe.c
V 24
file 102.5qq.r32659/8810
K 8
cma_fe.h
V 25
file 103.5qq.r28714/21206
K 8
colors.c
V 25
file 104.5qq.r31094/19943
K 8
colors.h
V 25
file 105.5g7.r21920/14399
K 12
connectdlg.c
V 25
file 106.5g7.r27275/44221
K 12
connectdlg.h
V 25
file 107.5ck.r19154/49180
K 9
dialogs.c
V 25
file 108.5qq.r31923/17147
K 9
dialogs.h
V 24
file 109.5qq.r31041/7033
K 10
diplodlg.c
V 26
file 10a.5qq.r32527/184629
K 10
diplodlg.h
V 23
file 10b.0.r9577/108261
K 9
editgui.c
V 25
file 4ej.5qq.r32601/99854
K 9
editgui.h
V 25
file 4ek.5qq.r32578/25898
K 10
editprop.c
V 24
file 4el.5qq.r33024/6414
K 10
editprop.h
V 25
file 3bj.5jh.r21141/57145
K 9
finddlg.c
V 26
file 10c.5qq.r32527/184913
K 9
finddlg.h
V 22
file 2d0.0.r5989/22356
K 10
gamedlgs.c
V 24
file 10d.5qq.r32598/5136
K 10
gamedlgs.h
V 26
file 197l.5g7.r26905/69711
K 9
gotodlg.c
V 26
file 10e.5qq.r32527/185198
K 9
gotodlg.h
V 25
file 10f.5ck.r19505/20989
K 10
graphics.c
V 22
file 10g.5qq.r33231/94
K 10
graphics.h
V 23
file 10h.5qq.r33231/371
K 12
gtkpixcomm.c
V 23
file 10i.5qq.r32003/124
K 12
gtkpixcomm.h
V 23
file 10j.5qq.r32003/405
K 10
gui_main.c
V 23
file 10k.5qq.r33178/405
K 10
gui_main.h
V 24
file 10l.5qq.r31101/2374
K 11
gui_stuff.c
V 24
file 10m.5qq.r32598/5418
K 11
gui_stuff.h
V 24
file 10n.5qq.r32138/1028
K 11
happiness.c
V 25
file 10o.5qq.r33085/31092
K 11
happiness.h
V 25
file 10p.5qq.r33085/31376
K 9
helpdlg.c
V 24
file 10q.5qq.r32138/1309
K 9
helpdlg.h
V 23
file 10r.0.r4313/267882
K 10
inputdlg.c
V 25
file 10s.5g7.r20464/72142
K 10
inputdlg.h
V 24
file 10t.5ck.r19651/6762
K 10
inteldlg.c
V 26
file 10u.5qq.r32527/185481
K 10
inteldlg.h
V 23
file 2d1.0.r9577/108626
K 12
luaconsole.c
V 24
file 76e.5qq.r31041/9003
K 12
luaconsole.h
V 25
file 76f.5g7.r26905/71334
K 9
mapctrl.c
V 23
file 10v.5qq.r32667/512
K 9
mapctrl.h
V 23
file 10w.5g7.r21978/547
K 9
mapview.c
V 25
file 10x.5qq.r30904/16009
K 9
mapview.h
V 24
file 10y.5qq.r31041/9571
K 6
menu.c
V 24
file 10z.5qq.r33309/5721
K 6
menu.h
V 25
file 110.5ck.r16067/65085
K 12
messagedlg.c
V 25
file 111.5qq.r29690/74880
K 12
messagedlg.h
V 22
file 2d2.0.r5989/22693
K 12
messagewin.c
V 25
file 112.5qq.r30211/43433
K 12
messagewin.h
V 25
file 113.5ck.r18082/27153
K 11
optiondlg.c
V 24
file 4js.5qq.r30375/7694
K 11
optiondlg.h
V 25
file 114.5ck.r17037/29773
K 7
pages.c
V 25
file 2pi.5ru.r33091/11936
K 7
pages.h
V 24
file 2pj.5qq.r31041/9855
K 8
plrdlg.c
V 24
file 115.5qq.r31191/7759
K 8
plrdlg.h
V 24
file 116.5qq.r31191/8043
K 10
ratesdlg.h
V 22
file 2d3.0.r5989/22018
K 10
repodlgs.c
V 25
file 118.5qq.r31923/20291
K 10
repodlgs.h
V 24
file 119.5ck.r18439/2365
K 14
soundset_dlg.c
V 24
file cku.5qq.r33331/7891
K 14
spaceshipdlg.c
V 25
file 11c.5qq.r31923/20578
K 14
spaceshipdlg.h
V 23
file 11d.0.r9577/110090
K 8
sprite.c
V 25
file 2y8.5qq.r31041/10980
K 8
sprite.h
V 25
file 2y9.5qq.r31041/11259
K 11
theme_dlg.c
V 25
file 47d.5qq.r30211/44295
K 8
themes.c
V 23
file 34x.5qq.r31139/656
K 13
tileset_dlg.c
V 24
file 45i.5qq.r33331/8177
K 14
transportdlg.c
V 25
file 2gfq.5qq.r33391/3952
K 14
transportdlg.h
V 26
file 2gfs.5qq.r32488/39736
K 12
unitselect.c
V 24
file 6pa.5qq.r33437/1095
K 12
unitselect.h
V 24
file 6pb.5qq.r33437/1379
K 16
unitselunitdlg.c
V 25
file 2gfq.5x0.r33437/1660
K 16
unitselunitdlg.h
V 25
file 2mxt.5qq.r33391/4437
K 14
voteinfo_bar.c
V 25
file 4h8.5qq.r31923/20867
K 14
voteinfo_bar.h
V 25
file 4h9.5g7.r26905/71982
K 7
wldlg.c
V 24
file 11e.5qq.r32939/6993
K 7
wldlg.h
V 25
file 11f.5qq.r31041/11824
END
ENDREP
id: zs.5qq.r33530/57063
type: dir
pred: zs.5qq.r33437/6049
count: 2102
text: 33530 52929 4121 0 2847bff582ef3a6b73a009801189b722
props: 11108 11912 79 0 480bb3268560e84c2d6c8376c422c65e
cpath: /branches/S2_6/client/gui-gtk-3.0
copyroot: 19694 /trunk/client/gui-gtk-3.0

id: 6ii.5qi.r33530/57333
type: file
pred: 6ii.5qi.r33410/325
count: 34
text: 33530 47874 30 17557 1d8723df089c973f9a05db327c59eea7
props: 26905 81666 34 0 25e6c2f7558b7484000d4d090dea5b92
cpath: /branches/S2_6/client/gui-qt/chatline.cpp
copyroot: 27474 /branches/S2_6

id: 6jp.5qi.r33530/57602
type: file
pred: 6jp.5qi.r32601/104721
count: 23
text: 33530 47929 26 5908 20895b57f5326153a10ba7afd972a149
props: 26905 92419 34 0 25e6c2f7558b7484000d4d090dea5b92
cpath: /branches/S2_6/client/gui-qt/qtg_cxxside.h
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 25
file 6if.5ck.r27239/18266
K 10
canvas.cpp
V 22
file 6ig.5qi.r33491/60
K 8
canvas.h
V 25
file 6ih.5ck.r26905/85299
K 12
chatline.cpp
V 25
file 6ii.5qi.r33530/57333
K 10
chatline.h
V 25
file 6ij.5qi.r33254/17308
K 11
citydlg.cpp
V 24
file 6ik.5qi.r33188/5264
K 9
citydlg.h
V 24
file gr2.5qi.r33188/5532
K 11
cityrep.cpp
V 25
file 6il.5qi.r32722/66300
K 9
cityrep.h
V 25
file 6im.5qi.r32722/66570
K 10
colors.cpp
V 25
file 6in.5qi.r31094/24431
K 8
colors.h
V 25
file 6io.5ck.r26905/93658
K 14
connectdlg.cpp
V 24
file 6ip.5qi.r30746/1816
K 12
connectdlg.h
V 25
file 6iq.5ck.r26905/81414
K 11
dialogs.cpp
V 23
file 6ir.5qi.r33500/205
K 9
dialogs.h
V 23
file 6is.5qi.r31325/551
K 12
diplodlg.cpp
V 22
file 6it.5qi.r32215/97
K 10
diplodlg.h
V 23
file 6iu.5qi.r29261/957
K 13
fc_client.cpp
V 23
file 6lc.5qi.r33497/111
K 11
fc_client.h
V 25
file 6ld.5qi.r33422/10846
K 11
finddlg.cpp
V 25
file 6iv.5ck.r26905/79622
K 9
finddlg.h
V 25
file 6iw.5ck.r26905/95148
K 11
gotodlg.cpp
V 26
file 6ix.5qi.r32527/190909
K 9
gotodlg.h
V 25
file 6iy.5ck.r26905/82913
K 12
graphics.cpp
V 24
file 6iz.5ck.r27004/7519
K 10
graphics.h
V 25
file 6j0.5ck.r26905/93360
K 12
gui_main.cpp
V 23
file 6j1.5qi.r33345/223
K 10
gui_main.h
V 24
file oxo.5qi.r30282/6108
K 11
helpdlg.cpp
V 22
file 6j2.5qi.r30983/93
K 9
helpdlg.h
V 24
file 6j3.5qi.r30431/5029
K 12
inteldlg.cpp
V 25
file 6j4.5ck.r26905/88586
K 10
inteldlg.h
V 25
file 6j5.5ck.r26905/94253
K 14
luaconsole.cpp
V 25
file 76c.5ck.r26905/82614
K 12
luaconsole.h
V 25
file 76d.5ck.r26905/89778
K 11
mapctrl.cpp
V 24
file 6j6.5qi.r33287/3043
K 9
mapctrl.h
V 25
file 6j7.5ck.r26905/94551
K 11
mapview.cpp
V 23
file 6j8.5qi.r33497/375
K 9
mapview.h
V 25
file 6j9.5qi.r33196/16038
K 8
menu.cpp
V 23
file 6ja.5qi.r33420/632
K 6
menu.h
V 23
file 6jb.5qi.r33420/891
K 14
messagedlg.cpp
V 25
file 6jc.5ck.r26905/84405
K 12
messagedlg.h
V 25
file 6jd.5ck.r26905/81118
K 14
messagewin.cpp
V 23
file 6je.5qi.r33347/243
K 12
messagewin.h
V 25
file 6jf.5qi.r33254/19446
K 13
optiondlg.cpp
V 25
file 6jg.5qi.r33299/24104
K 11
optiondlg.h
V 24
file 6jh.5qi.r30992/5764
K 9
pages.cpp
V 23
file 6ji.5qi.r33494/100
K 7
pages.h
V 25
file 6jj.5ck.r26905/88888
K 10
plrdlg.cpp
V 26
file 6jk.5qi.r32527/191448
K 8
plrdlg.h
V 25
file 6jl.5qi.r31758/25147
K 15
qtg_cxxside.cpp
V 25
file 6jo.5qi.r32488/45046
K 13
qtg_cxxside.h
V 25
file 6jp.5qi.r33530/57602
K 12
ratesdlg.cpp
V 25
file 6jq.5qi.r31568/14550
K 10
ratesdlg.h
V 25
file 6jr.5ck.r26905/94848
K 12
repodlgs.cpp
V 23
file 6js.5qi.r33228/452
K 10
repodlgs.h
V 23
file 6jt.5qi.r31255/922
K 16
spaceshipdlg.cpp
V 25
file 6ju.5ck.r27443/14318
K 14
spaceshipdlg.h
V 25
file 6jv.5ck.r27443/15080
K 10
sprite.cpp
V 25
file 6jw.5ck.r26905/79322
K 8
sprite.h
V 25
file 6jx.5ck.r26905/84707
K 10
themes.cpp
V 24
file 6jy.5qi.r33285/2046
K 16
voteinfo_bar.cpp
V 25
file 6jz.5ck.r26905/95445
K 14
voteinfo_bar.h
V 24
file 6k0.5ck.r27391/9245
K 9
wldlg.cpp
V 25
file 6k1.5ck.r26905/84106
K 7
wldlg.h
V 25
file 6k2.5ck.r26905/80524
END
ENDREP
id: 6ie.5qi.r33530/60893
type: dir
pred: 6ie.5qi.r33500/3487
count: 509
text: 33530 57874 3006 0 eca20978bb427a43b4c802cc6fa8e3c8
props: 28037 7697 380 0 ea9aeae72ef70d80276d9f2e0c9ac191
cpath: /branches/S2_6/client/gui-qt
copyroot: 27474 /branches/S2_6

id: 16y.5qi.r33530/61148
type: file
pred: 16y.5qi.r31054/72511
count: 71
text: 33530 47760 34 29845 549189e3ce623f8b457c737c9ad3761b
props: 9030 114052 111 0 2a5912525b098cb46a1301ee940f7617
cpath: /branches/S2_6/client/gui-sdl/chatline.c
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 24
file 16u.5ck.r27296/5447
K 15
action_dialog.c
V 25
file 3bn.5r0.r33403/25300
K 11
alphablit.c
V 25
file 3be.5qi.r31054/71706
K 8
canvas.c
V 25
file 39i.5qi.r31280/15483
K 8
canvas.h
V 25
file 39j.5qi.r31054/72244
K 10
chatline.c
V 25
file 16y.5qi.r33530/61148
K 10
chatline.h
V 23
file 16z.5qi.r33323/811
K 9
citydlg.c
V 25
file 170.5qi.r32939/15135
K 9
citydlg.h
V 25
file 171.5qi.r31054/73049
K 9
cityrep.c
V 26
file 172.5qi.r32527/195582
K 9
cityrep.h
V 26
file 173.5ck.r18101/104032
K 8
cma_fe.c
V 26
file 174.5qi.r32527/195855
K 8
cma_fe.h
V 23
file 175.0.r11361/43495
K 8
colors.c
V 25
file 176.5qi.r31094/27972
K 8
colors.h
V 25
file 177.5qi.r31054/74122
K 12
connectdlg.c
V 25
file 178.5qi.r31751/20756
K 12
connectdlg.h
V 23
file 179.0.r12349/45319
K 9
dialogs.c
V 26
file 17a.5qi.r32527/196125
K 9
dialogs.h
V 25
file 17b.5qi.r31054/74935
K 10
diplodlg.c
V 26
file 17c.5qi.r32527/196399
K 10
diplodlg.h
V 22
file 17d.0.r11584/2869
K 9
finddlg.c
V 26
file 17e.5qi.r32527/196671
K 9
finddlg.h
V 20
file 2d8.0.r5991/702
K 9
gotodlg.c
V 26
file 17f.5qi.r32527/196943
K 9
gotodlg.h
V 22
file 17g.0.r6515/58208
K 10
graphics.c
V 25
file 17h.5qi.r31054/76013
K 10
graphics.h
V 25
file 17i.5qi.r31054/76285
K 11
gui_iconv.c
V 25
file 17l.5qi.r31054/76557
K 11
gui_iconv.h
V 25
file 17m.5qi.r31054/76828
K 8
gui_id.h
V 24
file 17n.5qi.r31892/1679
K 10
gui_main.c
V 24
file 17o.5qi.r33479/2225
K 10
gui_main.h
V 25
file 17p.5qi.r31054/77371
K 11
gui_mouse.c
V 25
file 3ca.5qi.r31054/77638
K 11
gui_mouse.h
V 24
file 3cb.0.r12670/112397
K 12
gui_string.c
V 25
file 17r.5qi.r31054/77910
K 12
gui_string.h
V 25
file 17s.5qi.r31054/78182
K 14
gui_tilespec.c
V 25
file 191.5qi.r31054/78456
K 14
gui_tilespec.h
V 25
file 192.5qi.r31054/78730
K 9
helpdlg.c
V 24
file 17z.5qi.r31892/1945
K 9
helpdlg.h
V 24
file 180.5qi.r31892/2214
K 10
inteldlg.c
V 26
file 183.5qi.r32527/197214
K 10
inteldlg.h
V 22
file 2d9.0.r11409/2687
K 12
luaconsole.c
V 26
file 768.5ck.r26905/135274
K 12
luaconsole.h
V 26
file 769.5ck.r26905/135574
K 9
mapctrl.c
V 25
file 184.5qi.r31054/79546
K 9
mapctrl.h
V 25
file 185.5qi.r31054/79813
K 9
mapview.c
V 26
file 186.5qi.r32527/197486
K 9
mapview.h
V 25
file 187.5qi.r31054/80353
K 6
menu.c
V 25
file 188.5qi.r33309/13861
K 6
menu.h
V 25
file 189.5bk.r13856/57405
K 12
messagedlg.c
V 26
file 18a.5ck.r19259/474489
K 12
messagedlg.h
V 22
file 2da.0.r5989/48394
K 12
messagewin.c
V 25
file 18b.5qi.r31054/80888
K 12
messagewin.h
V 25
file 18c.5ck.r18082/39362
K 5
mmx.h
V 23
file 2e1.0.r6286/134429
K 11
optiondlg.c
V 24
file 18d.5qi.r31892/2476
K 11
optiondlg.h
V 24
file 18e.5qi.r28842/9064
K 7
pages.c
V 24
file 2qg.5qi.r33323/1075
K 7
pages.h
V 22
file 2qh.0.r8639/16416
K 8
plrdlg.c
V 25
file 18f.5qi.r31751/21027
K 8
plrdlg.h
V 22
file 18g.0.r6387/81301
K 10
ratesdlg.h
V 22
file 2db.0.r5989/47726
K 10
repodlgs.c
V 24
file 18i.5qi.r30546/2603
K 10
repodlgs.h
V 25
file 18j.5qi.r31054/81696
K 14
spaceshipdlg.c
V 25
file 18m.5qi.r29669/71722
K 14
spaceshipdlg.h
V 23
file 18n.0.r5500/263363
K 8
sprite.c
V 25
file 39k.5qi.r31054/81968
K 8
sprite.h
V 24
file 39l.5ck.r19390/3772
K 18
themebackgrounds.c
V 26
file 3ff.5ck.r19259/465848
K 18
themebackgrounds.h
V 25
file 3fg.5qi.r31054/82239
K 13
themecolors.c
V 25
file 392.5ck.r20963/49888
K 13
themecolors.h
V 25
file 393.5ck.r20963/50401
K 8
themes.c
V 25
file 38p.5qi.r30211/55369
K 11
themespec.c
V 25
file 390.5qi.r33331/12763
K 11
themespec.h
V 24
file 391.5qi.r29984/1503
K 11
unistring.c
V 25
file 18o.5qi.r31054/82517
K 11
unistring.h
V 25
file 18p.5qi.r31054/82788
K 14
voteinfo_bar.c
V 26
file 4ha.5ck.r26905/134055
K 14
voteinfo_bar.h
V 26
file 4hb.5ck.r26905/134357
K 8
widget.c
V 25
file 3fu.5qi.r31054/83058
K 8
widget.h
V 25
file 3fv.5qi.r29669/72267
K 15
widget_button.c
V 25
file 3fh.5qi.r31054/83327
K 15
widget_button.h
V 24
file 3g7.0.r12670/113556
K 17
widget_checkbox.c
V 25
file 3fi.5qi.r31054/83604
K 17
widget_checkbox.h
V 24
file 3g8.0.r12670/106620
K 14
widget_combo.c
V 25
file 4k3.5qi.r31054/83881
K 14
widget_combo.h
V 26
file 4k4.5ck.r26905/134968
K 13
widget_core.c
V 25
file 3fj.5qi.r31054/84154
K 13
widget_edit.c
V 25
file 3fk.5qi.r31054/84425
K 13
widget_edit.h
V 24
file 3g9.0.r12670/115595
K 13
widget_icon.c
V 25
file 3fl.5qi.r31054/84698
K 13
widget_icon.h
V 24
file 3ga.0.r12670/112107
K 14
widget_label.c
V 25
file 3fm.5qi.r31054/84973
K 14
widget_label.h
V 24
file 3gb.0.r12670/110079
K 10
widget_p.h
V 25
file 3fn.5qi.r29669/73639
K 18
widget_scrollbar.c
V 25
file 3fo.5sv.r31054/85249
K 18
widget_scrollbar.h
V 24
file 3gc.0.r12670/116811
K 15
widget_window.c
V 25
file 3fp.5qi.r31054/85553
K 15
widget_window.h
V 23
file 3gd.0.r12699/32533
K 7
wldlg.c
V 23
file 18q.5qi.r33108/900
K 7
wldlg.h
V 25
file 18r.5qi.r29669/74758
END
ENDREP
id: 16t.5qi.r33530/66199
type: dir
pred: 16t.5qi.r33479/7275
count: 963
text: 33530 61419 4767 0 a1db2f11658d7e9b0bc97b413a183dfa
props: 11108 12869 78 0 a27c61ac5fddbd709df8c1876129f940
cpath: /branches/S2_6/client/gui-sdl
copyroot: 27474 /branches/S2_6

id: 16y.5r1.r33530/66455
type: file
pred: 16y.5r1.r32403/47942
count: 82
text: 33530 47981 29 30530 9fa20a70578b5752daf5cf25a635f3e9
props: 9030 114052 111 0 2a5912525b098cb46a1301ee940f7617
cpath: /branches/S2_6/client/gui-sdl2/chatline.c
copyroot: 23136 /trunk/client/gui-sdl2

PLAIN
K 11
Makefile.am
V 24
file 16u.5r1.r30087/5995
K 15
action_dialog.c
V 25
file 3bn.5r2.r33403/30638
K 8
canvas.c
V 25
file 39i.5r1.r32403/47388
K 8
canvas.h
V 25
file 39j.5r1.r32403/47666
K 10
chatline.c
V 25
file 16y.5r1.r33530/66455
K 10
chatline.h
V 24
file 16z.5r1.r33323/6375
K 9
citydlg.c
V 25
file 170.5r1.r32939/20451
K 9
citydlg.h
V 25
file 171.5r1.r32403/48505
K 9
cityrep.c
V 26
file 172.5r1.r32527/203933
K 9
cityrep.h
V 26
file 173.5ck.r18101/104032
K 8
cma_fe.c
V 26
file 174.5r1.r32527/204214
K 8
cma_fe.h
V 25
file 175.5l8.r27385/13568
K 8
colors.c
V 25
file 176.5r1.r32403/49344
K 8
colors.h
V 25
file 177.5r1.r32403/49622
K 12
connectdlg.c
V 25
file 178.5r1.r32403/49900
K 12
connectdlg.h
V 25
file 179.5l8.r27385/19249
K 9
dialogs.c
V 26
file 17a.5r1.r32527/204493
K 9
dialogs.h
V 25
file 17b.5r1.r32403/50465
K 10
diplodlg.c
V 26
file 17c.5r1.r32527/204776
K 10
diplodlg.h
V 25
file 17d.5l8.r27385/19789
K 9
finddlg.c
V 26
file 17e.5r1.r32527/205060
K 9
finddlg.h
V 20
file 2d8.0.r5991/702
K 9
gotodlg.c
V 26
file 17f.5r1.r32527/205341
K 9
gotodlg.h
V 25
file 17g.5l8.r27385/17910
K 10
graphics.c
V 25
file 17h.5r1.r32403/51586
K 10
graphics.h
V 25
file 17i.5r1.r32403/51868
K 11
gui_iconv.c
V 25
file 17l.5r1.r32403/52149
K 11
gui_iconv.h
V 25
file 17m.5r1.r32403/52430
K 8
gui_id.h
V 24
file 17n.5r1.r31892/7777
K 10
gui_main.c
V 24
file 17o.5r1.r33479/7530
K 10
gui_main.h
V 25
file 17p.5r1.r32403/52994
K 11
gui_mouse.c
V 25
file 3ca.5r1.r32403/53272
K 11
gui_mouse.h
V 24
file 3cb.0.r12670/112397
K 12
gui_string.c
V 25
file 17r.5r1.r32403/53553
K 12
gui_string.h
V 25
file 17s.5r1.r32403/53836
K 14
gui_tilespec.c
V 25
file 191.5r1.r32403/54118
K 14
gui_tilespec.h
V 25
file 192.5r1.r32403/54403
K 9
helpdlg.c
V 25
file 17z.5r1.r32403/54687
K 9
helpdlg.h
V 24
file 180.5r1.r31892/8328
K 10
inteldlg.c
V 26
file 183.5r1.r32527/205620
K 10
inteldlg.h
V 25
file 2d9.5l8.r27385/10613
K 12
luaconsole.c
V 26
file 768.5l8.r26905/126647
K 12
luaconsole.h
V 26
file 769.5l8.r26905/126964
K 9
mapctrl.c
V 25
file 184.5r1.r32403/55249
K 9
mapctrl.h
V 25
file 185.5r1.r32403/55528
K 9
mapview.c
V 26
file 186.5r1.r32527/205905
K 9
mapview.h
V 25
file 187.5r1.r32403/56088
K 6
menu.c
V 25
file 188.5r1.r33309/19169
K 6
menu.h
V 25
file 189.5l8.r27385/18174
K 12
messagedlg.c
V 26
file 18a.5ck.r19259/474489
K 12
messagedlg.h
V 25
file 2da.5l8.r27385/18982
K 12
messagewin.c
V 24
file 18b.5r1.r33323/6651
K 12
messagewin.h
V 25
file 18c.5ck.r18082/39362
K 11
optiondlg.c
V 25
file 18d.5r1.r32403/56930
K 11
optiondlg.h
V 24
file 18e.5r1.r28842/2545
K 7
pages.c
V 24
file 2qg.5r1.r33323/6930
K 7
pages.h
V 22
file 2qh.0.r8639/16416
K 8
plrdlg.c
V 25
file 18f.5r1.r32403/57210
K 8
plrdlg.h
V 22
file 18g.0.r6387/81301
K 10
ratesdlg.h
V 25
file 2db.5l8.r27385/10877
K 10
repodlgs.c
V 25
file 18i.5r1.r32403/57490
K 10
repodlgs.h
V 25
file 18j.5r1.r32403/57771
K 14
spaceshipdlg.c
V 25
file 18m.5r1.r29669/85702
K 14
spaceshipdlg.h
V 25
file 18n.5l8.r27385/13298
K 8
sprite.c
V 25
file 39k.5r1.r32403/58052
K 8
sprite.h
V 25
file 39l.5l8.r27385/11141
K 18
themebackgrounds.c
V 24
file 3ff.5r1.r29462/2289
K 18
themebackgrounds.h
V 25
file 3fg.5r1.r32403/58331
K 13
themecolors.c
V 24
file 392.5r1.r29462/2572
K 13
themecolors.h
V 25
file 393.5l8.r27385/12215
K 8
themes.c
V 25
file 38p.5r1.r30211/62082
K 11
themespec.c
V 25
file 390.5r1.r33331/18071
K 11
themespec.h
V 24
file 391.5r1.r29984/7639
K 11
unistring.c
V 25
file 18o.5r1.r32403/58619
K 11
unistring.h
V 25
file 18p.5r1.r32403/58902
K 12
utf8string.c
V 26
file 1l88.5r1.r32403/59183
K 12
utf8string.h
V 26
file 1l8a.5r1.r32403/59466
K 14
voteinfo_bar.c
V 26
file 4ha.5l8.r26905/127282
K 14
voteinfo_bar.h
V 26
file 4hb.5l8.r26905/127601
K 8
widget.c
V 25
file 3fu.5r1.r32403/59749
K 8
widget.h
V 25
file 3fv.5r1.r29669/86261
K 15
widget_button.c
V 25
file 3fh.5r1.r32403/60025
K 15
widget_button.h
V 24
file 3g7.5r1.r29698/7568
K 17
widget_checkbox.c
V 25
file 3fi.5r1.r32403/60312
K 17
widget_checkbox.h
V 25
file 3g8.5r1.r29581/14582
K 14
widget_combo.c
V 25
file 4k3.5r1.r32403/60600
K 14
widget_combo.h
V 26
file 4k4.5r1.r27998/225070
K 13
widget_core.c
V 25
file 3fj.5r1.r32403/60885
K 13
widget_edit.c
V 25
file 3fk.5r1.r32403/61169
K 13
widget_edit.h
V 26
file 3g9.5r1.r27998/227074
K 13
widget_icon.c
V 25
file 3fl.5r1.r32403/61454
K 13
widget_icon.h
V 25
file 3ga.5l8.r27385/19517
K 14
widget_label.c
V 25
file 3fm.5r1.r32403/61739
K 14
widget_label.h
V 26
file 3gb.5r1.r27998/220820
K 10
widget_p.h
V 25
file 3fn.5r1.r29669/87677
K 18
widget_scrollbar.c
V 25
file 3fo.5r4.r32403/62025
K 18
widget_scrollbar.h
V 25
file 3gc.5l8.r27385/14638
K 15
widget_window.c
V 25
file 3fp.5r1.r32403/62333
K 15
widget_window.h
V 26
file 3gd.5r1.r27998/219687
K 7
wldlg.c
V 24
file 18q.5r1.r33108/6203
K 7
wldlg.h
V 25
file 18r.5r1.r29669/88826
END
ENDREP
id: 16t.5r1.r33530/71561
type: dir
pred: 16t.5r1.r33479/12636
count: 1056
text: 33530 66735 4813 0 29059d70da8cbb8f655959f823562ff5
props: 11108 12869 78 0 a27c61ac5fddbd709df8c1876129f940
cpath: /branches/S2_6/client/gui-sdl2
copyroot: 23136 /trunk/client/gui-sdl2

id: ml.5qi.r33530/71828
type: file
pred: ml.5ck.r24999/43324
count: 10
text: 33530 106 25 2289 9c7ee8705f328d8cee3e4afdda0f503c
props: 7930 39016 110 0 7d181b70073f10d0c5a58c73a72d4f04
cpath: /branches/S2_6/client/gui-stub/chatline.c
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 24
file mj.5ck.r25193/37544
K 8
canvas.c
V 25
file 2y0.5qi.r31280/26178
K 8
canvas.h
V 23
file 2y1.0.r10095/12720
K 10
chatline.c
V 24
file ml.5qi.r33530/71828
K 10
chatline.h
V 21
file mm.0.r5491/41569
K 9
citydlg.c
V 24
file mn.5ck.r20753/27536
K 9
citydlg.h
V 21
file mo.0.r5491/35843
K 9
cityrep.c
V 24
file mp.5ck.r20753/33432
K 9
cityrep.h
V 21
file mq.0.r5491/46587
K 8
colors.c
V 24
file mr.5qi.r31094/38668
K 8
colors.h
V 22
file ms.0.r10458/11524
K 12
connectdlg.c
V 24
file mt.5ck.r27275/15651
K 12
connectdlg.h
V 21
file mu.0.r5491/46943
K 9
dialogs.c
V 24
file mv.5qi.r33252/32219
K 9
dialogs.h
V 20
file mw.0.r8956/1107
K 10
diplodlg.c
V 24
file mx.5ck.r20753/27036
K 10
diplodlg.h
V 21
file my.0.r5491/35128
K 9
finddlg.c
V 24
file mz.5ck.r20753/29495
K 9
finddlg.h
V 22
file 2dc.0.r5989/44093
K 9
gotodlg.c
V 24
file n0.5ck.r20753/27287
K 9
gotodlg.h
V 21
file n1.0.r5491/35486
K 10
graphics.c
V 22
file n2.5qi.r29388/865
K 10
graphics.h
V 21
file n3.0.r5491/36199
K 10
gui_main.c
V 24
file n4.5qi.r32959/35480
K 10
gui_main.h
V 21
file n5.0.r5491/41925
K 10
gui_stub.h
V 26
file a3a.5ck.r26905/102940
K 9
helpdlg.c
V 24
file n6.5ck.r20753/30507
K 9
helpdlg.h
V 21
file n7.0.r5491/39423
K 10
inteldlg.c
V 24
file n8.5ck.r20753/28739
K 10
inteldlg.h
V 22
file 2dd.0.r5989/43421
K 12
luaconsole.c
V 26
file 76g.5ck.r26905/101724
K 12
luaconsole.h
V 26
file 76h.5ck.r26905/102027
K 9
mapctrl.c
V 23
file n9.5qi.r32667/8651
K 9
mapctrl.h
V 21
file na.0.r5491/37272
K 9
mapview.c
V 24
file nb.5ck.r26564/27564
K 9
mapview.h
V 21
file nc.0.r5491/38349
K 6
menu.c
V 24
file nd.5ck.r20753/32472
K 6
menu.h
V 21
file ne.0.r5491/43723
K 12
messagedlg.c
V 24
file nf.5ck.r20753/32977
K 12
messagedlg.h
V 22
file 2de.0.r5989/44428
K 12
messagewin.c
V 24
file ng.5ck.r20753/32022
K 12
messagewin.h
V 21
file nh.0.r5491/43363
K 11
optiondlg.c
V 26
file 4jt.5ck.r26905/101122
K 11
optiondlg.h
V 26
file 4ju.5ck.r26905/101421
K 7
pages.c
V 25
file 2qi.5ck.r27275/15908
K 7
pages.h
V 22
file 2qj.0.r8639/28697
K 8
plrdlg.c
V 24
file ni.5ck.r20753/30757
K 8
plrdlg.h
V 21
file nj.0.r5491/41213
K 10
ratesdlg.c
V 24
file nk.5qi.r29066/16723
K 10
ratesdlg.h
V 22
file 2df.0.r5989/43757
K 10
repodlgs.c
V 24
file nl.5ck.r20844/42577
K 10
repodlgs.h
V 21
file nm.0.r5491/40138
K 14
spaceshipdlg.c
V 24
file nn.5ck.r20753/32720
K 14
spaceshipdlg.h
V 21
file no.0.r5491/44796
K 8
sprite.c
V 25
file 2y2.5ck.r20753/29243
K 8
sprite.h
V 23
file 2y3.0.r10095/12384
K 8
themes.c
V 25
file 34y.5ck.r20753/31009
K 14
voteinfo_bar.c
V 26
file 4hc.5ck.r26905/102329
K 14
voteinfo_bar.h
V 26
file 4hd.5ck.r26905/102634
K 7
wldlg.c
V 25
file qj.5ck.r19259/501512
K 7
wldlg.h
V 21
file qk.0.r5491/45158
END
ENDREP
id: mh.5qi.r33530/74814
type: dir
pred: mh.5qi.r33252/35203
count: 243
text: 33530 72094 2707 0 73faef05fffc4d637bc4bef25cdea8a5
props: 11108 13796 68 0 fbaef5f6348d6ae4b0cc177104ca4ad2
cpath: /branches/S2_6/client/gui-stub
copyroot: 27474 /branches/S2_6

id: 9u.5qi.r33530/75070
type: file
pred: 9u.5ck.r24999/26869
count: 32
text: 33530 158 2415 4799 b428983f12df634b09f2dedbb920c775
props: 9160 4724 111 0 45c0e160a790dc8f7645f8a7eabea654
cpath: /branches/S2_6/client/gui-xaw/chatline.c
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 23
file bq.5ck.r26408/3872
K 15
action_dialog.c
V 25
file 37p.5rm.r33403/36034
K 4
ad2c
V 22
file 9q.0.r1186/243967
K 8
canvas.c
V 25
file 9r.5ck.r19259/439408
K 8
canvas.h
V 20
file 9s.0.r4034/9073
K 9
canvasp.h
V 20
file 9t.0.r4034/8365
K 10
chatline.c
V 24
file 9u.5qi.r33530/75070
K 10
chatline.h
V 21
file 9v.0.r2187/10435
K 9
citydlg.c
V 24
file 9w.5qi.r32722/80824
K 9
citydlg.h
V 20
file 9x.0.r2187/8309
K 9
cityrep.c
V 24
file 9y.5qi.r32722/81093
K 9
cityrep.h
V 24
file g1.5ck.r18101/97080
K 8
cma_fe.c
V 23
file 2ei.5qi.r32827/269
K 8
cma_fe.h
V 21
file 2ej.0.r6908/4433
K 8
colors.c
V 24
file a2.5qi.r31094/41911
K 8
colors.h
V 21
file a3.0.r10532/9312
K 12
connectdlg.c
V 24
file a4.5ck.r27275/24992
K 12
connectdlg.h
V 21
file a5.0.r2187/12228
K 9
dialogs.c
V 25
file a6.5qi.r32527/212688
K 9
dialogs.h
V 24
file a7.5ck.r20375/28717
K 10
diplodlg.c
V 25
file a8.5qi.r32527/212957
K 10
diplodlg.h
V 20
file a9.0.r2187/7955
K 9
finddlg.c
V 25
file aa.5qi.r32527/213229
K 9
finddlg.h
V 22
file 2dk.0.r5989/31562
K 9
gotodlg.c
V 25
file ab.5qi.r32527/213496
K 9
gotodlg.h
V 21
file ac.0.r1888/21069
K 10
graphics.c
V 24
file ad.5qi.r30211/67967
K 10
graphics.h
V 21
file ae.0.r10789/6338
K 10
gui_main.c
V 24
file bm.5qi.r32963/17114
K 10
gui_main.h
V 22
file bn.0.r11408/10219
K 11
gui_stuff.c
V 25
file bo.5ck.r19259/440420
K 11
gui_stuff.h
V 21
file bp.0.r4964/56392
K 9
helpdlg.c
V 25
file af.5qi.r28819/108226
K 9
helpdlg.h
V 21
file g2.0.r1888/23188
K 10
inputdlg.c
V 25
file ag.5ck.r19259/445437
K 10
inputdlg.h
V 20
file ah.0.r7586/2315
K 10
inteldlg.c
V 25
file ai.5qi.r32527/213765
K 10
inteldlg.h
V 23
file 2dl.0.r10108/22972
K 12
luaconsole.c
V 26
file 76a.5ck.r26905/118154
K 12
luaconsole.h
V 26
file 76b.5ck.r26905/118454
K 9
mapctrl.c
V 24
file aj.5qi.r32667/11892
K 9
mapctrl.h
V 21
file ak.0.r10532/9667
K 9
mapview.c
V 24
file al.5qi.r31280/29422
K 9
mapview.h
V 24
file am.5bk.r13912/46304
K 6
menu.c
V 24
file an.5qi.r33309/24542
K 6
menu.h
V 24
file ao.5qi.r30094/27538
K 12
messagedlg.c
V 25
file ap.5ck.r19259/446444
K 12
messagedlg.h
V 22
file 2dm.0.r5989/31896
K 12
messagewin.c
V 25
file aq.5ck.r19259/440924
K 12
messagewin.h
V 24
file g3.5ck.r18082/32178
K 11
optiondlg.c
V 25
file ar.5ck.r19259/438399
K 11
optiondlg.h
V 24
file as.5ck.r16998/79026
K 7
pages.c
V 25
file 2qm.5ck.r27275/24488
K 7
pages.h
V 22
file 2qn.0.r10536/7909
K 9
pixcomm.c
V 25
file at.5ck.r19259/441680
K 9
pixcomm.h
V 20
file au.0.r4034/9777
K 10
pixcommp.h
V 25
file av.5ck.r19259/443665
K 8
plrdlg.c
V 24
file aw.5ck.r23284/23132
K 8
plrdlg.h
V 20
file g4.0.r5489/3140
K 10
ratesdlg.c
V 24
file ax.5qi.r29066/10729
K 10
ratesdlg.h
V 22
file 2dn.0.r5989/31227
K 10
repodlgs.c
V 25
file ay.5qi.r30061/213267
K 10
repodlgs.h
V 24
file az.5ck.r18076/36844
K 11
resources.c
V 25
file b0.5ck.r19259/439161
K 11
resources.h
V 21
file b1.0.r3145/14204
K 14
spaceshipdlg.c
V 24
file b2.5ck.r23118/30282
K 14
spaceshipdlg.h
V 21
file b3.0.r2187/11152
K 8
themes.c
V 26
file 350.5ck.r19259/439910
K 14
voteinfo_bar.c
V 26
file 4hg.5ck.r26905/118755
K 14
voteinfo_bar.h
V 26
file 4hh.5ck.r26905/119062
K 7
wldlg.c
V 24
file o5.5qi.r32722/81362
K 7
wldlg.h
V 24
file o6.5ck.r16285/91411
K 13
xaw_actions.c
V 24
file nt.5sz.r33309/24804
K 13
xaw_actions.h
V 23
file nu.5sy.r29713/5689
END
ENDREP
id: 9o.5qi.r33530/78660
type: dir
pred: 9o.5qi.r33403/39657
count: 1178
text: 33530 75336 3311 0 e8594029cbdf79f16f7bc9b217f70cf5
props: 11108 12237 78 0 a27c61ac5fddbd709df8c1876129f940
cpath: /branches/S2_6/client/gui-xaw
copyroot: 27474 /branches/S2_6

id: 6jm.5u7.r33530/78916
type: file
pred: 6jm.5u7.r32601/126094
count: 25
text: 33530 0 29 21776 b319b69bf2e809743e3503c6a0b5a350
props: 26905 126275 34 0 25e6c2f7558b7484000d4d090dea5b92
cpath: /branches/S2_6/client/gui_interface.c
copyroot: 20572 /trunk/client/gui_interface.c

id: 6jn.5u6.r33530/79196
type: file
pred: 6jn.5u6.r32601/126377
count: 24
text: 33530 2602 26 6353 0f4c5f4c5c50a3ce0a1e51cb46f539ea
props: 26905 133686 34 0 25e6c2f7558b7484000d4d090dea5b92
cpath: /branches/S2_6/client/gui_interface.h
copyroot: 20572 /trunk/client/gui_interface.h

id: en.5qi.r33530/79478
type: file
pred: en.5ck.r24999/30690
count: 7
text: 33530 56 25 1144 85ae82cba8435eaf470b21b6ad3469a8
props: 7930 21518 110 0 fd27c383f48a4fbbd90a59fbcfc8b3be
cpath: /branches/S2_6/client/include/chatline_g.h
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 24
file dt.5ck.r26633/54459
K 10
canvas_g.h
V 25
file 2y4.5qi.r31280/34096
K 12
chatline_g.h
V 24
file en.5qi.r33530/79478
K 11
citydlg_g.h
V 24
file eo.5ck.r20720/21741
K 11
cityrep_g.h
V 24
file g5.5ck.r20720/20296
K 10
colors_g.h
V 24
file in.5qi.r31094/46024
K 14
connectdlg_g.h
V 24
file eq.5ck.r27275/28816
K 11
dialogs_g.h
V 24
file er.5qi.r33252/39335
K 12
diplodlg_g.h
V 24
file es.5ck.r20720/21245
K 11
editgui_g.h
V 26
file 3bj.5we.r32601/126925
K 11
finddlg_g.h
V 25
file 2do.5ck.r20720/23704
K 11
gotodlg_g.h
V 24
file et.5ck.r20720/21494
K 12
graphics_g.h
V 24
file eu.5ck.r26984/35955
K 12
gui_main_g.h
V 24
file ev.5ck.r27275/29070
K 23
gui_proto_constructor.h
V 26
file 9sq.5ck.r26905/123547
K 11
helpdlg_g.h
V 24
file g6.5qi.r29938/31949
K 12
inteldlg_g.h
V 25
file 2dp.5ck.r20720/22691
K 14
luaconsole_g.h
V 26
file 75y.5ck.r26905/123242
K 11
mapctrl_g.h
V 24
file ew.5ck.r20720/22946
K 11
mapview_g.h
V 24
file ex.5ck.r20720/23954
K 8
menu_g.h
V 24
file ey.5ck.r20720/18900
K 14
messagedlg_g.h
V 25
file 2dq.5ck.r20720/19844
K 14
messagewin_g.h
V 24
file g7.5ck.r20720/18646
K 13
optiondlg_g.h
V 26
file 4jv.5ck.r26905/122938
K 9
pages_g.h
V 25
file 2pk.5ck.r26633/54709
K 10
plrdlg_g.h
V 24
file g8.5ck.r20720/17105
K 12
ratesdlg_g.h
V 25
file 2dr.5qi.r29066/14582
K 12
repodlgs_g.h
V 24
file ez.5ck.r20844/29677
K 16
spaceshipdlg_g.h
V 24
file f0.5ck.r20720/19346
K 10
sprite_g.h
V 25
file 2y5.5ck.r20720/23450
K 10
themes_g.h
V 25
file 351.5ck.r20720/17352
K 16
voteinfo_bar_g.h
V 26
file 4hi.5ck.r26905/123860
K 9
wldlg_g.h
V 24
file o7.5ck.r20720/19599
END
ENDREP
id: b8.5qi.r33530/81357
type: dir
pred: b8.5qi.r33252/41216
count: 306
text: 33530 79743 1601 0 0a67ef8cbeebf71477dafef952b2f76a
props: 4431 36493 46 0 e473fc4bd409d833d90929dfcb3a14b8
cpath: /branches/S2_6/client/include
copyroot: 27474 /branches/S2_6

id: 33x.5qi.r33530/81611
type: file
pred: 33x.5qi.r31660/1697
count: 77
text: 33530 2656 439 25525 389cebb1da971a42a87d83a9a21f01a1
props: 11101 62 110 0 fdfdab56f53d2388a66f6a5ce0985f95
cpath: /branches/S2_6/client/servers.c
copyroot: 27474 /branches/S2_6

PLAIN
K 11
Makefile.am
V 22
file 5f.5qi.r31934/776
K 6
agents
V 23
dir zf.5qi.r32601/94733
K 11
attribute.c
V 24
file xh.5ck.r25151/59391
K 11
attribute.h
V 24
file xi.5ck.r18863/23649
K 7
audio.c
V 24
file 139.5qi.r33331/2762
K 7
audio.h
V 25
file 13a.5qi.r31664/81545
K 12
audio_none.c
V 25
file 13d.5ck.r24916/15731
K 12
audio_none.h
V 25
file 13e.5ck.r18863/20841
K 11
audio_sdl.c
V 23
file 13f.5qi.r31870/943
K 11
audio_sdl.h
V 25
file 13g.5ck.r18863/23885
K 17
chatline_common.c
V 23
file 14q.5qi.r31578/629
K 17
chatline_common.h
V 23
file 14r.5qi.r31578/895
K 16
citydlg_common.c
V 24
file z4.5qi.r32722/54377
K 16
citydlg_common.h
V 24
file z5.5qi.r32722/54646
K 13
cityrepdata.c
V 22
file mb.5qi.r33313/312
K 13
cityrepdata.h
V 24
file mc.5ck.r18863/19121
K 13
client_main.c
V 23
file 2f.5rc.r33091/7064
K 13
client_main.h
V 22
file hz.5sl.r31642/220
K 8
climap.c
V 24
file 197.5ck.r20232/3008
K 8
climap.h
V 25
file 198.5qi.r30222/65356
K 9
climisc.c
V 23
file d5.5qi.r33252/8434
K 9
climisc.h
V 24
file i0.5qi.r32759/10343
K 8
clinet.c
V 23
file hc.5qi.r33479/1971
K 8
clinet.h
V 24
file i1.5ck.r18863/24866
K 15
colors_common.c
V 24
file 33a.5qi.r31150/4089
K 15
colors_common.h
V 24
file 33b.5qi.r31851/8115
K 19
connectdlg_common.c
V 24
file 2fw.5qi.r33259/1194
K 19
connectdlg_common.h
V 22
file 2fx.5qi.r31710/95
K 9
control.c
V 21
file gz.5qi.r33522/73
K 9
control.h
V 22
file i2.5qi.r33309/867
K 7
dummy.c
V 26
file 4f9.5ck.r26905/141682
K 12
dummycxx.cpp
V 26
file 6kr.5ck.r26905/106211
K 8
editor.c
V 25
file 3bg.5qi.r32639/19170
K 8
editor.h
V 23
file 3bh.5qi.r32375/915
K 17
global_worklist.c
V 25
file 4i6.5qi.r32722/55434
K 17
global_worklist.h
V 26
file 4i7.5ck.r26905/126022
K 6
goto.c
V 22
file vu.5qi.r31299/503
K 6
goto.h
V 22
file vv.5qi.r31299/756
K 11
gui-gtk-2.0
V 23
dir zs.5qi.r33530/52386
K 11
gui-gtk-3.0
V 23
dir zs.5qq.r33530/57063
K 6
gui-qt
V 24
dir 6ie.5qi.r33530/60893
K 7
gui-sdl
V 24
dir 16t.5qi.r33530/66199
K 8
gui-sdl2
V 24
dir 16t.5r1.r33530/71561
K 8
gui-stub
V 23
dir mh.5qi.r33530/74814
K 7
gui-xaw
V 23
dir 9o.5qi.r33530/78660
K 14
gui_cbsetter.c
V 25
file a3c.5qi.r32488/67727
K 14
gui_cbsetter.h
V 25
file a3d.5qi.r32488/67993
K 15
gui_interface.c
V 25
file 6jm.5u7.r33530/78916
K 15
gui_interface.h
V 25
file 6jn.5u6.r33530/79196
K 10
helpdata.c
V 24
file h1.5qi.r32927/49503
K 10
helpdata.h
V 22
file i3.5qi.r30005/963
K 7
include
V 23
dir b8.5qi.r33530/81357
K 19
luaconsole_common.c
V 26
file 75z.5ck.r26905/100821
K 19
luaconsole_common.h
V 26
file 760.5ck.r26905/106500
K 9
luascript
V 24
dir 761.5qi.r29744/13350
K 16
mapctrl_common.c
V 25
file 15m.5qi.r32722/85210
K 16
mapctrl_common.h
V 24
file 15n.5qi.r32344/1056
K 16
mapview_common.c
V 21
file z2.5qi.r33057/69
K 16
mapview_common.h
V 21
file z3.5qi.r32428/66
K 19
messagewin_common.c
V 25
file 14s.5qi.r30211/72878
K 19
messagewin_common.h
V 25
file 14t.5ck.r18863/21579
K 7
music.c
V 25
file zmc.5qi.r30211/73150
K 7
music.h
V 25
file zme.5ck.r27127/11513
K 9
options.c
V 21
file dc.5qi.r33520/86
K 9
options.h
V 24
file i4.5qi.r33422/14922
K 17
overview_common.c
V 24
file 2yk.5qi.r32990/1986
K 17
overview_common.h
V 24
file 2yl.5qi.r29834/4937
K 10
packhand.c
V 23
file n.5qi.r33252/41471
K 10
packhand.h
V 24
file i5.5ck.r18863/20596
K 15
plrdlg_common.c
V 24
file 14u.5qi.r28834/2098
K 15
plrdlg_common.h
V 25
file 14v.5ck.r18863/21328
K 17
repodlgs_common.c
V 26
file 11i.5qi.r30061/217644
K 17
repodlgs_common.h
V 25
file 11j.5ck.r19589/11861
K 9
reqtree.c
V 25
file 2ym.5qi.r32939/25831
K 9
reqtree.h
V 24
file 2yn.5ck.r24150/6004
K 9
servers.c
V 25
file 33x.5qi.r33530/81611
K 9
servers.h
V 25
file 33y.5ck.r20478/36372
K 6
text.c
V 26
file 2g3.5qi.r32527/218161
K 6
text.h
V 24
file 2g4.5qi.r32344/1318
K 15
themes_common.c
V 25
file 352.5qi.r31664/82856
K 15
themes_common.h
V 25
file 353.5qi.r31664/83120
K 10
tilespec.c
V 23
file hl.5qi.r33517/1030
K 10
tilespec.h
V 22
file i6.5qi.r33317/886
K 19
unitselect_common.c
V 26
file 76v.5qi.r30061/218439
K 19
unitselect_common.h
V 26
file 76w.5ck.r26905/117548
K 14
update_queue.c
V 26
file 4jw.5qi.r32527/218422
K 14
update_queue.h
V 26
file 4jx.5ck.r26905/141966
K 10
voteinfo.c
V 25
file 4fe.5qi.r30211/74980
K 10
voteinfo.h
V 26
file 4ff.5ck.r26905/142263
K 6
zoom.c
V 24
file 212g.5qi.r33336/200
K 6
zoom.h
V 25
file 212i.5qi.r30914/1880
END
ENDREP
id: d.5qi.r33530/86203
type: dir
pred: d.5qi.r33522/4659
count: 7183
text: 33530 81869 4321 0 2d0f7f6416ee46d634ca5dbd52b1ffcc
props: 28037 12634 400 0 bbe1d6769a94f3af2a54f7dc91fc9c71
cpath: /branches/S2_6/client
copyroot: 27474 /branches/S2_6

PLAIN
K 9
ABOUT-NLS
V 24
file fu.5ck.r27270/69307
K 7
AUTHORS
V 24
file 5u.5ck.r22143/14016
K 7
COPYING
V 22
file 1h.5qi.r29455/952
K 9
ChangeLog
V 26
file 6l.5qi.r31298/7507168
K 7
INSTALL
V 22
file 6.5qi.r31740/1317
K 11
Makefile.am
V 22
file 59.5qi.r31920/516
K 4
NEWS
V 24
file 6m.5ck.r25634/30702
K 6
README
V 20
file 7.0.r4421/96382
K 2
ai
V 21
dir 8.5qi.r33509/3044
K 10
autogen.sh
V 22
file 12o.5qi.r32636/46
K 9
bootstrap
V 23
dir 2p5.5qi.r32590/4079
K 6
client
V 22
dir d.5qi.r33530/86203
K 6
common
V 21
dir p.5qi.r33504/8410
K 12
configure.ac
V 24
file 149.5qi.r33428/1085
K 4
data
V 22
dir w.5qi.r33450/33575
K 12
dependencies
V 23
dir 2yu.5qi.r33405/2646
K 3
doc
V 22
dir k7.5qi.r33525/2031
K 10
fc_version
V 25
file 2lo.5qj.r33252/53751
K 11
gen_headers
V 23
dir 1hsw.5qi.r32276/968
K 3
lua
V 24
dir 2c5p.5qi.r31920/4972
K 2
m4
V 23
dir 12p.5qi.r33428/3831
K 7
scripts
V 23
dir 2yo.5qi.r31853/1104
K 6
server
V 21
dir z.5qi.r33514/4314
K 5
tests
V 22
dir 2g9.5qi.r32362/652
K 5
tools
V 23
dir 4pj.5qp.r33467/2608
K 12
translations
V 26
dir t0a.5qi.r33303/2018544
K 7
utility
V 23
dir 1c.5qi.r33479/31699
K 3
vms
V 25
dir u9.5ck.r21528/1396085
K 5
win32
V 24
dir 2eu.5qi.r33461/16721
END
ENDREP
id: 3.5qi.r33530/87658
type: dir
pred: 3.5qi.r33525/3478
count: 20960
text: 33530 86449 1196 0 167b5dcce6a80c47b23b3244fadf961c
props: 28037 14463 292 0 9e1d5de0253c723466868990c52c129f
cpath: /branches/S2_6
copyroot: 27474 /branches/S2_6

PLAIN
K 5
S1_14
V 21
dir 3.21.r18109/18803
K 4
S2_0
V 21
dir 3.10x.r21862/4178
K 4
S2_1
V 22
dir 3.59e.r20026/11014
K 4
S2_2
V 21
dir 3.5cy.r21861/5036
K 4
S2_3
V 21
dir 3.5f2.r29458/5135
K 4
S2_4
V 23
dir 3.5ii.r32693/294508
K 4
S2_5
V 21
dir 3.5kv.r33526/3687
K 6
S2_5_3
V 23
dir 3.5ut.r31805/553797
K 4
S2_6
V 22
dir 3.5qi.r33530/87658
K 11
freeciv-web
V 22
dir 3.5bl.r13594/14918
END
ENDREP
id: 1.0.r33530/88293
type: dir
pred: 1.0.r33526/4318
count: 11607
text: 33530 87898 382 0 c081432d211cbff557c062d06e8c65b4
cpath: /branches
copyroot: 0 /

PLAIN
K 8
branches
V 20
dir 1.0.r33530/88293
K 4
tags
V 19
dir 2.0.r33382/6667
K 5
trunk
V 22
dir 3.5ck.r33529/83976
K 7
website
V 21
dir 3ge.0.r33387/2571
END
ENDREP
id: 0.0.r33530/88615
type: dir
pred: 0.0.r33529/84366
count: 33530
text: 33530 88448 154 0 e8125051d9c4c361b9c719f009f12015
cpath: /
copyroot: 0 /

zw.5qi.t33529-1 modify true false /branches/S2_6/client/gui-gtk-2.0/chatline.c

zw.5qq.t33529-1 modify true false /branches/S2_6/client/gui-gtk-3.0/chatline.c

6ii.5qi.t33529-1 modify true false /branches/S2_6/client/gui-qt/chatline.cpp

6jp.5qi.t33529-1 modify true false /branches/S2_6/client/gui-qt/qtg_cxxside.h

16y.5qi.t33529-1 modify true false /branches/S2_6/client/gui-sdl/chatline.c

16y.5r1.t33529-1 modify true false /branches/S2_6/client/gui-sdl2/chatline.c

ml.5qi.t33529-1 modify true false /branches/S2_6/client/gui-stub/chatline.c

9u.5qi.t33529-1 modify true false /branches/S2_6/client/gui-xaw/chatline.c

6jm.5u7.t33529-1 modify true false /branches/S2_6/client/gui_interface.c

6jn.5u6.t33529-1 modify true false /branches/S2_6/client/gui_interface.h

en.5qi.t33529-1 modify true false /branches/S2_6/client/include/chatline_g.h

33x.5qi.t33529-1 modify true false /branches/S2_6/client/servers.c


88615 88763
