URI:
       tInitial support for GtkTextView with colourised messages. - vaccinewars - be a doctor and try to vaccinate the world
  HTML git clone git://src.adamsgaard.dk/vaccinewars
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 79f711eab5b751a38e1f226fea9a438a8ab8885b
   DIR parent d1f9adba8d69b2ed42867b6ba636141bb709d1f1
  HTML Author: Ben Webb <ben@salilab.org>
       Date:   Thu,  4 Apr 2002 16:09:22 +0000
       
       Initial support for GtkTextView with colourised messages.
       
       
       Diffstat:
         M src/gui_client/gtk_client.c         |      70 +++++++++++++++++++------------
       
       1 file changed, 44 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
       t@@ -104,7 +104,7 @@ static void HandleClientMessage(char *buf, Player *Play);
        static void PrepareHighScoreDialog(void);
        static void AddScoreToDialog(char *Data);
        static void CompleteHighScoreDialog(gboolean AtEnd);
       -static void PrintMessage(char *Data);
       +static void PrintMessage(char *Data, char *tagname);
        static void DisplayFightMessage(char *Data);
        static GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status);
        static void DisplayStats(Player *Play, struct StatusWidgets *Status);
       t@@ -418,7 +418,7 @@ void HandleClientMessage(char *pt, Player *Play)
            CompleteHighScoreDialog((strcmp(Data, "end") == 0));
            break;
          case C_PRINTMESSAGE:
       -    PrintMessage(Data);
       +    PrintMessage(Data, NULL);
            break;
          case C_FIGHTPRINT:
            DisplayFightMessage(Data);
       t@@ -454,18 +454,18 @@ void HandleClientMessage(char *pt, Player *Play)
            break;
          case C_MSG:
            text = g_strdup_printf("%s: %s", GetPlayerName(From), Data);
       -    PrintMessage(text);
       +    PrintMessage(text, "talk");
            g_free(text);
            break;
          case C_MSGTO:
            text = g_strdup_printf("%s->%s: %s", GetPlayerName(From),
                                   GetPlayerName(Play), Data);
       -    PrintMessage(text);
       +    PrintMessage(text, "page");
            g_free(text);
            break;
          case C_JOIN:
            text = g_strdup_printf(_("%s joins the game!"), Data);
       -    PrintMessage(text);
       +    PrintMessage(text, "join");
            g_free(text);
            UpdatePlayerLists();
            UpdateMenus();
       t@@ -473,7 +473,7 @@ void HandleClientMessage(char *pt, Player *Play)
          case C_LEAVE:
            if (From != &Noone) {
              text = g_strdup_printf(_("%s has left the game."), Data);
       -      PrintMessage(text);
       +      PrintMessage(text, "leave");
              g_free(text);
              UpdatePlayerLists();
              UpdateMenus();
       t@@ -491,7 +491,7 @@ void HandleClientMessage(char *pt, Player *Play)
            /* Message displayed when the player "jets" to a new location */
            text = dpg_strdup_printf(_("Jetting to %tde"),
                                     Location[(int)Play->IsAt].Name);
       -    PrintMessage(text);
       +    PrintMessage(text, "jet");
            g_free(text);
            break;
          case C_ENDLIST:
       t@@ -753,25 +753,26 @@ void CompleteHighScoreDialog(gboolean AtEnd)
         * This area is used for displaying drug busts, messages from other
         * players, etc. The message is passed in as the string "text".
         */
       -void PrintMessage(char *text)
       +void PrintMessage(char *text, char *tagname)
        {
          gint EditPos;
       -  char *cr = "\n";
       -  GtkEditable *messages;
       +  GtkTextView *messages;
       +  GtkTextBuffer *buffer;
       +  GtkTextIter iter;
       +  GtkTextMark *insert;
        
       -  messages = GTK_EDITABLE(ClientData.messages);
       +  messages = GTK_TEXT_VIEW(ClientData.messages);
       +  buffer = gtk_text_view_get_buffer(messages);
        
       -  gtk_text_freeze(GTK_TEXT(messages));
          g_strdelimit(text, "^", '\n');
       -  EditPos = gtk_text_get_length(GTK_TEXT(ClientData.messages));
       -  while (*text == '\n')
       -    text++;
       -  gtk_editable_insert_text(messages, text, strlen(text), &EditPos);
       -  if (text[strlen(text) - 1] != '\n') {
       -    gtk_editable_insert_text(messages, cr, strlen(cr), &EditPos);
       -  }
       -  gtk_text_thaw(GTK_TEXT(messages));
       -  gtk_editable_set_position(messages, EditPos);
       +  gtk_text_buffer_get_end_iter(buffer, &iter);
       +  gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, text, -1,
       +                                           tagname, NULL);
       +  gtk_text_buffer_insert(buffer, &iter, "\n", -1);
       +
       +  gtk_text_buffer_place_cursor(buffer, &iter);
       +  insert = gtk_text_buffer_get_mark(buffer, "insert");
       +  gtk_text_view_scroll_mark_onscreen(messages, insert);
        }
        
        /* 
       t@@ -1902,7 +1903,7 @@ void EndGame(void)
        {
          DisplayFightMessage(NULL);
          gtk_widget_hide_all(ClientData.vbox);
       -  gtk_editable_delete_text(GTK_EDITABLE(ClientData.messages), 0, -1);
       +//gtk_editable_delete_text(GTK_EDITABLE(ClientData.messages), 0, -1);
          ShutdownNetwork(ClientData.Play);
          UpdatePlayerLists();
          CleanUpServer();
       t@@ -2090,6 +2091,17 @@ static void SetIcon(GtkWidget *window, gchar **xpmdata)
        #endif
        }
        
       +static void make_tags(GtkTextView *textview)
       +{
       +  GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
       +
       +  gtk_text_buffer_create_tag(buffer, "jet", "foreground", "blue", NULL);
       +  gtk_text_buffer_create_tag(buffer, "talk", "foreground", "red", NULL);
       +  gtk_text_buffer_create_tag(buffer, "page", "foreground", "green", NULL);
       +  gtk_text_buffer_create_tag(buffer, "join", "foreground", "cyan", NULL);
       +  gtk_text_buffer_create_tag(buffer, "leave", "foreground", "cyan", NULL);
       +}
       +
        #ifdef CYGWIN
        gboolean GtkLoop(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         gboolean ReturnOnFail)
       t@@ -2181,13 +2193,19 @@ gboolean GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail)
        
          vpaned = gtk_vpaned_new();
        
       -  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0.0, 100.0,
       +/*adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0.0, 100.0,
                                                    1.0, 10.0, 10.0);
          text = ClientData.messages = gtk_scrolled_text_new(NULL, adj, &hbox);
          gtk_widget_set_usize(text, 100, 80);
          gtk_text_set_point(GTK_TEXT(text), 0);
          gtk_text_set_editable(GTK_TEXT(text), FALSE);
       -  gtk_text_set_word_wrap(GTK_TEXT(text), TRUE);
       +  gtk_text_set_word_wrap(GTK_TEXT(text), TRUE);*/
       +
       +  text = ClientData.messages = gtk_scrolled_text_view_new(&hbox);
       +  make_tags(GTK_TEXT_VIEW(text));
       +  gtk_widget_set_usize(text, 100, 80);
       +  gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
       +  gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
          gtk_paned_pack1(GTK_PANED(vpaned), hbox, TRUE, TRUE);
        
          hbox = gtk_hbox_new(FALSE, 7);
       t@@ -2595,7 +2613,7 @@ static void TalkSend(GtkWidget *widget, struct TalkStruct *TalkData)
          if (AllPlayers) {
            SendClientMessage(ClientData.Play, C_NONE, C_MSG, NULL, text);
            g_string_sprintf(msg, "%s: %s", GetPlayerName(ClientData.Play), text);
       -    PrintMessage(msg->str);
       +    PrintMessage(msg->str, "talk");
          } else {
            for (selection = GTK_CLIST(TalkData->clist)->selection; selection;
                 selection = g_list_next(selection)) {
       t@@ -2607,7 +2625,7 @@ static void TalkSend(GtkWidget *widget, struct TalkStruct *TalkData)
                SendClientMessage(ClientData.Play, C_NONE, C_MSGTO, Play, text);
                g_string_sprintf(msg, "%s->%s: %s", GetPlayerName(ClientData.Play),
                                 GetPlayerName(Play), text);
       -        PrintMessage(msg->str);
       +        PrintMessage(msg->str, "page");
              }
            }
          }