山崎です。

Gtk::Notebook#get_nth_page では、オブジェクトを取り出す際に新しい
オブジェクトを作っているようで、これを使うと同じ GtkWidget を
参照していながら異なるオブジェクトができてしまいます。
(gtk_notebook_get_nth_page が返すのは、Gtk+, ruby/gtk 共に 
GtkNotebookPage ではなく page->child すなわち append_page 
した widget です。)

オブジェクトを取り出す際に make_gobject_auto_type ( => get_gtk_type )
で、GtkWidget の種類を特定し、その型のオブジェクトを作って GtkWidget
を設定している様です。

new で各ウイジェットを作る際に、set_widget により、その GtkObject
に対して、gtk_object_set_user_data で自分自身を設定しているので、
Notebook#get_nth_page に関しては get_value_from_gobject(GtkObject*)
で取り出すだけで良いのではないかと思います。

Gtk::Container#foreach などではそのようにコンテナの内容物を取り出し
ているので、こちらは同じ id になります。

ruby/gtk 0.22 で、make_gobject_auto_type を呼んでいるのは、
以下の6つです。
    Bin#child
    Menu#get_active
    Notebook#get_nth_page 
    NotebookPage#child
    NotebookPage#tab_label
    NotebookPage#menu_label

ただし、ScrolledWindow#add_with_viewport は、C のライブラリ中で
viewport を作って child にするので、その viewport には対応する ruby
オブジェクトがありません。このような場合があるので、新しくオブジェクト
を作っているのではないかと思います。

毎回違うオブジェクトになるのは気分が悪いので、対応するオブジェクトが
あるときはそれを返し、無ければ 新しく作るという形にすればよいのでは
ないでしょうか。すなわち、make_gobject_auto_type を直接呼ばず、
get_value_from_gobject を呼んで、その中で、
gtk_object_get_user_data == NULL のとき、make_gobject_auto_type 
で作って、user_data に設定する、というような方法です。

------------------------------------------ test1
require 'gtk'

c = Gtk::CList.new(1)

n = Gtk::Notebook.new
n.append_page(c, Gtk::Label.new('clist'))
w = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
w.add(n).show_all

printf "(1) => %X\n", c.id
n.foreach do |x|
  printf "(2) => %X\n", x.id
end
printf "(3) => %X\n", n.get_nth_page(0).id
printf "(4) => %X\n", n.get_nth_page(0).id

p c
p n.get_nth_page(0)

Gtk::main
----------------------------------------- 元の 0.22 での結果
(1) => 2008B3EE
(2) => 2008B3EE
(3) => 2008B312
(4) => 2008B2E0
#<Gtk::CList: id=0x815df70>
#<Gtk::CList: id=0x815df70>
----------------------------------------- test2
                            ([ruby-ext:00553]一行パッチ適用)
require 'gtk'

d = Gtk::DrawingArea.new
s = Gtk::ScrolledWindow.new.add_with_viewport(d)
p s.child
w = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL).add(s)
w.show_all
printf "(1) => %X\n", s.child.id
printf "(2) => %X\n", s.child.id
p s.child
Gtk::main
----------------------------------------- 元の 0.22 での結果
#<Gtk::Viewport: id=0x8158df0>
(1) => 2008B5D8
(2) => 2008B5A6
#<Gtk::Viewport: id=0x8158df0>
-----------------------------------------
下記パッチによる変更後は(1)..(n) は同じになります。


--- rbgtk.c.orig	Fri Nov 26 14:34:10 1999
+++ rbgtk.c	Fri Nov 26 14:37:03 1999
@@ -208,7 +208,11 @@
 get_value_from_gobject(obj)
     GtkObject *obj;
 {
-    return (VALUE)gtk_object_get_user_data(obj);
+    VALUE  ret;
+    ret = (VALUE)gtk_object_get_user_data(obj);
+    if ( ! ret )
+       ret = make_gobject_auto_type(obj);
+    return ret;
 }
 
 static void
--- rbgtkcontainer.c.orig	Fri Nov 26 12:56:54 1999
+++ rbgtkcontainer.c	Fri Nov 26 14:33:20 1999
@@ -217,7 +217,7 @@
     VALUE self;
 {
     GtkWidget *child = GTK_BIN(get_widget(self))->child;
-    return (child == NULL) ? Qnil : make_gobject_auto_type(GTK_OBJECT(child));
+    return (child == NULL) ? Qnil : get_value_from_gobject(GTK_OBJECT(child));
 }
 
 void Init_gtk_bin()
@@ -530,7 +530,7 @@
 {
     GtkWidget *mitem = gtk_menu_get_active(GTK_MENU(get_widget(self)));
 
-    return (mitem == NULL) ? Qnil : make_gobject_auto_type(GTK_OBJECT(mitem));
+    return (mitem == NULL) ? Qnil : get_value_from_gobject(GTK_OBJECT(mitem));
 }
 
 static VALUE
--- rbgtknotebook.c.orig	Fri Nov 26 12:48:05 1999
+++ rbgtknotebook.c	Fri Nov 26 12:53:05 1999
@@ -136,7 +136,7 @@
 {
     GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(get_widget(self)),
 						NUM2INT(page_num));
-    return page ? make_gobject_auto_type(GTK_OBJECT(page)) : Qnil;
+    return page ? get_value_from_gobject(GTK_OBJECT(page)) : Qnil;
 }
 
 static VALUE
@@ -383,7 +383,7 @@
     VALUE self;
 {
     GtkWidget *child = get_notepage(self)->child;
-    return make_gobject_auto_type(GTK_OBJECT(child));
+    return get_value_from_gobject(GTK_OBJECT(child));
 }
 
 static VALUE
@@ -391,7 +391,7 @@
     VALUE self;
 {
     GtkWidget *label = get_notepage(self)->tab_label;
-    return make_gobject_auto_type(GTK_OBJECT(label));
+    return get_value_from_gobject(GTK_OBJECT(label));
 }
 
 static VALUE
@@ -399,7 +399,7 @@
     VALUE self;
 {
     GtkWidget *label = get_notepage(self)->menu_label;
-    return make_gobject_auto_type(GTK_OBJECT(label));
+    return get_value_from_gobject(GTK_OBJECT(label));
 }