Blame tests/testwindows.c

Packit 98cdb6
#undef GDK_DISABLE_DEPRECATED
Packit 98cdb6
#include <gtk/gtk.h>
Packit 98cdb6
#ifdef GDK_WINDOWING_X11
Packit 98cdb6
#include <X11/Xlib.h>
Packit 98cdb6
#endif
Packit 98cdb6
Packit 98cdb6
static GtkWidget *darea;
Packit 98cdb6
static GtkTreeStore *window_store = NULL;
Packit 98cdb6
static GtkWidget *treeview;
Packit 98cdb6
Packit 98cdb6
static void update_store (void);
Packit 98cdb6
Packit 98cdb6
static GtkWidget *main_window;
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
window_has_impl (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *w;
Packit 98cdb6
  w = (GdkWindowObject *)window;
Packit 98cdb6
  return w->parent == NULL || w->parent->impl != w->impl;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkWindow *
Packit 98cdb6
create_window (GdkWindow *parent,
Packit 98cdb6
	       int x, int y, int w, int h,
Packit 98cdb6
	       GdkColor *color)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowAttr attributes;
Packit 98cdb6
  gint attributes_mask;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  GdkColor *bg;
Packit 98cdb6
Packit 98cdb6
  attributes.x = x;
Packit 98cdb6
  attributes.y = y;
Packit 98cdb6
  attributes.width = w;
Packit 98cdb6
  attributes.height = h;
Packit 98cdb6
  attributes.window_type = GDK_WINDOW_CHILD;
Packit 98cdb6
  attributes.event_mask = GDK_STRUCTURE_MASK
Packit 98cdb6
			| GDK_BUTTON_MOTION_MASK
Packit 98cdb6
			| GDK_BUTTON_PRESS_MASK
Packit 98cdb6
			| GDK_BUTTON_RELEASE_MASK
Packit 98cdb6
			| GDK_EXPOSURE_MASK
Packit 98cdb6
			| GDK_ENTER_NOTIFY_MASK
Packit 98cdb6
			| GDK_LEAVE_NOTIFY_MASK;
Packit 98cdb6
  attributes.wclass = GDK_INPUT_OUTPUT;
Packit 98cdb6
      
Packit 98cdb6
  attributes_mask = GDK_WA_X | GDK_WA_Y;
Packit 98cdb6
      
Packit 98cdb6
  window = gdk_window_new (parent, &attributes, attributes_mask);
Packit 98cdb6
  gdk_window_set_user_data (window, darea);
Packit 98cdb6
Packit 98cdb6
  bg = g_new (GdkColor, 1);
Packit 98cdb6
  if (color)
Packit 98cdb6
    *bg = *color;
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      bg->red = g_random_int_range (0, 0xffff);
Packit 98cdb6
      bg->blue = g_random_int_range (0, 0xffff);
Packit 98cdb6
      bg->green = g_random_int_range (0, 0xffff);;
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  gdk_rgb_find_color (gtk_widget_get_colormap (darea), bg);
Packit 98cdb6
  gdk_window_set_background (window, bg);
Packit 98cdb6
  g_object_set_data_full (G_OBJECT (window), "color", bg, g_free);
Packit 98cdb6
  
Packit 98cdb6
  gdk_window_show (window);
Packit 98cdb6
  
Packit 98cdb6
  return window;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
add_window_cb (GtkTreeModel      *model,
Packit 98cdb6
	       GtkTreePath       *path,
Packit 98cdb6
	       GtkTreeIter       *iter,
Packit 98cdb6
	       gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  GList **selected = data;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
Packit 98cdb6
  gtk_tree_model_get (GTK_TREE_MODEL (window_store),
Packit 98cdb6
		      iter,
Packit 98cdb6
		      0, &window,
Packit 98cdb6
		      -1);
Packit 98cdb6
Packit 98cdb6
  *selected = g_list_prepend (*selected, window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GList *
Packit 98cdb6
get_selected_windows (void)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeSelection *sel;
Packit 98cdb6
  GList *selected;
Packit 98cdb6
Packit 98cdb6
  sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
Packit 98cdb6
Packit 98cdb6
  selected = NULL;
Packit 98cdb6
  gtk_tree_selection_selected_foreach (sel, add_window_cb, &selected);
Packit 98cdb6
  
Packit 98cdb6
  return selected;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
find_window_helper (GtkTreeModel *model,
Packit 98cdb6
		    GdkWindow *window,
Packit 98cdb6
		    GtkTreeIter *iter,
Packit 98cdb6
		    GtkTreeIter *selected_iter)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeIter child_iter;
Packit 98cdb6
  GdkWindow *w;
Packit 98cdb6
Packit 98cdb6
  do
Packit 98cdb6
    {
Packit 98cdb6
      gtk_tree_model_get (model, iter,
Packit 98cdb6
			  0, &w,
Packit 98cdb6
			  -1);
Packit 98cdb6
      if (w == window)
Packit 98cdb6
	{
Packit 98cdb6
	  *selected_iter = *iter;
Packit 98cdb6
	  return TRUE;
Packit 98cdb6
	}
Packit 98cdb6
      
Packit 98cdb6
      if (gtk_tree_model_iter_children (model,
Packit 98cdb6
					&child_iter,
Packit 98cdb6
					iter))
Packit 98cdb6
	{
Packit 98cdb6
	  if (find_window_helper (model, window, &child_iter, selected_iter))
Packit 98cdb6
	    return TRUE;
Packit 98cdb6
	}
Packit 98cdb6
    } while (gtk_tree_model_iter_next (model, iter));
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
find_window (GdkWindow *window,
Packit 98cdb6
	     GtkTreeIter *window_iter)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
Packit 98cdb6
  if (!gtk_tree_model_get_iter_first  (GTK_TREE_MODEL (window_store), &iter))
Packit 98cdb6
    return FALSE;
Packit 98cdb6
Packit 98cdb6
  return find_window_helper (GTK_TREE_MODEL (window_store),
Packit 98cdb6
			     window,
Packit 98cdb6
			     &iter,
Packit 98cdb6
			     window_iter);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
toggle_selection_window (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeSelection *selection;
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
Packit 98cdb6
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
Packit 98cdb6
Packit 98cdb6
  if (window != NULL &&
Packit 98cdb6
      find_window (window, &iter))
Packit 98cdb6
    {
Packit 98cdb6
      if (gtk_tree_selection_iter_is_selected (selection, &iter))
Packit 98cdb6
	gtk_tree_selection_unselect_iter (selection,  &iter);
Packit 98cdb6
      else
Packit 98cdb6
	gtk_tree_selection_select_iter (selection,  &iter);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
unselect_windows (void)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeSelection *selection;
Packit 98cdb6
Packit 98cdb6
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
Packit 98cdb6
  
Packit 98cdb6
  gtk_tree_selection_unselect_all (selection);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
select_window (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeSelection *selection;
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
Packit 98cdb6
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
Packit 98cdb6
Packit 98cdb6
  if (window != NULL &&
Packit 98cdb6
      find_window (window, &iter))
Packit 98cdb6
    gtk_tree_selection_select_iter (selection,  &iter);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
select_windows (GList *windows)
Packit 98cdb6
{
Packit 98cdb6
  GtkTreeSelection *selection;
Packit 98cdb6
  GtkTreeIter iter;
Packit 98cdb6
  GList *l;
Packit 98cdb6
Packit 98cdb6
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
Packit 98cdb6
  gtk_tree_selection_unselect_all (selection);
Packit 98cdb6
  
Packit 98cdb6
  for (l = windows; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      if (find_window (l->data, &iter))
Packit 98cdb6
	gtk_tree_selection_select_iter (selection,  &iter);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
add_window_clicked (GtkWidget *button, 
Packit 98cdb6
		    gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *parent;
Packit 98cdb6
  GList *l;
Packit 98cdb6
Packit 98cdb6
  l = get_selected_windows ();
Packit 98cdb6
  if (l != NULL)
Packit 98cdb6
    parent = l->data;
Packit 98cdb6
  else
Packit 98cdb6
    parent = darea->window;
Packit 98cdb6
Packit 98cdb6
  g_list_free (l);
Packit 98cdb6
  
Packit 98cdb6
  create_window (parent, 10, 10, 100, 100, NULL);
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_drawable_clicked (GtkWidget *button, 
Packit 98cdb6
		       gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GdkGC *gc;
Packit 98cdb6
  gc = gdk_gc_new (darea->window);
Packit 98cdb6
  gdk_draw_drawable (darea->window,
Packit 98cdb6
		     gc,
Packit 98cdb6
		     darea->window,
Packit 98cdb6
		     -15, -15,
Packit 98cdb6
		     40, 70,
Packit 98cdb6
		     100, 100);
Packit 98cdb6
  g_object_unref (gc);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
remove_window_clicked (GtkWidget *button, 
Packit 98cdb6
		       gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *l, *selected;
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    gdk_window_destroy (l->data);
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void save_children (GString *s, GdkWindow *window);
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
save_window (GString *s,
Packit 98cdb6
	     GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  gint x, y, w, h;
Packit 98cdb6
  GdkColor *color;
Packit 98cdb6
Packit 98cdb6
  gdk_window_get_position (window, &x, &y);
Packit 98cdb6
  gdk_drawable_get_size (GDK_DRAWABLE (window), &w, &h);
Packit 98cdb6
  color = g_object_get_data (G_OBJECT (window), "color");
Packit 98cdb6
  
Packit 98cdb6
  g_string_append_printf (s, "%d,%d %dx%d (%d,%d,%d) %d %d\n",
Packit 98cdb6
			  x, y, w, h,
Packit 98cdb6
			  color->red, color->green, color->blue,
Packit 98cdb6
			  window_has_impl (window),
Packit 98cdb6
			  g_list_length (gdk_window_peek_children (window)));
Packit 98cdb6
Packit 98cdb6
  save_children (s, window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
save_children (GString *s,
Packit 98cdb6
	       GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GList *l;
Packit 98cdb6
  GdkWindow *child;
Packit 98cdb6
Packit 98cdb6
  for (l = g_list_reverse (gdk_window_peek_children (window));
Packit 98cdb6
       l != NULL;
Packit 98cdb6
       l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      child = l->data;
Packit 98cdb6
Packit 98cdb6
      save_window (s, child);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
save_clicked (GtkWidget *button, 
Packit 98cdb6
	      gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GString *s;
Packit 98cdb6
  GtkWidget *dialog;
Packit 98cdb6
  GFile *file;
Packit 98cdb6
Packit 98cdb6
  s = g_string_new ("");
Packit 98cdb6
Packit 98cdb6
  save_children (s, darea->window);
Packit 98cdb6
Packit 98cdb6
  dialog = gtk_file_chooser_dialog_new ("Filename for window data",
Packit 98cdb6
					NULL,
Packit 98cdb6
					GTK_FILE_CHOOSER_ACTION_SAVE,
Packit 98cdb6
					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
Packit 98cdb6
					GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
Packit 98cdb6
					NULL);
Packit 98cdb6
  
Packit 98cdb6
  gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
Packit 98cdb6
  
Packit 98cdb6
  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
Packit 98cdb6
    {
Packit 98cdb6
      file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
Packit 98cdb6
Packit 98cdb6
      g_file_replace_contents (file,
Packit 98cdb6
			       s->str, s->len,
Packit 98cdb6
			       NULL, FALSE,
Packit 98cdb6
			       0, NULL, NULL, NULL);
Packit 98cdb6
Packit 98cdb6
      g_object_unref (file);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gtk_widget_destroy (dialog);
Packit 98cdb6
  g_string_free (s, TRUE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
destroy_children (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GList *l;
Packit 98cdb6
  GdkWindow *child;
Packit 98cdb6
Packit 98cdb6
  for (l = gdk_window_peek_children (window);
Packit 98cdb6
       l != NULL;
Packit 98cdb6
       l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      child = l->data;
Packit 98cdb6
      
Packit 98cdb6
      destroy_children (child);
Packit 98cdb6
      gdk_window_destroy (child);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static char **
Packit 98cdb6
parse_window (GdkWindow *parent, char **lines)
Packit 98cdb6
{
Packit 98cdb6
  int x, y, w, h, r, g, b, native, n_children;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  GdkColor color;
Packit 98cdb6
  int i;
Packit 98cdb6
Packit 98cdb6
  if (*lines == NULL)
Packit 98cdb6
    return lines;
Packit 98cdb6
  
Packit 98cdb6
  if (sscanf(*lines, "%d,%d %dx%d (%d,%d,%d) %d %d",
Packit 98cdb6
	     &x, &y, &w, &h, &r, &g, &b, &native, &n_children) == 9)
Packit 98cdb6
    {
Packit 98cdb6
      lines++;
Packit 98cdb6
      color.red = r;
Packit 98cdb6
      color.green = g;
Packit 98cdb6
      color.blue = b;
Packit 98cdb6
      window = create_window (parent, x, y, w, h, &color;;
Packit 98cdb6
      if (native)
Packit 98cdb6
	gdk_window_ensure_native (window);
Packit 98cdb6
      
Packit 98cdb6
      for (i = 0; i < n_children; i++)
Packit 98cdb6
	lines = parse_window (window, lines);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    lines++;
Packit 98cdb6
  
Packit 98cdb6
  return lines;
Packit 98cdb6
}
Packit 98cdb6
  
Packit 98cdb6
static void
Packit 98cdb6
load_file (GFile *file)
Packit 98cdb6
{
Packit 98cdb6
  char *data;
Packit 98cdb6
  char **lines, **l;
Packit 98cdb6
  
Packit 98cdb6
  if (g_file_load_contents (file, NULL, &data, NULL, NULL, NULL))
Packit 98cdb6
    {
Packit 98cdb6
      destroy_children (darea->window);
Packit 98cdb6
Packit 98cdb6
      lines = g_strsplit (data, "\n", -1);
Packit 98cdb6
Packit 98cdb6
      l = lines;
Packit 98cdb6
      while (*l != NULL)
Packit 98cdb6
	l = parse_window (darea->window, l);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
move_window_clicked (GtkWidget *button, 
Packit 98cdb6
		     gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  GtkDirectionType direction;
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  gint x, y;
Packit 98cdb6
Packit 98cdb6
  direction = GPOINTER_TO_INT (data);
Packit 98cdb6
    
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_get_position (window, &x, &y);
Packit 98cdb6
      
Packit 98cdb6
      switch (direction) {
Packit 98cdb6
      case GTK_DIR_UP:
Packit 98cdb6
	y -= 10;
Packit 98cdb6
	break;
Packit 98cdb6
      case GTK_DIR_DOWN:
Packit 98cdb6
	y += 10;
Packit 98cdb6
	break;
Packit 98cdb6
      case GTK_DIR_LEFT:
Packit 98cdb6
	x -= 10;
Packit 98cdb6
	break;
Packit 98cdb6
      case GTK_DIR_RIGHT:
Packit 98cdb6
	x += 10;
Packit 98cdb6
	break;
Packit 98cdb6
      default:
Packit 98cdb6
	break;
Packit 98cdb6
      }
Packit 98cdb6
Packit 98cdb6
      gdk_window_move (window, x, y);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
manual_clicked (GtkWidget *button, 
Packit 98cdb6
		gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  int x, y, w, h;
Packit 98cdb6
  GtkWidget *dialog, *table, *label, *xspin, *yspin, *wspin, *hspin;
Packit 98cdb6
  
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  if (selected == NULL)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  gdk_window_get_position (selected->data, &x, &y);
Packit 98cdb6
  gdk_drawable_get_size (selected->data, &w, &h);
Packit 98cdb6
Packit 98cdb6
  dialog = gtk_dialog_new_with_buttons ("Select new position and size",
Packit 98cdb6
					GTK_WINDOW (main_window),
Packit 98cdb6
					GTK_DIALOG_MODAL,
Packit 98cdb6
					GTK_STOCK_OK, GTK_RESPONSE_OK,
Packit 98cdb6
					NULL);
Packit 98cdb6
  
Packit 98cdb6
Packit 98cdb6
  table = gtk_table_new (2, 4, TRUE);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
Packit 98cdb6
		      table,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      2);
Packit 98cdb6
Packit 98cdb6
  
Packit 98cdb6
  label = gtk_label_new ("x:");
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     label,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     0, 1);
Packit 98cdb6
  label = gtk_label_new ("y:");
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     label,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     1, 2);
Packit 98cdb6
  label = gtk_label_new ("width:");
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     label,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     2, 3);
Packit 98cdb6
  label = gtk_label_new ("height:");
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     label,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     3, 4);
Packit 98cdb6
Packit 98cdb6
  xspin = gtk_spin_button_new_with_range (G_MININT, G_MAXINT, 1);
Packit 98cdb6
  gtk_spin_button_set_value (GTK_SPIN_BUTTON (xspin), x);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     xspin,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     0, 1);
Packit 98cdb6
  yspin = gtk_spin_button_new_with_range (G_MININT, G_MAXINT, 1);
Packit 98cdb6
  gtk_spin_button_set_value (GTK_SPIN_BUTTON (yspin), y);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     yspin,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     1, 2);
Packit 98cdb6
  wspin = gtk_spin_button_new_with_range (G_MININT, G_MAXINT, 1);
Packit 98cdb6
  gtk_spin_button_set_value (GTK_SPIN_BUTTON (wspin), w);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     wspin,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     2, 3);
Packit 98cdb6
  hspin = gtk_spin_button_new_with_range (G_MININT, G_MAXINT, 1);
Packit 98cdb6
  gtk_spin_button_set_value (GTK_SPIN_BUTTON (hspin), h);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     hspin,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     3, 4);
Packit 98cdb6
  
Packit 98cdb6
  gtk_widget_show_all (dialog);
Packit 98cdb6
  
Packit 98cdb6
  gtk_dialog_run (GTK_DIALOG (dialog));
Packit 98cdb6
Packit 98cdb6
  x = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (xspin));
Packit 98cdb6
  y = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (yspin));
Packit 98cdb6
  w = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (wspin));
Packit 98cdb6
  h = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (hspin));
Packit 98cdb6
Packit 98cdb6
  gtk_widget_destroy (dialog);
Packit 98cdb6
  
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_move_resize (window, x, y, w, h);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
restack_clicked (GtkWidget *button,
Packit 98cdb6
		 gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected;
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  if (g_list_length (selected) != 2)
Packit 98cdb6
    {
Packit 98cdb6
      g_warning ("select two windows");
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_window_restack (selected->data,
Packit 98cdb6
		      selected->next->data,
Packit 98cdb6
		      GPOINTER_TO_INT (data));
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
scroll_window_clicked (GtkWidget *button, 
Packit 98cdb6
		       gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  GtkDirectionType direction;
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  gint dx, dy;
Packit 98cdb6
Packit 98cdb6
  direction = GPOINTER_TO_INT (data);
Packit 98cdb6
    
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  dx = 0; dy = 0;
Packit 98cdb6
  switch (direction) {
Packit 98cdb6
  case GTK_DIR_UP:
Packit 98cdb6
    dy = 10;
Packit 98cdb6
    break;
Packit 98cdb6
  case GTK_DIR_DOWN:
Packit 98cdb6
    dy = -10;
Packit 98cdb6
    break;
Packit 98cdb6
  case GTK_DIR_LEFT:
Packit 98cdb6
    dx = 10;
Packit 98cdb6
    break;
Packit 98cdb6
  case GTK_DIR_RIGHT:
Packit 98cdb6
    dx = -10;
Packit 98cdb6
    break;
Packit 98cdb6
  default:
Packit 98cdb6
    break;
Packit 98cdb6
  }
Packit 98cdb6
  
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
Packit 98cdb6
      gdk_window_scroll (window, dx, dy);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
raise_window_clicked (GtkWidget *button, 
Packit 98cdb6
		      gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
    
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_raise (window);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
  
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
lower_window_clicked (GtkWidget *button, 
Packit 98cdb6
		      gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
    
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_lower (window);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
  
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
smaller_window_clicked (GtkWidget *button, 
Packit 98cdb6
			gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  int w, h;
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_drawable_get_size (GDK_DRAWABLE (window), &w, &h);
Packit 98cdb6
      
Packit 98cdb6
      w -= 10;
Packit 98cdb6
      h -= 10;
Packit 98cdb6
      if (w < 1)
Packit 98cdb6
	w = 1;
Packit 98cdb6
      if (h < 1)
Packit 98cdb6
	h = 1;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_resize (window, w, h);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
larger_window_clicked (GtkWidget *button, 
Packit 98cdb6
			gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  int w, h;
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_drawable_get_size (GDK_DRAWABLE (window), &w, &h);
Packit 98cdb6
      
Packit 98cdb6
      w += 10;
Packit 98cdb6
      h += 10;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_resize (window, w, h);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
native_window_clicked (GtkWidget *button, 
Packit 98cdb6
			gpointer data)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected, *l;
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  for (l = selected; l != NULL; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      window = l->data;
Packit 98cdb6
      
Packit 98cdb6
      gdk_window_ensure_native (window);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
  
Packit 98cdb6
  update_store ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
darea_button_release_event (GtkWidget *widget,
Packit 98cdb6
			    GdkEventButton *event)
Packit 98cdb6
{
Packit 98cdb6
  if ((event->state & GDK_CONTROL_MASK) != 0)
Packit 98cdb6
    {
Packit 98cdb6
      toggle_selection_window (event->window);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      unselect_windows ();
Packit 98cdb6
      select_window (event->window);
Packit 98cdb6
    }
Packit 98cdb6
    
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
render_window_cell (GtkTreeViewColumn *tree_column,
Packit 98cdb6
		    GtkCellRenderer   *cell,
Packit 98cdb6
		    GtkTreeModel      *tree_model,
Packit 98cdb6
		    GtkTreeIter       *iter,
Packit 98cdb6
		    gpointer           data)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *window;
Packit 98cdb6
  char *name;
Packit 98cdb6
Packit 98cdb6
  gtk_tree_model_get (GTK_TREE_MODEL (window_store),
Packit 98cdb6
		      iter,
Packit 98cdb6
		      0, &window,
Packit 98cdb6
		      -1);
Packit 98cdb6
Packit 98cdb6
  if (window_has_impl (window))
Packit 98cdb6
      name = g_strdup_printf ("%p (native)", window);
Packit 98cdb6
  else
Packit 98cdb6
      name = g_strdup_printf ("%p", window);
Packit 98cdb6
  g_object_set (cell,
Packit 98cdb6
		"text", name,
Packit 98cdb6
		"background-gdk", &((GdkWindowObject *)window)->bg_color,
Packit 98cdb6
		NULL);  
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
add_children (GtkTreeStore *store,
Packit 98cdb6
	      GdkWindow *window,
Packit 98cdb6
	      GtkTreeIter *window_iter)
Packit 98cdb6
{
Packit 98cdb6
  GList *l;
Packit 98cdb6
  GtkTreeIter child_iter;
Packit 98cdb6
Packit 98cdb6
  for (l = gdk_window_peek_children (window);
Packit 98cdb6
       l != NULL;
Packit 98cdb6
       l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      gtk_tree_store_append (store, &child_iter, window_iter);
Packit 98cdb6
      gtk_tree_store_set (store, &child_iter,
Packit 98cdb6
			  0, l->data,
Packit 98cdb6
			  -1);
Packit 98cdb6
Packit 98cdb6
      add_children (store, l->data, &child_iter);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
update_store (void)
Packit 98cdb6
{
Packit 98cdb6
  GList *selected;
Packit 98cdb6
Packit 98cdb6
  selected = get_selected_windows ();
Packit 98cdb6
Packit 98cdb6
  gtk_tree_store_clear (window_store);
Packit 98cdb6
Packit 98cdb6
  add_children (window_store, darea->window, NULL);
Packit 98cdb6
  gtk_tree_view_expand_all (GTK_TREE_VIEW (treeview));
Packit 98cdb6
Packit 98cdb6
  select_windows (selected);
Packit 98cdb6
  g_list_free (selected);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
int
Packit 98cdb6
main (int argc, char **argv)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *window, *vbox, *hbox, *frame;
Packit 98cdb6
  GtkWidget *button, *scrolled, *table;
Packit 98cdb6
  GtkTreeViewColumn *column;
Packit 98cdb6
  GtkCellRenderer *renderer;
Packit 98cdb6
  GdkColor black = {0};
Packit 98cdb6
  GFile *file;
Packit 98cdb6
  
Packit 98cdb6
  gtk_init (&argc, &argv);
Packit 98cdb6
Packit 98cdb6
  main_window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 98cdb6
  gtk_container_set_border_width (GTK_CONTAINER (window), 0);
Packit 98cdb6
Packit 98cdb6
  g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL);
Packit 98cdb6
Packit 98cdb6
  hbox = gtk_hbox_new (FALSE, 5);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (window), hbox);
Packit 98cdb6
  gtk_widget_show (hbox);
Packit 98cdb6
Packit 98cdb6
  frame = gtk_frame_new ("GdkWindows");
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (hbox),
Packit 98cdb6
		      frame,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      5);
Packit 98cdb6
  gtk_widget_show (frame);
Packit 98cdb6
Packit 98cdb6
  darea =  gtk_drawing_area_new ();
Packit 98cdb6
  /*gtk_widget_set_double_buffered (darea, FALSE);*/
Packit 98cdb6
  gtk_widget_add_events (darea, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
Packit 98cdb6
  gtk_widget_set_size_request (darea, 500, 500);
Packit 98cdb6
  g_signal_connect (darea, "button_release_event", 
Packit 98cdb6
		    G_CALLBACK (darea_button_release_event), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
Packit 98cdb6
  
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (frame), darea);
Packit 98cdb6
  gtk_widget_realize (darea);
Packit 98cdb6
  gtk_widget_show (darea);
Packit 98cdb6
  gtk_widget_modify_bg (darea, GTK_STATE_NORMAL,
Packit 98cdb6
			&black);
Packit 98cdb6
			
Packit 98cdb6
  
Packit 98cdb6
  vbox = gtk_vbox_new (FALSE, 5);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (hbox),
Packit 98cdb6
		      vbox,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      5);
Packit 98cdb6
  gtk_widget_show (vbox);
Packit 98cdb6
Packit 98cdb6
  window_store = gtk_tree_store_new (1, GDK_TYPE_WINDOW);
Packit 98cdb6
  
Packit 98cdb6
  treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (window_store));
Packit 98cdb6
  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
Packit 98cdb6
			       GTK_SELECTION_MULTIPLE);
Packit 98cdb6
  column = gtk_tree_view_column_new ();
Packit 98cdb6
  gtk_tree_view_column_set_title (column, "Window");
Packit 98cdb6
  renderer = gtk_cell_renderer_text_new ();
Packit 98cdb6
  gtk_tree_view_column_pack_start (column, renderer, TRUE);
Packit 98cdb6
  gtk_tree_view_column_set_cell_data_func (column,
Packit 98cdb6
					   renderer,
Packit 98cdb6
					   render_window_cell,
Packit 98cdb6
					   NULL, NULL);
Packit 98cdb6
Packit 98cdb6
  gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  scrolled = gtk_scrolled_window_new (NULL, NULL);
Packit 98cdb6
  gtk_widget_set_size_request (scrolled, 200, 400);
Packit 98cdb6
  gtk_container_add (GTK_CONTAINER (scrolled), treeview);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox),
Packit 98cdb6
		      scrolled,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      5);
Packit 98cdb6
  gtk_widget_show (scrolled);
Packit 98cdb6
  gtk_widget_show (treeview);
Packit 98cdb6
  
Packit 98cdb6
  table = gtk_table_new (5, 4, TRUE);
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox),
Packit 98cdb6
		      table,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      2);
Packit 98cdb6
  gtk_widget_show (table);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new ();
Packit 98cdb6
  gtk_button_set_image (GTK_BUTTON (button),
Packit 98cdb6
			gtk_image_new_from_stock (GTK_STOCK_GO_BACK,
Packit 98cdb6
						  GTK_ICON_SIZE_BUTTON));
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (move_window_clicked), 
Packit 98cdb6
		    GINT_TO_POINTER (GTK_DIR_LEFT));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     1, 2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new ();
Packit 98cdb6
  gtk_button_set_image (GTK_BUTTON (button),
Packit 98cdb6
			gtk_image_new_from_stock (GTK_STOCK_GO_UP,
Packit 98cdb6
						  GTK_ICON_SIZE_BUTTON));
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (move_window_clicked), 
Packit 98cdb6
		    GINT_TO_POINTER (GTK_DIR_UP));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     0, 1);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new ();
Packit 98cdb6
  gtk_button_set_image (GTK_BUTTON (button),
Packit 98cdb6
			gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD,
Packit 98cdb6
						  GTK_ICON_SIZE_BUTTON));
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (move_window_clicked), 
Packit 98cdb6
		    GINT_TO_POINTER (GTK_DIR_RIGHT));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     2, 3,
Packit 98cdb6
			     1, 2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new ();
Packit 98cdb6
  gtk_button_set_image (GTK_BUTTON (button),
Packit 98cdb6
			gtk_image_new_from_stock (GTK_STOCK_GO_DOWN,
Packit 98cdb6
						  GTK_ICON_SIZE_BUTTON));
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (move_window_clicked), 
Packit 98cdb6
		    GINT_TO_POINTER (GTK_DIR_DOWN));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     2, 3);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Raise");
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (raise_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     0, 1);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Lower");
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (lower_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     0, 1,
Packit 98cdb6
			     2, 3);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Smaller");
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (smaller_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     2, 3,
Packit 98cdb6
			     0, 1);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Larger");
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (larger_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     2, 3,
Packit 98cdb6
			     2, 3);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Native");
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (native_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     1, 2,
Packit 98cdb6
			     1, 2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("scroll");
Packit 98cdb6
  gtk_button_set_image (GTK_BUTTON (button),
Packit 98cdb6
			gtk_image_new_from_stock (GTK_STOCK_GO_UP,
Packit 98cdb6
						  GTK_ICON_SIZE_BUTTON));
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (scroll_window_clicked), 
Packit 98cdb6
		    GINT_TO_POINTER (GTK_DIR_UP));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     3, 4,
Packit 98cdb6
			     0, 1);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("scroll");
Packit 98cdb6
  gtk_button_set_image (GTK_BUTTON (button),
Packit 98cdb6
			gtk_image_new_from_stock (GTK_STOCK_GO_DOWN,
Packit 98cdb6
						  GTK_ICON_SIZE_BUTTON));
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (scroll_window_clicked), 
Packit 98cdb6
		    GINT_TO_POINTER (GTK_DIR_DOWN));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     3, 4,
Packit 98cdb6
			     1, 2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Manual");
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (manual_clicked),
Packit 98cdb6
		    NULL);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     3, 4,
Packit 98cdb6
			     2, 3);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Restack above");
Packit 98cdb6
  g_signal_connect (button, "clicked",
Packit 98cdb6
		    G_CALLBACK (restack_clicked),
Packit 98cdb6
		    GINT_TO_POINTER (1));
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     2, 3,
Packit 98cdb6
			     3, 4);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Restack below");
Packit 98cdb6
  g_signal_connect (button, "clicked",
Packit 98cdb6
		    G_CALLBACK (restack_clicked),
Packit 98cdb6
		    0);
Packit 98cdb6
  gtk_table_attach_defaults (GTK_TABLE (table),
Packit 98cdb6
			     button,
Packit 98cdb6
			     3, 4,
Packit 98cdb6
			     3, 4);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("draw drawable");
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox),
Packit 98cdb6
		      button,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (draw_drawable_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Add window");
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox),
Packit 98cdb6
		      button,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (add_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
  
Packit 98cdb6
  button = gtk_button_new_with_label ("Remove window");
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox),
Packit 98cdb6
		      button,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (remove_window_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
Packit 98cdb6
  button = gtk_button_new_with_label ("Save");
Packit 98cdb6
  gtk_box_pack_start (GTK_BOX (vbox),
Packit 98cdb6
		      button,
Packit 98cdb6
		      FALSE, FALSE,
Packit 98cdb6
		      2);
Packit 98cdb6
  gtk_widget_show (button);
Packit 98cdb6
  g_signal_connect (button, "clicked", 
Packit 98cdb6
		    G_CALLBACK (save_clicked), 
Packit 98cdb6
		    NULL);
Packit 98cdb6
Packit 98cdb6
  gtk_widget_show (window);
Packit 98cdb6
Packit 98cdb6
  if (argc == 2)
Packit 98cdb6
    {
Packit 98cdb6
      file = g_file_new_for_commandline_arg (argv[1]);
Packit 98cdb6
      load_file (file);
Packit 98cdb6
      g_object_unref (file);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  gtk_main ();
Packit 98cdb6
Packit 98cdb6
  return 0;
Packit 98cdb6
}