Dear WINE developers,
I develop an MS windows app and just got it
working under
WINE/Linux. It's call LTspice/SwitcherCADIII. It's
a
free schematic capture/SPICE simulator obtainable from
www.linear.com/software.
I've noticed a few things about WINE that might
help you
improve it. WINE can confuse SendMessage() with
PostMessage().
LTspice uses SendMessage to handshake between
threads
sometimes. Wine usually obeys the difference, but
treated
some SendMessage calls like a PostMessage. My
workaround
was to poll volatile global
variables.
I needed to add some redraws to clear up some
differences
between WINE and Windows dialog box updates. This was
for
a tab control that make different controls on the
pane
visible or not depending on tab selection.
Also LTspice
draws directly to the screen and carefully counts the
number
of times it XOR'ed something with the screen. That
behaved a bit
different between WINE and Windows. Again,
I found workarounds for
most of it. I'm not sure, but maybe
it's just a difference between
obeying the SetROP2() setting
for CDC::SetPixel() calls.
The version of LTspice I put up on the web today,
2.01c,
works quite well under WINE/Linux. The main problem
with it
is that the RoboHelp isn't working. Any advice
there?
A few other WINE issues:
1. The icons drawn on Property sheet tabs
have a black
background in WINE. In Windows it's the
background
color. You can see the problem on the
Tools=>Control
Panel tab icons.
2. The resize grip on the lower right hand
corner of resizeable
dialogs is drawn like a
scrollbar. The "proper" windows
method to draw these
resize grips is to use a scroll bar
created like
this:
CScrollBar m_Grip;
char OldResizableGrip[] =
"OldResizableGrip";
LRESULT CALLBACK GripWindowProc(HWND
hwnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
if(WM_NCHITTEST ==
msg)
return(HTBOTTOMRIGHT); // the mouse cursor that goes with a grip on the bottom
right of a window
HANDLE oldWndProc =
GetProp(hwnd, OldResizableGrip);
if(WM_DESTROY == msg) //
unsubclass
{
RemoveProp(hwnd,
OldResizableGrip);
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)
oldWndProc);
}
return(CallWindowProc((WNDPROC)
oldWndProc, hwnd, msg, wParam,lParam));
}
BOOL
CSelectWaveformsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetAllListBoxItems();
CRect rect(0, 0,
GetSystemMetrics(SM_CXVSCROLL),GetSystemMetrics(SM_CYHSCROLL));
m_Grip.Create(WS_CHILD | WS_CLIPSIBLINGS | SBS_SIZEGRIP | WS_VISIBLE,rect, this,
AFX_IDW_SIZE_BOX);
CWnd *resizeWnd =
GetDlgItem(AFX_IDW_SIZE_BOX);
if(resizeWnd)
{
CRect rect,
rect2;
resizeWnd->GetWindowRect(&rect);
GetClientRect(rect2);
rect2.left = rect2.right -
rect.Width();
rect2.top = rect2.bottom -
rect.Height();
resizeWnd->MoveWindow(&rect2,
FALSE);
::SetProp(m_Grip, OldResizableGrip,
(HANDLE)
::GetWindowLong(m_Grip,
GWL_WNDPROC));
::SetWindowLong(m_Grip, GWL_WNDPROC, (LONG)
GripWindowProc);
}
return(TRUE);
}
3. Function key F6 is not
trapped.
4. The cursor colors are off. For
example, the voltage probe
cursor should have a red
body. In WINE it's black. The sleeve
of the
pointing hand is blue, in WINE it's black.
5. Font's aren't always correct.
There's two types for schematics, "Arial"
and "New
Courier". The Arial can become italic depending on the
size
required.
I would like to know if there is a way to
determine if my app is running
under WINE under runtime. That way I can
work around more of these
problems without imparing its performance under MS
Windows. If you know
the answer, please e-mail me
directly.