static HPOINTER GetIcon(nsCString& file, bool fExists,
                        bool fMini, bool *fWpsIcon)
{
  HPOINTER hRtn = 0;
  *fWpsIcon = false;

  if (file.IsEmpty()) {
    // append something so that we get at least the generic icon
    file.Append("pmwrlw");
  }

  // if RWS is enabled, try to get the icon from the WPS
  if (sUseRws) {
    nsCOMPtr<nsIRwsService> rwsSvc(do_GetService("@mozilla.org/rwsos2;1"));
    if (!rwsSvc)
      sUseRws = false;
    else {
      if (fExists) {
        rwsSvc->IconFromPath(file.get(), false, fMini, (uint32_t*)&hRtn);
      } else {
        const char *ptr = file.get();
        if (*ptr == '.')
          ptr++;
        rwsSvc->IconFromExtension(ptr, fMini, (uint32_t*)&hRtn);
      }
    }
  }

  // if we got an icon from the WPS, set the flag & exit
  if (hRtn) {
    *fWpsIcon = true;
    return hRtn;
  }

  // if the file exists already, get its icon
  if (fExists)
    return WinLoadFileIcon(file.get(), FALSE);

  // otherwise, create a temporary file with the correct extension,
  // then retrieve whatever icon PM assigns it
  if (file.First() == '.')
    file.Insert("moztmp", 0);

  nsCOMPtr<nsIFile> tempPath;
  if (NS_FAILED(NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempPath))) ||
      NS_FAILED(tempPath->AppendNative(file)))
    return 0;

  nsAutoCString pathStr;
  tempPath->GetNativePath(pathStr);
  FILE* fp = fopen(pathStr.get(), "wb+");
  if (fp) {
    fclose(fp);
    hRtn = WinLoadFileIcon(pathStr.get(), FALSE);
    remove(pathStr.get());
  }

  return hRtn;
}
OIcon::OIcon(PCSZ fileName)
    : OPicture((ULONG)WinQuerySysValue(HWND_DESKTOP, SV_CXICON),
               (ULONG)WinQuerySysValue(HWND_DESKTOP, SV_CYICON)),
      hptr(WinLoadFileIcon((PSZ)fileName, TRUE))
{
    if (!hptr)
        throw OPMException(OCL::error(72), 0, OException::recoverable);
}
OIcon& OIcon::loadFromFile(PSZ fileName)
{
    destroy();
    hptr = WinLoadFileIcon(fileName, FALSE);

    if (!hptr)
        throw OPMException(OCL::error(70), 0, OException::recoverable);

    return(*this);
}
Exemple #4
0
Verzeichnis::Verzeichnis (IString const &n)
{
        Path = n;
        IString name = n;
        HPOINTER p = WinLoadFileIcon (n, FALSE);
        if ( p )
                setIcon (IPointerHandle (p));
        else
                setIcon (ISystemPointerHandle (ISystemPointerHandle::folder));
        setIconText (name.remove (1, Path.lastIndexOf ('\\')));
}
Exemple #5
0
Datei::Datei (IString const &n)
{
        FILESTATUS3 s;
        DosQueryPathInfo (n, FIL_STANDARD, &s, sizeof (s));
        FTIME t = s.ftimeLastWrite;
        FDATE d = s.fdateLastWrite;
        MD.day = d.day;
        MD.month = d.month;
        MD.year = d.year + 1980;
        MT.hours = t.hours;
        MT.minutes = t.minutes;
        MT.seconds = t.twosecs * 2;
        Groesse = s.cbFile;
        Dir = s.attrFile & FILE_DIRECTORY;

        setIcon (IPointerHandle (WinLoadFileIcon (n, FALSE)));
        Name = n;
        Name.remove (1, Name.lastIndexOf ('\\'));
        setIconText (Name);
}
nsresult os2FrameWindow::SetIcon(const nsAString& aIconSpec)
{
  static HPOINTER hDefaultIcon = 0;
  HPOINTER        hWorkingIcon = 0;

  // Assume the given string is a local identifier for an icon file.
  nsCOMPtr<nsIFile> iconFile;
  mOwner->ResolveIconName(aIconSpec, NS_LITERAL_STRING(".ico"),
                          getter_AddRefs(iconFile));

  // if the file was found, try to use it
  if (iconFile) {
    nsCAutoString path;
    iconFile->GetNativePath(path);

    if (mFrameIcon) {
      WinFreeFileIcon(mFrameIcon);
    }
    mFrameIcon = WinLoadFileIcon(path.get(), FALSE);
    hWorkingIcon = mFrameIcon;
  }

  // if that doesn't work, use the app's icon (let's hope it can be
  // loaded because nobody should have to look at SPTR_APPICON)
  if (!hWorkingIcon) {
    if (!hDefaultIcon) {
      hDefaultIcon = WinLoadPointer(HWND_DESKTOP, 0, 1);
      if (!hDefaultIcon) {
        hDefaultIcon = WinQuerySysPointer(HWND_DESKTOP, SPTR_APPICON, FALSE);
      }
    }
    hWorkingIcon = hDefaultIcon;
  }

  WinSendMsg(mFrameWnd, WM_SETICON, (MPARAM)hWorkingIcon, (MPARAM)0);
  return NS_OK;
}
// Frame_window - окно рамки.
HPOINTER Diver_QueryWindowIcon( HWND Frame_window )
{
 // Для некоторых окон есть значки по умолчанию, но устанавливать их нельзя.
 if( IsEPMEditorWindow( Frame_window ) || WindowIsCreatedBy( APP_EPM, Frame_window ) )
  {
   if( Diver.RTSettings.EPM_icon == NULLHANDLE )
    {
     ULONG Boot_drive = 0;
     DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, (PULONG) &Boot_drive, sizeof( Boot_drive ) );

     if( Boot_drive )
      {
       CHAR Path[ SIZE_OF_PATH ] = "*:";
       Path[ 0 ] = (CHAR) Boot_drive + 64; strcat( Path, "\\OS2\\Apps\\Epm.exe" );

       if( FileExists( Path ) ) Diver.RTSettings.EPM_icon = WinLoadFileIcon( Path, 0 );
      }
    }

   if( Diver.RTSettings.EPM_icon != NULLHANDLE ) return Diver.RTSettings.EPM_icon;
   else return Resources.Default_icons[ ICON_VIEWDOC ];
  }

 // Для некоторых окон значки по умолчанию можно установить раз и навсегда, отправив сообщение в окно.
 HPOINTER Icon = NULLHANDLE;

 if( Icon == NULLHANDLE )
  {
   if( IsWinListWindow( Frame_window ) ) Icon = Resources.Default_icons[ ICON_WINLIST ];
  }

 if( Icon == NULLHANDLE )
  {
   if( WindowIsCreatedBy( APP_VIEWDOC, Frame_window ) ) Icon = Resources.Default_icons[ ICON_VIEWDOC ];
  }

 if( Icon == NULLHANDLE )
  {
   if( WindowIsCreatedBy( APP_PMCHKDSK, Frame_window ) )
    {
     if( Diver.RTSettings.HDD_icon == NULLHANDLE )
      {
       ULONG Boot_drive = 0;
       DosQuerySysInfo( QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, (PULONG) &Boot_drive, sizeof( Boot_drive ) );

       if( Boot_drive )
        {
         CHAR Path[ SIZE_OF_PATH ] = "*:";
         Path[ 0 ] = (CHAR) Boot_drive + 64; strcat( Path, "\\eCS\\Bin\\PMFormat.exe" );
         if( FileExists( Path ) ) Diver.RTSettings.HDD_icon = WinLoadFileIcon( Path, 0 );
        }
      }

     if( Diver.RTSettings.HDD_icon == NULLHANDLE )
      {
       CHAR Path[ SIZE_OF_PATH ] = "";
       HOBJECT WPDrives_object = QueryWPSObject( "<WP_DRIVES>" );
       if( WPDrives_object != NULLHANDLE ) WinQueryObjectPath( WPDrives_object, Path, SIZE_OF_PATH );
       if( Path[ 0 ] != 0 ) Diver.RTSettings.HDD_icon = WinLoadFileIcon( Path, 0 );
      }

     if( Diver.RTSettings.HDD_icon != NULLHANDLE ) Icon = Diver.RTSettings.HDD_icon;
    }
  }

 if( Icon == NULLHANDLE )
  {
   if( WindowIsCreatedBy( APP_APPLETVIEWER, Frame_window ) )
    {
     HWND Related_window = FindRelatedFrameWindow( Frame_window, &IsHotJavaBrowserWindow );

     if( Related_window != NULLHANDLE )
      {
       Icon = (HPOINTER) WinSendMsg( Related_window, WM_QUERYICON, 0, 0 );
      }
    }
  }

 // Если значок был выбран - ставим и возвращаем его.
 if( Icon != NULLHANDLE )
  {
   if( DrawSystemMenusSettingIsON() )
    {
     WinPostQueueMsg( Enhancer.Modules.Changer->Message_queue, SM_CHANGE_ICON, (MPARAM) Frame_window, (MPARAM) Icon );
    }

   return Icon;
  }

 // Узнаем значок окна.
 Icon = (HPOINTER) WinSendMsg( Frame_window, WM_QUERYICON, 0, 0 );

 // Если это пустой значок - ставим изображение по умолчанию.
 HWND Desktop = QueryDesktopWindow();

 if( Icon == WinQuerySysPointer( Desktop, SPTR_APPICON, 0 ) )
  {
   Icon = WinQuerySysPointer( Desktop, SPTR_PROGRAM, 0 );

   if( DrawSystemMenusSettingIsON() )
    {
     WinPostQueueMsg( Enhancer.Modules.Changer->Message_queue, SM_CHANGE_ICON, (MPARAM) Frame_window, (MPARAM) Icon );
    }

   return Icon;
  }

 // Если значок неизвестен - возвращаем значок владельца, главного окна, или значок по умолчанию.
 // Менять значок во всех случаях нельзя - может возникнуть постоянное рисование, которое выглядит как "мигание" рамки.
 if( Icon == NULLHANDLE )
  {
   // Узнаем окно рабочего стола.
   HWND Desktop = QueryDesktopWindow();

   // Просматриваем всех владельцев.
   HWND Owner_window = WinQueryWindow( Frame_window, QW_FRAMEOWNER );

   while( Owner_window != Desktop && Owner_window != NULLHANDLE )
    {
     // Если владелец - окно рамки:
     if( IsFrameWindow( Owner_window ) )
      {
       // Узнаем его значок.
       Icon = (HPOINTER) WinSendMsg( Owner_window, WM_QUERYICON, 0, 0 );

       // Если он есть - возвращаем его.
       if( Icon != NULLHANDLE ) return Icon;
      }

     // Узнаем следующего владельца.
     Owner_window = WinQueryWindow( Owner_window, QW_FRAMEOWNER );
    }

   // Узнаем главное окно приложения.
   HWND Main_window = QueryMainWindow( Frame_window );

   // Если это другое окно:
   if( Main_window != Frame_window )
    {
     // Узнаем его значок.
     Icon = (HPOINTER) WinSendMsg( Main_window, WM_QUERYICON, 0, 0 );

     // Если он есть - возвращаем его.
     if( Icon != NULLHANDLE ) return Icon;
    }

   // Узнаем очередь сообщений окна.
   HMQ Message_queue = WinQueryWindowULong( Frame_window, QWL_HMQ );

   // Узнаем окно оболочки.
   HWND Shell_window = GetDetectedShellWindow();

   if( Shell_window != NULLHANDLE )
    {
     // Узнаем очередь сообщений для окна оболочки.
     HMQ Shell_queue = WinQueryWindowULong( Shell_window, QWL_HMQ );

     // Если очереди совпадают - возвращаем его значок.
     if( Shell_queue == Message_queue ) return (HPOINTER) WinSendMsg( Shell_window, WM_QUERYICON, 0, 0 );

     // Если еще как-нибудь можно установить, что окно создано оболочкой - возвращаем значок окна оболочки.
     if( IsWorkplaceShellWindow( Frame_window ) ) return (HPOINTER) WinSendMsg( Shell_window, WM_QUERYICON, 0, 0 );
    }

   {
    // Перебираем окна в окне рабочего стола.
    HENUM Enumeration = WinBeginEnumWindows( Desktop ); HWND Window = NULLHANDLE;
    while( ( Window = WinGetNextWindow( Enumeration ) ) != NULLHANDLE )
     {
      // Если это то же самое окно - продолжаем перебор окон.
      if( Window == Frame_window ) continue;

      // Узнаем расположение окна и его состояние.
      SWP Window_state = {0}; WinQueryWindowPos( Window, &Window_state );

      // Если окно не скрыто и не уменьшено в значок:
      if( !( Window_state.fl & SWP_HIDE ) ) if( !( Window_state.fl & SWP_MINIMIZE ) )
       {
        // Если в это окно нельзя переключиться - продолжаем перебор окон.
        if( !PermissionForSwitching( Window ) ) continue;
       }

      // Узнаем очередь сообщений окна.
      HMQ Window_queue = WinQueryWindowULong( Window, QWL_HMQ );

      // Если очереди совпадают - узнаем его значок.
      if( Window_queue == Message_queue )
       {
        // Узнаем значок окна.
        Icon = (HPOINTER) WinSendMsg( Window, WM_QUERYICON, 0, 0 );

        // Если он есть - возвращаем его.
        if( Icon != NULLHANDLE )
         {
          // Завершаем перебор окон.
          WinEndEnumWindows( Enumeration );

          // Возвращаем значок.
          return Icon;
         }
       }
     }
    WinEndEnumWindows( Enumeration );
   }

   // Узнаем путь к приложению, создавшему окно.
   CHAR Path[ SIZE_OF_PATH ] = ""; GetDetectedExePath( Frame_window, Path );

   // Если его удалось определить:
   if( Path[ 0 ] != 0 )
    {
     // Узнаем имя приложения, создавшего окно.
     CHAR Name[ SIZE_OF_PATH ] = ""; GetDetectedExeName( Frame_window, Name );

     // Составляем полный путь.
     strcat( Path, "\\" ); strcat( Path, Name );

     // Загружаем значок для файла приложения.
     Icon = WinLoadFileIcon( Path, 0 );

     // Загрузка длится долго, поэтому в этом случае надо заменить значок окна. При
     // повторной загрузке возможна утечка памяти, так что лучше сделать это немедленно,
     // не посылая сообщений в поток Changer.
     WinSendMsg( Frame_window, WM_SETICON, (MPARAM) Icon, 0 );

     // Запоминаем, что значок был загружен с диска.
     BYTE Icon_was_loaded = 1; SetProperty( Frame_window, PRP_ICON_WAS_LOADED, &Icon_was_loaded );

     // Возвращаем значок.
     return Icon;
    }

   // Для окон постоянного размера выбираем простой значок.
   if( WindowIsDialog( Frame_window ) )
    {
     return Resources.Default_icons[ ICON_LEAF ];
    }
   // Для остальных окон - он зависит от того, можно ли переключиться в окно.
   else
    {
     HSWITCH Switch_handle = WinQuerySwitchHandle( Frame_window, NULLHANDLE );

     if( Switch_handle != NULLHANDLE ) return Resources.Default_icons[ ICON_LEAVES ];
     else return Resources.Default_icons[ ICON_LEAF ];
    }

   // И наконец, значок мог быть задан в свойствах раньше.
   FindProperty( Frame_window, PRP_ICON, &Icon );
  }

 // Возврат.
 return Icon;
}