#include <string.h>
#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "RePasteURL";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
  HWND hwnd;
  MSG messages;
  WNDCLASSEX wincl = {0};
  wincl.hInstance = hInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.cbSize = sizeof(WNDCLASSEX);
  if(!RegisterClassEx(&wincl)) return 0;
  hwnd = CreateWindowEx(WS_EX_TOOLWINDOW, szClassName, 0, 0, CW_USEDEFAULT,
                        CW_USEDEFAULT, 0, 0, 0, 0, hInstance, 0);
  if(!hwnd) return(0);
  while(GetMessage(&messages, 0, 0, 0))
     DispatchMessage(&messages);
  return messages.wParam;
}

/***********************************************************/

HANDLE hNextCB;
HANDLE cbData;
char buffer[2048], buffer2[2048];
char *bufptr, *buf2ptr, *cptr;

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch(message)
    {
     case WM_CREATE:
        hNextCB  = SetClipboardViewer(hwnd);
        SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
        break;

     case WM_CHANGECBCHAIN:
        if(hNextCB == (HWND)wParam)
          hNextCB = (HWND)lParam;
        if(hNextCB)
          SendMessage((HWND)hNextCB, WM_CHANGECBCHAIN, wParam, lParam);
        break;

     case WM_DRAWCLIPBOARD:
        if(hNextCB)
          SendMessage((HWND)hNextCB, WM_DRAWCLIPBOARD, (WPARAM)0, (LPARAM)0);
        if(IsClipboardFormatAvailable(CF_TEXT)  && (GetKeyState(VK_SHIFT) & 0X7000) && !(GetKeyState(VK_DELETE) & 0X7000))
          {
            ZeroMemory((void *)buffer, 2048);
            ZeroMemory((void *)buffer2, 2048);
            if(OpenClipboard(0))
              {
                cbData = GetClipboardData(CF_TEXT);
                if(cbData)
                  {
                    cptr = (char *)GlobalLock(cbData);
                    if(cptr)
                      {
                        strncpy(buffer, cptr, 2047);
                        GlobalUnlock(cbData);
                        CloseClipboard();
                        bufptr = buffer;
                        buf2ptr = buffer2;
                        while(*bufptr != '\0')
                          {
                            while((*bufptr == '\r') || (*bufptr == '\n') || (*bufptr == ' '))
                               bufptr++;
                            *buf2ptr++ = *bufptr++;
                          }
                        ShellExecute(0, "open", buffer2, 0, 0, SW_SHOW);
                      }
                     else CloseClipboard();
                  }
               SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
              }
          }
        break;

     case WM_CLOSE:
        ChangeClipboardChain(hwnd, (HWND)hNextCB);
        break;

     case WM_DESTROY:
        PostQuitMessage(0);
        break;

     default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
