WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / RNAforester / g2-0.70 / src / Win32 / g2_win32_thread.c
diff --git a/binaries/src/ViennaRNA/RNAforester/g2-0.70/src/Win32/g2_win32_thread.c b/binaries/src/ViennaRNA/RNAforester/g2-0.70/src/Win32/g2_win32_thread.c
new file mode 100644 (file)
index 0000000..7c31536
--- /dev/null
@@ -0,0 +1,213 @@
+/*****************************************************************************
+**  Copyright (C) 1998-2001  Ljubomir Milanovic & Horst Wagner
+**  This file is part of the g2 library
+**
+**  This library is free software; you can redistribute it and/or
+**  modify it under the terms of the GNU Lesser General Public
+**  License as published by the Free Software Foundation; either
+**  version 2.1 of the License, or (at your option) any later version.
+**
+**  This library is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+**  Lesser General Public License for more details.
+**
+**  You should have received a copy of the GNU Lesser General Public
+**  License along with this library; if not, write to the Free Software
+**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+******************************************************************************/
+
+#include <windows.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "g2_win32_P.h"
+
+#include "resource.h"
+
+
+
+int WINAPI About(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam)
+{
+       switch (message){
+       case WM_INITDIALOG:
+               return TRUE;
+
+       case WM_COMMAND:
+               if (wParam == IDOK)
+                       EndDialog(hDlg,wParam);
+               break;
+       }
+
+       return FALSE;
+}
+
+
+
+LRESULT CALLBACK g2_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+       PAINTSTRUCT ps;
+       HDC hDC;
+       RECT Rect;
+       struct  g2_win32_STRUCT *pdp;
+
+       pdp = (struct g2_win32_STRUCT *)GetWindowLong(hWnd, GWL_USERDATA);
+       switch (message) { 
+
+               case WM_PAINT:
+                       if (pdp == NULL) break;
+                       if (pdp->hBitmap == NULL) break;
+
+//                     printf("Received WM_PAINT\n");
+
+                       hDC = BeginPaint (hWnd, &ps);
+                       GetClientRect(hWnd,&Rect);
+                       BitBlt( hDC, Rect.left, Rect.top, Rect.right - Rect.left, 
+                       Rect.bottom - Rect.top, pdp->hMemDC, 0, 0, SRCCOPY );
+                       EndPaint (hWnd, &ps);
+                       return 0L;
+
+               case WM_DESTROY:
+
+//                     printf("Received WM_DESTROY\n");
+                       g2_win32_Cleanup(0,pdp);
+                       ExitThread(0);
+                       return 0L;
+                       
+               case WM_COMMAND:
+                       switch(LOWORD(wParam)){
+                       
+                       case ID_FILE_COPY:
+                               if (OpenClipboard(hWnd))
+                   {
+                    HBITMAP     hBitmap;
+                   
+                    EmptyClipboard();
+
+                    if (pdp->hBitmap)
+                        {
+                        if (hBitmap = CopyImage(pdp->hBitmap,IMAGE_BITMAP,
+                                                                                               0,0,LR_COPYRETURNORG));
+                            SetClipboardData(CF_BITMAP, hBitmap);
+                        }
+                                       CloseClipboard();
+                    }
+            return 0L;
+
+                       case ID_FILE_ABOUT:
+                               if(DialogBox(g2res_DLL,"ABOUTBOX",hWnd,(DLGPROC)About) == -1)
+                                       errhandler("Failed to create Dialogbox",NULL);
+                               return 0L;
+
+                       case ID_FILE_CLOS:
+                               g2_win32_Delete(0,pdp);
+                               return 0L;
+
+                       default:
+                               return (DefWindowProc(hWnd, message, wParam, lParam));
+                       }
+
+               default:
+                       return (DefWindowProc(hWnd, message, wParam, lParam));
+       }
+/* we should never get here */
+return -1;
+}
+
+long WINAPI g2_StartThread(struct g2_win32_STRUCT *pdp)
+{
+RECT   Rect;
+HWND hWnd;
+MSG msg;
+HDC hDC;
+HMENU hmenu;
+DWORD style;
+RECT frame;
+
+hmenu = NULL;
+if (g2res_DLL != NULL)
+       {
+       hmenu = LoadMenu(g2res_DLL,"G2WIN32");
+       if (hmenu == NULL) errhandler("Load menu failed",NULL);
+       }
+
+style = WS_POPUPWINDOW |WS_OVERLAPPED | WS_CAPTION |  WS_MINIMIZEBOX;
+frame.left = 0;
+frame.top = 0;
+frame.right = pdp->nWidth;
+frame.bottom = pdp->nHeight - ((hmenu==NULL)?GetSystemMetrics(SM_CYMENU):0);
+
+AdjustWindowRect(&frame,style,1);
+
+/* Save the instance handle in static variable, which will be used in  */
+/* many subsequence calls from this application to Windows.            */
+
+  /* Create a main window for this application instance.  */
+pdp->hinst = GetModuleHandle(NULL);
+
+hWnd = CreateWindow(
+        "g2Window",           // See RegisterClass() call.
+        pdp->title,             // Text for window title bar.
+        style,
+        pdp->x, pdp->y,
+        frame.right - frame.left,   // width
+        frame.bottom - frame.top,   // height
+        NULL,                  // Overlapped windows have no parent.
+        hmenu,                 // Use the window class menu.
+        0,                     // This instance owns this window.
+        NULL                   // Pointer not needed.
+  );
+  // If window could not be created, return "failure" 
+if (!hWnd)
+        {
+        errhandler("CreateWindow",NULL);
+        return (FALSE);   // return failure :((
+        }
+
+#define WIDTH(x)       (x.right-x.left+1)      // Macro to get rect width
+#define HEIGHT(x)      (x.bottom-x.top+1)      // Macro to get rect height
+
+// How big is the window?
+GetClientRect( hWnd, &Rect );
+
+// Need a DC
+hDC = GetDC( hWnd );
+SetBkColor(hDC,RGB(255,255,255));
+// Create a bitmap big enough to hold the window's image
+pdp->hBitmap = CreateCompatibleBitmap( hDC, WIDTH(Rect), HEIGHT(Rect) );
+// printf("memdc size: %d %d\n",WIDTH(Rect),HEIGHT(Rect));
+// Create MemDC
+pdp->hMemDC = CreateCompatibleDC(hDC);
+SelectObject( pdp->hMemDC, pdp->hBitmap );
+// clean up
+ReleaseDC( hWnd, hDC );
+#undef WIDTH
+#undef HEIGHT
+
+
+
+SetWindowLong(hWnd, GWL_USERDATA, (long)pdp); 
+ pdp->hwndThreadWindow = hWnd;
+ // Make the window visible; update its client area; and return "success" 
+ ShowWindow(hWnd, SW_SHOWDEFAULT); // Show the window
+ UpdateWindow(hWnd);     // Sends WM_PAINT message
+ //printf("pdp->messageloop ->= 1;\n");
+ pdp->messageloop = 1;
+ //printf("pdp->messageloop = 1;\n");
+ while (GetMessage(&msg, NULL, 0, 0)) {
+        TranslateMessage(&msg);
+               DispatchMessage(&msg);
+    }
+
+ return (TRUE);        // Returns success  :)
+}
+
+
+