Beispiel #1
0
static VOID _wmActive(PGROPDATA pGrop, BOOL fActive)
{
  if ( pGrop->fFullscreen )
  {
    if ( fActive )
    {
      _setFullscreen( pGrop, pGrop->ulModeIdx );
      pGrop->pVideoSys->fnUpdate( pGrop->pVSData, pGrop, 0, NULL );
    }
    else
    {
      _setDesktop( pGrop );

      _captureMouse( pGrop, FALSE );
      WinShowWindow( pGrop->hwndFrame, FALSE );
    }
  }
  else
    _captureMouse( pGrop, pGrop->fCapture && fActive );

  pGrop->fActive = fActive;

  if ( pGrop->stCallback.fnActive != NULL )
    pGrop->stCallback.fnActive( pGrop, GROUP_ACTIVATE_WINDOW, fActive );
}
void
KnotPropertiesDialog::_close()
{
    _setDesktop(NULL);
    destroy_();
    Glib::signal_idle().connect(
        sigc::bind_return(
            sigc::bind(sigc::ptr_fun(&::operator delete), this),
            false 
        )
    );
}
KnotPropertiesDialog::~KnotPropertiesDialog() {

    _setDesktop(NULL);
}
Beispiel #4
0
MRESULT EXPENTRY wndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
  PGROPDATA            pGrop = (PGROPDATA)WinQueryWindowULong( hwnd, 0 );

  switch( msg )
  {
    case WM_ACTIVATE:
        _wmActive( pGrop, (BOOL)mp1 );
      break;

    case WM_SETFOCUS:
      if ( pGrop->stCallback.fnActive != NULL )
        pGrop->stCallback.fnActive( pGrop, GROUP_ACTIVATE_FOCUS,
                                    LONGFROMMP(mp2) );
      break;

    case WM_DESTROY:
      break;

    case WM_CLOSE:
/*      if ( ( pGrop->stCallback.fnClose != NULL ) &&
           !pGrop->stCallback.fnClose( pGrop ) )
        return (MRESULT)FALSE;*/

      if ( pGrop->fFullscreen && pGrop->fActive )
        _setDesktop( pGrop );

      _captureMouse( pGrop, FALSE );
      break;

    case WM_PAINT:
      {
        RECTL   rctl;
        HPS     hps;

        hps = WinBeginPaint( hwnd, 0, &rctl );
        WinFillRect( hps, &rctl, CLR_BLACK );
        WinEndPaint( hps );

        if ( pGrop->fInternalResize )
          debugCP( "WM_PAINT & fInternalResize" );
//        else
          pGrop->pVideoSys->fnUpdate( pGrop->pVSData, pGrop, 0, NULL );
      }
      return (MRESULT)FALSE;

    case WM_SIZE:
      if ( pGrop->lSkipWinResize > 0 )
      {
        pGrop->lSkipWinResize--;
        break;
      }

      if ( !pGrop->fFullscreen && !pGrop->fInternalResize && pGrop->fActive &&
           (pGrop->stUserMode.ulFlags & GROP_MODEFL_RESIZABLE) != 0 &&
           pGrop->stCallback.fnSize != NULL )
        pGrop->stCallback.fnSize( pGrop, SHORT1FROMMP(mp2), SHORT2FROMMP(mp2) );
      break;

    case WM_VRNENABLED:
      _calcViewRect( pGrop, FALSE );
      _setVisibleRegion( pGrop, TRUE );
      return (MRESULT)TRUE;

    case WM_VRNDISABLED:
      _setVisibleRegion( pGrop, FALSE );
      return (MRESULT)TRUE;

    case WM_MOUSEMOVE:
      if ( pGrop->lSkipMouseMove > 0 )
        pGrop->lSkipMouseMove--;
      else
      {
        if ( pGrop->fInternalResize )
          debugCP( "WM_MOUSEMOVE & fInternalResize" );

        _wmMouseMove( pGrop, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1) );
      }
      return (MRESULT)FALSE;

    case WM_BUTTON1DOWN:
    case WM_BUTTON1DBLCLK:
      _wmMouseButton( pGrop, 0, TRUE );
      break;

    case WM_BUTTON1UP:
      _wmMouseButton( pGrop, 0, FALSE );
      break;

    case WM_BUTTON2DOWN:
    case WM_BUTTON2DBLCLK:
      _wmMouseButton( pGrop, 1, TRUE );
      break;

    case WM_BUTTON2UP:
      _wmMouseButton( pGrop, 1, FALSE );
      break;

    case WM_BUTTON3DOWN:
    case WM_BUTTON3DBLCLK:
      _wmMouseButton( pGrop, 2, TRUE );
      break;

    case WM_BUTTON3UP:
      _wmMouseButton( pGrop, 2, FALSE );
      break;

    case WM_TRANSLATEACCEL:
      // ALT and acceleration keys not allowed (must be processed in WM_CHAR)
      if ( mp1 == NULL || ((PQMSG)mp1)->msg != WM_CHAR )
        break;
      return (MRESULT)FALSE;

    case WM_CHAR:
      if ( pGrop->stCallback.fnKeyboard != NULL )
      {
        ULONG          ulFlags = SHORT1FROMMP(mp1);  // WM_CHAR flags

        pGrop->stCallback.fnKeyboard(
          pGrop, (ulFlags & KC_SCANCODE) == 0 ? 0 : CHAR4FROMMP(mp1),
          (ulFlags & KC_CHAR) == 0 ? 0 : SHORT1FROMMP(mp2), ulFlags );
      }
      return (MRESULT)TRUE;

    case WM_GROP_QUERY:
      _wmGropQuery( pGrop, (PGROPQUERY)PVOIDFROMMP(mp1) );
      return (MRESULT)TRUE;
  }

  return WinDefWindowProc( hwnd, msg, mp1, mp2 );
}
Beispiel #5
0
static BOOL _setMode(PGROPDATA pGrop, ULONG ulModeIdx, BOOL fFullscreen)
{
  PVIDEOMODE           pMode = &pGrop->stModes.pList[ulModeIdx];
  // fFirstTime - Mode was not selected, mode will be set first time.
  BOOL                 fFirstTime = pGrop->ulModeIdx == ~0;
  RECTL                rectl;
  LONG                 lX, lY, lW, lH;
  BOOL                 fSuccess = TRUE;

  if ( fFirstTime )
  {
    pGrop->swpOld.x = pGrop->ulDTWidth / 2;
    pGrop->swpOld.y = pGrop->ulDTHeight / 2;
  }

  fFullscreen &= ( pGrop->stUserMode.ulWidth <= pMode->ulWidth ) &&
                 ( pGrop->stUserMode.ulHeight <= pMode->ulHeight );

  if ( fFullscreen )
  {
    if ( pGrop->fActive || fFirstTime )
    {
      // Is the fullscreen and not on the descktop now - change fulscreen mode.

      if ( !pGrop->fFullscreen && !fFirstTime )
        // Save windows position before switching to full-screen mode.
        WinQueryWindowPos( pGrop->hwndFrame, &pGrop->swpOld );

      // Do not change FS mode if it is the same as the current one.
      fSuccess = ( pGrop->fFullscreen && ( pGrop->ulModeIdx == ulModeIdx ) ) ||
                 _setFullscreen( pGrop, ulModeIdx );
    }
    // else: FS mode but on the desktop now, change mode later in _wmActive().

    pGrop->ulModeIdx = ulModeIdx;
    pGrop->fFullscreen = TRUE;
  }
  else //if ( pGrop->fFullscreen || ( pGrop->ulModeIdx != ulModeIdx ) )
  {
    // Change window if mode is not same as the current one.

    if ( pGrop->fFullscreen )
    {
      debug( "Return to the desktop..." );
      _setDesktop( pGrop );
    }

    debug( "Calc new window size..." );
    rectl.xLeft = 0;
    rectl.yBottom = 0;
    rectl.xRight = pGrop->stUserMode.ulWidth;
    rectl.yTop = pGrop->stUserMode.ulHeight;
    WinCalcFrameRect( pGrop->hwndFrame, &rectl, FALSE );
    lW = rectl.xRight - rectl.xLeft;
    lH = rectl.yTop - rectl.yBottom;

    if ( !pGrop->fFullscreen && !fFirstTime )
    {
      // Positioning relative to the current location.
      debug( "Query current window position..." );
      WinQueryWindowPos( pGrop->hwndFrame, &pGrop->swpOld );
    }
    else
      debug( "Window's location will be relative to the location before FS." );

    lX = pGrop->swpOld.x + (pGrop->swpOld.cx / 2) - (lW / 2);
    lY = pGrop->swpOld.y + (pGrop->swpOld.cy / 2) - (lH / 2);

    if ( lW > pGrop->ulDTWidth )
      lX = (pGrop->ulDTWidth / 2) - ( lW / 2);
    else if ( (lX + lW) > pGrop->ulDTWidth )
      lX = pGrop->ulDTWidth - lW;
    else if ( lX < 0 )
      lX = 0;

    if ( lY < 0 )
      lY = 0;
    if ( (lY + lH) > pGrop->ulDTHeight )
      lY = pGrop->ulDTHeight - lH;

    pGrop->ulModeIdx = ulModeIdx;
    pGrop->fFullscreen = FALSE;

    debug( "Set window position..." );
    pGrop->fInternalResize = TRUE;
    WinSetWindowPos( pGrop->hwndFrame, HWND_TOP, lX, lY, lW, lH,
       fFirstTime ? SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE
                  : SWP_MOVE | SWP_SIZE | SWP_SHOW );
    pGrop->fInternalResize = FALSE;

    debug( "Call _captureMouse(,%s)...", pGrop->fCapture ? "TRUE" : "FALSE" );
    _captureMouse( pGrop, pGrop->fCapture );
  }

  debug( "Call _calcViewRect(,FALSE)..." );
  _calcViewRect( pGrop, FALSE );
  debug( "Call pVideoSys->fnUpdate()..." );
  pGrop->pVideoSys->fnUpdate( pGrop->pVSData, pGrop, 0, NULL );

  return fSuccess;
}