]> hydra-www.ietfng.org Git - gtetrinet/commitdiff
Merged page detach patch.
authorkswong <kswong>
Sat, 13 Jan 2001 05:56:21 +0000 (05:56 +0000)
committerkswong <kswong>
Sat, 13 Jan 2001 05:56:21 +0000 (05:56 +0000)
Miscellaneous bug fixes.

ChangeLog
src/commands.c
src/commands.h
src/gtetrinet.c
src/gtetrinet.h
src/misc.c
src/misc.h
src/tetrinet.c

index 38e1db0867fb08cbdfeebbce1221e69450327c5d..de62ab86f9818a08a6b5d9d71a8c7a58f76b4b8e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2001-01-13
+       * Merged page detach patch from Neil Bird <neil.bird@rdel.co.uk>.
+       * Fixed stupid bug in tetrinet_specialkey().
+
 2000-07-03 - version 0.4.1
 
 2000-06-27
index 7f735e40869b587b1e7d4da9b8c06c810c7eac03..dc7611d0402b4f3b601405f568d9bfd6e6333476 100644 (file)
@@ -39,6 +39,8 @@ GnomeUIInfo gamemenu[] = {
     GNOMEUIINFO_ITEM(N_("_Pause game"), NULL, pause_command, NULL),
     GNOMEUIINFO_ITEM(N_("_End game"), NULL, end_command, NULL),
     GNOMEUIINFO_SEPARATOR,
+    GNOMEUIINFO_ITEM(N_("Detac_h Page..."), NULL, detach_command, NULL),
+    GNOMEUIINFO_SEPARATOR,
     GNOMEUIINFO_MENU_EXIT_ITEM(destroymain, NULL),
     GNOMEUIINFO_END
 };
@@ -68,7 +70,9 @@ GnomeUIInfo toolbar[] = {
     GNOMEUIINFO_ITEM(N_("Pause game"), NULL, pause_command, NULL),
     GNOMEUIINFO_ITEM(N_("End game"), NULL, end_command, NULL),
     GNOMEUIINFO_SEPARATOR,
-    GNOMEUIINFO_ITEM(N_("Change team"), NULL, team_command, NULL),
+    GNOMEUIINFO_ITEM(N_("Change team"), NULL, team_command, NULL),\
+    GNOMEUIINFO_SEPARATOR,
+    GNOMEUIINFO_ITEM(N_("Detach Page"), NULL, detach_command, NULL),
     GNOMEUIINFO_END
 };
 
@@ -95,6 +99,11 @@ void team_command (GtkWidget *widget, gpointer data)
     teamdialog_new ();
 }
 
+void detach_command (GtkWidget *widget, gpointer data)
+{
+    move_current_page_to_window ();
+}
+
 void start_command (GtkWidget *widget, gpointer data)
 {
     char buf[16];
index 0ca21e81260d43ffe85613b33758f1cc2d24039c..05a63060ebca5133d535457b0ca9bfd8b715cafa 100644 (file)
@@ -6,6 +6,7 @@ void make_menus (GnomeApp *app);
 void connect_command (GtkWidget *widget, gpointer data);
 void disconnect_command (GtkWidget *widget, gpointer data);
 void team_command (GtkWidget *widget, gpointer data);
+void detach_command (GtkWidget *widget, gpointer data);
 void start_command (GtkWidget *widget, gpointer data);
 void end_command (GtkWidget *widget, gpointer data);
 void pause_command (GtkWidget *widget, gpointer data);
index 67146fbd75c6047cf4adbc545738347a0dc36da8..4109d8c05d4aa397893eb6775b2b24c213ff58d5 100644 (file)
 #include "images/winlist.xpm"
 
 static GtkWidget *pixmapdata_label (char **d, char *str);
-static gint keypress (GtkWidget *widget, GdkEventKey *key);
-static gint keyrelease (GtkWidget *widget, GdkEventKey *key);
 static int gtetrinet_key (int keyval);
+gint keypress (GtkWidget *widget, GdkEventKey *key);
+gint keyrelease (GtkWidget *widget, GdkEventKey *key);
 
-static GtkWidget *app, *notebook, *pfields;
+static GtkWidget *app, *pfields;
+GtkWidget *notebook;
 
 char *option_connect = 0, *option_nick = 0, *option_team = 0, *option_pass = 0;
 int option_spec = 0;
@@ -61,9 +62,9 @@ static const struct poptOption options[] = {
 
 int main (int argc, char *argv[])
 {
-    GtkWidget *page, *label;
+    GtkWidget *page, *label, *box;
 
-    srandom (time(NULL));
+    srand (time(NULL));
 
     gnome_init_with_popt_table (APPID, APPVERSION, argc, argv, options, 0 , NULL);
     gdk_imlib_init ();
@@ -101,24 +102,39 @@ int main (int argc, char *argv[])
     make_menus (GNOME_APP(app));
 
     /* create the pages in the notebook */
-    pfields = fields_page_new ();
-    gtk_widget_set_sensitive (pfields, TRUE);
+    page = fields_page_new ();
+    gtk_widget_set_sensitive (page, TRUE);
+    gtk_widget_show (page);
+    pfields = gtk_hbox_new (FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER(pfields), 0);
+    gtk_container_add (GTK_CONTAINER(pfields), page);
     gtk_widget_show (pfields);
+    gtk_object_set_data( GTK_OBJECT(page), "title", "Playing Fields");
     label = pixmapdata_label (fields_xpm, "Playing Fields");
     gtk_widget_show (label);
     gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pfields, label);
 
     page = partyline_page_new ();
     gtk_widget_show (page);
+    box = gtk_hbox_new (FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER(box), 0);
+    gtk_container_add (GTK_CONTAINER(box), page);
+    gtk_widget_show (box);
+    gtk_object_set_data( GTK_OBJECT(page), "title", "Partyline");
     label = pixmapdata_label (partyline_xpm, "Partyline");
     gtk_widget_show (label);
-    gtk_notebook_append_page (GTK_NOTEBOOK(notebook), page, label);
+    gtk_notebook_append_page (GTK_NOTEBOOK(notebook), box, label);
 
     page = winlist_page_new ();
     gtk_widget_show (page);
+    box = gtk_hbox_new (FALSE, 0);
+    gtk_container_set_border_width (GTK_CONTAINER(box), 0);
+    gtk_container_add (GTK_CONTAINER(box), page);
+    gtk_widget_show (box);
+    gtk_object_set_data( GTK_OBJECT(page), "title", "Winlist");
     label = pixmapdata_label (winlist_xpm, "Winlist");
     gtk_widget_show (label);
-    gtk_notebook_append_page (GTK_NOTEBOOK(notebook), page, label);
+    gtk_notebook_append_page (GTK_NOTEBOOK(notebook), box, label);
 
     gtk_widget_show (notebook);
     gtk_widget_show (app);
@@ -204,7 +220,25 @@ gint keytimeout (gpointer data)
 
 gint keypress (GtkWidget *widget, GdkEventKey *key)
 {
-    if (GTK_NOTEBOOK(notebook)->cur_page->child == pfields)
+    int game_area;
+
+    if (widget == app)
+    {
+        /* Main window - check the notebook */
+        game_area = (GTK_NOTEBOOK(notebook)->cur_page->child == pfields);
+    }
+    else
+    {
+        /* Sub-window - find out which */
+        GtkArg arg;
+
+        arg.name = "title";
+        gtk_object_getv( GTK_OBJECT(widget), 1, &arg );
+        game_area =  !strcmp( GTK_VALUE_STRING(arg), "Playing Fields" );
+        g_free( GTK_VALUE_STRING(arg) );
+    }
+
+    if (game_area)
     {
         /* keys for the playing field - key releases needed - install timeout */
         if (keytimeoutid && key->time == k.time)
@@ -220,7 +254,25 @@ keyprocessed:
 
 gint keyrelease (GtkWidget *widget, GdkEventKey *key)
 {
-    if (GTK_NOTEBOOK(notebook)->cur_page->child == pfields)
+    int game_area;
+
+    if (widget == app)
+    {
+        /* Main window - check the notebook */
+        game_area = (GTK_NOTEBOOK(notebook)->cur_page->child == pfields);
+    }
+    else
+    {
+        /* Sub-window - find out which */
+        GtkArg arg;
+
+        arg.name = "title";
+        gtk_object_getv( GTK_OBJECT(widget), 1, &arg );
+        game_area =  !strcmp( GTK_VALUE_STRING(arg), "Playing Fields" );
+        g_free( GTK_VALUE_STRING(arg) );
+    }
+
+    if (game_area)
     {
         k = *key;
         keytimeoutid = gtk_timeout_add (10, keytimeout, 0);
index 1b4f2feb44ff1ba9ca94a23973374cf4f320c4d2..32fdbedb2fc52e4803ab1dc315b9316a28bd8529 100644 (file)
@@ -2,4 +2,8 @@
 #define APPNAME "GTetrinet"
 #define APPVERSION VERSION
 
-void destroymain (GtkWidget *widget, gpointer data);
+extern void destroymain (GtkWidget *widget, gpointer data);
+extern gint keypress (GtkWidget *widget, GdkEventKey *key);
+extern gint keyrelease (GtkWidget *widget, GdkEventKey *key);
+
+extern GtkWidget *notebook;
index 2af839d3464c1a1b64c66810bc8480eca68c6783..b61bb7079913fafb2953f428403961592f1f1033 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <gtk/gtk.h>
+#include <gnome.h>
 #include <unistd.h>
 #include <stdlib.h>
 
 #include "misc.h"
+#include "gtetrinet.h"
+
+
+/* Type to hold primary widget and it's label in the notebook page */
+typedef struct {
+    GtkWidget *parent;
+    GtkWidget *widget;
+    gint       pageNo;
+} WidgetPageData;
+
 
 /* a left aligned label */
 GtkWidget *leftlabel_new (char *str)
@@ -43,7 +54,7 @@ void leftlabel_set (GtkWidget *align, char *str)
 /* returns a random number in the range 0 to n-1 */
 int randomnum (int n)
 {
-    return (float)n*random()/(RAND_MAX+1.0);
+    return (float)n*rand()/(RAND_MAX+1.0);
 }
 
 void fdreadline (int fd, char *buf)
@@ -188,3 +199,73 @@ GtkWidget *pixmap_label (GdkPixmap *pm, GdkBitmap *mask, char *str)
     gtk_box_pack_start (GTK_BOX(box), widget, TRUE, TRUE, 0);
     return box;
 }
+
+void destroy_page_window (GtkWidget *window, gpointer data)
+{
+    WidgetPageData *pageData = (WidgetPageData *)data;
+
+    /* Put widget back into a page */
+    gtk_widget_reparent (pageData->widget, pageData->parent);
+
+    /* Select it */
+    gtk_notebook_set_page (GTK_NOTEBOOK(notebook), pageData->pageNo);
+
+    /* Free return data */
+    g_free (data);
+}
+
+void move_current_page_to_window (void)
+{
+    WidgetPageData *pageData;
+    GtkWidget *page, *child, *newWindow;
+    GList *dlist;
+    gint pageNo;
+    char *title;
+
+    /* Extract current page's widget & it's parent from the notebook */
+    pageNo = gtk_notebook_get_current_page (GTK_NOTEBOOK(notebook));
+    page   = gtk_notebook_get_nth_page (GTK_NOTEBOOK(notebook), pageNo );
+    dlist  = gtk_container_children (GTK_CONTAINER(page));
+    if (!dlist ||  !(dlist->data))
+    {
+        /* Must already be a window */
+        if (dlist)
+           g_list_free (dlist);
+        return;
+    }
+    child = (GtkWidget *)dlist->data;
+    g_list_free (dlist);
+
+    /* Create new window for widget, plus container, etc. */
+    newWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    title = gtk_object_get_data(child, "title");
+    if (!title)
+        title = "GTetrinet";
+    gtk_window_set_title (GTK_WINDOW (newWindow), title);
+    gtk_container_set_border_width (GTK_CONTAINER (newWindow), 0);
+
+    /* Attach key events to window */
+    gtk_signal_connect (GTK_OBJECT(newWindow), "key_press_event",
+                        GTK_SIGNAL_FUNC(keypress), NULL);
+    gtk_signal_connect (GTK_OBJECT(newWindow), "key_release_event",
+                        GTK_SIGNAL_FUNC(keyrelease), NULL);
+    gtk_widget_set_events (newWindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+    gtk_window_set_policy (GTK_WINDOW(newWindow), FALSE, TRUE, FALSE);
+
+    /* Create store to point us back to page for later */
+    pageData = g_new( WidgetPageData, 1 );
+    pageData->parent = page;
+    pageData->widget = child;
+    pageData->pageNo = pageNo;
+
+    /* Move main widget to window */
+    gtk_widget_reparent (child, newWindow);
+
+    /* Pass ID of parent (to put widget back) to window's destroy */
+    gtk_signal_connect (GTK_OBJECT(newWindow), "destroy",
+                        GTK_SIGNAL_FUNC(destroy_page_window),
+                        (gpointer)(pageData));
+
+    gtk_widget_show_all( newWindow );
+}
+
index 7a247a67479deae6973c7cc794d21ab2585381e7..3373ef559f4e6be0716c3605696cde92cd31574d 100644 (file)
@@ -8,3 +8,4 @@ extern void textbox_addtext (GtkText *textbox, unsigned char *text);
 extern void adjust_bottom (GtkAdjustment *adj);
 extern char *nocolor (char *str);
 extern GtkWidget *pixmap_label (GdkPixmap *pm, GdkBitmap *mask, char *str);
+extern void move_current_page_to_window (void);
index 9d26ae7480332dc56a9826697e61cd10b19c9db6..a402d65d0285f70aa19f50ae0b3e5df4e975500d 100644 (file)
@@ -1387,7 +1387,7 @@ void tetrinet_specialkey (int pnum)
 
     if (specialblocknum == 0) return;
 
-    if (!playerplaying[pnum]) return;
+    if (pnum != -1 && !playerplaying[pnum]) return;
 
     /* find which block it is */
     for (sbnum = 0; sbinfo[sbnum].id; sbnum ++)
@@ -1403,7 +1403,7 @@ void tetrinet_specialkey (int pnum)
     else
         tetrinet_setspeciallabel (-1);
 
-    /* just discarding a block */
+    /* just discarding a block, no need to say anything */
     if (pnum == -1) return;
 
     /* send it out */