* ext/tk/README.macosx-aqua: [new document] tips to avoid the known
bug on platform specific dialogs of Tcl/Tk Aqua on MacOS X. * ext/tk/tcltklib.c: fix bug on switching threads and waiting on the deleted interpreter on vwait and tkwait command. * ext/tk/lib/multi-tk.rb: kill the meaningless loop for the deleted Tk interpreter. * ext/tk/sample/demos-jp/image3.rb: [bug fix] wrong argument. * ext/tk/sample/demos-en/image3.rb: ditto. * ext/tk/sample/demos-jp/menu.rb: fix message for MacOS X. * ext/tk/sample/demos-jp/menu8x.rb: ditto. * ext/tk/sample/demos-en/menu.rb: ditto. * ext/tk/sample/demos-jp/widget; update version-info. * ext/tk/sample/demos-en/widget; ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9650 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
6b6ddb6cdf
commit
976124788e
21
ChangeLog
21
ChangeLog
@ -1,3 +1,24 @@
|
|||||||
|
Wed Dec 7 01:02:04 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||||
|
|
||||||
|
* ext/tk/README.macosx-aqua: [new document] tips to avoid the known
|
||||||
|
bug on platform specific dialogs of Tcl/Tk Aqua on MacOS X.
|
||||||
|
|
||||||
|
* ext/tk/tcltklib.c: fix bug on switching threads and waiting on the
|
||||||
|
deleted interpreter on vwait and tkwait command.
|
||||||
|
|
||||||
|
* ext/tk/lib/multi-tk.rb: kill the meaningless loop for the deleted Tk
|
||||||
|
interpreter.
|
||||||
|
|
||||||
|
* ext/tk/sample/demos-jp/image3.rb: [bug fix] wrong argument.
|
||||||
|
|
||||||
|
* ext/tk/sample/demos-en/image3.rb: ditto.
|
||||||
|
|
||||||
|
* ext/tk/sample/demos-jp/menu.rb: fix message for MacOS X.
|
||||||
|
|
||||||
|
* ext/tk/sample/demos-jp/menu8x.rb: ditto.
|
||||||
|
|
||||||
|
* ext/tk/sample/demos-en/menu.rb: ditto.
|
||||||
|
|
||||||
Tue Dec 6 16:48:40 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Tue Dec 6 16:48:40 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* gc.c (ruby_xmalloc2): change check for integer overflow.
|
* gc.c (ruby_xmalloc2): change check for integer overflow.
|
||||||
|
67
ext/tk/README.macosx-aqua
Normal file
67
ext/tk/README.macosx-aqua
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
*** for MacOS X Aqua (Tcl/Tk Aqua) users ***
|
||||||
|
|
||||||
|
First of all, please read README.tcltklib to use Tcl/Tk Aqua Framework.
|
||||||
|
|
||||||
|
With Tcl/Tk Aqua libraries, current tcltklib somtimes freezes when
|
||||||
|
using Aqua specific dialogs (e.g. Tk.messageBox).
|
||||||
|
This is a known bug of Ruby-1.8.4 release.
|
||||||
|
|
||||||
|
When you meet the trouble on your GUI, you'll be able to avoid the trouble
|
||||||
|
by Tcl/Tk's traditional dialogs.
|
||||||
|
If you want to do that, please call some of the following bits of script
|
||||||
|
after "reqruie 'tk'".
|
||||||
|
|
||||||
|
=================================================================
|
||||||
|
# use a traditional dialog for Tk.chooseColor()
|
||||||
|
Tk.ip_eval(<<'EOS')
|
||||||
|
proc ::tk_chooseColor {args} {
|
||||||
|
return [eval tk::dialog::color:: $args]
|
||||||
|
}
|
||||||
|
EOS
|
||||||
|
|
||||||
|
# use a traditional dialog for Tk.getOpenFile() and Tk.getMultipleOpenFile()
|
||||||
|
Tk.ip_eval(<<'EOS')
|
||||||
|
proc ::tk_getOpenFile {args} {
|
||||||
|
if {$::tk_strictMotif} {
|
||||||
|
return [eval tk::MotifFDialog open $args]
|
||||||
|
} else {
|
||||||
|
return [eval ::tk::dialog::file:: open $args]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOS
|
||||||
|
|
||||||
|
# use a traditional dialog for Tk.getSaveFile() and Tk.getMultipleSaveFile()
|
||||||
|
Tk.ip_eval(<<'EOS')
|
||||||
|
proc ::tk_getSaveFile {args} {
|
||||||
|
if {$::tk_strictMotif} {
|
||||||
|
return [eval tk::MotifFDialog save $args]
|
||||||
|
} else {
|
||||||
|
return [eval ::tk::dialog::file:: save $args]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOS
|
||||||
|
|
||||||
|
# use a traditional dialog for Tk.messageBox()
|
||||||
|
Tk.ip_eval(<<'EOS')
|
||||||
|
proc ::tk_messageBox {args} {
|
||||||
|
return [eval tk::MessageBox $args]
|
||||||
|
}
|
||||||
|
EOS
|
||||||
|
|
||||||
|
# use a traditional dialog for Tk.chooseDirectory()
|
||||||
|
Tk.ip_eval(<<'EOS')
|
||||||
|
proc ::tk_chooseDirectory {args} {
|
||||||
|
return [eval ::tk::dialog::file::chooseDir:: $args]
|
||||||
|
}
|
||||||
|
EOS
|
||||||
|
=================================================================
|
||||||
|
|
||||||
|
Each of them replaces the platform specific dialog command to the
|
||||||
|
traditional one.
|
||||||
|
|
||||||
|
If you use some MultiTkIp objects, probably, you'll have to call the
|
||||||
|
bits of script for each MultiTkIp object.
|
||||||
|
|
||||||
|
--
|
||||||
|
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
|
@ -603,6 +603,7 @@ class MultiTkIp
|
|||||||
begin
|
begin
|
||||||
loop do
|
loop do
|
||||||
sleep 1
|
sleep 1
|
||||||
|
receiver.kill if @interp.deleted?
|
||||||
break unless receiver.alive?
|
break unless receiver.alive?
|
||||||
end
|
end
|
||||||
rescue Exception
|
rescue Exception
|
||||||
|
@ -35,7 +35,8 @@ end
|
|||||||
# Arguments:
|
# Arguments:
|
||||||
# w - Name of the toplevel window of the demo.
|
# w - Name of the toplevel window of the demo.
|
||||||
def selectAndLoadDir(w, lbox)
|
def selectAndLoadDir(w, lbox)
|
||||||
dir = Tk.chooseDirectory(:initialdir=>$dirName, :parent=>w, :mustexist=>true)
|
dir = Tk.chooseDirectory(:initialdir=>$dirName.value,
|
||||||
|
:parent=>w, :mustexist=>true)
|
||||||
if dir.length > 0
|
if dir.length > 0
|
||||||
$dirName.value = dir
|
$dirName.value = dir
|
||||||
loadDir(lbox)
|
loadDir(lbox)
|
||||||
|
@ -812,7 +812,7 @@ end
|
|||||||
#
|
#
|
||||||
def aboutBox
|
def aboutBox
|
||||||
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
|
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
|
||||||
'message'=>"Ruby/Tk widget demonstration Ver.1.5.5-en\n\n" +
|
'message'=>"Ruby/Tk widget demonstration Ver.1.5.6-en\n\n" +
|
||||||
"based on demos of Tk8.1 -- 8.5 " +
|
"based on demos of Tk8.1 -- 8.5 " +
|
||||||
"( Copyright:: " +
|
"( Copyright:: " +
|
||||||
"(c) 1996-1997 Sun Microsystems, Inc. / " +
|
"(c) 1996-1997 Sun Microsystems, Inc. / " +
|
||||||
|
@ -35,7 +35,8 @@ end
|
|||||||
# Arguments:
|
# Arguments:
|
||||||
# w - Name of the toplevel window of the demo.
|
# w - Name of the toplevel window of the demo.
|
||||||
def selectAndLoadDir3(w, lbox)
|
def selectAndLoadDir3(w, lbox)
|
||||||
dir = Tk.chooseDirectory(:initialdir=>$dirName, :parent=>w, :mustexist=>true)
|
dir = Tk.chooseDirectory(:initialdir=>$dirName.value,
|
||||||
|
:parent=>w, :mustexist=>true)
|
||||||
if dir.length > 0
|
if dir.length > 0
|
||||||
$dirName.value = dir
|
$dirName.value = dir
|
||||||
loadDir3(lbox)
|
loadDir3(lbox)
|
||||||
|
@ -19,9 +19,16 @@ $menu_demo = TkToplevel.new {|w|
|
|||||||
$menu_frame = TkFrame.new($menu_demo, 'relief'=>'raised', 'bd'=>2)
|
$menu_frame = TkFrame.new($menu_demo, 'relief'=>'raised', 'bd'=>2)
|
||||||
$menu_frame.pack('side'=>'top', 'fill'=>'x')
|
$menu_frame.pack('side'=>'top', 'fill'=>'x')
|
||||||
|
|
||||||
|
begin
|
||||||
|
windowingsystem = Tk.windowingsystem()
|
||||||
|
rescue
|
||||||
|
windowingsystem = ""
|
||||||
|
end
|
||||||
|
|
||||||
# label 生成
|
# label 生成
|
||||||
TkLabel.new($menu_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') {
|
TkLabel.new($menu_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') {
|
||||||
if $tk_platform['platform'] == 'macintosh'
|
if $tk_platform['platform'] == 'macintosh' ||
|
||||||
|
windowingsystem == "classic" || windowingsystem == "aqua"
|
||||||
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Command-X を入力すると、Xがコマンドキー記号に続いて表示されている文字ならば、アクセラレータを使った項目起動を行うことができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Command-X を入力すると、Xがコマンドキー記号に続いて表示されている文字ならば、アクセラレータを使った項目起動を行うことができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
||||||
else
|
else
|
||||||
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Alt-X を入力すると、Xがメニューにアンダーライン付きで表示されている文字ならば、キーボードからの指定ができます。矢印キーでメニューのトラバースも可能です。メニューが指定された際には、スペースキーで実行することができます。あるいは、アンダーライン付きの文字を入力することでも実行できます。メニューのエントリがアクセラレータを持っている場合は、そのアクセラレータを入力することでメニューを指定することなしに実行することができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Alt-X を入力すると、Xがメニューにアンダーライン付きで表示されている文字ならば、キーボードからの指定ができます。矢印キーでメニューのトラバースも可能です。メニューが指定された際には、スペースキーで実行することができます。あるいは、アンダーライン付きの文字を入力することでも実行できます。メニューのエントリがアクセラレータを持っている場合は、そのアクセラレータを入力することでメニューを指定することなしに実行することができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
||||||
@ -63,7 +70,8 @@ TkMenubutton.new($menu_frame, 'text'=>'File', 'underline'=>0) {|m|
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if $tk_platform['platform'] == 'macintosh'
|
if $tk_platform['platform'] == 'macintosh' ||
|
||||||
|
windowingsystem == "classic" || windowingsystem == "aqua"
|
||||||
modifier = 'Command'
|
modifier = 'Command'
|
||||||
elsif $tk_platform['platform'] == 'windows'
|
elsif $tk_platform['platform'] == 'windows'
|
||||||
modifier = 'Control'
|
modifier = 'Control'
|
||||||
|
@ -43,9 +43,16 @@ TkFrame.new($menu8x_demo) {|frame|
|
|||||||
|
|
||||||
else ; # Tk8.x
|
else ; # Tk8.x
|
||||||
|
|
||||||
|
begin
|
||||||
|
windowingsystem = Tk.windowingsystem()
|
||||||
|
rescue
|
||||||
|
windowingsystem = ""
|
||||||
|
end
|
||||||
|
|
||||||
# label 生成
|
# label 生成
|
||||||
TkLabel.new($menu8x_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') {
|
TkLabel.new($menu8x_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') {
|
||||||
if $tk_platform['platform'] == 'macintosh'
|
if $tk_platform['platform'] == 'macintosh' ||
|
||||||
|
windowingsystem == "classic" || windowingsystem == "aqua"
|
||||||
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Command-X を入力すると、Xがコマンドキー記号に続いて表示されている文字ならば、アクセラレータを使った項目起動を行うことができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Command-X を入力すると、Xがコマンドキー記号に続いて表示されている文字ならば、アクセラレータを使った項目起動を行うことができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
||||||
else
|
else
|
||||||
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Alt-X を入力すると、Xがメニューにアンダーライン付きで表示されている文字ならば、キーボードからの指定ができます。矢印キーでメニューのトラバースも可能です。メニューが指定された際には、スペースキーで実行することができます。あるいは、アンダーライン付きの文字を入力することでも実行できます。メニューのエントリがアクセラレータを持っている場合は、そのアクセラレータを入力することでメニューを指定することなしに実行することができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Alt-X を入力すると、Xがメニューにアンダーライン付きで表示されている文字ならば、キーボードからの指定ができます。矢印キーでメニューのトラバースも可能です。メニューが指定された際には、スペースキーで実行することができます。あるいは、アンダーライン付きの文字を入力することでも実行できます。メニューのエントリがアクセラレータを持っている場合は、そのアクセラレータを入力することでメニューを指定することなしに実行することができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。")
|
||||||
@ -93,7 +100,8 @@ TkMenu.new($menu8x_demo, 'tearoff'=>false) {|m|
|
|||||||
add('command', 'label'=>'終了', 'command'=>proc{$menu8x_demo.destroy})
|
add('command', 'label'=>'終了', 'command'=>proc{$menu8x_demo.destroy})
|
||||||
}
|
}
|
||||||
|
|
||||||
if $tk_platform['platform'] == 'macintosh'
|
if $tk_platform['platform'] == 'macintosh' ||
|
||||||
|
windowingsystem == "classic" || windowingsystem == "aqua"
|
||||||
modifier = 'Command'
|
modifier = 'Command'
|
||||||
elsif $tk_platform['platform'] == 'windows'
|
elsif $tk_platform['platform'] == 'windows'
|
||||||
modifier = 'Control'
|
modifier = 'Control'
|
||||||
|
@ -842,7 +842,7 @@ end
|
|||||||
#
|
#
|
||||||
def aboutBox
|
def aboutBox
|
||||||
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
|
Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo',
|
||||||
'message'=>"Ruby/Tk ウィジェットデモ Ver.1.5.5-jp\n\n" +
|
'message'=>"Ruby/Tk ウィジェットデモ Ver.1.5.6-jp\n\n" +
|
||||||
"based on demos of Tk8.1 -- 8.5 " +
|
"based on demos of Tk8.1 -- 8.5 " +
|
||||||
"( Copyright:: " +
|
"( Copyright:: " +
|
||||||
"(c) 1996-1997 Sun Microsystems, Inc. / " +
|
"(c) 1996-1997 Sun Microsystems, Inc. / " +
|
||||||
|
@ -1271,10 +1271,11 @@ eventloop_sleep(dummy)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lib_eventloop_core(check_root, update_flag, check_var)
|
lib_eventloop_core(check_root, update_flag, check_var, interp)
|
||||||
int check_root;
|
int check_root;
|
||||||
int update_flag;
|
int update_flag;
|
||||||
int *check_var;
|
int *check_var;
|
||||||
|
Tcl_Interp *interp;
|
||||||
{
|
{
|
||||||
volatile VALUE current = eventloop_thread;
|
volatile VALUE current = eventloop_thread;
|
||||||
int found_event = 1;
|
int found_event = 1;
|
||||||
@ -1324,6 +1325,11 @@ lib_eventloop_core(check_root, update_flag, check_var)
|
|||||||
if (*check_var || !found_event) {
|
if (*check_var || !found_event) {
|
||||||
return found_event;
|
return found_event;
|
||||||
}
|
}
|
||||||
|
if (interp != (Tcl_Interp*)NULL
|
||||||
|
&& Tcl_InterpDeleted(interp)) {
|
||||||
|
/* IP for check_var is deleted */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* found_event = Tcl_DoOneEvent(event_flag); */
|
/* found_event = Tcl_DoOneEvent(event_flag); */
|
||||||
@ -1435,6 +1441,11 @@ lib_eventloop_core(check_root, update_flag, check_var)
|
|||||||
if (*check_var || !found_event) {
|
if (*check_var || !found_event) {
|
||||||
return found_event;
|
return found_event;
|
||||||
}
|
}
|
||||||
|
if (interp != (Tcl_Interp*)NULL
|
||||||
|
&& Tcl_InterpDeleted(interp)) {
|
||||||
|
/* IP for check_var is deleted */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NIL_P(eventloop_thread) || current == eventloop_thread) {
|
if (NIL_P(eventloop_thread) || current == eventloop_thread) {
|
||||||
@ -1611,6 +1622,8 @@ struct evloop_params {
|
|||||||
int check_root;
|
int check_root;
|
||||||
int update_flag;
|
int update_flag;
|
||||||
int *check_var;
|
int *check_var;
|
||||||
|
Tcl_Interp *interp;
|
||||||
|
int thr_crit_bup;
|
||||||
};
|
};
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
@ -1623,7 +1636,8 @@ lib_eventloop_main_core(args)
|
|||||||
|
|
||||||
if (lib_eventloop_core(params->check_root,
|
if (lib_eventloop_core(params->check_root,
|
||||||
params->update_flag,
|
params->update_flag,
|
||||||
params->check_var)) {
|
params->check_var,
|
||||||
|
params->interp)) {
|
||||||
return Qtrue;
|
return Qtrue;
|
||||||
} else {
|
} else {
|
||||||
return Qfalse;
|
return Qfalse;
|
||||||
@ -1676,6 +1690,9 @@ lib_eventloop_ensure(args)
|
|||||||
DUMP2("eventloop_ensure: eventloop-thread : %lx", eventloop_thread);
|
DUMP2("eventloop_ensure: eventloop-thread : %lx", eventloop_thread);
|
||||||
if (eventloop_thread != current_evloop) {
|
if (eventloop_thread != current_evloop) {
|
||||||
DUMP2("finish eventloop %lx (NOT current eventloop)", current_evloop);
|
DUMP2("finish eventloop %lx (NOT current eventloop)", current_evloop);
|
||||||
|
|
||||||
|
rb_thread_critical = ptr->thr_crit_bup;
|
||||||
|
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1706,15 +1723,18 @@ lib_eventloop_ensure(args)
|
|||||||
|
|
||||||
free(ptr);
|
free(ptr);
|
||||||
|
|
||||||
|
rb_thread_critical = ptr->thr_crit_bup;
|
||||||
|
|
||||||
DUMP2("finish current eventloop %lx", current_evloop);
|
DUMP2("finish current eventloop %lx", current_evloop);
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
lib_eventloop_launcher(check_root, update_flag, check_var)
|
lib_eventloop_launcher(check_root, update_flag, check_var, interp)
|
||||||
int check_root;
|
int check_root;
|
||||||
int update_flag;
|
int update_flag;
|
||||||
int *check_var;
|
int *check_var;
|
||||||
|
Tcl_Interp *interp;
|
||||||
{
|
{
|
||||||
volatile VALUE parent_evloop = eventloop_thread;
|
volatile VALUE parent_evloop = eventloop_thread;
|
||||||
struct evloop_params *args = ALLOC(struct evloop_params);
|
struct evloop_params *args = ALLOC(struct evloop_params);
|
||||||
@ -1745,6 +1765,10 @@ lib_eventloop_launcher(check_root, update_flag, check_var)
|
|||||||
args->check_root = check_root;
|
args->check_root = check_root;
|
||||||
args->update_flag = update_flag;
|
args->update_flag = update_flag;
|
||||||
args->check_var = check_var;
|
args->check_var = check_var;
|
||||||
|
args->interp = interp;
|
||||||
|
args->thr_crit_bup = rb_thread_critical;
|
||||||
|
|
||||||
|
rb_thread_critical = Qfalse;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
return rb_ensure(lib_eventloop_main, (VALUE)args,
|
return rb_ensure(lib_eventloop_main, (VALUE)args,
|
||||||
@ -1771,7 +1795,8 @@ lib_mainloop(argc, argv, self)
|
|||||||
check_rootwidget = Qfalse;
|
check_rootwidget = Qfalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
return lib_eventloop_launcher(RTEST(check_rootwidget), 0, (int*)NULL);
|
return lib_eventloop_launcher(RTEST(check_rootwidget), 0,
|
||||||
|
(int*)NULL, (Tcl_Interp*)NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
@ -1799,7 +1824,8 @@ static VALUE
|
|||||||
watchdog_evloop_launcher(check_rootwidget)
|
watchdog_evloop_launcher(check_rootwidget)
|
||||||
VALUE check_rootwidget;
|
VALUE check_rootwidget;
|
||||||
{
|
{
|
||||||
return lib_eventloop_launcher(RTEST(check_rootwidget), 0, (int*)NULL);
|
return lib_eventloop_launcher(RTEST(check_rootwidget), 0,
|
||||||
|
(int*)NULL, (Tcl_Interp*)NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EVLOOP_WAKEUP_CHANCE 3
|
#define EVLOOP_WAKEUP_CHANCE 3
|
||||||
@ -1981,8 +2007,8 @@ lib_thread_callback(argc, argv, self)
|
|||||||
rb_thread_schedule();
|
rb_thread_schedule();
|
||||||
|
|
||||||
/* start sub-eventloop */
|
/* start sub-eventloop */
|
||||||
foundEvent = lib_eventloop_launcher(/* not check root-widget */0, 0,
|
foundEvent = RTEST(lib_eventloop_launcher(/* not check root-widget */0, 0,
|
||||||
q->done);
|
q->done, (Tcl_Interp*)NULL));
|
||||||
|
|
||||||
if (RTEST(rb_funcall(th, ID_alive_p, 0))) {
|
if (RTEST(rb_funcall(th, ID_alive_p, 0))) {
|
||||||
rb_funcall(th, ID_kill, 0);
|
rb_funcall(th, ID_kill, 0);
|
||||||
@ -2812,7 +2838,7 @@ ip_rbUpdateCommand(clientData, interp, objc, objv)
|
|||||||
|
|
||||||
/* call eventloop */
|
/* call eventloop */
|
||||||
/* ret = lib_eventloop_core(0, flags, (int *)NULL);*/ /* ignore result */
|
/* ret = lib_eventloop_core(0, flags, (int *)NULL);*/ /* ignore result */
|
||||||
ret = lib_eventloop_launcher(0, flags, (int *)NULL); /* ignore result */
|
ret = RTEST(lib_eventloop_launcher(0, flags, (int *)NULL, interp)); /* ignore result */
|
||||||
|
|
||||||
/* exception check */
|
/* exception check */
|
||||||
if (!NIL_P(rbtk_pending_exception)) {
|
if (!NIL_P(rbtk_pending_exception)) {
|
||||||
@ -2994,6 +3020,24 @@ ip_rb_threadUpdateCommand(clientData, interp, objc, objv)
|
|||||||
/***************************/
|
/***************************/
|
||||||
/* replace of vwait/tkwait */
|
/* replace of vwait/tkwait */
|
||||||
/***************************/
|
/***************************/
|
||||||
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
|
static int ip_rbVwaitObjCmd _((ClientData, Tcl_Interp *, int,
|
||||||
|
Tcl_Obj *CONST []));
|
||||||
|
static int ip_rb_threadVwaitObjCmd _((ClientData, Tcl_Interp *, int,
|
||||||
|
Tcl_Obj *CONST []));
|
||||||
|
static int ip_rbTkWaitObjCmd _((ClientData, Tcl_Interp *, int,
|
||||||
|
Tcl_Obj *CONST []));
|
||||||
|
static int ip_rb_threadTkWaitObjCmd _((ClientData, Tcl_Interp *, int,
|
||||||
|
Tcl_Obj *CONST []));
|
||||||
|
#else
|
||||||
|
static int ip_rbVwaitCommand _((ClientData, Tcl_Interp *, int, char *[]));
|
||||||
|
static int ip_rb_threadVwaitCommand _((ClientData, Tcl_Interp *, int,
|
||||||
|
char *[]));
|
||||||
|
static int ip_rbTkWaitCommand _((ClientData, Tcl_Interp *, int, char *[]));
|
||||||
|
static int ip_rb_threadTkWaitCommand _((ClientData, Tcl_Interp *, int,
|
||||||
|
char *[]));
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION >= 8
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
static char *VwaitVarProc _((ClientData, Tcl_Interp *,
|
static char *VwaitVarProc _((ClientData, Tcl_Interp *,
|
||||||
CONST84 char *,CONST84 char *, int));
|
CONST84 char *,CONST84 char *, int));
|
||||||
@ -3021,10 +3065,7 @@ VwaitVarProc(clientData, interp, name1, name2, flags)
|
|||||||
return (char *) NULL;
|
return (char *) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION >= 8
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
static int ip_rbVwaitObjCmd _((ClientData, Tcl_Interp *, int,
|
|
||||||
Tcl_Obj *CONST []));
|
|
||||||
static int
|
static int
|
||||||
ip_rbVwaitObjCmd(clientData, interp, objc, objv)
|
ip_rbVwaitObjCmd(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3032,7 +3073,6 @@ ip_rbVwaitObjCmd(clientData, interp, objc, objv)
|
|||||||
int objc;
|
int objc;
|
||||||
Tcl_Obj *CONST objv[];
|
Tcl_Obj *CONST objv[];
|
||||||
#else /* TCL_MAJOR_VERSION < 8 */
|
#else /* TCL_MAJOR_VERSION < 8 */
|
||||||
static int ip_rbVwaitCommand _((ClientData, Tcl_Interp *, int, char *[]));
|
|
||||||
static int
|
static int
|
||||||
ip_rbVwaitCommand(clientData, interp, objc, objv)
|
ip_rbVwaitCommand(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3053,6 +3093,20 @@ ip_rbVwaitCommand(clientData, interp, objc, objv)
|
|||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (!rb_thread_alone()
|
||||||
|
&& eventloop_thread != Qnil
|
||||||
|
&& eventloop_thread != rb_thread_current()) {
|
||||||
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
|
DUMP1("call ip_rb_threadVwaitObjCmd");
|
||||||
|
return ip_rb_threadVwaitObjCmd(clientData, interp, objc, objv);
|
||||||
|
#else /* TCL_MAJOR_VERSION < 8 */
|
||||||
|
DUMP1("call ip_rb_threadVwaitCommand");
|
||||||
|
return ip_rb_threadVwaitCommand(clientData, interp, objc, objv);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Tcl_Preserve(interp);
|
Tcl_Preserve(interp);
|
||||||
#ifdef HAVE_NATIVETHREAD
|
#ifdef HAVE_NATIVETHREAD
|
||||||
if (!is_ruby_native_thread()) {
|
if (!is_ruby_native_thread()) {
|
||||||
@ -3117,8 +3171,8 @@ ip_rbVwaitCommand(clientData, interp, objc, objv)
|
|||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
|
|
||||||
foundEvent
|
foundEvent = RTEST(lib_eventloop_launcher(/* not check root-widget */0,
|
||||||
= lib_eventloop_launcher(/* not check root-widget */0, 0, &done);
|
0, &done, interp));
|
||||||
|
|
||||||
thr_crit_bup = rb_thread_critical;
|
thr_crit_bup = rb_thread_critical;
|
||||||
rb_thread_critical = Qtrue;
|
rb_thread_critical = Qtrue;
|
||||||
@ -3248,8 +3302,6 @@ WaitWindowProc(clientData, eventPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION >= 8
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
static int ip_rbTkWaitObjCmd _((ClientData, Tcl_Interp *, int,
|
|
||||||
Tcl_Obj *CONST []));
|
|
||||||
static int
|
static int
|
||||||
ip_rbTkWaitObjCmd(clientData, interp, objc, objv)
|
ip_rbTkWaitObjCmd(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3257,7 +3309,6 @@ ip_rbTkWaitObjCmd(clientData, interp, objc, objv)
|
|||||||
int objc;
|
int objc;
|
||||||
Tcl_Obj *CONST objv[];
|
Tcl_Obj *CONST objv[];
|
||||||
#else /* TCL_MAJOR_VERSION < 8 */
|
#else /* TCL_MAJOR_VERSION < 8 */
|
||||||
static int ip_rbTkWaitCommand _((ClientData, Tcl_Interp *, int, char *[]));
|
|
||||||
static int
|
static int
|
||||||
ip_rbTkWaitCommand(clientData, interp, objc, objv)
|
ip_rbTkWaitCommand(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3283,6 +3334,20 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
|
|||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (!rb_thread_alone()
|
||||||
|
&& eventloop_thread != Qnil
|
||||||
|
&& eventloop_thread != rb_thread_current()) {
|
||||||
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
|
DUMP1("call ip_rb_threadTkWaitObjCmd");
|
||||||
|
return ip_rb_threadTkWaitObjCmd(clientData, interp, objc, objv);
|
||||||
|
#else /* TCL_MAJOR_VERSION < 8 */
|
||||||
|
DUMP1("call ip_rb_threadTkWaitCommand");
|
||||||
|
return ip_rb_threadTkWwaitCommand(clientData, interp, objc, objv);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Tcl_Preserve(interp);
|
Tcl_Preserve(interp);
|
||||||
|
|
||||||
if (objc != 3) {
|
if (objc != 3) {
|
||||||
@ -3394,7 +3459,7 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
|
|||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
/* lib_eventloop_core(check_rootwidget_flag, 0, &done); */
|
/* lib_eventloop_core(check_rootwidget_flag, 0, &done); */
|
||||||
lib_eventloop_launcher(check_rootwidget_flag, 0, &done);
|
lib_eventloop_launcher(check_rootwidget_flag, 0, &done, interp);
|
||||||
|
|
||||||
thr_crit_bup = rb_thread_critical;
|
thr_crit_bup = rb_thread_critical;
|
||||||
rb_thread_critical = Qtrue;
|
rb_thread_critical = Qtrue;
|
||||||
@ -3463,7 +3528,7 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
|
|||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
/* lib_eventloop_core(check_rootwidget_flag, 0, &done); */
|
/* lib_eventloop_core(check_rootwidget_flag, 0, &done); */
|
||||||
lib_eventloop_launcher(check_rootwidget_flag, 0, &done);
|
lib_eventloop_launcher(check_rootwidget_flag, 0, &done, interp);
|
||||||
|
|
||||||
/* exception check */
|
/* exception check */
|
||||||
if (!NIL_P(rbtk_pending_exception)) {
|
if (!NIL_P(rbtk_pending_exception)) {
|
||||||
@ -3560,7 +3625,7 @@ ip_rbTkWaitCommand(clientData, interp, objc, objv)
|
|||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
/* lib_eventloop_core(check_rootwidget_flag, 0, &done); */
|
/* lib_eventloop_core(check_rootwidget_flag, 0, &done); */
|
||||||
lib_eventloop_launcher(check_rootwidget_flag, 0, &done);
|
lib_eventloop_launcher(check_rootwidget_flag, 0, &done, interp);
|
||||||
|
|
||||||
/* exception check */
|
/* exception check */
|
||||||
if (!NIL_P(rbtk_pending_exception)) {
|
if (!NIL_P(rbtk_pending_exception)) {
|
||||||
@ -3678,8 +3743,6 @@ rb_threadWaitWindowProc(clientData, eventPtr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION >= 8
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
static int ip_rb_threadVwaitObjCmd _((ClientData, Tcl_Interp *, int,
|
|
||||||
Tcl_Obj *CONST []));
|
|
||||||
static int
|
static int
|
||||||
ip_rb_threadVwaitObjCmd(clientData, interp, objc, objv)
|
ip_rb_threadVwaitObjCmd(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3687,8 +3750,6 @@ ip_rb_threadVwaitObjCmd(clientData, interp, objc, objv)
|
|||||||
int objc;
|
int objc;
|
||||||
Tcl_Obj *CONST objv[];
|
Tcl_Obj *CONST objv[];
|
||||||
#else /* TCL_MAJOR_VERSION < 8 */
|
#else /* TCL_MAJOR_VERSION < 8 */
|
||||||
static int ip_rb_threadVwaitCommand _((ClientData, Tcl_Interp *, int,
|
|
||||||
char *[]));
|
|
||||||
static int
|
static int
|
||||||
ip_rb_threadVwaitCommand(clientData, interp, objc, objv)
|
ip_rb_threadVwaitCommand(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3811,8 +3872,6 @@ ip_rb_threadVwaitCommand(clientData, interp, objc, objv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if TCL_MAJOR_VERSION >= 8
|
#if TCL_MAJOR_VERSION >= 8
|
||||||
static int ip_rb_threadTkWaitObjCmd _((ClientData, Tcl_Interp *, int,
|
|
||||||
Tcl_Obj *CONST []));
|
|
||||||
static int
|
static int
|
||||||
ip_rb_threadTkWaitObjCmd(clientData, interp, objc, objv)
|
ip_rb_threadTkWaitObjCmd(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
@ -3820,8 +3879,6 @@ ip_rb_threadTkWaitObjCmd(clientData, interp, objc, objv)
|
|||||||
int objc;
|
int objc;
|
||||||
Tcl_Obj *CONST objv[];
|
Tcl_Obj *CONST objv[];
|
||||||
#else /* TCL_MAJOR_VERSION < 8 */
|
#else /* TCL_MAJOR_VERSION < 8 */
|
||||||
static int ip_rb_threadTkWaitCommand _((ClientData, Tcl_Interp *, int,
|
|
||||||
char *[]));
|
|
||||||
static int
|
static int
|
||||||
ip_rb_threadTkWaitCommand(clientData, interp, objc, objv)
|
ip_rb_threadTkWaitCommand(clientData, interp, objc, objv)
|
||||||
ClientData clientData;
|
ClientData clientData;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user