Linux上でWindowsのアプリを動作させるソフトウェア
Wineに関する情報交換スレ。
前スレ
今夜も Wine で乾杯! - 20本目
https://mao.2ch.net/test/read.cgi/linux/1455088008/
Wine本家
http://www.winehq.org/
http://wiki.winehq.org/
動作報告Wikiや過去ログなど
http://www.2chlinux.org/index.php?FrontPage
ここにパッチをうpするときはgzipやbzip2で圧縮した上で
base64などでエンコードしてください。おながいします。
動作報告は>>2のテンプレ使用を推奨。
今夜も Wine で乾杯! - 21本目 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/08/12(土) 21:18:15.22ID:tNr8ii2i
2018/02/21(水) 17:39:34.11ID:SJPTXnf1
X の同期の問題ではなく、MDI Child Wnd の TITLE BAR をドラッグするとき、
なぜか、数秒経ってから、x11drv_surface_flush() がまとめて何十回も呼び出されている
可能性があるかも・・・。
デバッグ表示をリアルタイムで見ていると、見た目が変化する直前までデバッグ表示が
全く出ず、見た目が変化する直前に、どどっと、数十回分の x11drv_surface_flush()
がまとめて出てくる、という現象が起きている。
なぜか、数秒経ってから、x11drv_surface_flush() がまとめて何十回も呼び出されている
可能性があるかも・・・。
デバッグ表示をリアルタイムで見ていると、見た目が変化する直前までデバッグ表示が
全く出ず、見た目が変化する直前に、どどっと、数十回分の x11drv_surface_flush()
がまとめて出てくる、という現象が起きている。
2018/02/21(水) 17:56:34.37ID:iuEniYB2
>>447
flushしてないだけではなく?
flushしてないだけではなく?
449396
2018/02/21(水) 17:57:13.78ID:SJPTXnf1 以下のコードが気になる。
message_count を減少させるのは唯一、wait_message() しか見つからなかった。
後は、check_for_driver_events() の中で単調増加してしまう。
メッセージがたまって初めて、flush_window_surfaces() が呼び出されるような
コードにも
/* check for driver events if we detect that the app is not properly consuming messages */
static inline void check_for_driver_events( UINT msg )
{
if (get_user_thread_info()->message_count > 200) {
flush_window_surfaces( FALSE );
USER_Driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, QS_ALLINPUT, 0 );
}
else if (msg == WM_TIMER || msg == WM_SYSTIMER) {
/* driver events should have priority over timers, so make sure we'll check for them soon */
get_user_thread_info()->message_count += 100;
}
else get_user_thread_info()->message_count++;
}
static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags )
{
DWORD ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags );
if (ret == WAIT_TIMEOUT && !count && !timeout) NtYieldExecution();
if ((mask & QS_INPUT) == QS_INPUT) get_user_thread_info()->message_count = 0;
return ret;
}
message_count を減少させるのは唯一、wait_message() しか見つからなかった。
後は、check_for_driver_events() の中で単調増加してしまう。
メッセージがたまって初めて、flush_window_surfaces() が呼び出されるような
コードにも
/* check for driver events if we detect that the app is not properly consuming messages */
static inline void check_for_driver_events( UINT msg )
{
if (get_user_thread_info()->message_count > 200) {
flush_window_surfaces( FALSE );
USER_Driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, QS_ALLINPUT, 0 );
}
else if (msg == WM_TIMER || msg == WM_SYSTIMER) {
/* driver events should have priority over timers, so make sure we'll check for them soon */
get_user_thread_info()->message_count += 100;
}
else get_user_thread_info()->message_count++;
}
static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DWORD mask, DWORD flags )
{
DWORD ret = USER_Driver->pMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags );
if (ret == WAIT_TIMEOUT && !count && !timeout) NtYieldExecution();
if ((mask & QS_INPUT) == QS_INPUT) get_user_thread_info()->message_count = 0;
return ret;
}
450396
2018/02/21(水) 17:58:18.49ID:SJPTXnf1 BOOL WINAPI DECLSPEC_HOTPATCH PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT flags )
{
MSG msg;
USER_CheckNotLock();
check_for_driver_events( 0 );
if (!peek_message( &msg, hwnd, first, last, flags, 0 ))
{
DWORD ret;
flush_window_surfaces( TRUE );
ret = wow_handlers.wait_message( 0, NULL, 0, QS_ALLINPUT, 0 );
/* if we received driver events, check again for a pending message */
if (ret == WAIT_TIMEOUT || !peek_message( &msg, hwnd, first, last, flags, 0 )) return FALSE;
}
check_for_driver_events( msg.message );
/* copy back our internal safe copy of message data to msg_out.
* msg_out is a variable from the *program*, so it can't be used
* internally as it can get "corrupted" by our use of SendMessage()
* (back to the program) inside the message handling itself. */
if (!msg_out)
{
SetLastError( ERROR_NOACCESS );
return FALSE;
}
*msg_out = msg;
return TRUE;
}
{
MSG msg;
USER_CheckNotLock();
check_for_driver_events( 0 );
if (!peek_message( &msg, hwnd, first, last, flags, 0 ))
{
DWORD ret;
flush_window_surfaces( TRUE );
ret = wow_handlers.wait_message( 0, NULL, 0, QS_ALLINPUT, 0 );
/* if we received driver events, check again for a pending message */
if (ret == WAIT_TIMEOUT || !peek_message( &msg, hwnd, first, last, flags, 0 )) return FALSE;
}
check_for_driver_events( msg.message );
/* copy back our internal safe copy of message data to msg_out.
* msg_out is a variable from the *program*, so it can't be used
* internally as it can get "corrupted" by our use of SendMessage()
* (back to the program) inside the message handling itself. */
if (!msg_out)
{
SetLastError( ERROR_NOACCESS );
return FALSE;
}
*msg_out = msg;
return TRUE;
}
451396
2018/02/21(水) 18:24:27.09ID:SJPTXnf1 >>448
PeekMessage()を回しているだけの時で、メッセージがキューに残り続けている場合、
メッセージを 200回 (100回?) PeekMessage するまでは、flush_window_surfaces()
されないコードになっている気がしませんか・・・。
PeekMessage()を回しているだけの時で、メッセージがキューに残り続けている場合、
メッセージを 200回 (100回?) PeekMessage するまでは、flush_window_surfaces()
されないコードになっている気がしませんか・・・。
452login:Penguin
2018/02/21(水) 18:32:33.53ID:SJPTXnf1 GetMessage() の方もほぼ同じような感じかも。。
とにかく、flush_window_surfaces() がとてつもなく長い間、呼ばれないことが
あるコードになっている様に見えて、実際、実験してもそう思える。
とにかく、flush_window_surfaces() がとてつもなく長い間、呼ばれないことが
あるコードになっている様に見えて、実際、実験してもそう思える。
2018/02/21(水) 18:38:45.85ID:SJPTXnf1
そうか、もともとは、dirty bit 方式じゃないから、flush_window_surfaces() を呼ぶと、
再計算する必要が無いのに必ず再計算されてしまうから、呼び出す頻度を下げるしか
高速化する方法が無いために、そんな風なコードになっているのかもしれない。
再計算する必要が無いのに必ず再計算されてしまうから、呼び出す頻度を下げるしか
高速化する方法が無いために、そんな風なコードになっているのかもしれない。
2018/02/21(水) 18:41:37.14ID:SJPTXnf1
そして、flush_window_surfaces() のコードでは、最低でも 50 (ms) の時間が経っていない場合には
処理をスキップするコードになっている。とことん、flush() しないコードになってしまっている。
これらが原因か・・・。
void flush_window_surfaces( BOOL idle )
{
static DWORD last_idle;
DWORD now;
struct window_surface *surface;
EnterCriticalSection( &surfaces_section );
now = GetTickCount();
if (idle) last_idle = now;
/* if not idle, we only flush if there's evidence that the app never goes idle */
else if ((int)(now - last_idle) < 50) goto done;
LIST_FOR_EACH_ENTRY( surface, &window_surfaces, struct window_surface, entry )
surface->funcs->flush( surface );
done:
LeaveCriticalSection( &surfaces_section );
}
処理をスキップするコードになっている。とことん、flush() しないコードになってしまっている。
これらが原因か・・・。
void flush_window_surfaces( BOOL idle )
{
static DWORD last_idle;
DWORD now;
struct window_surface *surface;
EnterCriticalSection( &surfaces_section );
now = GetTickCount();
if (idle) last_idle = now;
/* if not idle, we only flush if there's evidence that the app never goes idle */
else if ((int)(now - last_idle) < 50) goto done;
LIST_FOR_EACH_ENTRY( surface, &window_surfaces, struct window_surface, entry )
surface->funcs->flush( surface );
done:
LeaveCriticalSection( &surfaces_section );
}
455396
2018/02/21(水) 18:58:29.00ID:SJPTXnf1 元々の Windows では、LineTo などを実行すると瞬間的に実画面に反映される。
だから、そもそも Flush せずに見えないままの描画が残っているなんて時間は
ほぼ 0。
そう考えると、。Wine のこの実装はおかしいな・・・。
1. そもそもメッセージループを回している時しか flush される可能性が全くない
実装になってしまっているらしい。
2. メッセージループを回していても、メッセージがキューに残っている時は、
100回程度メッセージを読まない限り、flush されない。
Windows を「エミュレート」するのであれば、例えば、描いてから 50(ms) 経てば、
必ず flush する、という実装でなくてはならないはず。
Linux では、タイマー処理が難しいのかな???
だから、そもそも Flush せずに見えないままの描画が残っているなんて時間は
ほぼ 0。
そう考えると、。Wine のこの実装はおかしいな・・・。
1. そもそもメッセージループを回している時しか flush される可能性が全くない
実装になってしまっているらしい。
2. メッセージループを回していても、メッセージがキューに残っている時は、
100回程度メッセージを読まない限り、flush されない。
Windows を「エミュレート」するのであれば、例えば、描いてから 50(ms) 経てば、
必ず flush する、という実装でなくてはならないはず。
Linux では、タイマー処理が難しいのかな???
2018/02/21(水) 19:03:48.84ID:SJPTXnf1
1. Windows (もちろん、NT系) の場合は、メッセージ・ループ長く帰ってこないプログラムも
絶対ダメというわけではない。
2. そういうプログラムの場合、Wine 側は、描画を、一定時間間隔で、別スレッドの
タイマー割り込みの中などで flush するようにしないと、 正しく、Emulation 出来
ないはず。
絶対ダメというわけではない。
2. そういうプログラムの場合、Wine 側は、描画を、一定時間間隔で、別スレッドの
タイマー割り込みの中などで flush するようにしないと、 正しく、Emulation 出来
ないはず。
2018/02/21(水) 19:05:31.10ID:SJPTXnf1
割り込みなら、別スレッドを起こす必要が無かった。スマソ。
あと、誤字訂正:
誤: メッセージ・ループ長く帰ってこないプログラムも
正: メッセージ・ループに長く帰ってこないプログラムも
あと、誤字訂正:
誤: メッセージ・ループ長く帰ってこないプログラムも
正: メッセージ・ループに長く帰ってこないプログラムも
2018/02/21(水) 19:13:35.32ID:iuEniYB2
うーん
これがボトルネックになっているようには見えない
申し訳ないんだけど描画が遅くなる条件をもう一度書いてもらっていいですか?
これがボトルネックになっているようには見えない
申し訳ないんだけど描画が遅くなる条件をもう一度書いてもらっていいですか?
459396
2018/02/21(水) 23:23:31.14ID:4g3iPm6d うーんと。それはまあちょっと置いておいて、、、。
MDI Child Wnd の TITLE BAR を Drag している最中、メッセージループは一つも
回ってないんじゃないかと思う。
だから、>>455 の「1.」に書いた「flushされる必要条件」が満たされてない。
そのため、surface の pixel配列の内容が実画面に反映されないのではなかろうか。
MDI Child Wnd の TITLE BAR を Drag している最中、メッセージループは一つも
回ってないんじゃないかと思う。
だから、>>455 の「1.」に書いた「flushされる必要条件」が満たされてない。
そのため、surface の pixel配列の内容が実画面に反映されないのではなかろうか。
460396
2018/02/21(水) 23:38:56.14ID:4g3iPm6d ドラッグ中にマウスを静止させてしばらく待っていると、 x11drv_surface_flush() と
flush_surface_region() の両方が呼び出された事が FIXME 出力で確認できた。
静止させずにマウスをドラッグし続けると、FIXME 出力が全くでない。
しかも、それを行った時間が長いと、マウスボタンを離した後も、非常に長い間
システム全体がハングアップした様な状態になる。そして、長い沈黙の後、FIXME出力が
出る。
この沈黙の時間は、それまでドラッグしていた時間に比例しているように思える。
なぜだろう??? これはどこかに「何かが溜まっている」時の現象の様に思える。
しかし、>>449 を見ると、message_cnt は、減らされるときは、一期に 0 になるのであって、
少しずつ減らされるわけではない。
謎だ・・・。
flush_surface_region() の両方が呼び出された事が FIXME 出力で確認できた。
静止させずにマウスをドラッグし続けると、FIXME 出力が全くでない。
しかも、それを行った時間が長いと、マウスボタンを離した後も、非常に長い間
システム全体がハングアップした様な状態になる。そして、長い沈黙の後、FIXME出力が
出る。
この沈黙の時間は、それまでドラッグしていた時間に比例しているように思える。
なぜだろう??? これはどこかに「何かが溜まっている」時の現象の様に思える。
しかし、>>449 を見ると、message_cnt は、減らされるときは、一期に 0 になるのであって、
少しずつ減らされるわけではない。
謎だ・・・。
2018/02/21(水) 23:42:58.43ID:iuEniYB2
単にイベントを送信する側でバッファリングしてるんじゃないの?
2018/02/21(水) 23:50:18.32ID:iuEniYB2
まあ最初からマルチスレッド意識して書いた感じではないなと思うけど90年代から開発されてるわけだしそのへんはご愛嬌じゃない
463396
2018/02/22(木) 00:35:51.88ID:9+xI5ulA >>449-450 辺りのソースを見ていて、背理法で語ってみたい。
仮定1:「Drag 中でも、PeekMessage されている。」 と仮定する。
仮定2. 透明化した際に重くなるのは、flush_window_surfaces() と、
そこから呼び出される update_surface_region() のみだと仮定する。
補足: update_surface_region() は、透明化のための Shape の作成の処理が
されるので、重い。
flush_window_surfaces() は、update_surface_region() を呼び出す
以外にも、XPutImage() 系の処理が入るので、さらに重い。
仮定2については、透明化時に、それ以外に重い関数が出現する可能性を否定は
できない。なぜなら、surface の処理は、透明化しない時には行われないかも
知れないからである。その場合、LineTo の関数が切り替わる。
1. FIXME で見ている限り、ドラッグ中は、それらの関数は全く呼び出されない。
2. >>450 を見ると、PeekMessage した際に、キューにメッセージが残ってないなら、
flush_window_surfaces() が呼び出されるはず。
3. 「仮定2」 の関数は呼ばれてないのだから、キューのメッセージは、透明化され
てない場合と同程度に高速に処理されてもおかしくない。
4. もしそうであれば、キューのメッセージはあっという間に「空」になるはず。
5. 空になったとしたら、「2.」の通りに、flush_window_surfaces() が呼び出されるはず。
6. しかし、「1.」で述べたように、実験的には、flush_window_surfaces() は呼び出されてない。
7. 矛盾である。
8. 背理法により、これは、仮定の少なくとも一方が間違っている事を意味する。
仮定1:「Drag 中でも、PeekMessage されている。」 と仮定する。
仮定2. 透明化した際に重くなるのは、flush_window_surfaces() と、
そこから呼び出される update_surface_region() のみだと仮定する。
補足: update_surface_region() は、透明化のための Shape の作成の処理が
されるので、重い。
flush_window_surfaces() は、update_surface_region() を呼び出す
以外にも、XPutImage() 系の処理が入るので、さらに重い。
仮定2については、透明化時に、それ以外に重い関数が出現する可能性を否定は
できない。なぜなら、surface の処理は、透明化しない時には行われないかも
知れないからである。その場合、LineTo の関数が切り替わる。
1. FIXME で見ている限り、ドラッグ中は、それらの関数は全く呼び出されない。
2. >>450 を見ると、PeekMessage した際に、キューにメッセージが残ってないなら、
flush_window_surfaces() が呼び出されるはず。
3. 「仮定2」 の関数は呼ばれてないのだから、キューのメッセージは、透明化され
てない場合と同程度に高速に処理されてもおかしくない。
4. もしそうであれば、キューのメッセージはあっという間に「空」になるはず。
5. 空になったとしたら、「2.」の通りに、flush_window_surfaces() が呼び出されるはず。
6. しかし、「1.」で述べたように、実験的には、flush_window_surfaces() は呼び出されてない。
7. 矛盾である。
8. 背理法により、これは、仮定の少なくとも一方が間違っている事を意味する。
464396
2018/02/22(木) 00:45:26.84ID:9+xI5ulA あるいは、Peek されるだけで、一部のメッセージは取り残されるなら・・・。
465396
2018/02/22(木) 01:30:28.67ID:9+xI5ulA Wine で、MDI Child Wnd の TITLE BAR をドラッグしたときの処理について。
DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
-->case WM_NCLBUTTONDOWN
-->NC_HandleNCLButtonDown()
-->case HTCAPTION
-->SendMessageW( hwnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam )
-->DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
-->case WM_SYSCOMMAND
-->NC_HandleSysCommand()
-->WINPOS_SysCommandSizeMove()
最後の関数は、タイトルバーをドラッグを開始直後に一回だけ呼び出される事
を確認した。その後のドラッグ中は呼び出されず、この関数の内部でドラッグ
の処理がされている可能性が高い。
この最後の関数の中に、次のような、メッセージ・ループがある:
if (!GetMessageW( &msg, 0, 0, 0 )) break;
if (CallMsgFilterW( &msg, MSGF_SIZE )) continue;
/* Exit on button-up, Return, or Esc */
if ((msg.message == WM_LBUTTONUP) ||
((msg.message == WM_KEYDOWN) &&
((msg.wParam == VK_RETURN) || (msg.wParam == VK_ESCAPE)))) break;
if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE)) {
TranslateMessage( &msg );
DispatchMessageW( &msg );
continue; /* We are not interested in other messages */
}
DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
-->case WM_NCLBUTTONDOWN
-->NC_HandleNCLButtonDown()
-->case HTCAPTION
-->SendMessageW( hwnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam )
-->DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
-->case WM_SYSCOMMAND
-->NC_HandleSysCommand()
-->WINPOS_SysCommandSizeMove()
最後の関数は、タイトルバーをドラッグを開始直後に一回だけ呼び出される事
を確認した。その後のドラッグ中は呼び出されず、この関数の内部でドラッグ
の処理がされている可能性が高い。
この最後の関数の中に、次のような、メッセージ・ループがある:
if (!GetMessageW( &msg, 0, 0, 0 )) break;
if (CallMsgFilterW( &msg, MSGF_SIZE )) continue;
/* Exit on button-up, Return, or Esc */
if ((msg.message == WM_LBUTTONUP) ||
((msg.message == WM_KEYDOWN) &&
((msg.wParam == VK_RETURN) || (msg.wParam == VK_ESCAPE)))) break;
if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE)) {
TranslateMessage( &msg );
DispatchMessageW( &msg );
continue; /* We are not interested in other messages */
}
466396
2018/02/22(木) 01:32:06.83ID:9+xI5ulA さらに次のような、枠だけを書くか、実際に動かしてしまうコードが続く :
if (!DragFullWindows)
draw_moving_frame( parent, hdc, &sizingRect, thickframe );
else {
RECT rect = sizingRect;
MapWindowPoints( 0, parent, (POINT *)&rect, 2 );
SetWindowPos( hwnd, 0, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
}
if (!DragFullWindows)
draw_moving_frame( parent, hdc, &sizingRect, thickframe );
else {
RECT rect = sizingRect;
MapWindowPoints( 0, parent, (POINT *)&rect, 2 );
SetWindowPos( hwnd, 0, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 );
}
467396
2018/02/22(木) 02:01:49.71ID:9+xI5ulA あー。
FIXMEを消してしまっていただけだった・・・。
update_surface_region() や、flush_window_surfaces() は、
ドラッグ中でも、マウスを静止してしばらくすると呼ばれるようです。
マウスを動かしつづけていると呼ばれないらしい。
FIXMEを消してしまっていただけだった・・・。
update_surface_region() や、flush_window_surfaces() は、
ドラッグ中でも、マウスを静止してしばらくすると呼ばれるようです。
マウスを動かしつづけていると呼ばれないらしい。
468396
2018/02/22(木) 02:44:50.36ID:9+xI5ulA 【やっと原因判明】
CMainFrame を WS_EX_LAYERED で透明化していて、今回の条件に当てはまる時に、
CMDIClientWnd のタイトルバー上でマウスの左ボタンを押し始め、そのまま
マウスをずっと動かし続けると、WINPOS_SysCommandSizeMove() の中の
if (!GetMessageW( &msg, 0, 0, 0 )) break;
の部分の GetMessageW() 関数の中で停止してしまう。詳細は、GetMessageW() の
中で、メッセージキューが空だった場合に呼び出されるところの、
wait_objects() ;dlls/user32/message.c
-->wow_handlers.wait_message()
-->wait_message() ;dll/user32/winproc.c
-->USER_Driver->pMsgWaitForMultipleObjectsEx()
-->X11DRV_MsgWaitForMultipleObjectsEx()
の最後の関数の中で停止してしまう。
正常なら、WM_NCMOUSEMOVE メッセージが到着することによって、関数から
戻って来るはずだと思われる。
CMainFrame を WS_EX_LAYERED で透明化していて、今回の条件に当てはまる時に、
CMDIClientWnd のタイトルバー上でマウスの左ボタンを押し始め、そのまま
マウスをずっと動かし続けると、WINPOS_SysCommandSizeMove() の中の
if (!GetMessageW( &msg, 0, 0, 0 )) break;
の部分の GetMessageW() 関数の中で停止してしまう。詳細は、GetMessageW() の
中で、メッセージキューが空だった場合に呼び出されるところの、
wait_objects() ;dlls/user32/message.c
-->wow_handlers.wait_message()
-->wait_message() ;dll/user32/winproc.c
-->USER_Driver->pMsgWaitForMultipleObjectsEx()
-->X11DRV_MsgWaitForMultipleObjectsEx()
の最後の関数の中で停止してしまう。
正常なら、WM_NCMOUSEMOVE メッセージが到着することによって、関数から
戻って来るはずだと思われる。
469396
2018/02/22(木) 10:45:19.02ID:9+xI5ulA >>468
2つ目の WaitForMultipleObjectsEx() の中で停止してしまっていることが判明。
本来、先頭に Msg が付く方の API は、メッセージと HANDLE の両方を同時に
監視するようなコードでなくてはならないハズなのに、そうなってないらしい。
process_events() が、MotionNotify の XEvent が来ていたら WM_MOUSEMOVE
メッセージをキューにポストするらしいが、最初に一度だけ調べて XEvent が
来ていない場合は、以後、全く XEvent を調査せずに他の HANDLE 群の変化だけ
を待機してしまうらしい。
DWORD CDECL X11DRV_MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
DWORD timeout, DWORD mask, DWORD flags )
{
DWORD ret;
struct x11drv_thread_data *data = TlsGetValue( thread_data_tls_index );
if (!data) {
if (!count && !timeout) return WAIT_TIMEOUT;
return WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
}
if (data->current_event) mask = 0; /* don't process nested events */
if (process_events( data->display, filter_event, mask )) ret = count - 1;
else if (count || timeout) {
ret = WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
if (ret == count - 1) process_events( data->display, filter_event, mask );
}
else ret = WAIT_TIMEOUT;
return ret;
}
2つ目の WaitForMultipleObjectsEx() の中で停止してしまっていることが判明。
本来、先頭に Msg が付く方の API は、メッセージと HANDLE の両方を同時に
監視するようなコードでなくてはならないハズなのに、そうなってないらしい。
process_events() が、MotionNotify の XEvent が来ていたら WM_MOUSEMOVE
メッセージをキューにポストするらしいが、最初に一度だけ調べて XEvent が
来ていない場合は、以後、全く XEvent を調査せずに他の HANDLE 群の変化だけ
を待機してしまうらしい。
DWORD CDECL X11DRV_MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
DWORD timeout, DWORD mask, DWORD flags )
{
DWORD ret;
struct x11drv_thread_data *data = TlsGetValue( thread_data_tls_index );
if (!data) {
if (!count && !timeout) return WAIT_TIMEOUT;
return WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
}
if (data->current_event) mask = 0; /* don't process nested events */
if (process_events( data->display, filter_event, mask )) ret = count - 1;
else if (count || timeout) {
ret = WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
if (ret == count - 1) process_events( data->display, filter_event, mask );
}
else ret = WAIT_TIMEOUT;
return ret;
}
470396
2018/02/22(木) 10:46:53.05ID:9+xI5ulA 【通常時、WM_MOUSEMOVE がキューへ追加される時の実行経路】
X11DRV_MsgWaitForMultipleObjectsEx()
--> process_events()
---> call_event_handler( Display *display, XEvent *event )
---> handlers[event->type]( hwnd, event );
event->type = MotionNotify (6)
---> X11DRV_MotionNotify( HWND hwnd, XEvent *xev )
XMotionEvent *event = &xev->xmotion;
INPUT input;
---> send_mouse_input( hwnd, event->window, event->state, &input );
---> __wine_send_input( HWND hwnd, const INPUT *input )
---> send_hardware_message( hwnd, input, 0 );
SERVER_START_REQ( send_hardware_message ) {
switch (input->type)
case INPUT_MOUSE:
}
---> wine_server_call( req );
---> DECL_HANDLER(send_hardware_message)
(send a hardware message to a thread queue)
---> queue_mouse_message( desktop, req->win, &req->input, req->flags, sender );
messages[MOUSEEVENTF_MOVE (1)] = WM_MOUSEMOVE
---> queue_hardware_message() : WM_MOUSEMOVE
list_add_tail( &input->msg_list, &msg->entry );
set_queue_bits( thread->queue, get_hardware_msg_bit(msg) );
--->
if (!always_queue || merge_message( input, msg )) free_message( msg );
else {
msg->unique_id = 0; /* will be set once we return it to the app */
list_add_tail( &input->msg_list, &msg->entry );
set_queue_bits( thread->queue, get_hardware_msg_bit(msg) );
}
X11DRV_MsgWaitForMultipleObjectsEx()
--> process_events()
---> call_event_handler( Display *display, XEvent *event )
---> handlers[event->type]( hwnd, event );
event->type = MotionNotify (6)
---> X11DRV_MotionNotify( HWND hwnd, XEvent *xev )
XMotionEvent *event = &xev->xmotion;
INPUT input;
---> send_mouse_input( hwnd, event->window, event->state, &input );
---> __wine_send_input( HWND hwnd, const INPUT *input )
---> send_hardware_message( hwnd, input, 0 );
SERVER_START_REQ( send_hardware_message ) {
switch (input->type)
case INPUT_MOUSE:
}
---> wine_server_call( req );
---> DECL_HANDLER(send_hardware_message)
(send a hardware message to a thread queue)
---> queue_mouse_message( desktop, req->win, &req->input, req->flags, sender );
messages[MOUSEEVENTF_MOVE (1)] = WM_MOUSEMOVE
---> queue_hardware_message() : WM_MOUSEMOVE
list_add_tail( &input->msg_list, &msg->entry );
set_queue_bits( thread->queue, get_hardware_msg_bit(msg) );
--->
if (!always_queue || merge_message( input, msg )) free_message( msg );
else {
msg->unique_id = 0; /* will be set once we return it to the app */
list_add_tail( &input->msg_list, &msg->entry );
set_queue_bits( thread->queue, get_hardware_msg_bit(msg) );
}
471396
2018/02/22(木) 10:47:48.18ID:9+xI5ulA 【WM_NCMOUSEMOVE は WM_MOUSEMOVE から修正される】
PeekMessageW() または GetMessageW() の中で、hittest が HTCLIENT 以外
の場合は、WM_MOUSEMOVE が WM_NCMOUSEMOVE に修正される :
PeekMessageW() または、GetMessageW()
---> peek_message()
---> switch(info.type)
case MSG_HARDWARE :
---> process_hardware_message()
---> process_mouse_message() {
if (hittest != HTCLIENT) {
message += WM_NCMOUSEMOVE - WM_MOUSEMOVE;
wparam = hittest;
}
PeekMessageW() または GetMessageW() の中で、hittest が HTCLIENT 以外
の場合は、WM_MOUSEMOVE が WM_NCMOUSEMOVE に修正される :
PeekMessageW() または、GetMessageW()
---> peek_message()
---> switch(info.type)
case MSG_HARDWARE :
---> process_hardware_message()
---> process_mouse_message() {
if (hittest != HTCLIENT) {
message += WM_NCMOUSEMOVE - WM_MOUSEMOVE;
wparam = hittest;
}
472login:Penguin
2018/02/22(木) 15:16:45.32ID:9+xI5ulA 頭に Msg が付かない方の WaitForMultipleObjecstEx() も
挙動がおかしい。 timeout に 0 を指定しても、無限に
待機してしまうことがある。
挙動がおかしい。 timeout に 0 を指定しても、無限に
待機してしまうことがある。
473396
2018/02/22(木) 16:31:11.62ID:9+xI5ulA Msg が付く方の WaitXxxx で、usleep() で、0.3秒ほど停止しながら、
Polling (Loop) するようにしてから、FIXMEでメッセージを観察してみた。
普段は、usleep() 命令は、呼び出してから 0.3 秒で戻ってくる。
ところが、先日からの遅くなる条件でドラッグし続けた場合、単純な usleep() の
1命令が、呼び出してから、永久に戻ってこなくなる。ドラッグをやめると、
人間が長く感じるほどの長い時間が経過してから戻ってくる。
これは、WINEの問題ではなく、Linux Kernel の問題だろうか???
Polling (Loop) するようにしてから、FIXMEでメッセージを観察してみた。
普段は、usleep() 命令は、呼び出してから 0.3 秒で戻ってくる。
ところが、先日からの遅くなる条件でドラッグし続けた場合、単純な usleep() の
1命令が、呼び出してから、永久に戻ってこなくなる。ドラッグをやめると、
人間が長く感じるほどの長い時間が経過してから戻ってくる。
これは、WINEの問題ではなく、Linux Kernel の問題だろうか???
474396
2018/02/22(木) 16:45:23.34ID:9+xI5ulA やったことをもうちょっと詳しく書いておくと、
>>469 の X11DRV_MsgWaitForMultipleObjectsEx() の関数の2番目の
WaitForMultipleObjectsEx() の呼び出しの箇所を次の様に修正してみた。
(FIXME はもっと付けてあるが省略):
if ( timeout == INFINITE ) {
//*中略*
for ( ;; ) { // 苦肉の polling loop :
ret = WaitForMultipleObjectsEx( count, handles, bWaitAll,
0, // (ms) (指定しても上手く行かないので0にしてみた)
bAlertable );
if ( ret == WAIT_TIMEOUT ) {
if ( process_events( data->display, filter_event, mask ) ) {
ret = count;
break;
}
}
else {
break;
}
FIXME( "call usleep\n" ); //(1)
usleep(1000 * 300); //(2) 仕様上は、300(ms)後に戻る。
FIXME( "returned from usleep\n" ); //(3)
}
}
else {
ret = WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
}
該当の条件の時にマウスを動かし続けると、(1)のメッセージが出た後、
(3)のメッセージが、事実上、無限に待っても出てこなくなった。ドラッグして
ないときには、usleep()の仕様通り、300(ms)後にメッセージが出てくる。
>>469 の X11DRV_MsgWaitForMultipleObjectsEx() の関数の2番目の
WaitForMultipleObjectsEx() の呼び出しの箇所を次の様に修正してみた。
(FIXME はもっと付けてあるが省略):
if ( timeout == INFINITE ) {
//*中略*
for ( ;; ) { // 苦肉の polling loop :
ret = WaitForMultipleObjectsEx( count, handles, bWaitAll,
0, // (ms) (指定しても上手く行かないので0にしてみた)
bAlertable );
if ( ret == WAIT_TIMEOUT ) {
if ( process_events( data->display, filter_event, mask ) ) {
ret = count;
break;
}
}
else {
break;
}
FIXME( "call usleep\n" ); //(1)
usleep(1000 * 300); //(2) 仕様上は、300(ms)後に戻る。
FIXME( "returned from usleep\n" ); //(3)
}
}
else {
ret = WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
timeout, flags & MWMO_ALERTABLE );
}
該当の条件の時にマウスを動かし続けると、(1)のメッセージが出た後、
(3)のメッセージが、事実上、無限に待っても出てこなくなった。ドラッグして
ないときには、usleep()の仕様通り、300(ms)後にメッセージが出てくる。
475396
2018/02/22(木) 17:29:11.00ID:9+xI5ulA かなり色々やったつもりだけど、ちょっとこれ以上深入りは難しいので、もう諦めようかも。
以下の上京からするとLinuxカーネルの問題かも知れない:
1. タスクバーも操作不能になる。
2. 単純な usleep() も無限に帰ってこない。
以下の上京からするとLinuxカーネルの問題かも知れない:
1. タスクバーも操作不能になる。
2. 単純な usleep() も無限に帰ってこない。
476396
2018/02/22(木) 17:39:46.66ID:9+xI5ulA Wineでは、昔の MSDN Library の CD もインストールは出来ただが見られなかった。
hh.exe が xxx.COL ファイルを開けないと言ってくる。
yyy.CHM ファイルは、開くことはできたが、右のペーンだけが見えて、左側の目次や
検索のぺーンには何も表示されない。
今回 WINEのソースを見て思うのは、意外とちゃんと書かれていないということ。
MsgWaitXxxx にも、戻り値が明らかに間違っている部分を発見した。
また、TRUE (1)を引数に渡す必要があるところで、1ではない非0 の値を渡している
箇所も見つかった。そのようなコードは後々問題を来すかも知れない。
それに、MsgWaitXxx もちゃんと書かれていない。同時に待機するのは、アプリ・プログラマ
がどんだけ頑張ってもかけないから API が用意されているのだが、そこに明らかな
ロジックの間違いがある。
有名なアプリだけはちゃんと動作するが、実は模倣の程度が意外と低いかも。
有名なアプリだけは動くように調整されている・・・。
hh.exe が xxx.COL ファイルを開けないと言ってくる。
yyy.CHM ファイルは、開くことはできたが、右のペーンだけが見えて、左側の目次や
検索のぺーンには何も表示されない。
今回 WINEのソースを見て思うのは、意外とちゃんと書かれていないということ。
MsgWaitXxxx にも、戻り値が明らかに間違っている部分を発見した。
また、TRUE (1)を引数に渡す必要があるところで、1ではない非0 の値を渡している
箇所も見つかった。そのようなコードは後々問題を来すかも知れない。
それに、MsgWaitXxx もちゃんと書かれていない。同時に待機するのは、アプリ・プログラマ
がどんだけ頑張ってもかけないから API が用意されているのだが、そこに明らかな
ロジックの間違いがある。
有名なアプリだけはちゃんと動作するが、実は模倣の程度が意外と低いかも。
有名なアプリだけは動くように調整されている・・・。
477396
2018/02/22(木) 18:45:28.30ID:9+xI5ulA usleep() の部分を setitimer(), pause() に変えてみたら、そこは指定した
時間でちゃんと帰ってくるようになった。でも、Linux全体が停止に近い状態に
なる症状は変わらない。端末内の FIXME の表示が途中の文字まで書かれた状態で
改行までいく前に長い間停止する現象が起きてしまっている。
時間でちゃんと帰ってくるようになった。でも、Linux全体が停止に近い状態に
なる症状は変わらない。端末内の FIXME の表示が途中の文字まで書かれた状態で
改行までいく前に長い間停止する現象が起きてしまっている。
478396
2018/02/22(木) 23:32:51.41ID:9+xI5ulA X Window System は、Server と Client で通信を行っているから、Client側では処理が
一瞬で帰って来ているように見えても、Server側では処理に凄く時間がかかっている可能性
があるかもしれない。だから Client側で、関数の呼び出しの前後の時間を計測をしても
それは単にServer にコマンドを送る処理の時間を計測しているに過ぎないのかも
知れない。イメージのバイト数が多いいときには、通信時のデータ・コピーに時間がかかる
から多少時間がかかるかも知れないが、それはまだ表面上の時間に過ぎず、Server 側は
Shapeのくり抜き処理(?)や重ね合わせの処理に膨大な時間がかかっている可能性も否定できない。
だから、XCreateBitmapFromData(), XShapeCombineMask(), XPutImage() の前後の時間を
計測しているだけでは速く見えても、見えない場所でCPUパワーを全開にしてがんばっても
まだ処理を終えてないのかもしれない。
だから、Linux Kernel は、X Serverに CPU パワーを全開まで与えようとしている・・・。
Client側で計測した時間は見せかけの時間であって、処理全体の時間ではない・・・。
だから、タスクバーなども動かず、デバッグ表示の端末の文字も中途半端な場所でWAIT
状態になってしまう・・・。
これが真相だろうか?
一瞬で帰って来ているように見えても、Server側では処理に凄く時間がかかっている可能性
があるかもしれない。だから Client側で、関数の呼び出しの前後の時間を計測をしても
それは単にServer にコマンドを送る処理の時間を計測しているに過ぎないのかも
知れない。イメージのバイト数が多いいときには、通信時のデータ・コピーに時間がかかる
から多少時間がかかるかも知れないが、それはまだ表面上の時間に過ぎず、Server 側は
Shapeのくり抜き処理(?)や重ね合わせの処理に膨大な時間がかかっている可能性も否定できない。
だから、XCreateBitmapFromData(), XShapeCombineMask(), XPutImage() の前後の時間を
計測しているだけでは速く見えても、見えない場所でCPUパワーを全開にしてがんばっても
まだ処理を終えてないのかもしれない。
だから、Linux Kernel は、X Serverに CPU パワーを全開まで与えようとしている・・・。
Client側で計測した時間は見せかけの時間であって、処理全体の時間ではない・・・。
だから、タスクバーなども動かず、デバッグ表示の端末の文字も中途半端な場所でWAIT
状態になってしまう・・・。
これが真相だろうか?
479396
2018/02/22(木) 23:41:51.80ID:9+xI5ulA そういえば、update_surface_region() が呼び出されたことを示すデバッグ文字列は、後からまとめて
ドドッと出てくる。それは、文字列が「出てない」間には関数が呼ばれてないことを意味する
訳ではなく、実は呼ばれてはいるが、文字列が flush されてないか、または、flush
されていても、端末に CPU リソースが割り当てられないから、文字表示だけが行われずに
文字列がバッファに溜まった状態になってしまっている・・・・。
こう考えれば辻褄が合うかも。
ドドッと出てくる。それは、文字列が「出てない」間には関数が呼ばれてないことを意味する
訳ではなく、実は呼ばれてはいるが、文字列が flush されてないか、または、flush
されていても、端末に CPU リソースが割り当てられないから、文字表示だけが行われずに
文字列がバッファに溜まった状態になってしまっている・・・・。
こう考えれば辻褄が合うかも。
480396
2018/02/23(金) 00:00:03.49ID:rGoiNTvu 本家の Windowsでは、描画処理が重いときには、OnPaint や OnDraw の関数が終わるまで
の時間も長い。だから、メッセージがたくさんたまっているのに描画が追いついていない事は、
メッセージ・キューに残っているメッセージの個数が多い事で大体の判断が付く。だから、
InvalidateRect(NULL)をしておけば、描画が追いついてない場合は、メッセージループ
が WM_PAINTメッセージを送るタイミングを自動的に後回しにしてくれる。
ところが、X Window System の場合、実際の描画がまだ終わってない場合でも、
「描画関数」自体は一瞬にして戻ってきてしまうから、上記のアルゴリズムが「勘違い」を
起こしてしまうことがある・・・。
そらに悪い事に、WINEが、内部で Surface を持っているときには、LineTo 関数自体は高速に
処理を終えるのに、アプリが予想もしないタイミングで、時間の掛かる flush の処理が行われ
てしまう。
そうすると、OnPaint は高速に終わったと勘違いして、WM_PAINT メッセージが、マウス・メッセージに
完全に連動して大量に生成されてしまう。すると、Pending 状態の X Window の処理がどんどん
待ち行列に溜まっていってしまう。
ドラッグ中は、WM_PAINT が秒間20回も送られるのに、Server が実際の描画を終えるのは、
その何十倍も時間がかかってしまう。
こんな感じだろうか。
の時間も長い。だから、メッセージがたくさんたまっているのに描画が追いついていない事は、
メッセージ・キューに残っているメッセージの個数が多い事で大体の判断が付く。だから、
InvalidateRect(NULL)をしておけば、描画が追いついてない場合は、メッセージループ
が WM_PAINTメッセージを送るタイミングを自動的に後回しにしてくれる。
ところが、X Window System の場合、実際の描画がまだ終わってない場合でも、
「描画関数」自体は一瞬にして戻ってきてしまうから、上記のアルゴリズムが「勘違い」を
起こしてしまうことがある・・・。
そらに悪い事に、WINEが、内部で Surface を持っているときには、LineTo 関数自体は高速に
処理を終えるのに、アプリが予想もしないタイミングで、時間の掛かる flush の処理が行われ
てしまう。
そうすると、OnPaint は高速に終わったと勘違いして、WM_PAINT メッセージが、マウス・メッセージに
完全に連動して大量に生成されてしまう。すると、Pending 状態の X Window の処理がどんどん
待ち行列に溜まっていってしまう。
ドラッグ中は、WM_PAINT が秒間20回も送られるのに、Server が実際の描画を終えるのは、
その何十倍も時間がかかってしまう。
こんな感じだろうか。
481396
2018/02/23(金) 00:09:19.71ID:rGoiNTvu482396
2018/02/23(金) 00:23:13.75ID:rGoiNTvu 原因は推定できてきたけど、さて、どうやってこれを解決すればいいか・・・。
2018/02/23(金) 09:55:12.25ID:o5jNB0tx
ライセンスの関係でややこしいことに成る可能性が存在するから
5chへソースコードは書かないで
github使ったほうがいい
5chへソースコードは書かないで
github使ったほうがいい
2018/02/23(金) 10:10:14.53ID:53V98ywt
粒度の低いパッチをちょこちょこアップすると良いのでは。
論理値のあやまりを直すやつとか。
論理値のあやまりを直すやつとか。
2018/02/23(金) 12:34:30.91ID:o5jNB0tx
487396
2018/02/23(金) 12:36:23.19ID:rGoiNTvu 協力しにくくしにくくなるように仕向けられて、どうしようもない状態になってる気もする。
make時の表示の無駄が多すぎて、特に警告が出ていても見逃しやすいし、HDDも膨大に
消費するし、ダウンロードやアップロードにも莫大な時間がかかるし。
なんだか、アメリカと北欧の社会的環境以外ではとっても負担が大きいかも、
make時の表示の無駄が多すぎて、特に警告が出ていても見逃しやすいし、HDDも膨大に
消費するし、ダウンロードやアップロードにも莫大な時間がかかるし。
なんだか、アメリカと北欧の社会的環境以外ではとっても負担が大きいかも、
2018/02/23(金) 12:38:43.64ID:o5jNB0tx
490396
2018/02/23(金) 12:41:01.63ID:rGoiNTvu MSのやり方に困った人が集まってくるのがLinux。
でも、Linuxのやり方にもまた困る。UbuntuのUpdateも自分には出来ない。
なぜなら、HDDのパーティションの容量が足りないのと、DLに時間がかかりすぎるからと、
クリーンインストールしなきゃならないから、せっかく入れた Wine や Wz, VC++ などの再
インストールに莫大な時間がかかってしまうのとで。それでやっとの思いでなんとか協力
したいと思っているのに、また、ライセンスがどうのこうのとか。
わけが分からない。LinuxやUbuntuのバグに悩まされて、しょっちゅう Logout と Login
を繰り返しながら、やっとの思いでやってます。
でも、Linuxのやり方にもまた困る。UbuntuのUpdateも自分には出来ない。
なぜなら、HDDのパーティションの容量が足りないのと、DLに時間がかかりすぎるからと、
クリーンインストールしなきゃならないから、せっかく入れた Wine や Wz, VC++ などの再
インストールに莫大な時間がかかってしまうのとで。それでやっとの思いでなんとか協力
したいと思っているのに、また、ライセンスがどうのこうのとか。
わけが分からない。LinuxやUbuntuのバグに悩まされて、しょっちゅう Logout と Login
を繰り返しながら、やっとの思いでやってます。
2018/02/23(金) 12:42:05.80ID:k4GWhlfR
MacでWine使ってるけど似たようんだもんだわ。
2018/02/23(金) 12:42:59.46ID:o5jNB0tx
OSSやLinuxの問題ではなくて
5chのライセンス扱いの問題
5chのライセンス扱いの問題
493396
2018/02/23(金) 12:43:40.23ID:rGoiNTvu >>489
そんな心配はないはずです。
自分は権利を放棄するつもりでやってますし、法的には Wine の LGPL が優先されて、
5ch は権利は主張できないハズ。もし、権利を主張するなら、5ch自体が人が来なくなって、
閉鎖されるでしょう。
そんな心配はないはずです。
自分は権利を放棄するつもりでやってますし、法的には Wine の LGPL が優先されて、
5ch は権利は主張できないハズ。もし、権利を主張するなら、5ch自体が人が来なくなって、
閉鎖されるでしょう。
2018/02/23(金) 12:46:50.60ID:o5jNB0tx
>>493
OSSのソースコードを5chに書き写したらライセンスが移るかというとそうではないと思うけど
問題にされる可能性が存在する
新規のソースコードだった場合など、5chが権利を主張してOSSで扱えない可能性が出てくる
OSSのソースコードを5chに書き写したらライセンスが移るかというとそうではないと思うけど
問題にされる可能性が存在する
新規のソースコードだった場合など、5chが権利を主張してOSSで扱えない可能性が出てくる
2018/02/23(金) 12:49:19.08ID:l6yAbvNG
2018/02/23(金) 12:50:21.93ID:FG6aVYHX
とはいっても、勝手に転載するな、の主張は現在進行でバンバンやってますからねえ…
2018/02/23(金) 12:52:23.01ID:o5jNB0tx
498396
2018/02/23(金) 13:42:27.43ID:rGoiNTvu 【ついに出来た】
x11drv_surface_flush() の中で、
update_surface_region( surface );
を実行後、
XPutImage(・・・);
XFlush( gdi_display );
XSync( gdi_display, TRUE );
XSynchronize( gdi_display, True );
で関数が終わっていたところに、試しに
usleep( 1000 * 150 ); // 0.15(秒) の待機
を追加して見たところ、「改善(感覚的な速度アップ)」が見られました。
ちゃんと、ドラッグした時に「XOR反転枠」がマウスの動きに付いてきます。
今までは、「枠」が現れすらしなかったのに。試しに WAIT 値を「小さく」して、
usleep( 1000 * 100 );
とするとダメなままでした。WAIT 値が大きいほど、感覚的に速度がアップ
したような感じになります(一種の逆転現象)。
これは、X Window の Server の処理が終わってないのに、終わったと勘違いして
次々に新しいコマンドを X Server に送ってしまっていたことで、今回の不具合
が起きていたことを裏付ける物です。Linux が CPU パワーを X Server にばかり
与えてしまい、アプリ側のコードは停止する一方て、実際の画面には何の描画も
行われなくなり、タスクバーすら全く機能しなくなる。その結果、システムが
ハングアップしたようになる。
x11drv_surface_flush() の中で、
update_surface_region( surface );
を実行後、
XPutImage(・・・);
XFlush( gdi_display );
XSync( gdi_display, TRUE );
XSynchronize( gdi_display, True );
で関数が終わっていたところに、試しに
usleep( 1000 * 150 ); // 0.15(秒) の待機
を追加して見たところ、「改善(感覚的な速度アップ)」が見られました。
ちゃんと、ドラッグした時に「XOR反転枠」がマウスの動きに付いてきます。
今までは、「枠」が現れすらしなかったのに。試しに WAIT 値を「小さく」して、
usleep( 1000 * 100 );
とするとダメなままでした。WAIT 値が大きいほど、感覚的に速度がアップ
したような感じになります(一種の逆転現象)。
これは、X Window の Server の処理が終わってないのに、終わったと勘違いして
次々に新しいコマンドを X Server に送ってしまっていたことで、今回の不具合
が起きていたことを裏付ける物です。Linux が CPU パワーを X Server にばかり
与えてしまい、アプリ側のコードは停止する一方て、実際の画面には何の描画も
行われなくなり、タスクバーすら全く機能しなくなる。その結果、システムが
ハングアップしたようになる。
2018/02/23(金) 17:33:19.82ID:HLL3Qr1p
日本語でパッチの記述を書いてくれれば、英訳してくれる奴がスレにいると思うな。
最悪ぐぐる翻訳でも。
あとは日本人でwineにコミットしてる人を探してパッチを仲介してもらうとか…
最悪ぐぐる翻訳でも。
あとは日本人でwineにコミットしてる人を探してパッチを仲介してもらうとか…
2018/02/24(土) 00:28:32.95ID:zOhbGEn1
だいぶ前のレスだけれど、 >>439 は信じるなよ。
Wineに修正を送る方法はgit format-patchで整形したパッチを
wine-devel@winehq .orgにメールする方法だからな。(前近代的に感じるかもしれないけれど)
他にも要件がいろいろあるから、 ttps://wiki.winehq.org/Submitting_Patches を一読した方がいいと思う。
Wineに修正を送る方法はgit format-patchで整形したパッチを
wine-devel@winehq .orgにメールする方法だからな。(前近代的に感じるかもしれないけれど)
他にも要件がいろいろあるから、 ttps://wiki.winehq.org/Submitting_Patches を一読した方がいいと思う。
501396
2018/02/24(土) 02:46:13.04ID:OWf5FxmD >>500
WINE 本家に正式採用されなくてもいいなら、github にプルリクエストを送る、なんて
事は可能なんでしょうか。
ライセンス上は、修正した箇所のソースの断片でも、どこでもいいからネット上のどこかに
アップロードしておけば良いんだと思うんですが。
ネットの回線が遅いから、自分が全く修正してない部分まで全部アップロードというのは
かなり困ります。
WINE 本家に正式採用されなくてもいいなら、github にプルリクエストを送る、なんて
事は可能なんでしょうか。
ライセンス上は、修正した箇所のソースの断片でも、どこでもいいからネット上のどこかに
アップロードしておけば良いんだと思うんですが。
ネットの回線が遅いから、自分が全く修正してない部分まで全部アップロードというのは
かなり困ります。
502396
2018/02/24(土) 02:53:02.72ID:OWf5FxmD 要は、著作権が発生するようなソースを書かなければいいんですね。
WINE で、WS_EX_LAYERED の場合に、現状の様に XShape を使わずに、
XCreateWindow の depth に 32 を指定して、ARGB カラーを使うようにして
透明化を実験して見たところ、高速になったようです。
まだ、中途半端ですが。
WINE で、WS_EX_LAYERED の場合に、現状の様に XShape を使わずに、
XCreateWindow の depth に 32 を指定して、ARGB カラーを使うようにして
透明化を実験して見たところ、高速になったようです。
まだ、中途半端ですが。
503396
2018/02/24(土) 03:51:57.07ID:OWf5FxmD 透明化、完全に上手く行きました。速度は劇的に向上。
システムの(事実上の)ハングアップも全く起きません。
現状で Windows との非互換な部分は、透明部分をクリックしても、下にある Window
にマウスメッセージが送られない、という一点だけです。
システムの(事実上の)ハングアップも全く起きません。
現状で Windows との非互換な部分は、透明部分をクリックしても、下にある Window
にマウスメッセージが送られない、という一点だけです。
2018/02/24(土) 14:18:44.11ID:cjPOAqRo
wineならぬmace出ないかな
2018/02/24(土) 14:34:29.89ID:lC3bqhkw
ダーウィン
2018/02/25(日) 07:00:46.98ID:gMY/XOlZ
>>502
>要は、著作権が発生するようなソースを書かなければいいんですね。
そうそう
wine本家にマージさせるためにどこかにあげてというのでなく
自分のwebsiteでもgithubでもgooglecodeでも、問題がなさそうな場所へ
>要は、著作権が発生するようなソースを書かなければいいんですね。
そうそう
wine本家にマージさせるためにどこかにあげてというのでなく
自分のwebsiteでもgithubでもgooglecodeでも、問題がなさそうな場所へ
2018/02/25(日) 19:49:25.06ID:klqr3sXG
>>506
Qiita にソースをULするのは、著作権的に問題ありそうですか?
Qiita にソースをULするのは、著作権的に問題ありそうですか?
2018/02/25(日) 20:01:41.95ID:dPUju/W+
2018/02/26(月) 04:48:44.29ID:AjOMcg+3
ソースコードの投稿は厄介そう
2018/02/26(月) 19:35:42.85ID:uvsc9Ei6
511396
2018/02/27(火) 17:20:06.59ID:fxlvg2HV Linux の X Window の XShape と、 Win32 の WS_EX_LAYERED は相性が悪いために
単に Win32 を Emulateしようとすると、多分、どうやっても遅くなってしまうと思うんです。
だから、Wine 専用に Windows には無いフラグや関数を定義して、ある新定義の
独自APIを呼んだタイミングでだけ、XShapeを呼び出す仕様にすればいいと思うん
です。それを呼び出さなくても、中の図形や透明部分は自由に変えられると。
で、メッセージが下(Desktopなど)まで届く部分を指定したい場合(外形を変えた
い場合等)だけは、その関数を呼ぶと。例えば、透明を使った一般のアプリでも、
輪郭は楕円にしておいて、中の絵だけを高速に変えたいような需要はあると思う
んです。それは、今の Wineでは出来ません。でも、今述べた方法なら可能になり
ます。
技術的には自分だけでも可能です。でも、この仕組みを本家Wineの人が納得して
くれるか分かりません。
なお、自分のアプリだと、「GroundWnd」なる「受け皿」を作ってそこでメッセー
ジを「せき止めて」下には透明部分であっても、敢えてメッセージが届かないよ
うにしているので、見た目だけ透明に出来れば十分なのですが。
でも、本家に統合してもらわないと、Wineのバージョンアップの度に、こっちで
その独自部分の追加作業が必要になったりして大変なんです。
なんとか話を付けることは出来ないものでしょうか???
単に Win32 を Emulateしようとすると、多分、どうやっても遅くなってしまうと思うんです。
だから、Wine 専用に Windows には無いフラグや関数を定義して、ある新定義の
独自APIを呼んだタイミングでだけ、XShapeを呼び出す仕様にすればいいと思うん
です。それを呼び出さなくても、中の図形や透明部分は自由に変えられると。
で、メッセージが下(Desktopなど)まで届く部分を指定したい場合(外形を変えた
い場合等)だけは、その関数を呼ぶと。例えば、透明を使った一般のアプリでも、
輪郭は楕円にしておいて、中の絵だけを高速に変えたいような需要はあると思う
んです。それは、今の Wineでは出来ません。でも、今述べた方法なら可能になり
ます。
技術的には自分だけでも可能です。でも、この仕組みを本家Wineの人が納得して
くれるか分かりません。
なお、自分のアプリだと、「GroundWnd」なる「受け皿」を作ってそこでメッセー
ジを「せき止めて」下には透明部分であっても、敢えてメッセージが届かないよ
うにしているので、見た目だけ透明に出来れば十分なのですが。
でも、本家に統合してもらわないと、Wineのバージョンアップの度に、こっちで
その独自部分の追加作業が必要になったりして大変なんです。
なんとか話を付けることは出来ないものでしょうか???
2018/02/27(火) 18:55:09.95ID:glf1pFGh
2018/02/27(火) 19:35:49.93ID:fxlvg2HV
2018/02/27(火) 22:28:51.79ID:SXflemsb
新定義の独自APIとか言い出したら正確に伝わっても賛同されるか疑問だ
516396
2018/02/28(水) 01:21:22.23ID:nqkdrNZG 結論的には、Wineを改造しても Windows API の仕様を変える訳ではありませんので、
もし、Wineの一部であっても、Windows API だけを使った dll の部分は、Wineの
バージョンが変わっても、原則的には自由に入れ替え可能な可能性があるのです。
kernel32.dll, gdi32.dll, user32.dll, ntdll.dll の4つの dll 以外のdllは、
WINEの内部がどのように実装されているかには依存していない可能性があると
いうことです。もしそうであれば、Wine のソースを改造してもこれらのdll.so以外は、
本家Wineが今後発表する新バージョンのものを、改造 Wine のバイナリファイル群に
後から上書きしても、互換性が保たれ続けるんじゃないかな、と思いました。つまり、
以下の 4つの dll.so だけを配布すれば、かなり長い間、独自の Wine として動作
できる可能性があるのではないかと。loader.c を修正した libswine.so.1.0 を配布
すれば、dll.so の検索パスも上手く「オーバーライド」できますので、以下のたかだか
18MB程度のファイル群を配布しさえすれば、標準の Wine を壊さないまま、独自の Wine を
特定のアプリにだけ適用し、両バージョンの Wine を共存できるのではないかと思えて
きたんです。
./libs/wine/libwine.so.1.0 1,933,464 # WINEDLLPATH 修正のため
./kernel32/kernel32.dll.so 5,526,999
./gdi32/gdi32.dll.so 2,655,524
./user32/user32.dll.so 4,267,471
./ntdll/ntdll.dll.so 3,256,245
もし、Wineの一部であっても、Windows API だけを使った dll の部分は、Wineの
バージョンが変わっても、原則的には自由に入れ替え可能な可能性があるのです。
kernel32.dll, gdi32.dll, user32.dll, ntdll.dll の4つの dll 以外のdllは、
WINEの内部がどのように実装されているかには依存していない可能性があると
いうことです。もしそうであれば、Wine のソースを改造してもこれらのdll.so以外は、
本家Wineが今後発表する新バージョンのものを、改造 Wine のバイナリファイル群に
後から上書きしても、互換性が保たれ続けるんじゃないかな、と思いました。つまり、
以下の 4つの dll.so だけを配布すれば、かなり長い間、独自の Wine として動作
できる可能性があるのではないかと。loader.c を修正した libswine.so.1.0 を配布
すれば、dll.so の検索パスも上手く「オーバーライド」できますので、以下のたかだか
18MB程度のファイル群を配布しさえすれば、標準の Wine を壊さないまま、独自の Wine を
特定のアプリにだけ適用し、両バージョンの Wine を共存できるのではないかと思えて
きたんです。
./libs/wine/libwine.so.1.0 1,933,464 # WINEDLLPATH 修正のため
./kernel32/kernel32.dll.so 5,526,999
./gdi32/gdi32.dll.so 2,655,524
./user32/user32.dll.so 4,267,471
./ntdll/ntdll.dll.so 3,256,245
517396
2018/02/28(水) 01:22:09.65ID:nqkdrNZG >>516
その際、「wine server」の「server request」の仕様を変更さえしなければ、
標準の Wine を使ったアプリと、まさに同時実行も可能ではないかと。
実際、自分が実験する限り、標準の Wine を使った VC++ と Wz が、
特に問題なく独自 Wine の自前アプリと同時実行で来ているように見えますので。
なんというか、例えば、Wineの実装の構造体にメンバ変数を独自に追加した場合、
それが直接見えているソースは、同一の構造体の他のメンバの相対アドレス、構造体の
サイズが変わるために再コンパイルが必要です。しかし、それを直接見ているのは、
上の 4つの dllのdll.soファイルだけではないかと。そして、その他のdllは、その
構造体を直接見てないのではないかと。それで、カプセルの様にブラックボックスの
中に改造が閉じ込められてしまって、再コンパイルを全くしなくても外の dll 達に
は、その改造が破壊的な影響を与えずに、機能としての変化だけが伝達されるのでは
ないかと。
その際、「wine server」の「server request」の仕様を変更さえしなければ、
標準の Wine を使ったアプリと、まさに同時実行も可能ではないかと。
実際、自分が実験する限り、標準の Wine を使った VC++ と Wz が、
特に問題なく独自 Wine の自前アプリと同時実行で来ているように見えますので。
なんというか、例えば、Wineの実装の構造体にメンバ変数を独自に追加した場合、
それが直接見えているソースは、同一の構造体の他のメンバの相対アドレス、構造体の
サイズが変わるために再コンパイルが必要です。しかし、それを直接見ているのは、
上の 4つの dllのdll.soファイルだけではないかと。そして、その他のdllは、その
構造体を直接見てないのではないかと。それで、カプセルの様にブラックボックスの
中に改造が閉じ込められてしまって、再コンパイルを全くしなくても外の dll 達に
は、その改造が破壊的な影響を与えずに、機能としての変化だけが伝達されるのでは
ないかと。
518396
2018/02/28(水) 01:33:54.04ID:nqkdrNZG 「dll.so」ではなく「drv.so」ですが、
/wine/dlls/winex11.drv/winex11.drv.so 1,797,340
も配布が必要ですので、合計20MB程度。圧縮すれば 10MB程度のはず。
だから、アプリ本体のバイナリと同時に 10MBを配布すれば独自修正 Wineが
配布できるかと。
/wine/dlls/winex11.drv/winex11.drv.so 1,797,340
も配布が必要ですので、合計20MB程度。圧縮すれば 10MB程度のはず。
だから、アプリ本体のバイナリと同時に 10MBを配布すれば独自修正 Wineが
配布できるかと。
519396
2018/02/28(水) 01:52:50.24ID:nqkdrNZG >>515
やはり、そう思われますか。
一部の透明アプリに取っては、改造Wineの方がWindowsとの互換性がかなり上がりますが、
他の透明アプリに取っては下がる、見たいな状態になるので、意見が分かれるかな、と思って
たんです。でも、恩恵を受けるアプリもあります。
やはり、そう思われますか。
一部の透明アプリに取っては、改造Wineの方がWindowsとの互換性がかなり上がりますが、
他の透明アプリに取っては下がる、見たいな状態になるので、意見が分かれるかな、と思って
たんです。でも、恩恵を受けるアプリもあります。
2018/02/28(水) 02:06:19.42ID:b2U8RIm2
派生版みたいなのが乱立しそうで恐い
まあ、現状も最新版が必ずしも良いとは言えないから複数バージョンを使い分けるなんてことはやられているが
まあ、現状も最新版が必ずしも良いとは言えないから複数バージョンを使い分けるなんてことはやられているが
2018/02/28(水) 04:17:01.75ID:ojsBE0jk
これは大変更過ぎて厳しいだろ
フォークして勝手にやってと言われる可能性大
フォークして勝手にやってと言われる可能性大
2018/02/28(水) 05:20:26.14ID:zhVHYdgK
取り敢えず改変した物もしくはそれが置いてあるURLを本家に晒して反応を様子見かね
523396
2018/02/28(水) 15:05:22.37ID:nqkdrNZG MSDN Library の CD-ROM 版を、Wineにインストール出来ました。
https://qiita.com/Yutaka_Aoki/items/a83371ebf5c1e967a6f6
なお、確か、MSDN Library 2008 の ISO イメージは、無料で DL 出来たと思います。
https://qiita.com/Yutaka_Aoki/items/a83371ebf5c1e967a6f6
なお、確か、MSDN Library 2008 の ISO イメージは、無料で DL 出来たと思います。
524login:Penguin
2018/02/28(水) 19:42:05.86ID:Rd3IONev wine下で動くspider.exeがやたらと速いんだが
delayが効いてないだけな気がしなくもない
delayが効いてないだけな気がしなくもない
2018/03/01(木) 22:49:34.77ID:fYfWMlBV
Ctrl+Insertでコピーできるようにしたいんだけど
何か方法ある?
何か方法ある?
2018/03/01(木) 23:36:11.65ID:j/zFLdIr
そんなショートカットあったなあ
最近使ってなかったから忘れてた
最近使ってなかったから忘れてた
2018/03/02(金) 01:05:28.44ID:Bl3AZi1p
155 名前:login:Penguin [sage]: 2018/03/01(木) 23:01:33.07 ID:fYfWMlBV
Ctrl+Insertでコピーしたいんだけどショートカット設定する方法ありますか?
Ctrl+Insertでコピーしたいんだけどショートカット設定する方法ありますか?
2018/03/02(金) 20:50:16.09ID:KIYBEbwH
2018/03/02(金) 20:55:43.86ID:U359uzwU
片山をReactOSの人と言うのはどういう悪意があってのことなのか
2018/03/03(土) 06:56:58.37ID:tG6ima8j
「ReactOSの人」ワロタw
531396
2018/03/03(土) 10:25:25.44ID:YW+cC+A2 「片山 ReactOS」でGoogle検索した時に一番上に表示したページが、
ウイルス感染している事を、BitDefender Traffic Light が報告したので注意
してください。
これは煽りや虚偽ではありません。
ウイルス感染している事を、BitDefender Traffic Light が報告したので注意
してください。
これは煽りや虚偽ではありません。
2018/03/03(土) 11:48:42.40ID:cwR/oIIZ
virustotalで確認
アドレスは現状BitDefenderだけ
ソフトウェア全部は見たわけではないのですが
スクリーンセーバーでひとつだけ他のベンダーが反応>CMC
ぐぐるとアドウェアとして
MZさん、面倒かもしれないけど全部virustotalにぶち込んで
反応してしまったら各ベンダーに報告をほねがいします
IPAに相談したほうが早いかも
アドレスは現状BitDefenderだけ
ソフトウェア全部は見たわけではないのですが
スクリーンセーバーでひとつだけ他のベンダーが反応>CMC
ぐぐるとアドウェアとして
MZさん、面倒かもしれないけど全部virustotalにぶち込んで
反応してしまったら各ベンダーに報告をほねがいします
IPAに相談したほうが早いかも
2018/03/03(土) 11:52:36.01ID:e1SsLOIJ
ひでえwフイタww
534login:Penguin
2018/03/03(土) 13:34:14.61ID:YW+cC+A2 https://www.virustotal.com/#/domain/katahiromz.web.fc2.com
↑を見ると、ScreenSaver の他に、例えば、
Detect 6/55, Data Scaned 2014-08-29, calch_setup.exe
Detect, 9/55, Data Scaned 2014-11-19, file-7704712_exe
と出ます。他に roumaji.zip なども。
多分、BitDefender や CMC だけでなく、過去に(?)、9 つの Security Soft で検出されたということでは?
↑を見ると、ScreenSaver の他に、例えば、
Detect 6/55, Data Scaned 2014-08-29, calch_setup.exe
Detect, 9/55, Data Scaned 2014-11-19, file-7704712_exe
と出ます。他に roumaji.zip なども。
多分、BitDefender や CMC だけでなく、過去に(?)、9 つの Security Soft で検出されたということでは?
2018/03/03(土) 13:37:24.32ID:YW+cC+A2
sage
2018/03/03(土) 13:44:15.14ID:YW+cC+A2
そのサイトには
「d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1」という変な名前のファイルがあり、
9つの Security Soft でウイルスを検知したようです。
https://www.virustotal.com/#/file/d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1/detection
9 engines detected this file
SHA-256 d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1
File name d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1
File size 668.72 KB
Last analysis 2014-08-25 00:08:58 UTC
1. Ad-Aware; Gen:Variant.Graftor.50154
2. BitDefender; Gen:Variant.Graftor.50154
3. Emsisoft; Gen:Variant.Graftor.50154 (B)
4. eScan; Gen:Variant.Graftor.50154
5. F-Secure; Gen:Variant.Graftor.50154
6. GData; Gen:Variant.Graftor.50154
7. Ikarus; Win32.SuspectCrc
8. Symantec; WS.Reputation.1
9. TrendMicro-HouseCall; Suspicious_GEN.F47V0818
「d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1」という変な名前のファイルがあり、
9つの Security Soft でウイルスを検知したようです。
https://www.virustotal.com/#/file/d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1/detection
9 engines detected this file
SHA-256 d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1
File name d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1
File size 668.72 KB
Last analysis 2014-08-25 00:08:58 UTC
1. Ad-Aware; Gen:Variant.Graftor.50154
2. BitDefender; Gen:Variant.Graftor.50154
3. Emsisoft; Gen:Variant.Graftor.50154 (B)
4. eScan; Gen:Variant.Graftor.50154
5. F-Secure; Gen:Variant.Graftor.50154
6. GData; Gen:Variant.Graftor.50154
7. Ikarus; Win32.SuspectCrc
8. Symantec; WS.Reputation.1
9. TrendMicro-HouseCall; Suspicious_GEN.F47V0818
2018/03/03(土) 15:15:34.02ID:cwR/oIIZ
https://www.isthisfilesafe.com/company/Katayama%20Hirofumi%20MZ_details.aspx
過去に何かがあった時はきちんとそれを説明するページを残して置かないと
過去に何かがあった時はきちんとそれを説明するページを残して置かないと
2018/03/03(土) 16:20:23.25ID:cwR/oIIZ
>>536
https://www.virustotal.com/en/file/d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1/analysis/1408320159/
https://www.virustotal.com/en/file/d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1/analysis/1408925338/
Fake7Booting
http://peace.5ch.net/test/read.cgi/tech/1394156278/926
404Error
https://www.virustotal.com/en/file/d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1/analysis/1408320159/
https://www.virustotal.com/en/file/d4178884156e93779603fe5d33d3fc8f749fd2280a199b19d5d218bb8548b6b1/analysis/1408925338/
Fake7Booting
http://peace.5ch.net/test/read.cgi/tech/1394156278/926
404Error
2018/03/03(土) 22:11:33.47ID:V9+0Qzt3
The Wine development release 3.3 is now available.
What's new in this release (see below for details):
- Beginnings of Vulkan support.
- Direct3D multi-threaded command stream enabled by default.
- Multisample textures enabled by default.
- Support for game controllers through SDL.
- Support for loading CIL-only .Net binaries.
- Various bug fixes.
日本人っぽい名前が2つに増えているね
What's new in this release (see below for details):
- Beginnings of Vulkan support.
- Direct3D multi-threaded command stream enabled by default.
- Multisample textures enabled by default.
- Support for game controllers through SDL.
- Support for loading CIL-only .Net binaries.
- Various bug fixes.
日本人っぽい名前が2つに増えているね
540396
2018/03/04(日) 11:19:00.67ID:bPq1RsH0 Wine において HTML HELP (CHM) を表示時、リンク先へ飛べない場合の原因が分かって来ました。
https://qiita.com/Yutaka_Aoki/items/a83371ebf5c1e967a6f6
飛べる場合 : リンクに Java Script を使ってない。
飛べない場合 : リンクに Java Script を使っている。
Java Script の実行が上手く行ってないのではないでしょうか。どなたかにさらに原因を追求して
不具合を直していただければ幸です。
https://qiita.com/Yutaka_Aoki/items/a83371ebf5c1e967a6f6
飛べる場合 : リンクに Java Script を使ってない。
飛べない場合 : リンクに Java Script を使っている。
Java Script の実行が上手く行ってないのではないでしょうか。どなたかにさらに原因を追求して
不具合を直していただければ幸です。
541396
2018/03/04(日) 11:21:15.47ID:bPq1RsH0 なお体験から言えば、リンク先のHTMLのファイル名に日本語が使われている場合も、
リンク先へ飛べないことがあるようです。
リンク先へ飛べないことがあるようです。
2018/03/04(日) 20:03:48.28ID:GmjVYsG4
なるほど。CHMがセキュリティ的にまずい理由がなんとなくわかった
543396
2018/03/04(日) 21:46:39.04ID:bPq1RsH0 [HTML HELP (MSDN Library) 関連]
nativeなDLLの組み合わせを根気よく実験したところ、上手く行く組み合わせが見つかり、
飛べなかったリンクへも飛べるようになりました。詳しくは、上のリンク先を見てください。
nativeなDLLの組み合わせを根気よく実験したところ、上手く行く組み合わせが見つかり、
飛べなかったリンクへも飛べるようになりました。詳しくは、上のリンク先を見てください。
2018/03/09(金) 14:42:02.50ID:eOG+axBG
自分の環境(RTKernel)だとKindleを起動した時に
四角の枠だけ表示されて止まる
LowLatencyKernelだと正常に表示される
四角の枠だけ表示されて止まる
LowLatencyKernelだと正常に表示される
2018/03/17(土) 03:08:15.42ID:P07T+/HF
OSで設定したカーソルのサイズとWineアプリ上のカーソルのサイズが違うけど
自動で設定同期してほしいわ
自動で設定同期してほしいわ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】日本が4発大勝のチュニジア戦 日テレ中継33・2%、瞬間最高は37・0%★3 [ゴアマガラ★]
- 「〇国」と590万回も叩かれた岩屋毅議員が激白、ネットのデマに歪められる民主主義の危機に「保守政治家」が取るべき道 [少考さん★]
- 【MLB】大谷翔平に「なぜ第二子早すぎ批判」 根拠はWHOの出産間隔に関する勧告 [ネギうどん★]
- 【中傷動画】首相、秘書の陳述書提出意向 衆院予算委で業務に支障訴え [蚤の市★]
- 【サッカー】上田綺世マンU急浮上 2発で超名門が動く? ほかのプレミア勢すでに熱視線 [ゴアマガラ★]
- 「日本の若者は本当に貧乏なのか?」竹中平蔵が警鐘…日銀の利上げで始まる、若い世代を待ち受ける“さらに厳しい現実” [煮卵★]
- 【地上波/DAZNほか】 FIFAワールドカップ2026 総合スレ★142【メキシコ/カナダ/アメリカ】
- こいせん祝勝会 全レス転載禁止
- とらせん 月曜日
- わしせん3
- ハム専 気合い入れなくて良いよ、もう
- 〓たかせん〓 快勝
- 高市早苗のキメ顔ってスプーに似てるよね [809488867]
- 高市早苗首相の動静(21日) [432287167]
- 高市首相「私は土日も睡眠を取らずにしっかり仕事をしている😤」 [709039863]
- 日本企業さん、claude mythos超えの性能のAI開発に成功してしまうwwwwwwwwwwwwww [199590541]
- 高市総理「えー、中傷動画疑惑への対応で残念ながら首相としての業務時間が確保できなくなってます」 [256556981]
- 【悲報】大谷翔平、炎上が止まらないwwwwwwwwwwwwwwwwwwwwww [398059782]