[•\ަ : ‘S‚Ä ÅV50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.sc‚Ìread.cgi‚Ö]
Update time : 04/09 05:09 / Filesize : 284 KB / Number-of Response : 1051
[‚±‚̃XƒŒƒbƒh‚Ì‘‚«ž‚Ý‚ð휂·‚é]
[{” ŋߗ§‚Á‚½ƒXƒŒ•”M‚¢ƒXƒŒˆê—— : {” ŋߗ§‚Á‚½ƒXƒŒ^‹LŽÒ•ʈꗗ] [—ÞŽ—ƒXƒŒƒbƒhˆê——]


ªƒLƒƒƒbƒVƒ…ŒŸõA—ÞŽ—ƒXƒŒ“®ì‚ðC³‚µ‚Ü‚µ‚½A‚²–À˜f‚ð‚¨Š|‚¯‚µ‚Ü‚µ‚½

¡–é‚à Wine ‚ÅŠ£”t! - 21–{–Ú



1 –¼‘OFlogin:Penguin mailto:sage [2017/08/12(“y) 21:18:15.22 ID:tNr8ii2i.net]
Linuxã‚ÅWindows‚̃AƒvƒŠ‚ð“®ì‚³‚¹‚éƒ\ƒtƒgƒEƒFƒA
Wine‚ÉŠÖ‚·‚éî•ñŒðŠ·ƒXƒŒB

‘OƒXƒŒ
¡–é‚à Wine ‚ÅŠ£”t! - 20–{–Ú
https://mao.2ch.net/test/read.cgi/linux/1455088008/

Wine–{‰Æ
www.winehq.org/
wiki.winehq.org/

“®ì•ñWiki‚â‰ß‹ŽƒƒO‚È‚Ç
www.2chlinux.org/index.php?FrontPage

‚±‚±‚Ƀpƒbƒ`‚ð‚¤‚‚·‚邯‚«‚Ígzip‚âbzip2‚ň³k‚µ‚½ã‚Å
base64‚ȂǂŃGƒ“ƒR[ƒh‚µ‚Ä‚­‚¾‚³‚¢B‚¨‚È‚ª‚¢‚µ‚Ü‚·B
“®ì•ñ‚Í>>2‚̃eƒ“ƒvƒŒŽg—p‚ð„§B

409 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 17:12:51.37 ID:KjUUJ1nJ.net]
>>398
¡‰ñ‚ÉŠÖ‚µ‚Ä‚ÍAˆÈ‰º‚ð“Ç‚ñ‚ÅAgit ‚Å‚â‚Á‚Ă܂· :
https://wiki.winehq.org/Git_Wine_Tutoria

home directory (~) ‚É‚ÄA
$ git clone git://source.winehq.org/git/wine.git [ret]
‚Æ‚·‚邯Awine ƒfƒBƒŒƒNƒgƒŠ‚ªì¬‚³‚ê‚é‚Ì‚ÅA
$ cd wine
‚Æ‚µ‚Ü‚·B‚»‚±‚ÅA
$ git config remote.origin.url [ret]
‚Æ“ü‚ê‚Ä
git://source.winehq.org/git/wine.gi
‚Æo‚ê‚ÎA‘å‘

410 –¼‘OFÌ DL ¬Œ÷‚Å‚·B

~/wine/ ‚Ƀ\[ƒX‚ª DL ‚³‚ê‚Ä‚¨‚èAdlls ‚É Win32 ‚Ì DLL ŒQ‚ÌŽÀ‘•‚ª‚ ‚è‚Ü‚·B
—Ⴆ‚ÎAuser32 ‚Ȃǂ̃tƒHƒ‹ƒ_‚ª‚ ‚è‚Ü‚·B~/wine/server ‚É wine ‚Ì’†•‚Ì
ƒvƒƒOƒ‰ƒ€‚ª“ü‚Á‚Ä‚¢‚Ü‚·BCreateWindow ‚ȂǂÍAdlls ‚Ì•û‚É‚ ‚è‚Ü‚·‚ªA
‚»‚ê‚ð XWindowCreate ‚É‹´“n‚µ‚·‚é‚Ì‚ÍAserver ‚Ì•û‚Å‚·B

ƒIƒ“ƒ‰ƒCƒ“‚ÅŒ©‚½‚¢‚È‚çA
https://source.winehq.org/git/wine.git/tree/HEAD:/dlls/user32
‚Ì win.c ‚É CreateWindow Œn‚̃\[ƒX‚ª“ü‚Á‚Ä‚¨‚èA

https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/user32/win.c

‚ÅŒ©‚ç‚ê‚Ü‚·Bwin.c ‚̉E‚Ìurawv‚̃{ƒ^ƒ“‚ð‰Ÿ‚·‚ÆAƒ[ƒJƒ‹‚Ì Wz ƒGƒfƒBƒ^
‚È‚Ç‚Å‚àŒ©‚ç‚ê‚Ü‚·B
[]
[‚±‚±‰ó‚ê‚Ă܂·]

411 –¼‘OFlogin:Penguin [2018/02/17(“y) 17:16:25.31 ID:KjUUJ1nJ.net]
5ch ‚©‚ç‚̃AƒNƒZƒX‚͋֎~‚³‚ê‚Ä‚¢‚é‚炵‚¢‚Ì‚ÅAƒAƒhƒŒƒXƒo[‚Éã‹L‚Ì URL ‚ð
ƒRƒs[‚µ‚ăAƒNƒZƒX‚µ‚Ä‚­‚¾‚³‚¢B

‚È‚¨Amake ‚ª’x‚¢Œ‚ÍAmake -j 4 ‚ȂǂƂµ‚ÄAƒ}ƒ‹ƒ`ƒRƒA“®ì‚·‚邯‚¾‚¢‚Ô—Ç‚­‚È‚è‚Ü‚µ‚½B
‚½‚¾‚µA‚»‚Ìê‡Amake ‚ɃoƒO‚ª‚ ‚é‚̂Ÿ–§‚È_Œo‚ÌŽ‚¿Žå‚É‚ÍAƒXƒgƒŒƒX‚ª‚½‚Ü‚è‚Ü‚·B

412 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 17:19:14.92 ID:KjUUJ1nJ.net]
“®‚«‚ðƒgƒŒ[ƒX‚µ‚½‚¢ê‡ATRACE ‚̓fƒtƒHƒ‹ƒg‚ł̓ƒbƒZ[ƒW‚ªo‚¸AŽg‚¢•û‚𒲂ׂÄ
‚È‚¢‚Ì‚ÅA

FIXME( "Yamada Taro, CreateWindowEx, hWND=%08X", hWND );

‚Ý‚½‚¢‚É‚â‚Á‚Ă܂·B

413 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 17:23:11.12 ID:KjUUJ1nJ.net]
make‚µ‚½‚¢l‚ÍA~/wine ‚É‚ÄA

$ ./confiugre
$ make -j 4 2>build.log
$ make -j 4 install 2>inst.log
$ wineserver -k

‚Ås‚¯‚Ü‚·B‚±‚±‚ÅAwz ƒGƒfƒBƒ^‚ð‹N“®‚µ‚Ă݂܂·B•¶Žš‰»‚¯‚·‚邿‚¤‚Å‚µ‚½‚çA

$ apt-get remove wine
$ apt-get install wine

‚Å’¼‚邯Žv‚¢‚Ü‚·B‚±‚ê‚ÍAˆê“x‚â‚ê‚Î Ok ‚̂悤‚Å‚·B

414 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 17:40:09.90 ID:KjUUJ1nJ.net]
@call set_window_pos()
--> wine/dlls/user32/winpos.c
--> X11DRV_WindowPosChanging()
--> X11DRV_create_win_data()
--> dlls/winex11.drv/window.c :
@@static void create_whole_window( struct x11drv_win_data *data )
--->
data->whole_window = XCreateWindow(
@@@@@@@data->display, root_window, pos.x, pos.y,
@@@@@@@cx, cy, 0, data->vis.depth, InputOutput,
@@@@@@@data->vis.visual, mask, &attr );

‚Æ‚¢‚¤—¬‚ê‚̂悤‚Å‚·B

415 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 17:41:22.28 ID:KjUUJ1nJ.net]
ˆÈ‰º‚ðŒ©‚é‚ÆAe‚ªADesktopWindow ‚ÌŽž‚Ì‚ÝAcreate_whole_window() ‚ªŒÄ‚Ño‚³‚ê‚Ä‚¢‚é
‚炵‚¢‚±‚Æ‚ª•ª‚©‚è‚Ü‚·B

static struct x11drv_win_data *X11DRV_create_win_data( HWND hwnd, const RECT *window_rect,
@@@@@@@@@@@@@@@@@@@@@@@@@@@ const RECT *client_rect ) {
@@Display *display;
@@struct x11drv_win_data *data;
@@HWND parent;
@@if (!(parent = GetAncestor( hwnd, GA_PARENT ))) return NULL;@/* desktop */
@@/* don't create win data for HWND_MESSAGE windows */
@@if (parent != GetDesktopWindow() && !GetAncestor( parent, GA_PARENT )) return NULL;
@@if (GetWindowThreadProcessId( hwnd, NULL ) != GetCurrentThreadId()) return NULL;
@@display = thread_init_display();
@@init_clip_window();@/* make sure the clip window is initialized in this thread */
@@if (!(data = alloc_win_data( display, hwnd ))) return NULL;
@@data->whole_rect = data->window_rect = *window_rect;
@@data->client_rect = *client_rect;
@@if (parent == GetDesktopWindow()){
@@@@create_whole_window( data );
@@@@TRACE( "win %p/%lx window %s whole %s client %s\n",
@@@@@@@ hwnd, data->whole_window, wine_dbgstr_rect( &data->window_rect ),
@@@@@@@ wine_dbgstr_rect( &data->whole_rect ), wine_dbgstr_rect( &data->client_rect ));
@@}
@@return data;
}

416 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 17:42:23.86 ID:KjUUJ1nJ.net]
>>403 ‚Ì’ù³F

CreateWindowExW()
--->
WIN_CreateWindowEx()
@call set_window_pos()
--> wine/dlls/user32/winpos.c
--> X11DRV_WindowPosChanging()
--> X11DRV_create_win_data()
--> dlls/winex11.drv/window.c :
@@static void create_whole_window( struct x11drv_win_data *data )
--->
data->whole_window = XCreateWindow(
@@@@@@@data->display, root_window, pos.x, pos.y,
@@@@@@@cx, cy, 0, data->vis.depth, InputOutput,
@@@@@@@data->vis.visual, mask, &attr );

417 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 18:08:08.76 ID:KjUUJ1nJ.net]
‚¿‚Ȃ݂ÉA
1. ~/.wine
2. ~/wine

‚͕ʕ¨‚Å‚·B1‚ÍAbinary ‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚½Û‚Éo—ˆ‚éƒfƒtƒHƒ‹ƒg‚̃tƒHƒ‹ƒ_
‚Å‚·‚æ‚ËB2. ‚ÍAgit ‚©‚çƒ\[ƒX‚ðŽ‚Á‚Ä‚«‚½Žž‚ɂł«‚éƒfƒBƒŒƒNƒgƒŠ‚Å‚·B

‚Ü‚¸‚ÍAƒoƒCƒiƒŠ‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚Ä“®ì‚µ‚Ä‚©‚çAƒ\[ƒX‚ðŽ‚Á‚Ä‚«‚Ä‚­‚¾‚³‚¢B



418 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 18:27:32.24 ID:1JDlaACg.net]
”¼“§–¾‰»‚ÍWin32API‘¤‚łǂ¤‚â‚Á‚Ä‚¢‚é‚Ì? LinuxƒlƒCƒeƒBƒu‚ȃAƒvƒŠ‚Å‚Í?

SetLayeredWindowAttributes‚Å‚ ‚ê‚ÎAuser32.dll‚©‚çUSER_Driver‚ð‰î‚µ‚Äwinex11.drv‚ªŒÄ‚΂ê‚ÄA
window.c“à‚Ìsync_window_opacity‚Å_NET_WM_WINDOW_OPACITY‚Ƀ¿’l‚ðݒ肵‚Ä‚¢‚é—lŽq‚ªŒ©‚ÄŽæ‚ê‚é
ttps://github.com/wine-mirror/wine/blob/wine-3.2/dlls/winex11.drv/window.c#L435

TRACE‚Å•\ަ‚µ‚Ä‚¢‚郃bƒZ[ƒW‚ðŠm”F‚·‚é‚ɂ͊‹«•Ï”WINEDEBUG‚ðŽg‚Á‚ÄA
WINEDEBUG=win,x11 ‚Ý‚½‚¢‚ɃJƒ“ƒ}‹æØ‚è‚ÅŽw’è‚·‚éBׂ©‚­‚Í
ttps://wiki.winehq.org/Wine_Developer%27s_Guide/Debug_Logging ‚É‘‚¢‚Ä‚ ‚éB

‚ ‚Æ‚ÍAdlls”z‰º‚ÌŠeƒfƒBƒŒƒNƒgƒŠ‚Å‚àmake && sudo make instlall‚Å‚«‚é‚Ì‚Å
“Á’è‚ÌDLLƒtƒ@ƒCƒ‹‚µ‚©•ÏX‚µ‚È‚¢‚̂ł ‚ê‚ÎA‚±‚Ì•û–@‚Ńrƒ‹ƒhŽžŠÔ‚ð’Zk‚Å‚«‚邼B

419 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 18:42:48.23 ID:cvAP0C15.net]
ƒfƒoƒbƒO‘å•Ï‚¾‚ÈB‚ß‚ñ‚Ç‚­‚³‚»‚¤B
ŽdŽ–‚¶‚á‚È‚¢‚Ɖ´‚Í‚â‚ç‚È‚¢‚¾‚낤‚ÈB

420 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 19:41:54.60 ID:J9G7l4mf.net]
Ž©•ª‚Íimm32ŠÖ˜A(“ú–{Œê“ü—Í)API‚ðC³‚µ‚悤‚Æeclipce‚ŃRƒ“ƒpƒCƒ‹ŠÂ‹«ì‚Á‚½‚Í‚¢‚¢‚¯‚Ç
ƒlƒCƒeƒBƒu‚̃EƒBƒ“ƒhƒEƒ}ƒl[ƒWƒƒŠÖ˜A‚Ì’mޝ•s‘«‚Ń\[ƒX‚̈Ӗ¡‚ª‚í‚©‚炸Q‚©‚¹‚Ä‚ ‚éEEE

421 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 19:54:02.08 ID:Tf7u8zkg.net]
>>407
Linux NativeƒAƒvƒŠ‚Ìê‡A32BIT COLOR ‚É‚·‚邯AA,R,G,B ‚Ì 4‚‚̒l‚ð
ƒhƒbƒg‚ÌuFv‚Æ‚µ‚ÄŽw’è‚Å‚«‚Ü‚·BA‚ªƒ¿’l‚Å‚·B‚±‚̂悤‚È‚±‚Æ‚ÍAWindows
‚Å‚Ío—ˆ‚È‚¢‚ÆŽv‚¢‚Ü‚·BWindows‚Ìê‡ACreateWindowEx‚ÌdwExStyle ‚É
WS_EX_LAYERED‚ðŽw’è‚·‚邯“§–¾A”¼“§–¾‚ªˆµ‚¦‚邿‚¤‚ɂȂè‚Ü‚·B

1.Š®‘S‚Éu“§–¾‚ɂȂéFv‚ð24BIT’l‚Å1FŽw’è‚Å‚«‚Ü‚·B‚±‚ÌF‚Å•`‚¢‚½ƒhƒbƒg‚ÍA
@ƒfƒXƒNƒgƒbƒv‚܂œ§‚¯‚ÄŒ©‚¦‚邿‚¤‚ɂȂè‚Ü‚·BŒ©‚½–Ú‚¾‚¯‚ł͂Ȃ­AWindowƒƒb
@ƒZ[ƒW‚à‰º‚ÌWindow‚É“`’B‚³‚ê‚Ä‚µ‚Ü‚¤‚±‚ƂɂȂè‚Ü‚·‚ªB

2.ƒhƒbƒg‚²‚Ƃł͂Ȃ­AWindow‘S‘̂̃¿’l‚ð1‚Â(1BYTE)‚¾‚¯Žw’è‚Å‚«‚Ü‚·B
@ƒhƒbƒg‚²‚Ƃł͖³‚¢‚Ì‚ÅA‘S‘Ì“I‚É“§–¾“x‚ªŒˆ‚Ü‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·B

1‚Æ2‚ÍŠ®‘S‚ɕʂ̊T”O‚Å‚·B


Linux‚ÌARGB’l‚ÍAƒhƒbƒg–ˆ‚ÉŽw’è‚Å‚«‚é‚Ì‚ÅAWindows‚Ì‹@”\‚ð•ïŠÜ‚µ‚Ä‚¢‚邯
Œ¾‚¦‚Ü‚·B‹t‚É Windows‚Å‚ÍA“¯‚¶Ž–‚Ío—ˆ‚È‚¢‚Í‚¸‚Å‚·B

422 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 19:57:46.46 ID:Tf7u8zkg.net]
/wine/dlls/winex11.drv/x11drv.h
‚ÉŽŸ‚̂悤‚È\‘¢‘Ì‚ª‚ ‚èA‚±‚Ì whole_window ‚Æ‚¢‚¤‚Ì‚ª‘厖‚炵‚¢F
/* x11drv private window data */
struct x11drv_win_data {
Display *display; /* display connection for the thread owning the window */
XVisualInfo vis; /* X visual used by this window */
Colormap colormap; /* colormap if non-default visual */
HWND hwnd; /* hwnd that this private data belongs to */
Window whole_window; /* X window for the complete window */
Window client_window; /* X window for the client area */
RECT window_rect; /* USER window rectangle relative to parent */
RECT whole_rect; /* X window rectangle for the whole window relative to parent */
RECT client_rect; /* client area relative to parent */
XIC xic; /* X input context */
BOOL managed : 1; /* is window managed? */
BOOL mapped : 1; /* is window mapped? (in either normal or iconic state) */
BOOL iconic : 1; /* is window in

423 –¼‘OFiconic state? */
BOOL embedded : 1; /* is window an XEMBED client? */
BOOL shaped : 1; /* is window using a custom region shape? */
BOOL layered : 1; /* is window layered and with valid attributes? */
BOOL use_alpha : 1; /* does window use an alpha channel? */
int wm_state; /* current value of the WM_STATE property */
DWORD net_wm_state; /* bit mask of active x11drv_net_wm_state values */
Window embedder; /* window id of embedder */
unsigned long configure_serial; /* serial number of last configure request */
struct window_surface *surface;
Pixmap icon_pixmap;
Pixmap icon_mask;
unsigned long *icon_bits;
unsigned int icon_size;
};
[]
[‚±‚±‰ó‚ê‚Ă܂·]

424 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 20:00:42.49 ID:Tf7u8zkg.net]
>>407
Œã”¼‚Ì“ñ‚ÂBŽ©•ª‚ÉŽæ‚Á‚Ä‚ÍA‚©‚È‚è‹Md‚Èî•ñ‚Å‚·B•‚©‚è‚Ü‚·B

425 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 20:11:22.91 ID:Tf7u8zkg.net]
>>407
XWindow ‚Å“§–¾‰»B‚±‚ê‚Í‚â‚Á‚Ă݂ĎÀÛ‚Éo—ˆ‚Ü‚µ‚½F
https://stackoverflow.com/questions/39906128/
how-to-create-semi-transparent-white-window-in-xlib

ŽqƒEƒBƒ“ƒhƒE‚ð“ü‚ê‚Ă݂ĂàA‚¿‚á‚ñ‚Æo—ˆ‚Ü‚µ‚½B

‚½‚¾‚µAŽqƒEƒBƒ“ƒhƒE‚É‚ÍAWin32‚̂悤‚ÈAƒ^ƒCƒgƒ‹ƒo[‚Í•t‚«‚«‚Ü‚¹‚ñ‚Å‚µ‚½B
XWindow ‚ÉÚ‚µ‚¢l‚É‚æ‚ê‚ÎAXWindow ‚Ì Window Manager ‚ÍA
Win32 ‚Ì MDI ‚̂悤‚ÈŽ–‚ÍAƒTƒ|[ƒg‚µ‚Ä‚¢‚È‚¢‚炵‚¢‚Å‚·Bâ‘΂©
‚Ç‚¤‚©‚Í•ª‚©‚è‚Ü‚¹‚ñ‚ªB

ŽÀŒ±‚µ‚Ä‚Ý‚é‚ÆAŽqƒEƒBƒ“ƒhƒE‚àAeƒEƒBƒ“ƒhƒE‚àAABI ‚ÅAXMoveWindow
‚ŃXƒ€[ƒY‚É“®‚©‚¹‚Ü‚µ‚½B

‚½‚¾‚µAWine‚Ìê‡AŽqƒEƒBƒ“ƒhƒE‚É’¼ü‚â•¶Žš‚ª‘‚©‚ê‚Ä‚¢‚ÄA‚©‚ÂA”wŒi‚ª“§–¾‚Èê‡A
ƒXƒ€[ƒY‚ɂ͓®‚©‚¹‚Ü‚¹‚ñB

426 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 21:31:43.98 ID:cvAP0C15.net]
Win32API‚¾‚¯‚¶‚á‚È‚­AX Window‚ɂ‚¢‚Ä‚à’m‚Á‚Ä‚¨‚©‚È‚¢‚Æ‚¢‚¯‚È‚¢‚Ì‚©
–Ê“|L‚ÁEEE

•’iŽg‚Á‚Ă邾‚¯‚Å‚¸‚¢‚Ô‚ñŠy‚µ‚Ä‚½‚ñ‚¾‚ÈB

427 –¼‘OFlogin:Penguin mailto:sage [2018/02/17(“y) 22:08:41.04 ID:eqmjcJnH.net]
–Ê”’‚»‚¤‚¾‚¯‚ÇŽžŠÔ‚Ë‚¦‚Ècc
>>411‚ðŒ©‚éŒÀ‚肾‚Æuse_alpha‚ÍŽ‚Á‚Ă邯‚ÇAlpha’lŽ©‘Ì‚Í‚à‚¤X11‚Ì\‘¢‘̂ɂ¢‚ê‚Ä‚é‚Ì‚©‚ÈH
‚Ü‚ ’x‚­‚Ȃ闗R‚Æ‚©ŒŸ“¢‚‚©‚ñ‚¯‚Çcc



428 –¼‘OF396 mailto:sage [2018/02/18(“ú) 01:13:22.20 ID:DznsC7ZZ.net]
WINE‚É‚¨‚¢‚ÄA

1. MDI‚ÌCMDIChildWnd‚ÌCView‚ÌCLIENT—̈æ‘S‘Ì(ŽqƒEƒBƒ“ƒhƒE‚Ì
@ ’†‘S‘̂ƌ¾‚Á‚Ä‚à‚æ‚¢) ‚É >>410‚Ì1.‚ÌF‚ð“h‚Á‚ÄAŠ®‘S“§–¾
@ ‚É‚µ‚Ä‚¢‚鎞‚ÍACMDIChildWnd‚̃^ƒCƒgƒ‹ƒo[(ŽqƒEƒBƒ“ƒhƒE‚Ì
@ ƒ^ƒCƒgƒ‹ƒo[j‚ðƒhƒ‰ƒbƒO‚µ‚Ä‚à‚‘¬‚É“®‚©‚¹‚éB

2. 1‚ÌCView‚Ì’†‚ÉApDC->LineTo()‚Å’¼ü‚ðˆê–{•`‚¢‚½ó‘Ô‚É‚µ‚Ä‚©‚ç
@ “¯‚¶Ž–‚ð‚µ‚æ‚¤‚Æ‚·‚邯A‚ƂĂà’x‚­‚È‚éB

3. 2.‚ÍA’¼ü‚Ì‘ã‚í‚è‚É pDC->TextOut() ‚Å•¶Žš‚ð•`‚¢‚Ä‚à“¯—l‚É’x‚­
@ ‚È‚éB

4. „’è‚Å‚ÍAWine‚ÍAWin32‚ÌCreateWindowŒn‚ÅAParent Window ‚ª
@ Desktop ˆÈŠO‚Ìê‡AXWindow ‚Ì Window ‚ðŽg‚킸AŽ©‘O‚Å
@ Parent Window ‚Ì’†‚ɉ摜‚ð‡¬‚µ‚ÄŽqWindow‚ð–͕킵‚Ä‚¢‚éB

5. 4.‚Ì—l‚É‚µ‚Ä‚¢‚é——R‚ÍA„’肾‚Æ Window Manager ‚ÌŽí—Þ‚É‚æ‚é
@ ‹““®‚̈Ⴂ‚ÉŠ³‚킳‚ꂸ‚ɈÀ’肵‚Ä Emulation ‚·‚邽‚ß‚©‚à’m‚ê
@ ‚È‚¢B

6. ‚»‚ÌŒ‹‰ÊAXWindow ‚Ì ARGB ’l‚É‚æ‚é‚‘¬‚È“§–¾ˆ—‚ð—˜—p‚Å‚«‚È
@ ‚­‚È‚èA’ᑬ‚ɂȂéB

7. ‚µ‚©‚µA‚È‚é‚ׂ­’ᑬ‚ɂȂç‚È‚¢‚悤‚É‚·‚邽‚ßA­‚È‚­‚Æ‚àA
@ ŽqƒEƒBƒ“ƒhƒE‚Ì’†‘S‘Ì‚ªŠ®‘S“§–¾‚Èꇂɂ‚¢‚Ä‚ÍA‘Îô‚ªŽæ‚ç
@ ‚ê‚Ä‚¨‚èA‚‘¬‚Ƀhƒ‰ƒbƒO‚Å‚«‚邿‚¤‚ɂȂÁ‚Ä‚¢‚éB

8. ‚»‚ÌŒ‹‰ÊA2, 3 ‚̂悤‚ÈðŒ‚ÌŽž‚̂ݒx‚­‚È‚é‚Æ„’肳‚ê‚éB

429 –¼‘OFlogin:Penguin mailto:sage [2018/02/18(“ú) 01:24:45.49 ID:smHwezpH.net]
„’è‚¶‚á‚È‚­‚Ä’¼Ú•·‚¢‚½‚çH

430 –¼‘OFlogin:Penguin [2018/02/18(“ú) 01:56:23.18 ID:HH6qVqdM.net]
>>417
‚Ç‚¤‚â‚Á‚ÄH

431 –¼‘OF406 mailto:sage [2018/02/18(“ú) 02:29:31.78 ID:dARugMLm.net]
>>416
‚·‚Ü‚ñAƒEƒBƒ“ƒhƒE‚Ì”¼“§–¾‰»ˆ—(LWA_ALPHA)‚ÆŠ¨ˆá‚¢‚µ‚Ä‚½B
ƒEƒBƒ“ƒhƒE—̈æ“à‚Ì“Á’èF‚Å‘‚¢‚½‰ÓŠ‚ð“§‰ß‚³‚¹‚éê‡(LWA_COLORKEY)‚ËB

ƒ\[ƒX‚𒲂ׂ½‚çAWine‚Å‚ÍX11‚ÌShape Extension‚ðŽg‚Á‚ăEƒBƒ“ƒhƒE‚ÌŒ`ó‚ð•ÏX‚·‚邱‚Æ‚ÅA
uŒ©‚½–Ú‚¾‚¯‚ł͂Ȃ­AWindowƒƒbƒZ[ƒW‚à‰º‚ÌWindow‚É“`’B‚·‚邱‚Æv‚ðŽÀŒ»‚µ‚Ä‚¢‚邿‚¤‚¾B

‹ï‘Ì“I‚É‚Íupdate_surface_region()‚Å1ƒsƒNƒZƒ‹‚²‚ƂɃsƒNƒZƒ‹’l‚ð”äŠr‚µ‚ÄA
XShapeCombineRectangles‚ÉŽw’è‚·‚é‹éŒ`—̈æ‚ðì‚Á‚Ä‚¢‚éB
ttps://github.com/wine-mirror/wine/blob/2936f3f9bb9dc01c595498a821d6adb6775b62cc/dlls/winex11.drv/bitblt.c#L1616

415‚Ì2.,3.‚ÌðŒ‚¾‚Æ’x‚­‚È‚é‚Æ‚·‚邯AƒsƒNƒZƒ‹’l‚ð”äŠr‚·‚鈗‚Í1.‚Æ“¯‚¶‚Ȃ̂ÅA
‹éŒ`‚ª‘å—ʂɂȂÁ‚½‚Æ‚«‚ÉAX‘¤‚Å•`‰æ«”\‚ª’ቺ‚·‚é‚̂ł͂Ȃ¢‚©‚ÆŽv‚¤‚¼B

StackOverflow‚Ì‹LŽ–‚ÍShape Extension‚ðŽg‚Á‚Ä‚¢‚È‚¢‚̂ŋ؈Ⴂ‚¾B

432 –¼‘OFlogin:Penguin mailto:sage [2018/02/18(“ú) 04:20:47.62 ID:HH6qVqdM.net]
>>419
‚È‚é‚Ù‚ÇB

1‚ÂŽ¿–â‚Å‚·B

‚Í‚Á‚«‚è‚Æ‚Í‘‚¢‚ĂȂ©‚Á‚½‚̂ł·‚ªA>>416‚Ì’x‚­‚È‚éðŒ‚Å‚ ‚邯‚±‚ë‚Ì 2,3 ‚Ìê‡
‚É‚¨‚¢‚Ä‚àACMainFrameA‚‚܂èAƒAƒvƒŠƒP[ƒVƒ‡ƒ“‘S‘Ì‚Ì Main ‚Ì Window ‚̃^ƒCƒgƒ‹ƒo[‚ð
ƒhƒ‰ƒbƒO‚µ‚½ê‡‚ÍA’x‚­‚È‚è‚Ü‚¹‚ñB‚¢‚½‚Á‚Ä‚‘¬‚Ƀhƒ‰ƒbƒO‚Å‚«‚Ü‚·B

>>419 ‚ª³‚µ‚¢‚È‚çA‚Ç‚¤‚µ‚ÄAX ‚ÍA‚±‚Ìꇂ¾‚¯‚Í‘¬‚­ACMDIChildWnd ‚Ìꇂ¾‚¯‚Í
’x‚­“®ì‚·‚é‚̂łµ‚傤‚©HHH

433 –¼‘OFlogin:Penguin mailto:sage [2018/02/18(“ú) 04:57:21.33 ID:HH6qVqdM.net]
«‚Ì\‘¢‘Ì‚Ì dc_rect ‚Ì‹éŒ`‚ªŽqƒEƒBƒ“ƒhƒE‚ð–͕킷‚邽‚߂Ɏg‚í‚ê‚Ä‚¢‚é‚©‚à’m‚ê‚Ü‚¹‚ñF
/* X physical device */
typedef struct {
@@struct gdi_physdev dev;
@@GC@@@@@@gc;@@@@@/* X Window GC */
@@Drawable@@@drawable;
@@RECT@@@@@dc_rect;@@@ /* DC rectangle relative to drawable */
@@RECT@@@@ *bounds;@@@@/* Graphics bounds */
@@HRGN@@@@@region;@@@@/* Device region (visible region & clip region) */
@@X_PHYSPEN@@ pen;
@@X_PHYSBRUSH@ brush;
@@int@@@@@ depth;@@@ /* bit depth of the DC */
@@ColorShifts@*color_shifts; /* color shifts of the DC */
@@int@@@@@ exposures;@ /* count of graphics exposures operations */
} X11DRV_PDEVICE;

BOOL X11DRV_LineTo( PHYSDEV dev, INT x, INT y ) {
@@X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
@@POINT pt[2];
@@GetCurrentPositionEx( dev->hdc, &pt[0] );
@@pt[1].x = x;
@@pt[1].y = y;
@@LPtoDP( dev->hdc, pt, 2 );
@@add_pen_device_bounds( physDev, pt, 2 );
@@if (X11DRV_SetupGCForPen( physDev ))
@@@@XDrawLine(gdi_display, physDev->drawable, physDev->gc,
@@@@@@@@@physDev->dc_rect.left + pt[0].x, physDev->dc_rect.top + pt[0].y,
@@@@@@@@@physDev->dc_rect.left + pt[1].x, physDev->dc_rect.top + pt[1].y );
@@return TRUE;
}

434 –¼‘OFlogin:Penguin mailto:sage [2018/02/18(“ú) 05:32:50.78 ID:HH6qVqdM.net]
/wine/dlls/user32/painting.c ‚Ì’†‚ÌA
// Set the visible region and X11 drawable for the DC associated to a given window.
static void update_visible_region( struct dce *dce )
‚Ì’†‚ÉA
USER_Driver->pGetDC( dce->hdc, dce->hwnd, top_win, &win_rect, &top_rect, flags );
‚Æ‚ ‚Á‚ÄA
void CDECL X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect,
const RECT *top_rect, DWORD flags )
‚ªŒÄ‚Ño‚³‚ê‚éBˆø”‚É hwnd ‚Æ topAwin_rect ‚Æ top_rect ‚ª‘΂ɂȂÁ‚Ä‚¢‚é‚炵‚¢‚±‚ƂɒˆÓB

‚±‚ÌŠÖ”‚Ì’†‚ÅAx11drv_escape_set_drawable escape; ‚Ì
escape.dc_rect ‚ÉAwin_rect ‚Ì top_rect ‚Ì (left, top) ‚©‚ç‚Ì‘Š‘ÎÀ•W‚ª“ü‚ê‚ç‚ê‚éB

‚»‚µ‚ÄAExtEscape( hdc, X11DRV_ESCA

435 –¼‘OFPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
‚Æ ExtEscape() ‚ªŒÄ‚Ño‚³‚ê‚éB

escape = X11DRV_ESCAPE;
escape.code = X11DRV_SET_DRAWABLE;
in_data = &escape;
‚Ìó‘Ô‚ÅA

X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
const struct x11drv_escape_set_drawable *data = in_data;
physDev->dc_rect = data->dc_rect;
‚ƂȂéBphysDev->dc_rect ‚ªA>>421 ‚Ì dc_rect ‚É‘¼‚È‚ç‚È‚¢B

‚‚܂èAHWND hwnd‚Ìwin_rect‚ÌAHWND top‚̶ãÀ•W‚©‚ç‚Ì‘Š‘ÎÀ•W‚ªA
physDev->dc_rect ‚É“ü‚邱‚Æ‚É‚È‚é‚ÆŽv‚í‚ê‚éBhwnd‚ÌuÅãˆÊ‚Ìev‚ª
top‚¾‚Æ‚·‚邯Atop‚¾‚¯‚ª XCreateWindow()‚³‚ꂽ–{•¨‚ÌWindow‚Å‚ ‚Á‚ÄA
hwnd ‚Í ‹[Ž—Window‚Å‚ ‚邯‚µ‚Ä’Òå낪‡‚¤Bhwnd‚Ö‚Ì•`‰æ‚ÍA
ŽÀ‚ÍÀ•W‚¾‚¯‚ðC³‚µ‚Ä top ‚Ì(–{•¨‚Ì X )Window ‚É‘‚«ž‚Ü‚ê‚Ä‚¢‚邾‚¯
‚©‚à’m‚ê‚È‚¢B
[]
[‚±‚±‰ó‚ê‚Ă܂·]

436 –¼‘OFlogin:Penguin [2018/02/18(“ú) 12:58:43.05 ID:HH6qVqdM.net]
Œ‹˜_“I‚É‚ÍAWine ‚Å‚ÍAŠ®‘S“§–¾F‚ªÝ’肳‚ê‚Ä‚¢‚é‘S‚Ä‚Ì LAYERED_WINDOW ‚É
‘΂µ‚ÄAIdleó‘Ô‚ÌŽž‚©A‚Ü‚½‚ÍA50(ms) –ˆ‚ÉAWindowƒAƒvƒŠ‚̃ƒbƒZ[ƒWƒ‹[ƒv
‚Ì’†‚©‚玩“®“I‚ÉA>>419 ‚Ì update_surface_region() ‚ªŒÄ‚Ño‚³‚ê‚邿‚¤‚ɂȂÁ
‚Ä‚¢‚é‚炵‚¢‚Å‚·B‚±‚ÌðŒ‚ÌWindow‚ª‚ ‚Á‚ÄA‚©‚ÂAupdate_surface_region() ‚Ì
ˆ—‚ªd‚¢ê‡‚ÉA“®ì‚ª’x‚­‚È‚é‰Â”\«‚ª‚‚¢‚Å‚·BDirty Bit‚̂悤‚È‚à‚Ì‚ÍA
¡‚̂Ƃ±‚댩‚‚©‚Á‚Ä‚¢‚Ü‚¹‚ñ‚Ì‚ÅA‰½‚à‚µ‚È‚­‚Ä‚àí‚Éd‚­‚È‚é‚̂łµ‚傤‚©B

yÚ×z
flush_window_surfaces() ‚È‚éŠÖ”‚ªA’èŠú“I‚ɌĂÑo‚³‚ê‚éB
“TŒ^“I‚ȃ^ƒCƒ~ƒ“ƒO‚ÍAPeekMessage() ‚Ì’†‚©‚ç‚Å‚ ‚èAGetMessage()‚Å‚ÍA
check_for_driver_events() ‚ð‰î‚µ‚ČĂÑo‚³‚ê‚éB
flush_window_surfaces() ‚Ì’†‚ÉŽŸ‚̂悤‚ȃ}ƒNƒŒÄ‚Ño‚µ‚ª‚ ‚é :
LIST_FOR_EACH_ENTRY( surface, &window_surfaces, struct window_surface, entry )
surface->funcs->flush( surface );
‚±‚±‚ÅA
/* iterate through the list using a list entry */
#define LIST_FOR_EACH_ENTRY(elem, list, type, field) \
for ((elem) = LIST_ENTRY((list)->next, type, field); \
&(elem)->field != (list); \
(elem) = LIST_ENTRY((elem)->field.next, type, field))
‚Å‚ ‚èAã‹L‚ÍAwindow_surfaces ƒŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚é‘S‚Ä‚Ì
window_surface *surface ‚ɂ‚¢‚ÄAwindow_surface_funcs *funcs ‚Ì
ŠÖ”ƒ|ƒCƒ“ƒ^ flush ‚ÌŠÖ”‚ðŒÄ‚Ño‚·‚±‚ƂɂȂèAŒ‹‹ÇA
ŠÖ” x11drv_surface_flush() ‚ªŒÄ‚Ño‚³‚ê‚邱‚ƂɂȂéB

ŠÖ” x11drv_surface_flush() ‚Ì’†‚É
if (surface->is_argb || surface->color_key != CLR_INVALID) update_surface_region( surface );
‚Æ‚ ‚éBupdate_surface_region() ‚ÍA>>419 ‚É‘‚©‚ê‚Ä‚¢‚éŠÖ”B

437 –¼‘OF396=422 mailto:sage [2018/02/18(“ú) 13:53:01.38 ID:HH6qVqdM.net]
ŠY“–‚ÌðŒ‚ÌŽžAV‚½‚ɂ͉½‚Ì•`‰æ‚à‚µ‚Ä‚¢‚È‚¢ÃŽ~ó‘Ô‚Å‚àALinux‚̃VƒXƒeƒ€Eƒ‚ƒjƒ^[‚Å
CPUƒpƒ[‚ª–c‘å‚ÉÁ”‚ê‚Ä‚¢‚邱‚Æ‚ðŠm”F‚µ‚Ü‚µ‚½B‚±‚Ì‚±‚Æ‚ÍA>>423 ‚ð— •t‚¯‚镨‚Å‚·B
‚¾‚Æ‚·‚邯ADirty Bit ‚𓱓ü‚µ‚ÄAupdate_surface_region()‚Ì•p“x‚ð‰º‚°‚ê‚ÎA‚±‚̒ᑬ‰»
‚ÍC³‚Å‚«‚é‰Â”\«‚ªo‚Ä‚«‚Ü‚µ‚½BLineTo, TextOut, MoveWindow, SetWindowPos,
ShowWindow ‚ȂǂðŽg‚Á‚½‚Æ‚«‚¾‚¯ADirtyBit ‚ð 1‚É‚µ‚ÄA1‚ÌŽž‚¾‚¯ update_surface_region()
‚ðŒÄ‚Ño‚µAŒÄ‚Ño‚µ‚½Œã‚É‚Í 0 ‚É‚·‚ê‚Ηǂ¢‚̂ł͂Ȃ¢‚©‚Æ‚¢‚¤‚±‚Ƃł·B

ðŒ‚ÍF

1. WINE‚ðŽg—p‚µ‚Ä WindowsƒAƒvƒŠ‚𑖂点‚Ä‚¢‚邱‚ÆB
2. ƒAƒvƒŠ“à‚Å CreateWindowEx() ‚ÌdwExStyle ‚É WS_EX_LAYERED ‚ðŽw’肵‚Ä Window‚ðì¬
@ ς݂ł ‚邱‚ÆB
3. ‚³‚ç‚ÉASetLayeredWindowAttribute() ‚É LWA_COLORKEY ‚ðŽw’肵‚ÄuŠ®‘S“§–¾Fv‚ð
@ Žw’肵‚Ä‚¢‚邱‚ÆB
4. ‚»‚Ì Window ‚Ì”wŒi‚ðuŠ®‘S“§–¾Fv‚ÅÁ‹Ž‚µ‚Ä‚¢‚邱‚ÆB
5. ‚»‚Ì Window “à•”‚É’ÊíF‚ÅALineTo() ‚â TextOut() ‚É‚æ‚Á‚Ä}Œ`‚â•¶Žš‚ð
@ •`‚¢‚½Œã‚Å‚ ‚邱‚ÆB

‚Å‚·B

MDI‚ðŽg‚Á‚Ä‚¢‚鎖‚âACMDIChildWnd “®‚©‚·‚©‚Ç‚¤‚©‚ÍŠÖŒW‚È‚¢—l‚Å‚·B

CMainFrame ‚ðƒhƒ‰ƒbƒO‚µ‚½Žž‚ɂ͒x‚­Š´‚¶‚È‚¢‚Ì‚ÍA‚»‚Ì“®ì‚ɂ‚¢‚Ă̓VƒXƒeƒ€‚ª CPU
‚Ì—D懈ʂðã‚°‚Ä‚¢‚é‚©‚炳͂Ȃ¢‚©‚ÆŽv‚¢‚Ü‚·B



438 –¼‘OF396 mailto:sage [2018/02/18(“ú) 14:19:00.83 ID:HH6qVqdM.net]
>>419 ‚³‚ñ‚ÌŽw“E‚ͦ‚­–ð—§‚¿‚Ü‚µ‚½B—L“‚²‚´‚¢‚Ü‚·B

‚½‚¾‚µA‚±‚Á‚¿‚Ì’²¸•s‘«‚Ì‚¹‚¢‚ª‘å‚«‚¢‚̂łµ‚傤‚ªAˆÈ‰º‚Ì•”•ª‚ÍA¡‰ñ‚Ì
Œ‹‰Ê‚Ƃ͈á‚Á‚Ä‚¢‚½‚悤‚Å‚·F
>416‚Ì2.,3.‚ÌðŒ‚¾‚Æ’x‚­‚È‚é‚Æ‚·‚邯AƒsƒNƒZƒ‹’l‚ð”äŠr‚·‚鈗‚Í1.‚Æ“¯‚¶‚Ȃ̂ÅA
>‹éŒ`‚ª‘å—ʂɂȂÁ‚½‚Æ‚«‚ÉAX‘¤‚Å•`‰æ«”\‚ª’ቺ‚·‚é‚̂ł͂Ȃ¢‚©‚ÆŽv‚¤‚¼B

uX‘¤‚Ì•`‰æ«”\‚̒ቺv‚ªŒ´ˆö‚ł͂Ȃ­AuƒsƒNƒZƒ‹’l‚ð”äŠr‚·‚鈗vŽ©‘Ì‚ªA
ŽÀ‚ÍuÃŽ~ó‘Ôv‚Å‚àA펞A‘å•‚É‘‰Á‚µ‚Ä‚¢‚½A‚Æ‚¢‚¤‚±‚Ƃł·B

‰½‚̕ω»‚ª‚È‚¢‚Æ‚«‚ɂłàA•S–œƒsƒNƒZƒ‹‚ð”äŠr‚µAƒ‰ƒ“ƒŒƒ“ƒOƒX‚𓱂«o‚·ˆ—‚ðA
Œ´‘¥“I‚ɂ͕bŠÔ20‰ñ‚à‚â‚Á‚Ä‚¢‚Ü‚·B

‚Ü‚½A}Œ`‚ª•¡ŽG‚¾‚ÆAƒVƒXƒeƒ€ƒR[ƒ‹‚ðŒÄ‚Ño‚·‰ñ”‚ªƒ‰ƒ“ƒŒƒ“ƒOƒX‚̕ω»‚̉ñ””{
‚³‚ê‚Ü‚·B—Ⴆ‚ÎA’¼ü‚ðN–{ˆø‚¢‚½ê‡AƒVƒXƒeƒ€ƒR[ƒ‹‚̉ñ”‚ªŒ´‘¥ 3N (”{)‚ɂȂè‚Ü‚·B
c•ûŒü‚ª500ƒhƒbƒg‚ÌWindow‚ÅA1–{‚Ì’¼ü‚ðˆø‚¢‚½ê‡Aˆê‰ñ‚̈—‚ÅAÅ’á‚Å‚à
6,000‰ñ‚̃VƒXƒeƒ€ƒR[ƒ‹‚ªŒÄ‚Ño‚³‚ê‚Ü‚·B‚±‚ꂪ•bŠÔ20‰ñ‚às‚í‚ê‚Ü‚·‚Ì‚ÅA
Å’á‚ÅA•bŠÔ12–œ‰ñ‚̃VƒXƒeƒ€ƒR[ƒ‹‚ƂȂè‚Ü‚·B1‰ñ‚̃VƒXƒeƒ€ƒR[ƒ‹‚ÍA5(ƒÊs)
‚­‚ç‚¢‚͂ǂ¤‚µ‚Ä‚à‚©‚©‚é‚Ì‚ÅA‚±‚ꂾ‚¯‚ÅA0.6(•b)‚à‚©‚©‚Á‚Ä‚µ‚Ü‚¢‚Ü‚·B
‚‚܂èA1•bŠÔ‚É0.6•b‚à–³‘ʂȃVƒXƒeƒ€ƒR[ƒ‹‚ÉŽžŠÔ‚ðŽæ‚ç‚ê‚Ä‚¢‚邯Œ©Ï‚à‚ê‚Ü‚·B
’¼ü‚ð2–{‚É‚·‚邯A‚±‚ꂾ‚¯‚ÅCPU‚ªƒtƒ‹ƒpƒ[ó‘ԂɂȂè‚Ü‚·B

439 –¼‘OF396 mailto:sage [2018/02/18(“ú) 14:38:25.11 ID:HH6qVqdM.net]
yŒµ–§‰»z

1. ‘½•ªA6,000‰ñ‚ł͂Ȃ­A4,500‰ñ’ö“x‚Å‚µ‚½B
2. ”äŠrˆ—Ž©‘Ì‚ÍA}Œ`‚Ì•¡ŽG‚³‚Ƃ͖³ŠÖŒW‚ɂقڈê’è‚Ìd‚³‚Å‚·B
3. }Œ`‚ª•¡ŽG‚Èê‡AƒVƒXƒeƒ€ƒR[ƒ‹‚̉ñ”‚ª‘‚¦‚Ü‚·B
4. ‰¡•ûŒü‚Ì1‚‚̃‰ƒ“ƒŒƒ“ƒOƒX‚ÅA3‚‚̃VƒXƒeƒ€ƒR[ƒ‹‚ªŒÄ‚΂ê‚Ü‚·B
5. }Œ`‚ª‰½‚à•`‚©‚ê‚Ä‚¢‚È‚¢ê‡A1‚‚ÌyÀ•W‚ɑ΂µ‚ÄA1‚‚̃‰ƒ“ƒŒƒ“ƒOƒX‚Å‚·B
6. N –{‚Ì’¼ü‚Ìê‡A‘å‘̂Ō¾‚¦‚ÎA3N ŒÂ‚̃‰ƒ“ƒŒƒ“ƒOƒX‚ɂȂè‚Ü‚·B
7. ‚¾‚©‚çA1‚‚ÌyÀ•W‚ɑ΂µA9N ŒÂ‚̃VƒXƒeƒ€ƒR[ƒ‹‚ªŒÄ‚΂ê‚邱‚ƂɂȂè‚Ü‚·B
8. c 500 ƒhƒbƒg‚Ìê‡A500*9N = 4500 N ‰ñ‚̃VƒXƒeƒ€ƒR[ƒ‹‚ƂȂè‚Ü‚·B
9. ‚æ‚Á‚ÄA’†‚É•`‚©‚ê‚Ä‚¢‚é’¼ü‚Ì–{”‚ª‘‚¦‚邯A‘å‘Ì O(N) ‚ň—ŽžŠÔ‚ª
@ ‘‚¦‚Ü‚·B
10. •¶Žš‚ð•`‚¢‚½ê‡A‘å‘ÌA•¶Žš‚Ì•¡ŽG‚³‚É”ä—Ⴕ‚Ĉ—ŽžŠÔ‚ª‘‚¦‚Ü‚·B

440 –¼‘OF396 mailto:sage [2018/02/18(“ú) 15:25:59.15 ID:HH6qVqdM.net]
>>426
y’ù³z
u6.v‚̃‰ƒ“ƒŒƒ“ƒOƒX‚̌”‚ÍA3NŒÂ‚ł͂Ȃ­A2N+1 ŒÂ‚Å‚µ‚½B

‚¨‘›‚ª‚¹‚µ‚Ü‚µ‚½B

441 –¼‘OFlogin:Penguin mailto:sage [2018/02/18(“ú) 16:08:39.77 ID:dARugMLm.net]
>>426
update_surface_region‚Ì•û‚ªŒø—¦ˆ«‚»‚¤‚Ȃ̂ÅAX‘¤‚Ì•`‰æ«”\‚ªŒ´ˆö‚Æ„‘ª‚µ‚½•”•ª‚Í“P‰ñ‚·‚éB

Shape Extension‚ÌŽd—l‚ðŒ©‚é‚ÆA
‹éŒ`—̈æ‚ł͂Ȃ­ƒ}ƒXƒN—p‚ÌPixmap‚ðŽw’è‚·‚é•û–@‚àÌ‚ê‚é‚©‚çA
BitBlt‚ÅŒø—¦‚æ‚­ƒ}ƒXƒN‚ðì‚ê‚΂»‚Á‚¿‚Ì•û‚ª‘‚­‚Ȃ邩‚à‚ÆŽv‚Á‚Ă݂½‚èB

‚ ‚ÆAMDIƒEƒBƒ“ƒhƒE‚ªX‚ÌWindow‚ł͂Ȃ¢‚±‚Æ‚ÍAxwininfoƒRƒ}ƒ“ƒh‚ÌŒ‹‰Ê‚Å‚àŠm”F‚Å‚«‚éB

442 –¼‘OF396 mailto:sage [2018/02/18(“ú) 17:01:36.91 ID:hqeoLLBF.net]
>>428
>‹éŒ`—̈æ‚ł͂Ȃ­ƒ}ƒXƒN—p‚ÌPixmap‚ðŽw’è‚·‚é•û–@‚àÌ‚ê‚é‚©‚çA
>BitBlt‚ÅŒø—¦‚æ‚­ƒ}ƒXƒN‚ðì‚ê‚΂»‚Á‚¿‚Ì•û‚ª‘‚­‚Ȃ邩‚à‚ÆŽv‚Á‚Ă݂½‚èB

­‚È‚­‚Æ‚à‚»‚Ì•û–@‚¾‚ÆA}Œ`‚Ì•¡ŽG‚³‚É‚æ‚炸‚ɈÀ’肵‚Ä“¯‚¶ˆ—ŽžŠÔ‚Å
ς݂܂·‚ËB‚»‚ê‚Æ“–‘RABitBlt ‚̓n[ƒhƒEƒFƒA‚̕╂ª“¾‚ç‚ê‚Ü‚·B
‚ ‚ÆAƒVƒXƒeƒ€ƒR[ƒ‹‚à‘S‘̂Ŕ‰ñ‚µ‚©ŒÄ‚΂ȂÄς݂܂·‚µB

443 –¼‘OF396 mailto:sage [2018/02/19(ŒŽ) 12:40:07.08 ID:v4nZjJQ1.net]
“Á’è‚̃AƒvƒŠ‚Ìꇂɂ¾‚¯‚ÍAŽ©ì‚Ì user32.dll.so ‚ð“ǂݞ‚Ü‚¹‚鎖‚ªo—ˆ‚È‚¢B
WINEDLLPATH, WINEPATH ‚ðŽŽ‚µ‚Ă݂½‚ªA¡‚̂Ƃ±‚ëãŽè‚­s‚©‚È‚¢B

444 –¼‘OF396 mailto:sage [2018/02/19(ŒŽ) 15:28:56.74 ID:v4nZjJQ1.net]
’²‚×‚Ä‚Ý‚é‚ÆA/wine/libs/wine/loader.c ‚Ì’†‚Ì build_dll_path()
ŠÖ”‚Ì’†‚ÅAŠÂ‹«•Ï” WINEDLLPATH ‚ªA“ǂݎæ‚ç‚êA: ‚ð 0x00‚É
•Ï‚¦‚Ä‚©‚çAdll_paths[] ”z—ñ‚É : ‚Å‹æØ‚ç‚ꂽ‚»‚ꂼ‚ê‚Ì•¶Žš—ñ
‚Ìæ“ªƒAƒhƒŒƒX‚ð‘ã“ü‚µ‚Ä‚¢‚éB

‚µ‚©‚µA‚»‚̈—‚É“ü‚é‘O‚ÉAget_dlldir() ŠÖ”‚ª NULL ˆÈŠO‚ð•Ô‚µ‚½ê‡A
dll_paths[0] ‚É‚»‚ÌŠÖ”‚ª•Ô‚µ‚½•¶Žš—ñ‚̃AƒhƒŒƒX‚ð“ü‚ê‚Ä‚µ‚Ü‚¤B

‚»‚µ‚ÄAŽÀÛ‚Ì get_dlldir() ‚ÍA"/usr/local/bin/../lib/wine"
‚Æ‚¢‚¤•¶Žš—ñ‚ð•Ô‚µ‚Ä‚­‚é‚Ì‚ÅA‚»‚Á‚¿‚̃pƒX‚Ì•û‚ªAWINEDLLPATH
‚Ì—D懈ʂæ‚è‚àã‚ɂȂÁ‚Ä‚µ‚Ü‚¤B‚»‚µ‚ÄA

/* retrieve the default dll dir */
const char *get_dlldir( const char **default_dlldir )
{
*default_dlldir = DLLDIR;
return dlldir;
}
‚ƂȂÁ‚Ä‚¢‚邪ADLLDIR ‚ª‘S‚Ă̊g’£Žq‚Ì‘Sƒtƒ@ƒCƒ‹‚ð‘S•¶ŒŸõ‚µ‚Ä‚à
‚Ç‚±‚É‚à’è‹`‚³‚ê‚Ä‚¨‚炸AŽQÆ‚³‚ê‚Ä‚¢‚é‚Ì‚à—Bˆê‚±‚ÌŠÖ”‚¾‚¯‚¾‚Á‚½B

‚±‚ꂾ‚ÆAWINEDLLPATH ‚ÅuOverridev‚Å‚«‚È‚¢‚Ì‚à“–‘R‚¾‚¯‚ÇA
‚»‚à‚»‚àADLLDIR ‚ª‚Ç‚±‚Å’è‹`‚³‚ê‚Ä‚¢‚é‚Ì‚©‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å
’N‚©‚Ì‹³‚¦‚ð‚¢‚½‚¾‚«‚½‚¢‚Å‚·B

445 –¼‘OFlogin:Penguin mailto:sage [2018/02/19(ŒŽ) 15:47:21.84 ID:qkc2SRTD.net]
Œ©‚‚©‚è‚Ü‚µ‚½Bwine/libs/wine/Makefile‚Ì’†‚ÅA
config_EXTRADEFS = \
@@-DBINDIR='"${bindir}"' \
@@-DDLLDIR='"${dlldir}"' \
@@-DLIB_TO_BINDIR=\"`$(MAKEDEP) -R ${libdir} ${bindir}`\" \
@@-DLIB_TO_DLLDIR=\"`$(MAKEDEP) -R ${libdir} ${dlldir}`\" \
@@-DBIN_TO_DLLDIR=\"`$(MAKEDEP) -R ${bindir} ${dlldir}`\" \
@@-DBIN_TO_DATADIR=\"`$(MAKEDEP) -R ${bindir} ${datadir}/wine`\"
‚Æ‚¢‚¤‚Ì‚ªB’PŒêŒŸõ‚µ‚Ä‚¢‚½‚Ì‚ª‹S–å‚Å‚µ‚½B

446 –¼‘OF396 mailto:sage [2018/02/19(ŒŽ) 19:22:56.55 ID:WuPPo4Ry.net]
loader.c ‚Ì build_dll_path() ‚ÌC³‚ÆAuser32.dll.so ‚ÌC³‚ðA
Ž©•ª‚̃AƒvƒŠ‚¾‚¯‚É“K—p‚·‚鎖‚ɬŒ÷‚µ‚Ü‚µ‚½B

447 –¼‘OF396 mailto:sage [2018/02/20(‰Î) 03:10:39.77 ID:nCkYsCc8.net]
surface ‚ª NULL ‚ł͂Ȃ¢ê‡Axxx->pLineTo() ‚ÍAX11DRV_LineTo()
‚ł͂Ȃ­Adibdrv_LineTo() ‚ªŒÄ‚Ño‚³‚ê‚邿‚¤‚ÈEEEB



448 –¼‘OF396 mailto:sage [2018/02/20(‰Î) 05:59:07.45 ID:nCkYsCc8.net]
DirtyBit ‚ðŽg‚Á‚ÄA—á‚Ì update_surface_region() ‚ÍA
•`‰æ‚µ‚ĂȂ¢‚Æ‚«‚ɂ͑S‚­ŒÄ‚΂ê‚È‚¢‚悤‚ɂł«‚½‚ñ‚Å‚·‚ªA
‚Ü‚¾‚©‚È‚è’x‚¢‚Å‚·B‰½‚à‚µ‚ĂȂ¢‚Æ‚«‚É‚à CPU ƒpƒ[‚ª‚©‚È‚èÁ”‚ê‚Ä‚¢‚Ü‚·B
‚»‚ÌŠÔAupdate_surface_region() ‚ªŒÄ‚Ño‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚ÍAFIXME ‚Å
•\ަ‚µ‚ÄŠm”F‚ªŽæ‚ê‚Ä‚¢‚Ü‚·B

‚È‚¨A>>434‚ÍAwindrv_LineTo() ‚Ì•û‚̊ԈႢ‚Å‚µ‚½Bwindrv_LineTo() ‚Ìê‡A
ŠÈ’P‚É surface ‚ɃAƒNƒZƒX‚Å‚«‚é‚Ì‚ÅAsurface ‚É bNeedToUpdate ‚̂悤‚È
ƒtƒ‰ƒO‚ð’ljÁ‚µ‚ÄA‚»‚ê‚ð 1 ‚É‚µ‚Ä dirty bit ‚É‚µ‚Ä‚¢‚Ü‚·B

‚È‚º’x‚¢‚܂܂Ȃ̂©‚Í“ä‚Å‚·B

449 –¼‘OFlogin:Penguin mailto:sage [2018/02/20(‰Î) 06:05:44.26 ID:AmaI1OSV.net]
2ch(5ch?)‚Íl‚Í‘½‚¢‚¯‚ÇŠî–{“I‚Ƀ†[ƒU[ƒŒƒxƒ‹‚Ìl‚΂©‚肾‚©‚ç‹Zp“I‚È‘‚«ž‚Ý‚µ‚Ä‚à”½‰ž‚͓݂¢‚Ë
Qiita‚É‚Å‚à‘‚¢‚Ă݂½‚ç‚Ç‚¤H

450 –¼‘OFlogin:Penguin mailto:sage [2018/02/20(‰Î) 18:28:22.71 ID:QMmYbOOf.net]
–{‰Æ‚Ƀpƒbƒ`“Še‚à‚¨Šè‚¢‚µ‚Ü‚·w

451 –¼‘OF396 mailto:sage [2018/02/20(‰Î) 18:49:16.00 ID:nCkYsCc8.net]
’x‚¢Œ´ˆö‚Ì1‚‚ÍAOnldle ‚Ì’†‚É‚ ‚邱‚Æ‚ª•ª‚©‚è‚Ü‚µ‚½B

1. •K—v‚ª‚ ‚Á‚ÄAŠO•”ƒc[ƒ‹‚É‚æ‚éƒtƒ@ƒCƒ‹‚ÌXVƒ`ƒFƒbƒN‚ð‚µ‚Ä‚¢‚½‚Æ‚±‚ëA
@ ‚»‚ꂪ‚Æ‚ñ‚Å‚à‚È‚­d‚¢Ž–‚ª”»–¾B

2. SetTimer ‚Å CMainFrame ‚Ƀ^ƒCƒ}[‚ð‚µ‚©‚¯‚Ä‚¢‚邯ACMainFrame::OnCmdMsg()
@ ‚ªAWM_TIMER ƒƒbƒZ[ƒW‚ª—ˆ‚é“x‚ÉA‚»‚ê‚ð‰½”{‚É‚àŠ|‚¯ŽZ‚µ‚½‰ñ”‚¾‚¯ŒÄ‚Ñ
@ o‚³‚ê‚鎖‚ª”»–¾B—Ⴆ‚ÎA•bŠÔ N ‰ñ‚̃^ƒCƒ}[‚ðŽdŠ|‚¯‚邯AOnCmdMsg ‚ªA
@ 10*N ‰ñ ŒÄ‚Ño‚³‚ê‚邿‚¤‚ÈŠ´‚¶‚Å‚·Bƒ^ƒCƒ}[ƒƒbƒZ[ƒW‚ª‚­‚é“x‚ÉA
@ ƒƒjƒ…[‚ȂǂðXV‚·‚邽‚߂̃ƒbƒZ[ƒW‚ª—ˆ‚Ä‚¢‚邿‚¤‚È‹C‚ª‚µ‚Ü‚·B
@ ‘½•ªA–{‰Æ Windows ‚Å‚ÍAƒ^ƒCƒ}[ƒƒbƒZ[ƒW‚ª—ˆ‚Ä‚àA‚»‚̂悤‚ÈŽ–‚É‚Í
@ ‚È‚ç‚È‚¢‚ñ‚¶‚á‚È‚¢‚©‚ÆŽv‚¢‚Ü‚·B ’ÊíAOnCmdMsg ‚Í•p“x‚ª’á‚¢‚±‚Æ‚ª
@ ‘O’ñ‚ɂȂÁ‚Ä‚¢‚é‚Ì‚ÅA‚»‚Ì’†‚Å‘½­d‚¢ˆ—‚ð‚µ‚Ä‚¢‚邯A‚Æ‚ñ‚Å‚à‚È‚­
@ d‚½‚­‚È‚éB

‚È‚¨A“§–¾F‚ðŽg‚Á‚Ä‚¢‚éê‡Aupdate_surface_region ‚Ì’†‚̈—‚ÌŒyd‚É
‚æ‚Á‚ÄA•`‰æ‘¬“x‚ª‘啂ɕςí‚邱‚Æ‚àŠm”F‚µ‚Ü‚µ‚½B

ƒ‰ƒ“ƒŒƒ“ƒOƒX‚𔂦‚ăŠ[ƒWƒ‡ƒ“‚ð add_row ‚µ‚Ä‚¢‚é‰ÓŠ‚ðA’Pƒ‚ɉ½‚à
”‚¦‚¸‚És‘S‘Ì‚ÅA1ŒÂ‚¾‚¯ add_row ‚·‚邿‚¤‚É

452 –¼‘OFC³‚µ‚Ä‚Ý‚é‚ÆA•`‰æ‚ª
‚¾‚¢‚Ô‘¬‚­‚È‚è‚Ü‚µ‚½i“§–¾‚ɂ͂Ȃè‚Ü‚¹‚ñ‚ªBjB
[]
[‚±‚±‰ó‚ê‚Ă܂·]

453 –¼‘OFlogin:Penguin [2018/02/20(‰Î) 18:56:15.10 ID:nCkYsCc8.net]
>>437
‚»‚¤‚µ‚½‚¢‚ñ‚Å‚·‚ªA‰½‚©‚Æ‘å•ςȂñ‚Å‚·B

1. ƒ[ƒ‹ƒAƒhƒŒƒX‚Ì“o˜^‚·‚é‚Ì‚ªALinux‚©‚炾‚Æ‘å•ÏB
2. git ‚ÌŽd—l‚ª—Ç‚­•ª‚©‚ç‚È‚¢B
3. ‰ñü‚ª’x‚¢‚Ì‚ÅAProject ‚ð Fork ‚µ‚ÄAgit ‚ª Tree ‘S‘Ì‚ð
@ƒAƒbƒvƒ[ƒh‚µ‚悤‚Æ‚µ‚Ä‚µ‚Ü‚Á‚½‚è‚È‚ñ‚©‚·‚邯‘å•ςȎ–‚ɂȂéB
4. ‚¾‚©‚çAˆê•”‚̃tƒ@ƒCƒ‹‚¾‚¯‚ð UL ‚µ‚½‚¢‚ªAƒRƒ~ƒ…ƒjƒP[ƒVƒ‡ƒ“‚Ì
@–â‘è‚©‚玖î‚ð“`‚¦‚ÄA‚»‚±‚Ü‚Ås‚­‚©‚Ç‚¤‚©•ª‚©‚ç‚È‚¢B
5. ‚¾‚©‚çA“ÆŽ©‚ɃI[ƒo[ƒ‰ƒCƒh‚µ‚悤‚Æ‚µ‚½‚Ì‚ªAæ“ú‚©‚炱‚±‚Å‚à
@‘‚¢‚Ä‚¢‚½‚±‚Ƃł·Bloader ‚ðC³‚µ‚ÄA‚©‚ÂAŠÂ‹«•Ï”‚ð•Ï‚¦‚Ä
@‚â‚ê‚ÎA–{‰Æ‚Æ“‡‚µ‚È‚­‚Ä‚àA•”•ª‘‚«•Ï‚¦‚̂悤‚ÈŽ–‚ªo—ˆ‚éB

454 –¼‘OFlogin:Penguin mailto:sage [2018/02/20(‰Î) 18:59:20.15 ID:TT83z4l8.net]
>>439
github‚©‚ç‚Å‚àƒvƒ‹ƒŠƒNƒGƒXƒgŽó‚¯•t‚¯‚Ă邿

455 –¼‘OFlogin:Penguin mailto:sage [2018/02/20(‰Î) 19:09:08.87 ID:LN/W3cN7.net]
æ‚Éhttps://bugs.winehq.org/‚É‘‚¢‚½•û‚ª‚¢‚¢
•ñ‚µ‚Ä‚ ‚邯ƒpƒbƒ`‘—‚éŽžà–¾‚ªŠy‚ɂȂ邩‚ç

456 –¼‘OFlogin:Penguin mailto:sage [2018/02/20(‰Î) 19:12:23.54 ID:hMkWg0ue.net]
•`‰æ‚ª‘‚­‚È‚é‚Ȃ炠‚肪‚½‚¢
‘f‚ÌWindows‚æ‚èˆÙ—l‚É’x‚¢ƒQ[ƒ€‚Æ‚©‚ ‚邵

457 –¼‘OF396 mailto:sage [2018/02/20(‰Î) 20:06:46.63 ID:ErFPSqeX.net]
Œ‹˜_‚¾‚¯‘‚¢‚Ä‚¨‚­‚ÆAsurface‚ª”ñNULL‚ÌŽž‚Ì LineTo ‚ÌŽÀ‘Ì‚ÍA
windrv_LineTo‚ÅAsurface ‚ð lock ‚·‚éˆÈŠO‚ÍAdibdrv_LineTo ‚Æ“¯‚¶B
dibdrv_LineTo‚ÍAbits ‚È‚épixel”z—ñ‚É 32BIT‚ÌF’l‚ð‘‚«ž‚ÞB
ŽÀۂ͔ėp«‚Ì‚½‚ßA•K‚¸and‚µ‚Ä‚©‚çxor‚·‚éBSOLIDƒ‚[ƒh‚Ìê‡Aand’l‚Í0B
xor’l‚ÍA00RRGGBB ‚ÅAÅãˆÊƒoƒCƒg‚Í0B
ŽÀۂւ̉æ–ʂ̔½‰f‚ÍA’èŠú“I‚Éuxxx->flushv‚È‚éŠÖ”ƒ|ƒCƒ“ƒ^‚ð‰î‚µ‚ÄA
x11drv_surface_flush() ‚ðŒÄ‚Ño‚·Ž–‚Ås‚¤B‚»‚Ì’†‚ÅA‹c‘è‚ɂȂÁ‚Ä‚¢‚é
update_surface_region() ‚àŒÄ‚΂ê‚éBÅŒã‚É bits ‚Ì“à—e‚ðŽÀ‰æ–ʂɔ½‰f‚³‚¹‚é
‚½‚ßAXShmPutImage()‚Ü‚½‚ÍAXPutImage(), XFlush()‚ðs‚¤B

surface->image ‚Ì pixel ƒoƒbƒtƒ@‚ÍAbits[] ”z—ñ‚Æ‹¤’ʂ炵‚¢B

‚‚܂èALinux ‚Ì•`‰æŠÖ”‚Í‘S‚­Žg‚킸‚ÉŽ©‘O‚ʼn摜‚ðpixel”z—ñ‚ɇ¬‚µ‚Ä‚©‚çA
’èŠú“I‚ÉAXPutImage() ‚ȂǂŎÀ‚ª–ʂɕ`‚«ž‚ÞA‚Æ‚¢‚¤‚悤‚È‚±‚Æ‚ð‚â‚Á‚Ä‚¢‚é‚炵‚¢B



458 –¼‘OF396 mailto:sage [2018/02/21(…) 16:48:35.77 ID:SJPTXnf1.net]
update_surface_region() ‚ª’x‚¢‚ñ‚¾‚ÆŽv‚Á‚ÄA
XShape ‚Ì쬂ðAXShapeCombineRectangles() ‚ðŽg‚¤•ûŽ®‚©‚çA
XCreateBitmapFromData() ‚Æ XShapeCombineMask()
‚ðŽg‚¤•ûŽ®‚ւƕς¦‚½B

‚·‚邯A1146 x 745 ‚̃TƒCƒY‚Ì Window ‚ÅA

1. Ž©‘O‚̃R[ƒh‚É‚æ‚é 1bit ‚Ì mask bitmap 쬂ɂ©‚©‚鎞ŠÔ :
796 (us)

2. XCreateBitmapFromData() ‚Æ XShapeCombineMask() ‚É‚©‚©‚鎞ŠÔ :
38 (us)

3. XShmPutImage() ‚Æ XFlush() ; x11drv_surface_flush()“à ‚Ì—¼•û‚É‚©‚©‚鎞ŠÔ :
94 (us)

4. MDI Child Wnd ‚ðƒhƒ‰ƒbƒO‚·‚邯‚«‚ÉAx11drv_surface_flush() ‚ª
@ ŒÄ‚Ño‚³‚ê‚鎞ŠÔŠÔŠu :
@ 3`100 (ms) ---> •bŠÔ 10‰ñ`330‰ñ

5. “÷Šá‚Å•`‰æ‚ªXV‚³‚ê‚é‚Ü‚Å‚É x11drv_surface_flush() ‚ªŒÄ‚Ño‚³‚ê‚é‰ñ” :
”10‰ñ ˆÈã‚ ‚邱‚Æ‚ª‘½‚¢B


1.`4. ‚¾‚¯‚Ý‚é‚ÆA‚‘¬‚Ɉ—‚³‚ê‚Ä‚¢‚é—l‚ÉŒ©‚¦‚邯‚ÇA5. ‚¾‚¯‚ª—‰ð‚Å‚«‚È‚¢B
ƒJƒEƒ“ƒ^‚ðÝ‚¯‚Ä”‚¦‚Ä‚Ý‚é‚ÆAŽÀÛ‚É–Ú‚Å‚ÍXV‚ª‹N‚«‚ĂȂ¢‚Ì‚ÉA
‚¿‚á‚ñ‚ÆA1`3 ‚Ì‘S‚Ă̊֔‚ª”\‰ñ‚àŒÄ‚Ño‚³‚ê‚Ä‚¢‚éB

‚¿‚á‚ñ‚ÆuXFlush()v‚³‚ê‚Ä‚¢‚é‚Ì‚ÉA‚È‚º‚¾‚낤HHHH

459 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 17:03:51.93 ID:SJPTXnf1.net]
XSync() ‚ð’ljÁ‚µ‚Ä‚àAXShmPutImage() ‚ð XPutImage() ‚ÉC³‚µ‚Ä‚àA
‰½‚ð‚â‚Á‚Ä‚àŒ©‚½–Ú‚¾‚¯‚ªXV‚³‚ê‚È‚¢B

460 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 17:09:56.25 ID:iuEniYB2.net]
>>444

> update_surface_region() ‚ª’x‚¢‚ñ‚¾‚ÆŽv‚Á‚ÄA
> XShape ‚Ì쬂ðAXShapeCombineRectangles() ‚ðŽg‚¤•ûŽ®‚©‚çA
> XCreateBitmapFromData() ‚Æ XShapeCombineMask()
> ‚ðŽg‚¤•ûŽ®‚ւƕς¦‚½B

‚±‚¤‚·‚邯‚È‚ñ‚Å‘¬‚­‚È‚é‚ÌH

461 –¼‘OF396 mailto:sage [2018/02/21(…) 17:35 ]
[‚±‚±‰ó‚ê‚Ă܂·]

462 –¼‘OF:51.39 ID:SJPTXnf1.net mailto: >>446
‚»‚ê‚ÍA
>>428-429
‚Ì•”•ª‚Æ[‚­ŠÖŒW‚µ‚Ä‚¢‚Ü‚·B
[]
[‚±‚±‰ó‚ê‚Ă܂·]

463 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 17:39:34.11 ID:SJPTXnf1.net]
X ‚Ì“¯Šú‚Ì–â‘è‚ł͂Ȃ­AMDI Child Wnd ‚Ì TITLE BAR ‚ðƒhƒ‰ƒbƒO‚·‚邯‚«A
‚È‚º‚©A”•bŒo‚Á‚Ä‚©‚çAx11drv_surface_flush() ‚ª‚܂Ƃ߂ĉ½\‰ñ‚àŒÄ‚Ño‚³‚ê‚Ä‚¢‚é
‰Â”\«‚ª‚ ‚é‚©‚àEEEB

ƒfƒoƒbƒO•\ަ‚ðƒŠƒAƒ‹ƒ^ƒCƒ€‚ÅŒ©‚Ä‚¢‚邯AŒ©‚½–Ú‚ª•ω»‚·‚é’¼‘O‚܂ŃfƒoƒbƒO•\ަ‚ª
‘S‚­o‚¸AŒ©‚½–Ú‚ª•ω»‚·‚é’¼‘O‚ÉA‚ǂǂÁ‚ÆA”\‰ñ•ª‚Ì x11drv_surface_flush()
‚ª‚܂Ƃ߂Äo‚Ä‚­‚éA‚Æ‚¢‚¤Œ»Û‚ª‹N‚«‚Ä‚¢‚éB

464 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 17:56:34.37 ID:iuEniYB2.net]
>>448
flush‚µ‚ĂȂ¢‚¾‚¯‚ł͂Ȃ­H

465 –¼‘OF396 mailto:sage [2018/02/21(…) 17:57:13.78 ID:SJPTXnf1.net]
ˆÈ‰º‚̃R[ƒh‚ª‹C‚ɂȂéB

message_count ‚ðŒ¸­‚³‚¹‚é‚̂͗BˆêAwait_message() ‚µ‚©Œ©‚‚©‚ç‚È‚©‚Á‚½B
Œã‚ÍAcheck_for_driver_events() ‚Ì’†‚Å’P’²‘‰Á‚µ‚Ä‚µ‚Ü‚¤B
ƒƒbƒZ[ƒW‚ª‚½‚Ü‚Á‚ĉ‚ß‚ÄAflush_window_surfaces() ‚ªŒÄ‚Ño‚³‚ê‚邿‚¤‚È
ƒR[ƒh‚É‚à

/* 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;
}

466 –¼‘OF396 mailto:sage [2018/02/21(…) 17:58:18.49 ID:SJPTXnf1.net]
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;
}

467 –¼‘OF396 mailto:sage [2018/02/21(…) 18:24:27.09 ID:SJPTXnf1.net]
>>449
PeekMessage()‚ð‰ñ‚µ‚Ä‚¢‚邾‚¯‚ÌŽž‚ÅAƒƒbƒZ[ƒW‚ªƒLƒ…[‚ÉŽc‚葱‚¯‚Ä‚¢‚éê‡A
ƒƒbƒZ[ƒW‚ð 200‰ñ (100‰ñH) PeekMessage ‚·‚é‚܂łÍAflush_window_surfaces()
‚³‚ê‚È‚¢ƒR[ƒh‚ɂȂÁ‚Ä‚¢‚é‹C‚ª‚µ‚Ü‚¹‚ñ‚©EEEB



468 –¼‘OFlogin:Penguin [2018/02/21(…) 18:32:33.53 ID:SJPTXnf1.net]
GetMessage() ‚Ì•û‚à‚Ù‚Ú“¯‚¶‚悤‚ÈŠ´‚¶‚©‚àBB

‚Ƃɂ©‚­Aflush_window_surfaces() ‚ª‚ƂÂà‚È‚­’·‚¢ŠÔAŒÄ‚΂ê‚È‚¢‚±‚Æ‚ª
‚ ‚éƒR[ƒh‚ɂȂÁ‚Ä‚¢‚é—l‚ÉŒ©‚¦‚ÄAŽÀÛAŽÀŒ±‚µ‚Ä‚à‚»‚¤Žv‚¦‚éB

469 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 18:38:45.85 ID:SJPTXnf1.net]
‚»‚¤‚©A‚à‚Æ‚à‚Æ‚ÍAdirty bit •ûŽ®‚¶‚á‚È‚¢‚©‚çAflush_window_surfaces() ‚ðŒÄ‚Ô‚ÆA
ÄŒvŽZ‚·‚é•K—v‚ª–³‚¢‚̂ɕK‚¸ÄŒvŽZ‚³‚ê‚Ä‚µ‚Ü‚¤‚©‚çAŒÄ‚Ño‚·•p“x‚ð‰º‚°‚邵‚©
‚‘¬‰»‚·‚é•û–@‚ª–³‚¢‚½‚ß‚ÉA‚»‚ñ‚È•—‚ȃR[ƒh‚ɂȂÁ‚Ä‚¢‚é‚Ì‚©‚à‚µ‚ê‚È‚¢B

470 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 18:41:37 ]
[‚±‚±‰ó‚ê‚Ă܂·]

471 –¼‘OF.14 ID:SJPTXnf1.net mailto: ‚»‚µ‚ÄAflush_window_surfaces() ‚̃R[ƒh‚Å‚ÍAÅ’á‚Å‚à 50 (ms) ‚ÌŽžŠÔ‚ªŒo‚Á‚Ä‚¢‚È‚¢ê‡‚É‚Í
ˆ—‚ðƒXƒLƒbƒv‚·‚éƒR[ƒh‚ɂȂÁ‚Ä‚¢‚éB‚Æ‚±‚Æ‚ñAflush() ‚µ‚È‚¢ƒR[ƒh‚ɂȂÁ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚éB
‚±‚ê‚炪Œ´ˆö‚©EEEB

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 );
}
[]
[‚±‚±‰ó‚ê‚Ă܂·]

472 –¼‘OF396 mailto:sage [2018/02/21(…) 18:58:29.00 ID:SJPTXnf1.net]
Œ³X‚Ì Windows ‚Å‚ÍALineTo ‚ȂǂðŽÀs‚·‚邯uŠÔ“I‚ÉŽÀ‰æ–ʂɔ½‰f‚³‚ê‚éB
‚¾‚©‚çA‚»‚à‚»‚à Flush ‚¹‚¸‚ÉŒ©‚¦‚È‚¢‚܂܂̕`‰æ‚ªŽc‚Á‚Ä‚¢‚é‚È‚ñ‚ÄŽžŠÔ‚Í
‚Ù‚Ú 0B

‚»‚¤l‚¦‚邯ABWine ‚Ì‚±‚ÌŽÀ‘•‚Í‚¨‚©‚µ‚¢‚ÈEEEB

1. ‚»‚à‚»‚àƒƒbƒZ[ƒWƒ‹[ƒv‚ð‰ñ‚µ‚Ä‚¢‚鎞‚µ‚© flush ‚³‚ê‚é‰Â”\«‚ª‘S‚­‚È‚¢
@ ŽÀ‘•‚ɂȂÁ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚é‚炵‚¢B

2. ƒƒbƒZ[ƒWƒ‹[ƒv‚ð‰ñ‚µ‚Ä‚¢‚Ä‚àAƒƒbƒZ[ƒW‚ªƒLƒ…[‚ÉŽc‚Á‚Ä‚¢‚鎞‚ÍA
@ 100‰ñ’ö“xƒƒbƒZ[ƒW‚ð“ǂ܂Ȃ¢ŒÀ‚èAflush ‚³‚ê‚È‚¢B


Windows ‚ðuƒGƒ~ƒ…ƒŒ[ƒgv‚·‚é‚̂ł ‚ê‚ÎA—Ⴆ‚ÎA•`‚¢‚Ä‚©‚ç 50(ms) Œo‚Ä‚ÎA
•K‚¸ flush ‚·‚éA‚Æ‚¢‚¤ŽÀ‘•‚łȂ­‚Ă͂Ȃç‚È‚¢‚Í‚¸B

Linux ‚Å‚ÍAƒ^ƒCƒ}[ˆ—‚ª“‚¢‚Ì‚©‚ÈHHH

473 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 19:03:48.84 ID:SJPTXnf1.net]
1. Windows (‚à‚¿‚ë‚ñANTŒn) ‚ÌꇂÍAƒƒbƒZ[ƒWEƒ‹[ƒv’·‚­‹A‚Á‚Ä‚±‚È‚¢ƒvƒƒOƒ‰ƒ€‚à
@â‘΃_ƒ‚Æ‚¢‚¤‚킯‚ł͂Ȃ¢B

2. ‚»‚¤‚¢‚¤ƒvƒƒOƒ‰ƒ€‚Ìê‡AWine ‘¤‚ÍA•`‰æ‚ðAˆê’莞ŠÔŠÔŠu‚ÅA•ʃXƒŒƒbƒh‚Ì
@ ƒ^ƒCƒ}[Š„‚螂݂̒†‚ȂǂŠflush ‚·‚邿‚¤‚É‚µ‚È‚¢‚ÆA ³‚µ‚­AEmulation o—ˆ
@ ‚È‚¢‚Í‚¸B

474 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 19:05:31.10 ID:SJPTXnf1.net]
Š„‚螂݂ȂçA•ʃXƒŒƒbƒh‚ð‹N‚±‚·•K—v‚ª–³‚©‚Á‚½BƒXƒ}ƒ\B

‚ ‚ÆAŒëŽš’ù³F
ŒëF@ƒƒbƒZ[ƒWEƒ‹[ƒv’·‚­‹A‚Á‚Ä‚±‚È‚¢ƒvƒƒOƒ‰ƒ€‚à
³F@ƒƒbƒZ[ƒWEƒ‹[ƒv‚É’·‚­‹A‚Á‚Ä‚±‚È‚¢ƒvƒƒOƒ‰ƒ€‚à

475 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 19:13:35.32 ID:iuEniYB2.net]
‚¤[‚ñ
‚±‚ꂪƒ{ƒgƒ‹ƒlƒbƒN‚ɂȂÁ‚Ä‚¢‚邿‚¤‚ɂ͌©‚¦‚È‚¢

\‚µ–ó‚È‚¢‚ñ‚¾‚¯‚Ç•`‰æ‚ª’x‚­‚È‚éðŒ‚ð‚à‚¤ˆê“x‘‚¢‚Ä‚à‚ç‚Á‚Ä‚¢‚¢‚Å‚·‚©H

476 –¼‘OF396 mailto:sage [2018/02/21(…) 23:23:31.14 ID:4g3iPm6d.net]
‚¤[‚ñ‚ÆB‚»‚ê‚͂܂ ‚¿‚å‚Á‚Æ’u‚¢‚Ä‚¨‚¢‚ÄAAAB

MDI Child Wnd ‚Ì TITLE BAR ‚ð Drag ‚µ‚Ä‚¢‚éÅ’†AƒƒbƒZ[ƒWƒ‹[ƒv‚͈ê‚‚à
‰ñ‚Á‚ĂȂ¢‚ñ‚¶‚á‚È‚¢‚©‚ÆŽv‚¤B

‚¾‚©‚çA>>456 ‚Ìu1.v‚É‘‚¢‚½uflush‚³‚ê‚é•K—vðŒv‚ª–ž‚½‚³‚ê‚ĂȂ¢B

‚»‚Ì‚½‚ßAsurface ‚Ì pixel”z—ñ‚Ì“à—e‚ªŽÀ‰æ–ʂɔ½‰f‚³‚ê‚È‚¢‚̂ł͂Ȃ©‚낤‚©B

477 –¼‘OF396 mailto:sage [2018/02/21(…) 23:38:56.14 ID:4g3iPm6d.net]
ƒhƒ‰ƒbƒO’†‚Ƀ}ƒEƒX‚ðÃŽ~‚³‚¹‚Ä‚µ‚΂炭‘Ò‚Á‚Ä‚¢‚邯A x11drv_surface_flush() ‚Æ
flush_surface_region() ‚Ì—¼•û‚ªŒÄ‚Ño‚³‚ê‚½Ž–‚ª FIXME o—͂Ŋm”F‚Å‚«‚½B
ÃŽ~‚³‚¹‚¸‚Ƀ}ƒEƒX‚ðƒhƒ‰ƒbƒO‚µ‘±‚¯‚邯AFIXME o—Í‚ª‘S‚­‚łȂ¢B
‚µ‚©‚àA‚»‚ê‚ðs‚Á‚½ŽžŠÔ‚ª’·‚¢‚ÆAƒ}ƒEƒXƒ{ƒ^ƒ“‚𗣂µ‚½Œã‚àA”ñí‚É’·‚¢ŠÔ
ƒVƒXƒeƒ€‘S‘Ì‚ªƒnƒ“ƒOƒAƒbƒv‚µ‚½—l‚Èó‘ԂɂȂéB‚»‚µ‚ÄA’·‚¢’¾–Ù‚ÌŒãAFIXMEo—Í‚ª
o‚éB

‚±‚Ì’¾–Ù‚ÌŽžŠÔ‚ÍA‚»‚ê‚܂Ńhƒ‰ƒbƒO‚µ‚Ä‚¢‚½ŽžŠÔ‚É”ä—Ⴕ‚Ä‚¢‚邿‚¤‚ÉŽv‚¦‚éB

‚È‚º‚¾‚낤HHH@‚±‚ê‚͂ǂ±‚©‚Éu‰½‚©‚ª—­‚Ü‚Á‚Ä‚¢‚évŽž‚ÌŒ»Û‚Ì—l‚ÉŽv‚¦‚éB
‚µ‚©‚µA>>450 ‚ðŒ©‚é‚ÆAmessage_cnt ‚ÍAŒ¸‚炳‚ê‚邯‚«‚ÍAˆêŠú‚É 0 ‚ɂȂé‚̂ł ‚Á‚ÄA
­‚µ‚¸‚ÂŒ¸‚炳‚ê‚é‚킯‚ł͂Ȃ¢B

“䂾EEEB



478 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 23:42:58.43 ID:iuEniYB2.net]
’P‚ɃCƒxƒ“ƒg‚ð‘—M‚·‚鑤‚Ńoƒbƒtƒ@ƒŠƒ“ƒO‚µ‚Ä‚é‚ñ‚¶‚á‚È‚¢‚ÌH

479 –¼‘OFlogin:Penguin mailto:sage [2018/02/21(…) 23:50:18.32 ID:iuEniYB2.net]
‚Ü‚ Å‰‚©‚çƒ}ƒ‹ƒ`ƒXƒŒƒbƒhˆÓޝ‚µ‚Ä‘‚¢‚½Š´‚¶‚ł͂Ȃ¢‚ȂƎv‚¤‚¯‚Ç90”N‘ã‚©‚çŠJ”­‚³‚ê‚Ä‚é‚킯‚¾‚µ‚»‚̂ւñ‚Í‚²ˆ¤›g‚¶‚á‚È‚¢

480 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 00:35:51.88 ID:9+xI5ulA.net]
>>450-451 •Ó‚è‚̃\[ƒX‚ðŒ©‚Ä‚¢‚ÄA”w—–@‚ÅŒê‚Á‚Ă݂½‚¢B

‰¼’è1FuDrag ’†‚Å‚àAPeekMessage ‚³‚ê‚Ä‚¢‚éBv ‚Ɖ¼’è‚·‚éB
‰¼’è2. “§–¾‰»‚µ‚½Û‚Éd‚­‚È‚é‚Ì‚ÍAflush_window_surfaces() ‚ÆA
@@@@‚»‚±‚©‚çŒÄ‚Ño‚³‚ê‚é update_surface_region() ‚݂̂¾‚Ɖ¼’è‚·‚éB
•â‘«F update_surface_region() ‚ÍA“§–¾‰»‚Ì‚½‚ß‚Ì Shape ‚Ì쬂̈—‚ª
@@@ ‚³‚ê‚é‚Ì‚ÅAd‚¢B
@@@ flush_window_surfaces() ‚ÍAupdate_surface_region() ‚ðŒÄ‚Ño‚·
@@@ ˆÈŠO‚É‚àAXPutImage() Œn‚̈—‚ª“ü‚é‚Ì‚ÅA‚³‚ç‚Éd‚¢B

‰¼’è2‚ɂ‚¢‚Ä‚ÍA“§–¾‰»Žž‚ÉA‚»‚êˆÈŠO‚Éd‚¢ŠÖ”‚ªoŒ»‚·‚é‰Â”\«‚ð”Û’è‚Í
‚Å‚«‚È‚¢B‚È‚º‚È‚çAsurface ‚̈—‚ÍA“§–¾‰»‚µ‚È‚¢Žž‚É‚Ís‚í‚ê‚È‚¢‚©‚à
’m‚ê‚È‚¢‚©‚ç‚Å‚ ‚éB‚»‚Ìê‡ALineTo ‚ÌŠÖ”‚ªØ‚è‘Ö‚í‚éB

1. FIXME ‚ÅŒ©‚Ä‚¢‚éŒÀ‚èAƒhƒ‰ƒbƒO’†‚ÍA‚»‚ê‚ç‚ÌŠÖ”‚Í‘S‚­ŒÄ‚Ño‚³‚ê‚È‚¢B

2. >>451 ‚ðŒ©‚é‚ÆAPeekMessage ‚µ‚½Û‚ÉAƒLƒ…[‚ɃƒbƒZ[ƒW‚ªŽc‚Á‚ĂȂ¢‚È‚çA
@ flush_window_surfaces() ‚ªŒÄ‚Ño‚³‚ê‚é‚Í‚¸B

3. u‰¼’è2v ‚ÌŠÖ”‚͌Ă΂ê‚ĂȂ¢‚Ì‚¾‚©‚çAƒLƒ…[‚̃ƒbƒZ[ƒW‚ÍA“§–¾‰»‚³‚ê
@‚ĂȂ¢ê‡‚Æ“¯’ö“x‚É‚‘¬‚Ɉ—‚³‚ê‚Ä‚à‚¨‚©‚µ‚­‚È‚¢B

4. ‚à‚µ‚»‚¤‚Å‚ ‚ê‚ÎAƒLƒ…[‚̃ƒbƒZ[ƒW‚Í‚ ‚Á‚Æ‚¢‚¤ŠÔ‚Éu‹óv‚ɂȂé‚Í‚¸B

5. ‹ó‚ɂȂÁ‚½‚Æ‚µ‚½‚çAu2.v‚Ì’Ê‚è‚ÉAflush_window_surfaces() ‚ªŒÄ‚Ño‚³‚ê‚é‚Í‚¸B

6. ‚µ‚©‚µAu1.v‚Åq‚ׂ½‚悤‚ÉAŽÀŒ±“I‚É‚ÍAflush_window_surfaces() ‚͌ĂÑo‚³‚ê‚ĂȂ¢B

7. –µ‚‚Å‚ ‚éB

8. ”w—–@‚É‚æ‚èA‚±‚ê‚ÍA‰¼’è‚Ì­‚È‚­‚Æ‚àˆê•û‚ªŠÔˆá‚Á‚Ä‚¢‚鎖‚ðˆÓ–¡‚·‚éB

481 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 00:45:26.84 ID:9+xI5ulA.net]
‚ ‚é‚¢‚ÍAPeek ‚³‚ê‚邾‚¯‚ÅAˆê•”‚̃ƒbƒZ[ƒW‚ÍŽæ‚èŽc‚³‚ê‚é‚È‚çEEEB

482 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 01:30:28.67 ID:9+xI5ulA.net]
Wine ‚ÅAMDI Child Wnd ‚Ì TITLE BAR ‚ðƒhƒ‰ƒbƒO‚µ‚½‚Æ‚«‚̈—‚ɂ‚¢‚ÄB

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()

ÅŒã‚ÌŠÖ”‚ÍAƒ^ƒCƒgƒ‹ƒo[‚ðƒhƒ‰ƒbƒO‚ðŠJŽn’¼Œã‚Ɉê‰ñ‚¾‚¯ŒÄ‚Ño‚³‚ê‚鎖
‚ðŠm”F‚µ‚½B‚»‚ÌŒã‚̃hƒ‰ƒbƒO’†‚͌ĂÑo‚³‚ꂸA‚±‚ÌŠÖ”‚Ì“à•”‚Ńhƒ‰ƒbƒO
‚̈—‚ª‚³‚ê‚Ä‚¢‚é‰Â”\«‚ª‚‚¢B

‚±‚ÌÅŒã‚ÌŠÖ”‚Ì’†‚ÉAŽŸ‚̂悤‚ÈAƒƒbƒZ[ƒWEƒ‹[ƒv‚ª‚ ‚éF
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 */
}

483 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 01:32:06.83 ID:9+xI5ulA.net]
‚³‚ç‚ÉŽŸ‚̂悤‚ÈA˜g‚¾‚¯‚ð‘‚­‚©AŽÀÛ‚É“®‚©‚µ‚Ä‚µ‚Ü‚¤ƒR[ƒh‚ª‘±‚­ :

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 );
}

484 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 02:01:49.71 ID:9+xI5ulA.net]
‚ [B

FIXME‚ðÁ‚µ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½‚¾‚¯‚¾‚Á‚½EEEB

update_surface_region() ‚âAflush_window_surfaces() ‚ÍA
ƒhƒ‰ƒbƒO’†‚Å‚àAƒ}ƒEƒX‚ðÃŽ~‚µ‚Ä‚µ‚΂炭‚·‚邯ŒÄ‚΂ê‚邿‚¤‚Å‚·B
ƒ}ƒEƒX‚ð“®‚©‚µ‚‚¯‚Ä‚¢‚邯ŒÄ‚΂ê‚È‚¢‚炵‚¢B

485 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 02:44:50.36 ID:9+xI5ulA.net]
y‚â‚Á‚ÆŒ´ˆö”»–¾z

CMainFrame ‚ð WS_EX_LAYERED ‚Å“§–¾‰»‚µ‚Ä‚¢‚ÄA¡‰ñ‚ÌðŒ‚É“–‚Ă͂Ü

486 –¼‘OF‚鎞‚ÉA
CMDIClientWnd ‚̃^ƒCƒgƒ‹ƒo[ã‚Ń}ƒEƒX‚̶ƒ{ƒ^ƒ“‚ð‰Ÿ‚µŽn‚ßA‚»‚̂܂Ü
ƒ}ƒEƒX‚ð‚¸‚Á‚Æ“®‚©‚µ‘±‚¯‚邯AWINPOS_SysCommandSizeMove() ‚Ì’†‚Ì

if (!GetMessageW( &msg, 0, 0, 0 )) break;

‚Ì•”•ª‚Ì GetMessageW() ŠÖ”‚Ì’†‚Å’âŽ~‚µ‚Ä‚µ‚Ü‚¤BÚׂÍAGetMessageW() ‚Ì
’†‚ÅAƒƒbƒZ[ƒWƒLƒ…[‚ª‹ó‚¾‚Á‚½ê‡‚ɌĂÑo‚³‚ê‚邯‚±‚ë‚ÌA

wait_objects()@@@ ;dlls/user32/message.c
-->wow_handlers.wait_message()
-->wait_message()@@;dll/user32/winproc.c
-->USER_Driver->pMsgWaitForMultipleObjectsEx()
-->X11DRV_MsgWaitForMultipleObjectsEx()

‚ÌÅŒã‚ÌŠÖ”‚Ì’†‚Å’âŽ~‚µ‚Ä‚µ‚Ü‚¤B

³í‚È‚çAWM_NCMOUSEMOVE ƒƒbƒZ[ƒW‚ª“ž’…‚·‚邱‚Ƃɂæ‚Á‚ÄAŠÖ”‚©‚ç
–ß‚Á‚Ä—ˆ‚é‚Í‚¸‚¾‚ÆŽv‚í‚ê‚éB
[]
[‚±‚±‰ó‚ê‚Ă܂·]

487 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 10:45:19.02 ID:9+xI5ulA.net]
>>469
2‚Â–Ú‚Ì WaitForMultipleObjectsEx() ‚Ì’†‚Å’âŽ~‚µ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚邱‚Æ‚ª”»–¾B
–{—ˆA擪‚É Msg ‚ª•t‚­•û‚Ì API ‚ÍAƒƒbƒZ[ƒW‚Æ HANDLE ‚Ì—¼•û‚𓯎ž‚É
ŠÄŽ‹‚·‚邿‚¤‚ȃR[ƒh‚łȂ­‚Ă͂Ȃç‚È‚¢ƒnƒY‚Ȃ̂ÉA‚»‚¤‚È‚Á‚ĂȂ¢‚炵‚¢B
process_events() ‚ªAMotionNotify ‚Ì XEvent ‚ª—ˆ‚Ä‚¢‚½‚ç WM_MOUSEMOVE
ƒƒbƒZ[ƒW‚ðƒLƒ…[‚Ƀ|ƒXƒg‚·‚é‚炵‚¢‚ªAʼn‚Ɉê“x‚¾‚¯’²‚×‚Ä XEvent ‚ª
—ˆ‚Ä‚¢‚È‚¢ê‡‚ÍAˆÈŒãA‘S‚­ XEvent ‚𒲸‚¹‚¸‚É‘¼‚Ì HANDLE ŒQ‚̕ω»‚¾‚¯
‚ð‘Ò‹@‚µ‚Ä‚µ‚Ü‚¤‚炵‚¢B

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;
}



488 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 10:46:53.05 ID:9+xI5ulA.net]
y’Ê펞AWM_MOUSEMOVE ‚ªƒLƒ…[‚֒ljÁ‚³‚ê‚鎞‚ÌŽÀsŒo˜Hz

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) );
}

489 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 10:47:48.18 ID:9+xI5ulA.net]
yWM_NCMOUSEMOVE ‚Í WM_MOUSEMOVE ‚©‚çC³‚³‚ê‚éz
PeekMessageW() ‚Ü‚½‚Í GetMessageW() ‚Ì’†‚ÅAhittest ‚ª HTCLIENT ˆÈŠO
‚ÌꇂÍAWM_MOUSEMOVE ‚ª WM_NCMOUSEMOVE ‚ÉC³‚³‚ê‚é :

PeekMessageW() ‚Ü‚½‚ÍAGetMessageW()
---> peek_message()
---> switch(info.type)
@@ case MSG_HARDWARE :
---> process_hardware_message()
---> process_mouse_message() {
@@ if (hittest != HTCLIENT) {
@@@ message += WM_NCMOUSEMOVE - WM_MOUSEMOVE;
@@@ wparam = hittest;
@@ }

490 –¼‘OFlogin:Penguin [2018/02/22(–Ø) 15:16:45.32 ID:9+xI5ulA.net]
“ª‚É Msg ‚ª•t‚©‚È‚¢•û‚Ì WaitForMultipleObjecstEx() ‚à
‹““®‚ª‚¨‚©‚µ‚¢B timeout ‚É 0 ‚ðŽw’肵‚Ä‚àA–³ŒÀ‚É
‘Ò‹@‚µ‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚ ‚éB

491 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 16:31:11.62 ID:9+xI5ulA.net]
Msg ‚ª•t‚­•û‚Ì WaitXxxx ‚ÅAusleep() ‚ÅA0.3•

492 –¼‘OFb‚Ù‚Ç’âŽ~‚µ‚È‚ª‚çA
Polling (Loop) ‚·‚邿‚¤‚É‚µ‚Ä‚©‚çAFIXME‚ŃƒbƒZ[ƒW‚ðŠÏŽ@‚µ‚Ă݂½B
•’i‚ÍAusleep() –½—ß‚ÍAŒÄ‚Ño‚µ‚Ä‚©‚ç 0.3 •b‚Å–ß‚Á‚Ä‚­‚éB
‚Æ‚±‚낪Aæ“ú‚©‚ç‚Ì’x‚­‚È‚éðŒ‚Ńhƒ‰ƒbƒO‚µ‘±‚¯‚½ê‡A’Pƒ‚È usleep() ‚Ì
1–½—ß‚ªAŒÄ‚Ño‚µ‚Ä‚©‚çA‰i‹v‚É–ß‚Á‚Ä‚±‚È‚­‚È‚éBƒhƒ‰ƒbƒO‚ð‚â‚߂邯A
lŠÔ‚ª’·‚­Š´‚¶‚é‚قǂ̒·‚¢ŽžŠÔ‚ªŒo‰ß‚µ‚Ä‚©‚ç–ß‚Á‚Ä‚­‚éB

‚±‚ê‚ÍAWINE‚Ì–â‘è‚ł͂Ȃ­ALinux Kernel ‚Ì–â‘肾‚낤‚©HHH
[]
[‚±‚±‰ó‚ê‚Ă܂·]

493 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 16:45:23.34 ID:9+xI5ulA.net]
‚â‚Á‚½‚±‚Æ‚ð‚à‚¤‚¿‚å‚Á‚ÆÚ‚µ‚­‘‚¢‚Ä‚¨‚­‚ÆA
>>470 ‚Ì X11DRV_MsgWaitForMultipleObjectsEx() ‚ÌŠÖ”‚Ì2”Ô–Ú‚Ì
WaitForMultipleObjectsEx() ‚̌ĂÑo‚µ‚̉ӊ‚ðŽŸ‚Ì—l‚ÉC³‚µ‚Ă݂½B
(FIXME ‚Í‚à‚Á‚Æ•t‚¯‚Ä‚ ‚邪ȗª):
if ( timeout == INFINITE ) {
@@//*’†—ª*
@@for ( ;; ) {@// ‹ê“÷‚Ì polling loop :
@@@@ret = WaitForMultipleObjectsEx( count, handles, bWaitAll,
@@@@@@@@0, // (ms) (Žw’肵‚Ä‚àãŽè‚­s‚©‚È‚¢‚Ì‚Å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) Žd—lã‚ÍA300(ms)Œã‚É–ß‚éB
@@@@FIXME( "returned from usleep\n" ); //(3)
@@}
}
else {
@@ret = WaitForMultipleObjectsEx( count, handles, flags & MWMO_WAITALL,
@@@@@@@@@@@@@@@@@@timeout, flags & MWMO_ALERTABLE );
}

ŠY“–‚ÌðŒ‚ÌŽž‚Ƀ}ƒEƒX‚ð“®‚©‚µ‘±‚¯‚邯A(1)‚̃ƒbƒZ[ƒW‚ªo‚½ŒãA
(3)‚̃ƒbƒZ[ƒW‚ªAŽ–ŽÀãA–³ŒÀ‚ɑ҂Á‚Ä‚ào‚Ä‚±‚È‚­‚È‚Á‚½Bƒhƒ‰ƒbƒO‚µ‚Ä
‚È‚¢‚Æ‚«‚É‚ÍAusleep()‚ÌŽd—l’Ê‚èA300(ms)Œã‚ɃƒbƒZ[ƒW‚ªo‚Ä‚­‚éB

494 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 17:29:11.00 ID:9+xI5ulA.net]
‚©‚È‚èFX‚â‚Á‚½‚‚à‚肾‚¯‚ÇA‚¿‚å‚Á‚Æ‚±‚êˆÈã[“ü‚è‚͓‚¢‚Ì‚ÅA‚à‚¤’ú‚߂悤‚©‚àB
ˆÈ‰º‚Ì㋞‚©‚ç‚·‚邯LinuxƒJ[ƒlƒ‹‚Ì–â‘è‚©‚à’m‚ê‚È‚¢F

1. ƒ^ƒXƒNƒo[‚à‘€ì•s”\‚ɂȂéB
2. ’Pƒ‚È usleep() ‚à–³ŒÀ‚É‹A‚Á‚Ä‚±‚È‚¢B

495 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 17:39:46.66 ID:9+xI5ulA.net]
Wine‚Å‚ÍAÌ‚Ì MSDN Library ‚Ì CD ‚àƒCƒ“ƒXƒg[ƒ‹‚Ío—ˆ‚½‚¾‚ªŒ©‚ç‚ê‚È‚©‚Á‚½B
hh.exe ‚ª xxx.COL ƒtƒ@ƒCƒ‹‚ðŠJ‚¯‚È‚¢‚ÆŒ¾‚Á‚Ä‚­‚éB
yyy.CHM ƒtƒ@ƒCƒ‹‚ÍAŠJ‚­‚±‚Ƃ͂ł«‚½‚ªA‰E‚̃y[ƒ“‚¾‚¯‚ªŒ©‚¦‚ÄA¶‘¤‚Ì–ÚŽŸ‚â
ŒŸõ‚Ì‚Ø[ƒ“‚ɂ͉½‚à•\ަ‚³‚ê‚È‚¢B

¡‰ñ WINE‚̃\[ƒX‚ðŒ©‚ÄŽv‚¤‚Ì‚ÍAˆÓŠO‚Æ‚¿‚á‚ñ‚Æ‘‚©‚ê‚Ä‚¢‚È‚¢‚Æ‚¢‚¤‚±‚ÆB
MsgWaitXxxx ‚É‚àA–ß‚è’l‚ª–¾‚ç‚©‚ÉŠÔˆá‚Á‚Ä‚¢‚é•”•ª‚ð”­Œ©‚µ‚½B
‚Ü‚½ATRUE (1)‚ðˆø”‚É“n‚·•K—v‚ª‚ ‚邯‚±‚ë‚ÅA1‚ł͂Ȃ¢”ñ0 ‚Ì’l‚ð“n‚µ‚Ä‚¢‚é
‰ÓŠ‚àŒ©‚‚©‚Á‚½B‚»‚̂悤‚ȃR[ƒh‚ÍŒãX–â‘è‚𗈂·‚©‚à’m‚ê‚È‚¢B
‚»‚ê‚ÉAMsgWaitXxx ‚à‚¿‚á‚ñ‚Æ‘‚©‚ê‚Ä‚¢‚È‚¢B“¯Žž‚ɑҋ@‚·‚é‚Ì‚ÍAƒAƒvƒŠEƒvƒƒOƒ‰ƒ}
‚ª‚Ç‚ñ‚¾‚¯Šæ’£‚Á‚Ä‚à‚©‚¯‚È‚¢‚©‚ç API ‚ª—pˆÓ‚³‚ê‚Ä‚¢‚é‚Ì‚¾‚ªA‚»‚±‚É–¾‚ç‚©‚È
ƒƒWƒbƒN‚̊ԈႢ‚ª‚ ‚éB

—L–¼‚ȃAƒvƒŠ‚¾‚¯‚Í‚¿‚á‚ñ‚Æ“®ì‚·‚邪AŽÀ‚Í–Í•í‚Ì’ö“x‚ªˆÓŠO‚Æ’á‚¢‚©‚àB
—L–¼‚ȃAƒvƒŠ‚¾‚¯‚Í“®‚­‚悤‚É’²®‚³‚ê‚Ä‚¢‚éEEEB

496 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 18:45:28.30 ID:9+xI5ulA.net]
usleep() ‚Ì•”•ª‚ð setitimer(), pause() ‚ɕς¦‚Ă݂½‚çA‚»‚±‚ÍŽw’肵‚½
ŽžŠÔ‚Å‚¿‚á‚ñ‚Æ‹A‚Á‚Ä‚­‚邿‚¤‚ɂȂÁ‚½B‚Å‚àALinux‘S‘Ì‚ª’âŽ~‚ɋ߂¢ó‘Ô‚É
‚È‚éÇó‚͕ςí‚ç‚È‚¢B’[––“à‚Ì FIXME ‚Ì•\ަ‚ª“r’†‚Ì•¶Žš‚܂ő‚©‚ꂽó‘Ô‚Å
‰üs‚܂ł¢‚­‘O‚É’·‚¢ŠÔ’âŽ~‚·‚錻ۂª‹N‚«‚Ä‚µ‚Ü‚Á‚Ä‚¢‚éB

497 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 23:32:51.41 ID:9+xI5ulA.net]
X Window System ‚ÍAServer ‚Æ Client ‚Å’ÊM‚ðs‚Á‚Ä‚¢‚é‚©‚çAClient‘¤‚ł͈—‚ª
ˆêu‚Å‹A‚Á‚Ä—ˆ‚Ä‚¢‚邿‚¤‚ÉŒ©‚¦‚Ä‚àAServer‘¤‚ł͈—‚ɦ‚­ŽžŠÔ‚ª‚©‚©‚Á‚Ä‚¢‚é‰Â”\«
‚ª‚ ‚é‚©‚à‚µ‚ê‚È‚¢B‚¾‚©‚ç Client‘¤‚ÅAŠÖ”‚̌ĂÑo‚µ‚Ì‘OŒã‚ÌŽžŠÔ‚ðŒv‘ª‚ð‚µ‚Ä‚à
‚»‚ê‚Í’P‚ÉServer ‚ɃRƒ}ƒ“ƒh‚𑗂鈗‚ÌŽžŠÔ‚ðŒv‘ª‚µ‚Ä‚¢‚é‚ɉ߂¬‚È‚¢‚Ì‚©‚à
’m‚ê‚È‚¢BƒCƒ[ƒW‚̃oƒCƒg



498 –¼‘OF”‚ª‘½‚¢‚¢‚Æ‚«‚É‚ÍA’ÊMŽž‚̃f[ƒ^EƒRƒs[‚ÉŽžŠÔ‚ª‚©‚©‚é
‚©‚瑽­ŽžŠÔ‚ª‚©‚©‚é‚©‚à’m‚ê‚È‚¢‚ªA‚»‚ê‚͂܂¾•\–Êã‚ÌŽžŠÔ‚ɉ߂¬‚¸AServer ‘¤‚Í
Shape‚Ì‚­‚蔲‚«ˆ—(?)‚âd‚ˇ‚킹‚̈—‚É–c‘å‚ÈŽžŠÔ‚ª‚©‚©‚Á‚Ä‚¢‚é‰Â”\«‚à”Û’è‚Å‚«‚È‚¢B

‚¾‚©‚çAXCreateBitmapFromData(), XShapeCombineMask(), XPutImage() ‚Ì‘OŒã‚ÌŽžŠÔ‚ð
Œv‘ª‚µ‚Ä‚¢‚邾‚¯‚ł͑¬‚­Œ©‚¦‚Ä‚àAŒ©‚¦‚È‚¢êŠ‚ÅCPUƒpƒ[‚ð‘SŠJ‚É‚µ‚Ä‚ª‚ñ‚΂Á‚Ä‚à
‚Ü‚¾ˆ—‚ðI‚¦‚ĂȂ¢‚Ì‚©‚à‚µ‚ê‚È‚¢B

‚¾‚©‚çALinux Kernel ‚ÍAX Server‚É CPU ƒpƒ[‚ð‘SŠJ‚܂ŗ^‚¦‚悤‚Æ‚µ‚Ä‚¢‚éEEEB
Client‘¤‚ÅŒv‘ª‚µ‚½ŽžŠÔ‚ÍŒ©‚¹‚©‚¯‚ÌŽžŠÔ‚Å‚ ‚Á‚ÄAˆ—‘S‘̂̎žŠÔ‚ł͂Ȃ¢EEEB

‚¾‚©‚çAƒ^ƒXƒNƒo[‚È‚Ç‚à“®‚©‚¸AƒfƒoƒbƒO•\ަ‚Ì’[––‚Ì•¶Žš‚à’†“r”¼’[‚ÈꊂÅWAIT
ó‘ԂɂȂÁ‚Ä‚µ‚Ü‚¤EEEB

‚±‚ꂪ^‘Š‚¾‚낤‚©H
[]
[‚±‚±‰ó‚ê‚Ă܂·]

499 –¼‘OF396 mailto:sage [2018/02/22(–Ø) 23:41:51.80 ID:9+xI5ulA.net]
‚»‚¤‚¢‚¦‚ÎAupdate_surface_region() ‚ªŒÄ‚Ño‚³‚ꂽ‚±‚Æ‚ðŽ¦‚·ƒfƒoƒbƒO•¶Žš—ñ‚ÍAŒã‚©‚ç‚܂Ƃ߂Ä
ƒhƒhƒb‚Æo‚Ä‚­‚éB‚»‚ê‚ÍA•¶Žš—ñ‚ªuo‚ĂȂ¢vŠÔ‚ɂ͊֔‚ªŒÄ‚΂ê‚ĂȂ¢‚±‚Æ‚ðˆÓ–¡‚·‚é
–ó‚ł͂Ȃ­AŽÀ‚͌Ă΂ê‚Ă͂¢‚邪A•¶Žš—ñ‚ª flush ‚³‚ê‚ĂȂ¢‚©A‚Ü‚½‚ÍAflush
‚³‚ê‚Ä‚¢‚Ä‚àA’[––‚É CPU ƒŠƒ\[ƒX‚ªŠ„‚è“–‚Ä‚ç‚ê‚È‚¢‚©‚çA•¶Žš•\ަ‚¾‚¯‚ªs‚í‚ꂸ‚É
•¶Žš—ñ‚ªƒoƒbƒtƒ@‚É—­‚Ü‚Á‚½ó‘ԂɂȂÁ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚éEEEEB

‚±‚¤l‚¦‚ê‚Î’Òå낪‡‚¤‚©‚àB

500 –¼‘OF396 mailto:sage [2018/02/23(‹à) 00:00:03.49 ID:rGoiNTvu.net]
–{‰Æ‚Ì Windows‚Å‚ÍA•`‰æˆ—‚ªd‚¢‚Æ‚«‚É‚ÍAOnPaint ‚â OnDraw ‚ÌŠÖ”‚ªI‚í‚é‚Ü‚Å
‚ÌŽžŠÔ‚à’·‚¢B‚¾‚©‚çAƒƒbƒZ[ƒW‚ª‚½‚­‚³‚ñ‚½‚Ü‚Á‚Ä‚¢‚é‚̂ɕ`‰æ‚ª’Ç‚¢‚‚¢‚Ä‚¢‚È‚¢Ž–‚ÍA
ƒƒbƒZ[ƒWEƒLƒ…[‚ÉŽc‚Á‚Ä‚¢‚郃bƒZ[ƒW‚̌”‚ª‘½‚¢Ž–‚Å‘å‘̂̔»’f‚ª•t‚­B‚¾‚©‚çA
InvalidateRect(NULL)‚ð‚µ‚Ä‚¨‚¯‚ÎA•`‰æ‚ª’Ç‚¢‚‚¢‚ĂȂ¢ê‡‚ÍAƒƒbƒZ[ƒWƒ‹[ƒv
‚ª WM_PAINTƒƒbƒZ[ƒW‚ð‘—‚éƒ^ƒCƒ~ƒ“ƒO‚ðŽ©“®“I‚ÉŒã‰ñ‚µ‚É‚µ‚Ä‚­‚ê‚éB

‚Æ‚±‚낪AX Window System ‚Ìê‡AŽÀÛ‚Ì•`‰æ‚ª‚Ü‚¾I‚í‚Á‚ĂȂ¢ê‡‚Å‚àA
u•`‰æŠÖ”vŽ©‘͈̂êu‚É‚µ‚Ä–ß‚Á‚Ä‚«‚Ä‚µ‚Ü‚¤‚©‚çAã‹L‚̃Aƒ‹ƒSƒŠƒYƒ€‚ªuЍˆá‚¢v‚ð
‹N‚±‚µ‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚ ‚éEEEB

‚»‚ç‚Ɉ«‚¢Ž–‚ÉAWINE‚ªA“à•”‚Å Surface ‚ðŽ‚Á‚Ä‚¢‚邯‚«‚É‚ÍALineTo ŠÖ”Ž©‘̂͂‘¬‚É
ˆ—‚ðI‚¦‚é‚Ì‚ÉAƒAƒvƒŠ‚ª—\‘z‚à‚µ‚È‚¢ƒ^ƒCƒ~ƒ“ƒO‚ÅAŽžŠÔ‚ÌŠ|‚©‚é flush ‚̈—‚ªs‚í‚ê
‚Ä‚µ‚Ü‚¤B

‚»‚¤‚·‚邯AOnPaint ‚Í‚‘¬‚ÉI‚í‚Á‚½‚ÆŠ¨ˆá‚¢‚µ‚ÄAWM_PAINT ƒƒbƒZ[ƒW‚ªAƒ}ƒEƒXEƒƒbƒZ[ƒW‚É
Š®‘S‚ɘA“®‚µ‚Ä‘å—ʂɶ¬‚³‚ê‚Ä‚µ‚Ü‚¤B‚·‚邯APending ó‘Ô‚Ì X Window ‚̈—‚ª‚Ç‚ñ‚Ç‚ñ
‘Ò‚¿s—ñ‚É—­‚Ü‚Á‚Ä‚¢‚Á‚Ä‚µ‚Ü‚¤B

ƒhƒ‰ƒbƒO’†‚ÍAWM_PAINT ‚ª•bŠÔ20‰ñ‚à‘—‚ç‚ê‚é‚Ì‚ÉAServer ‚ªŽÀÛ‚Ì•`‰æ‚ðI‚¦‚é‚Ì‚ÍA
‚»‚̉½\”{‚àŽžŠÔ‚ª‚©‚©‚Á‚Ä‚µ‚Ü‚¤B

‚±‚ñ‚ÈŠ´‚¶‚¾‚낤‚©B

501 –¼‘OF396 mailto:sage [2018/02/23(‹à) 00:09:19.71 ID:rGoiNTvu.net]
‚³‚ç‚ÉA>>466-467, >>469 ‚É‘‚¢‚½AWINPOS_SysCommandSizeMove() ‚ÍA
CWinApp ‚ȂǂƂ͕ʂÌA“ÆŽ©‚̃ƒbƒZ[ƒWƒ‹[ƒv‚ðŽ‚Á‚Ä‚¢‚éB
‚»‚±‚Å‚ÍA‚³‚ç‚ÉAWM_PAINT ‚ª•s“K؂ɑå—ʂɔ­¶‚µ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚é
‰Â”\«‚ª‚ ‚éB

‚¾‚ñ‚¾‚ñ•ª‚©‚Á‚Ä‚«‚½‚©‚àB

502 –¼‘OF396 mailto:sage [2018/02/23(‹à) 00:23:13.75 ID:rGoiNTvu.net]
Œ´ˆö‚Í„’è‚Å‚«‚Ä‚«‚½‚¯‚ÇA‚³‚ÄA‚Ç‚¤‚â‚Á‚Ä‚±‚ê‚ð‰ðŒˆ‚·‚ê‚΂¢‚¢‚©EEEB

503 –¼‘OFlogin:Penguin mailto:sage [2018/02/23(‹à) 09:55:12.25 ID:o5jNB0tx.net]
ƒ‰ƒCƒZƒ“ƒX‚ÌŠÖŒW‚Å‚â‚₱‚µ‚¢‚±‚Ƃɬ‚é‰Â”\«‚ª‘¶Ý‚·‚é‚©‚ç
‚Tch‚Öƒ\[ƒXƒR[ƒh‚Í‘‚©‚È‚¢‚Å
‚‡‚‰‚”‚ˆ‚•‚‚Žg‚Á‚½‚Ù‚¤‚ª‚¢‚¢

504 –¼‘OFlogin:Penguin mailto:sage [2018/02/23(‹à) 10:10:14.53 ID:53V98ywt.net]
—±“x‚Ì’á‚¢ƒpƒbƒ`‚ð‚¿‚å‚±‚¿‚傱ƒAƒbƒv‚·‚邯—Ç‚¢‚̂łÍB
˜_—’l‚Ì‚ ‚â‚Ü‚è‚𒼂·‚â‚‚Ƃ©B

505 –¼‘OF396 mailto:sage [2018/02/23(‹à) 12:30:36.00 ID:rGoiNTvu.net]
>>484
‚»‚ê‚Å‚ÍA“ú–{l‚ÌŽ©•ª‚ÉŽæ‚Á‚ÄŽè‚à‘«‚à‚łȂ¢ó‹µ‚ɂȂÁ‚Ä‚µ‚Ü‚¤‚Ì‚ÅA‚ƂĂà
¢‚è‚Ü‚·B

506 –¼‘OFlogin:Penguin mailto:sage [2018/02/23(‹à) 12:34:30.91 ID:o5jNB0tx.net]
>>486
‚È‚ºH
ƒRƒR‚É‘‚¯‚Ζâ‘肪¶‚¶‚é‰Â”\«‚à‚ ‚é‚Ì‚É

507 –¼‘OF396 mailto:sage [2018/02/23(‹à) 12:36:23.19 ID:rGoiNTvu.net]
‹¦—Í‚µ‚É‚­‚­‚µ‚É‚­‚­‚È‚é‚æ‚¤‚ÉŽdŒü‚¯‚ç‚ê‚ÄA‚Ç‚¤‚µ‚悤‚à‚È‚¢ó‘ԂɂȂÁ‚Ä‚é‹C‚à‚·‚éB
makeŽž‚Ì•\ަ‚Ì–³‘Ê‚ª‘½‚·‚¬‚ÄA“Á‚ÉŒx‚ªo‚Ä‚¢‚Ä‚àŒ©“¦‚µ‚â‚·‚¢‚µAHDD‚à–c‘å‚É
Á”ï‚·‚邵Aƒ_ƒEƒ“ƒ[ƒh‚âƒAƒbƒvƒ[ƒh‚É‚à”œ‘å‚ÈŽžŠÔ‚ª‚©‚©‚邵B

‚È‚ñ‚¾‚©AƒAƒƒŠƒJ‚Æ–k‰¢‚̎Љï“IŠÂ‹«ˆÈŠO‚ł͂ƂÁ‚Ä‚à•‰’S‚ª‘å‚«‚¢‚©‚àA



508 –¼‘OF396 mailto:sage [2018/02/23(‹à) 12:36:59.52 ID:rGoiNTvu.net]
>>487
ˆÓ–¡‚ª•ª‚©‚è‚Ü‚¹‚ñB

509 –¼‘OFlogin:Penguin mailto:sage [2018/02/23(‹à) 12:38:43.64 ID:o5jNB0tx.net]
>>489
‚±‚±‚Ƀ\[ƒXƒR[ƒh‚𑂯‚Î5ch‚ªŒ —˜‚ðŽå’£‚·‚é‹°‚ꂪ‚ ‚é
‚ ‚È‚½‚ª‘‚¢‚½‚à‚̂ł ‚Á‚Ä‚à
‚»‚ê‚Í–â‘è‚Å‚µ‚傤H






[ ‘±‚«‚ð“Ç‚Þ ] / [ Œg‘єŠ]

‘O100 ŽŸ100 ÅV50 £ [ ‚±‚̃XƒŒ‚ðƒuƒbƒNƒ}[ƒNI Œg‘тɑ—‚é ] 2ch‚Ìread.cgi‚Ö
[{” ŋߗ§‚Á‚½ƒXƒŒ•”M‚¢ƒXƒŒˆê—— : {” ŋߗ§‚Á‚½ƒXƒŒ^‹LŽÒ•ʈꗗ]i LÍMjƒ284KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
’S“–:undef