Miscellaneous bug fixes.
+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
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
};
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
};
teamdialog_new ();
}
+void detach_command (GtkWidget *widget, gpointer data)
+{
+ move_current_page_to_window ();
+}
+
void start_command (GtkWidget *widget, gpointer data)
{
char buf[16];
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);
#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;
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 ();
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);
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)
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);
#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;
* 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)
/* 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)
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 );
+}
+
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);
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 ++)
else
tetrinet_setspeciallabel (-1);
- /* just discarding a block */
+ /* just discarding a block, no need to say anything */
if (pnum == -1) return;
/* send it out */