]> hydra-www.ietfng.org Git - gtetrinet/commitdiff
Patch from James Antill:
authorJordi Albornoz <jordi@src.gnome.org>
Tue, 3 Dec 2002 17:10:35 +0000 (17:10 +0000)
committerJordi Albornoz <jordi@src.gnome.org>
Tue, 3 Dec 2002 17:10:35 +0000 (17:10 +0000)
* src/misc.c (adjust_bottom_text_view): Change function API to work on
  TextViews nativley ... use idle handler to stop syncronous updates.
  (nocolor): Change static buffer with no bounds checking to dynamicly
  sized buffer.
* src/gtetrinet.c (keypress): Search for notebook keys before game
  keys (as 1, 2 and 3 are attack commands).

ChangeLog
src/fields.c
src/gtetrinet.c
src/misc.c
src/misc.h
src/partyline.c

index 15d9f1197d689be8b8289cb1ca1fba26f87ebbcd..8abfecfd643bffe98485f06de18fb5052aff85da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2002-12-02  James Antill  <james@and.org>
+
+       * src/misc.c (adjust_bottom_text_view): Change function API to work on
+       TextViews nativley ... use idle handler to stop syncronous updates.
+       (nocolor): Change static buffer with no bounds checking to dynamicly
+       sized buffer.
+
+       * src/gtetrinet.c (keypress): Search for notebook keys before game
+       keys (as 1, 2 and 3 are attack commands).
+
 2002-11-18  Jordi Mallach  <jordi@sindominio.net>
 
        * AUTHORS: added Gerfried.
index f5de3e1c630030ba383494ffd6ea5c16413273ba..21a1dd59d53b7dcccd011c0b9801461258c668c1 100644 (file)
@@ -499,7 +499,7 @@ void fields_drawnextblock (TETRISBLOCK block)
 void fields_attdefmsg (char *text)
 {
     textbox_addtext (GTK_TEXT_VIEW(attdefwidget), text);
-    adjust_bottom (GTK_TEXT_VIEW(attdefwidget)->vadjustment);
+    adjust_bottom_text_view (GTK_TEXT_VIEW(attdefwidget));
 }
 
 void fields_attdefclear (void)
@@ -541,7 +541,7 @@ void fields_setactivelevel (int l)
 void fields_gmsgadd (char *str)
 {
     textbox_addtext (GTK_TEXT_VIEW(gmsgtext), str);
-    adjust_bottom (GTK_TEXT_VIEW(gmsgtext)->vadjustment);
+    adjust_bottom_text_view (GTK_TEXT_VIEW(gmsgtext));
 }
 
 void fields_gmsgclear (void)
index 915dc0ec2371cf1b0bd53d383e77cb4907332a79..265b7bf27718a59a48487d1e8b71df5f10fcfe67 100644 (file)
@@ -320,16 +320,16 @@ gint keypress (GtkWidget *widget, GdkEventKey *key)
     }
 
     if (game_area)
-    {
-        /* keys for the playing field - key releases needed - install timeout */
-        if (keytimeoutid && key->time == k.time)
-            gtk_timeout_remove (keytimeoutid);
-        if (tetrinet_key (key->keyval, key->string)) goto keyprocessed;
+    { /* keys for the playing field - key releases needed - install timeout */
+      if (keytimeoutid && key->time == k.time)
+        gtk_timeout_remove (keytimeoutid);
     }
     if (gtetrinet_key(key->keyval, key->state & (GDK_MOD1_MASK |
                                                  GDK_CONTROL_MASK |
                                                  GDK_SHIFT_MASK)))
-        goto keyprocessed;
+      goto keyprocessed;
+    if (game_area && tetrinet_key (key->keyval, key->string)) goto keyprocessed;
+
     return FALSE;
 keyprocessed:
     gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
index bbcddce1a1be5c8a666f9d23611a49c27e3ffff2..d4513da318502fdf6c2deef6c2aa0298422889e8 100644 (file)
@@ -239,19 +239,69 @@ void textbox_addtext (GtkTextView *textbox, unsigned char *text)
     /* if (bottom) adjust_bottom (textboxadj); */
 }
 
-void adjust_bottom (GtkAdjustment *adj)
-{ /* FIXME: GtkTextView craps itself */
-    gtk_adjustment_set_value (adj, adj->upper);
+/* have to use an idle handler for the adjustment ... or the TextView goes
+ * syncronous ... and has bugs.
+ * There might be a better way to do a one shot idle handler.
+ * This works though */
+static GList *adj_list = NULL;
+
+static gboolean cb_adjust_bottom(gpointer data)
+{
+  GList *scan = adj_list;
+
+  while (scan)
+  {
+    GtkTextView *tv = scan->data;
+    GtkTextIter iter;
+
+    gtk_text_buffer_get_end_iter(tv->buffer, &iter);
+    /* Maybe want... scroll_to_iter(tv, &iter, 0.0, TRUE, 0.0, 1.0); ???? */
+    gtk_text_view_scroll_to_iter(tv, &iter, 0.0, FALSE, 0.0, 0.0);
+    
+    scan = scan->next;
+  }
+  
+  g_list_free(adj_list);
+  adj_list = NULL;
+  return FALSE;
+}
+
+void adjust_bottom_text_view (GtkTextView *tv)
+{
+  if (!g_list_find(adj_list, tv))
+  {
+    if (!adj_list)
+      gtk_idle_add(cb_adjust_bottom, adj_list);
+    
+    adj_list = g_list_append(adj_list, tv);
+  }
 }
 
 char *nocolor (char *str)
 {
-    static char buf[1024], *p;
-    for (p = buf; *str; str ++) {
-        if (*str > 0x1F) *p++ = *str;
-    }
-    *p = 0;
-    return buf;
+  static GString *ret = NULL;
+  size_t len = strlen(str);
+  char *scan = NULL;
+  char *p = NULL;
+  
+  if (!ret)
+    ret = g_string_new("");
+
+  g_string_assign(ret, str);
+
+  p = scan = ret->str;
+  while (*scan)
+  {
+    if ((signed char)*scan > 0x1F) /* high characters are ok,
+                                    * but only if it's UTF-8 --
+                                    * just kill them for now */
+      *p++ = *scan;
+    ++scan;
+  }
+  if (scan != p)
+    g_string_truncate(ret, len - (scan - p));
+  
+  return ret->str;
 }
 
 GtkWidget *pixmap_label (GdkPixmap *pm, GdkBitmap *mask, char *str)
index aae953a48f652f7c43168f6cac039e011e68aaba..2ded9e2f8beb7b6303ff22503bf04be959d0b603 100644 (file)
@@ -8,7 +8,7 @@ extern int randomnum (int n);
 extern void fdreadline (int fd, char *buf);
 extern void textbox_setup (void);
 extern void textbox_addtext (GtkTextView *textbox, unsigned char *text);
-extern void adjust_bottom (GtkAdjustment *adj);
+extern void adjust_bottom_text_view (GtkTextView *);
 extern char *nocolor (char *str);
 extern GtkWidget *pixmap_label (GdkPixmap *pm, GdkBitmap *mask, char *str);
 
index 58511b294a86cdaff9960847a1a3783ab95dc70b..5d7a5d3f58c828dfa63e7a2399b8751fda88a1e1 100644 (file)
@@ -170,7 +170,7 @@ void partyline_status (char *status)
 void partyline_text (char *text)
 {
     textbox_addtext (GTK_TEXT_VIEW(textbox), text);
-    adjust_bottom (GTK_TEXT_VIEW(textbox)->vadjustment);
+    adjust_bottom_text_view(GTK_TEXT_VIEW(textbox));
 }
 
 void partyline_playerlist (int *numbers, char **names, char **teams, int n, char **specs, int sn)