+2003-01-08 Dani Carbonell <bocata@panete.net>
+
+ * TODO: remove composed characters problem.
+ * src/fields.c: rewrite fields messages entry box, so it works ok
+ with composed characters.
+ * src/gtetrinet.c: acomodate fields messages changes.
+ * src/tetrinet.c: remove fields messages code, moved to fields.c.
+
2003-01-08 Jordi Mallach <jordi@sindominio.net>
* src/misc.c (nocolor): fix previous change.
- GNOME2 port issues:
+ preferences dialog (gconf)
+ keybindings
- + problem when typing composed letters (รก) in fields messages
+ port deprecated widgets (-DGTK_DISABLE_DEPRECATED)
+ detaching and reattaching the Menu Bar causes two Bonobo-CRITICAL
+ if you use the C locale and input an 8bit character, gtetrinet segfaults
#include "tetris.h"
#include "fields.h"
#include "misc.h"
+#include "gtetrinet.h"
#define BLOCKSIZE bsize
#define SMALLBLOCKSIZE (BLOCKSIZE/2)
static void fields_drawblock (int field, int x, int y, char block);
static gint fields_eatkey (GtkWidget *widget);
+static void gmsginput_activate (GtkEntry *entry, gpointer data);
static GdkPixmap *blockpix;
gmsginput = gtk_entry_new_with_max_length (128);
gtk_widget_show (gmsginput);
/* eat up key messages */
- g_signal_connect (G_OBJECT(gmsginput), "key-press-event",
- GTK_SIGNAL_FUNC(fields_eatkey), NULL);
+ g_signal_connect (G_OBJECT(gmsginput), "activate",
+ GTK_SIGNAL_FUNC(gmsginput_activate), NULL);
gtk_table_attach (GTK_TABLE(table2), gmsginput, 0, 1, 1, 2,
GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_widget_show (table2);
}
}
-void fields_gmsgadd (char *str)
+void fields_gmsgadd (const char *str)
{
textbox_addtext (GTK_TEXT_VIEW(gmsgtext), str);
adjust_bottom_text_view (GTK_TEXT_VIEW(gmsgtext));
gtk_text_buffer_set_text(GTK_TEXT_VIEW(gmsgtext)->buffer, "", 0);
}
-void fields_gmsginput (int i)
+void fields_gmsginput (gboolean i)
{
if (i) {
gtk_widget_show (gmsginput);
void fields_gmsginputactivate (int t)
{
if (t)
+ {
+ fields_gmsginputclear ();
gtk_widget_grab_focus (gmsginput);
+ }
else
{ /* do nothing */; }
}
g_free (utf8_c);
}
+void gmsginput_activate (GtkEntry *entry, gpointer data)
+{
+ gchar *locale_s, buf[256];
+ const gchar *s;
+
+ if (gmsgstate == 0)
+ {
+ fields_gmsginputclear ();
+ return;
+ }
+ s = fields_gmsginputtext ();
+ if (strlen(s) > 0) {
+ if (strncmp("/me ", s, 4) == 0) {
+ /* post /me thingy */
+ g_snprintf (buf, sizeof(buf), "* %s %s", nick, s+4);
+ locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL);
+ client_outmessage (OUT_GMSG, locale_s);
+ g_free (locale_s);
+ }
+ else {
+ /* post message */
+ g_snprintf (buf, sizeof(buf), "<%s> %s", nick, s);
+ locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL);
+ client_outmessage (OUT_GMSG, locale_s);
+ g_free (locale_s);
+ }
+ }
+ fields_gmsginputclear ();
+ fields_gmsginput (FALSE);
+ unblock_keyboard_signal ();
+ gmsgstate = 0;
+}
+
void fields_gmsginputback (void)
{
char buf[256];
extern void fields_setlines (int l);
extern void fields_setlevel (int l);
extern void fields_setactivelevel (int l);
-extern void fields_gmsgadd (char *str);
+extern void fields_gmsgadd (const char *str);
extern void fields_gmsgclear (void);
extern void fields_gmsginput (int i);
extern void fields_gmsginputclear (void);
int fields_width, fields_height;
+gulong keypress_signal;
+
static const struct poptOption options[] = {
{"connect", 'c', POPT_ARG_STRING, &option_connect, 0, N_("Connect to server"), N_("SERVER")},
{"nickname", 'n', POPT_ARG_STRING, &option_nick, 0, N_("Set nickname to use"), N_("NICKNAME")},
g_signal_connect (G_OBJECT(app), "destroy",
GTK_SIGNAL_FUNC(destroymain), NULL);
- g_signal_connect (G_OBJECT(app), "key-press-event",
- GTK_SIGNAL_FUNC(keypress), NULL);
+ keypress_signal = g_signal_connect (G_OBJECT(app), "key-press-event",
+ GTK_SIGNAL_FUNC(keypress), NULL);
g_signal_connect (G_OBJECT(app), "key-release-event",
GTK_SIGNAL_FUNC(keyrelease), NULL);
gtk_widget_set_events (app, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
GDK_CONTROL_MASK |
GDK_SHIFT_MASK)))
{
- gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
+ gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key-press-event");
return TRUE;
}
+
+ if (game_area && (gdk_keyval_to_upper (key->keyval) == keys[K_GAMEMSG]))
+ {
+ g_signal_handler_block (app, keypress_signal);
+ fields_gmsginputactivate (TRUE);
+ gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key-press-event");
+ }
if (game_area && tetrinet_key (key->keyval, key->string))
{
- gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
+ gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key-press-event");
return TRUE;
}
{
gtk_notebook_set_page (GTK_NOTEBOOK(notebook), 1);
}
+
+void unblock_keyboard_signal (void)
+{
+ g_signal_handler_unblock (app, keypress_signal);
+}
extern void move_current_page_to_window (void);
extern void show_fields_page (void);
extern void show_partyline_page (void);
+void unblock_keyboard_signal (void);
tag_table = gtk_text_buffer_get_tag_table(buffer);
}
-void textbox_addtext (GtkTextView *textbox, unsigned char *text)
+void textbox_addtext (GtkTextView *textbox, const unsigned char *text)
{
GtkTextTag *color, *lastcolor;
int i;
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 textbox_addtext (GtkTextView *textbox, const unsigned char *text);
extern void adjust_bottom_text_view (GtkTextView *);
extern char *nocolor (char *str);
extern GtkWidget *pixmap_label (GdkPixmap *pm, GdkBitmap *mask, char *str);
notfieldkey:
if (!ingame) return FALSE;
/* gmsg keys */
- if (gmsgstate == 1) {
+/* if (gmsgstate == 1) {
fields_gmsginputactivate (TRUE);
switch (keyval) {
case GDK_Return:
s = fields_gmsginputtext ();
if (strlen(s) > 0) {
if (strncmp("/me ", s, 4) == 0) {
- /* post /me thingy */
g_snprintf (buf, sizeof(buf), "* %s %s", nick, s+4);
locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL);
client_outmessage (OUT_GMSG, locale_s);
}
else {
- /* post message */
g_snprintf (buf, sizeof(buf), "<%s> %s", nick, s);
locale_s = g_locale_from_utf8 (buf, -1, NULL, NULL, NULL);
client_outmessage (OUT_GMSG, locale_s);
}
g_free (locale_s);
}
- /* hide input area */
fields_gmsginput (FALSE);
fields_gmsginputclear ();
gmsgstate = 0;
break;
}
return TRUE;
- }
+ }*/
if (gdk_keyval_to_upper (keyval) == keys[K_GAMEMSG]) {
fields_gmsginput (TRUE);
gmsgstate = 1;