[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[meadow-develop:1998/382]menubar and minibuffer.



新年早々うるさいこと言うかも知れませんが、
ちょっと大目に見て下さい。

Tatsuya Ichikawa <t-ichi@xxxxxxxxxxxxxxxxx> writes:

>   ところで、以前から Meadow で懸案になっていた Menubar が2行になったとき
>   Minibuffer も2行になってしまうという問題を Quick Hack ですがパッチを
>   作ってみました。
>   Magic Number が使ってあっったりしてきたないパッチですが himi さん、試して
>   みていただけますか??

ちょっとわからないところがたくさんありますので、
すみませんが、確認してみて下さい。

> [2 patch1 <application/octet-stream (7bit)>]
> --- mw32fns.c.orig	Thu Dec 18 07:58:15 1997
> +++ mw32fns.c	Sat Jan 03 17:57:11 1998
> @@ -47,7 +47,13 @@
>  extern HINSTANCE hprevinst;
>  extern LPSTR lpCmdLine;
>  extern int nCmdShow;
> -    
> +
> +/* TEST T.Ichikawa */
> +#ifdef MEADOW
> +static int menubar_state = 0;
> +#endif
> +/* TEST T.Ichikawa */
> +

ここ、menubar_stateはFrame毎に持つべきデータですね。
これではまずいです。
f->output_data.w32の中に封じ込めて下さい。
私としては、frame_change_stateの上位ビットでも使うべきだと
思います。

>  #define EMACS_RESOURCE_CLASS "Emacs"
>  
>  /* Title name and application name for X stuff. */
> @@ -2214,13 +2220,18 @@
>    case WM_WINDOWPOSCHANGED:
>  	
>      if (!f->async_iconified && f->async_visible &&
> -	f->output_data.w32->frame_change_state != 2)
> +	f->output_data.w32->frame_change_state < 2)
> +      /* To adjust window correctly,
> +	 we must check size of the window twice
> +	 (strictly speaking number of dimention),
> +	 thus, width and height. */
>        {
>  	LPWINDOWPOS lppos = (LPWINDOWPOS) lParam;
>  
> -	f->output_data.w32->frame_change_state = 2;
> +	f->output_data.w32->frame_change_state++;
>  
> -	if (!(lppos->flags & SWP_NOSIZE))
> +	if ((!(lppos->flags & SWP_NOSIZE)) ||
> +	    (lppos->flags & SWP_DRAWFRAME))
>  	  {
>  	    RECT rect;
>  	    int wdiff;
> @@ -2228,7 +2239,6 @@
>  
>  	    GetClientRect (hwnd, &rect);
>  
> -
>  #ifdef MW32_FONT
>  	    wdiff = ((rect.right - rect.left) -
>  		     f->output_data.w32->vertical_scroll_bar_extra) %
> @@ -2244,7 +2254,24 @@
>  	    if (wdiff || hdiff)
>  	      {
>  		rect.right = lppos->cx - wdiff;
> -		rect.bottom = lppos->cy - hdiff;
> +/* TEST - T.Ichikawa */
> +		if((f->output_data.w32->frame_change_state < 2) &&

この条件、不要ではありませんか?

> +		   (menubar_state == 2) &&
> +		   (lppos->flags == 0x37)){

うるさいようですが、GNUのcoding styleにそろえて下さると
嬉しいです。(RMSが認めてくれましぇん。;_;)

それと、lppos->flagsの使い方に問題があります。
Win32APIはDocumentに書かれている以外のことをすると
著しく移植性が落ちます。
(書かれていることをやってもだめなことが多いのですが:-P)
将来lppos->flagsの新しいbitが使われたとき動作しなくなります。

それから、一般的に、定数値を参照するときには
定義済みの値SWP_???などを使って下さい。
直接、値を書き込むと非常にソースが読みにくくなります。
# 例外はROP(Raster OPeration)

それで、
SWP_DRAWFRAME | SWP_NOACTIVATE  | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE
ですか。
うーん、どういう状況を意図しているのか、さっぱり分かりません。

> +		  rect.bottom = lppos->cy + f->output_data.w32->line_height - 5;

ここ、どうして5なんですか?

> +		  menubar_state = 0;
> +		} else if (lppos->flags == 0x04){
> +		  rect.bottom = lppos->cy + f->output_data.w32->line_height - 13;

同じく、どうして13なんですか?
あと、SWP_NOZORDERである時という理由も分かりません。

> +		  SetWindowPos (hwnd, NULL, 0, 0,
> +				rect.right, rect.bottom,
> +				SWP_NOZORDER | SWP_NOMOVE);

これは、不要ではありませんか?

> +		  menubar_state = (menubar_state >= 2) ? 2 : menubar_state + 1;
> +		  return 0;

このreturn 0;もとってしまえば、

> +		} else {
> +		  rect.bottom = lppos->cy - hdiff;
> +		  menubar_state = (menubar_state >= 2) ? 2 : menubar_state + 1;
> +		}
> +/* TEST T.Ichikawa */
>  		SetWindowPos (hwnd, NULL, 0, 0,
>  			      rect.right, rect.bottom,
>  			      SWP_NOZORDER | SWP_NOMOVE);
> @@ -2252,9 +2279,7 @@
>  	      }
>  	  }
>        }
> -
> -    if (f)
> -      f->output_data.w32->frame_change_state = 0;
> +    f->output_data.w32->frame_change_state = 0;
>  
>      goto dflt;
>  #endif

From himi