From: kswong Date: Sat, 13 Jan 2001 05:56:21 +0000 (+0000) Subject: Merged page detach patch. X-Git-Url: https://hydra-www.ietfng.org/gitweb/?a=commitdiff_plain;h=1119e1603703147f3f2bbf003ac470aace5e8e7f;p=gtetrinet Merged page detach patch. Miscellaneous bug fixes. --- diff --git a/ChangeLog b/ChangeLog index 38e1db0..de62ab8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2001-01-13 + * Merged page detach patch from Neil Bird . + * Fixed stupid bug in tetrinet_specialkey(). + 2000-07-03 - version 0.4.1 2000-06-27 diff --git a/src/commands.c b/src/commands.c index 7f735e4..dc7611d 100644 --- a/src/commands.c +++ b/src/commands.c @@ -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]; diff --git a/src/commands.h b/src/commands.h index 0ca21e8..05a6306 100644 --- a/src/commands.h +++ b/src/commands.h @@ -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); diff --git a/src/gtetrinet.c b/src/gtetrinet.c index 67146fb..4109d8c 100644 --- a/src/gtetrinet.c +++ b/src/gtetrinet.c @@ -41,11 +41,12 @@ #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); diff --git a/src/gtetrinet.h b/src/gtetrinet.h index 1b4f2fe..32fdbed 100644 --- a/src/gtetrinet.h +++ b/src/gtetrinet.h @@ -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; diff --git a/src/misc.c b/src/misc.c index 2af839d..b61bb70 100644 --- a/src/misc.c +++ b/src/misc.c @@ -17,10 +17,21 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include +#include #include #include #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 ); +} + diff --git a/src/misc.h b/src/misc.h index 7a247a6..3373ef5 100644 --- a/src/misc.h +++ b/src/misc.h @@ -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); diff --git a/src/tetrinet.c b/src/tetrinet.c index 9d26ae7..a402d65 100644 --- a/src/tetrinet.c +++ b/src/tetrinet.c @@ -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 */