Ticket #5733: screenshot2.diff

File screenshot2.diff, 6.7 KB (added by augiedoggie, 15 years ago)

alternate patch which removes the hardcoded id values

  • src/apps/screenshot/Screenshot.h

     
    3030    bool                fArgvReceived;
    3131    bool                fRefsReceived;
    3232    int32               fImageFileType;
    33     int32               fTranslator;
    3433    BCatalog                fCatalog;
    3534};
    3635
  • src/apps/screenshot/ScreenshotWindow.cpp

     
    9898
    9999ScreenshotWindow::ScreenshotWindow(bigtime_t delay, bool includeBorder,
    100100    bool includeMouse, bool grabActiveWindow, bool showConfigWindow,
    101     bool saveScreenshotSilent, int32 imageFileType, int32 translator,
    102     const char* outputFilename)
     101    bool saveScreenshotSilent, int32 imageFileType, const char* outputFilename)
    103102    :
    104103    BWindow(BRect(0, 0, 200.0, 100.0), TR("Retake screenshot"), B_TITLED_WINDOW,
    105104        B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_QUIT_ON_WINDOW_CLOSE |
     
    117116    fSaveScreenshotSilent(saveScreenshotSilent),
    118117    fOutputFilename(outputFilename),
    119118    fExtension(""),
    120     fTranslator(translator),
     119    fTranslator(0),
    121120    fImageFileType(imageFileType)
    122121{
    123122    if (fSaveScreenshotSilent) {
     
    185184       
    186185        case kImageOutputFormat:
    187186            message->FindInt32("be:type", &fImageFileType);
    188             message->FindInt32("be:translator", &fTranslator);
     187            message->FindInt32("be:translator", (int32*)&fTranslator);
    189188            fNameControl->SetText(_FindValidFileName(fNameControl->Text()).String());
    190189            _UpdateFilenameSelection();
    191190            break;
     
    616615        return baseName;
    617616   
    618617    BTranslatorRoster* roster = BTranslatorRoster::Default();
    619     const translation_format* formats = NULL;
    620618
    621     int32 numFormats;
    622     if (roster->GetOutputFormats(fTranslator, &formats, &numFormats) == B_OK) {
    623         for (int32 i = 0; i < numFormats; ++i) {
    624             if (formats[i].type == uint32(fImageFileType)) {
    625                 BMimeType mimeType(formats[i].MIME);
    626                 BMessage msgExtensions;             
    627                 if (mimeType.GetFileExtensions(&msgExtensions) == B_OK) {
    628                     const char* extension;
    629                     if (msgExtensions.FindString("extensions", 0, &extension) == B_OK) {
    630                         fExtension.SetTo(extension);
    631                         fExtension.Prepend(".");
    632                     } else
    633                         fExtension.SetTo("");
     619    if (fTranslator != 0
     620            || _FindTranslator(fImageFileType, &fTranslator) == B_OK) {
     621
     622        const translation_format* formats = NULL;
     623   
     624        int32 numFormats;
     625        if (roster->GetOutputFormats(fTranslator, &formats, &numFormats) == B_OK) {
     626            for (int32 i = 0; i < numFormats; ++i) {
     627                if (formats[i].type == uint32(fImageFileType)) {
     628                    BMimeType mimeType(formats[i].MIME);
     629                    BMessage msgExtensions;             
     630                    if (mimeType.GetFileExtensions(&msgExtensions) == B_OK) {
     631                        const char* extension;
     632                        if (msgExtensions.FindString("extensions", 0, &extension) == B_OK) {
     633                            fExtension.SetTo(extension);
     634                            fExtension.Prepend(".");
     635                        } else
     636                            fExtension.SetTo("");
     637                    }
     638                    break;
    634639                }
    635                 break;
    636640            }
    637641        }
    638642    }
    639    
     643
    640644    BPath outputPath = orgPath;
    641645    BString fileName;
    642646    fileName << baseName << fExtension;
     
    855859    if (nodeInfo.InitCheck() != B_OK)
    856860        return B_ERROR;
    857861
     862
     863    if (fTranslator == 0
     864            && _FindTranslator(fImageFileType, &fTranslator) != B_OK)
     865        return B_ERROR;
     866
    858867    int32 numFormats;
    859868    const translation_format* formats = NULL;
     869
    860870    if (roster->GetOutputFormats(fTranslator, &formats, &numFormats) != B_OK)
    861         return B_OK;
     871        return B_ERROR;
    862872
    863873    for (int32 i = 0; i < numFormats; ++i) {
    864874        if (formats[i].type == uint32(fImageFileType)) {
     
    866876            break;
    867877        }
    868878    }
     879
    869880    return B_OK;
    870881}
    871882
     
    958969    }
    959970    fScreenshot->RemoveChild(&view);
    960971}
     972
     973
     974status_t
     975ScreenshotWindow::_FindTranslator(uint32 imageType, translator_id* id)
     976{
     977    status_t status = B_ERROR;
     978
     979    translator_id* translators = NULL;
     980    int32 numTranslators = 0;
     981    BTranslatorRoster* roster = BTranslatorRoster::Default();
     982    roster->GetAllTranslators(&translators, &numTranslators);
     983
     984    for (int32 x = 0; x < numTranslators && status != B_OK; x++) {
     985        int32 numFormats;
     986        const translation_format* formats = NULL;
     987
     988        if (roster->GetOutputFormats(x, &formats, &numFormats) == B_OK) {
     989            for (int32 i = 0; i < numFormats; ++i) {
     990                if (formats[i].type == imageType) {
     991                    *id = x;
     992                    status = B_OK;
     993                    break;
     994                }
     995            }
     996        }
     997    }
     998
     999    delete [] translators;
     1000
     1001    return status;
     1002}
  • src/apps/screenshot/ScreenshotWindow.h

     
    1212
    1313#include <String.h>
    1414#include <Window.h>
     15#include <TranslationDefs.h>
    1516#include <TranslatorFormats.h>
    1617
    1718
     
    3738                                bool showConfigWindow = false,
    3839                                bool saveScreenshotSilent = false,
    3940                                int32 imageFileType = B_PNG_FORMAT,
    40                                 int32 translator = 8,
    4141                                const char* outputFilename = NULL);
    4242    virtual                 ~ScreenshotWindow();
    4343
     
    7070
    7171            status_t        _SaveScreenshot();
    7272
     73            status_t        _FindTranslator(uint32 imageType, translator_id* id);
     74
    7375            PreviewView*    fPreview;
    7476            BRadioButton*   fActiveWindow;
    7577            BRadioButton*   fWholeDesktop;
     
    9799            BString         fOutputFilename;
    98100            BString         fExtension;
    99101
    100             int32           fTranslator;
     102            translator_id   fTranslator;
    101103            int32           fImageFileType;
    102104};
    103105
  • src/apps/screenshot/Screenshot.cpp

     
    2929    BApplication("application/x-vnd.Haiku-Screenshot"),
    3030    fArgvReceived(false),
    3131    fRefsReceived(false),
    32     fImageFileType(B_PNG_FORMAT),
    33     fTranslator(8)
     32    fImageFileType(B_PNG_FORMAT)
    3433{
    3534    be_locale->GetAppCatalog(&fCatalog);
    3635}
     
    136135   
    137136    new ScreenshotWindow(delay, includeBorder, includeMouse, grabActiveWindow,
    138137        showConfigureWindow, saveScreenshotSilent, fImageFileType,
    139         fTranslator, outputFilename);
     138        outputFilename);
    140139}
    141140
    142141
     
    166165{
    167166    if (strcmp(name, "bmp") == 0) {
    168167        fImageFileType = B_BMP_FORMAT;
    169         fTranslator = 1;
    170168    } else if (strcmp(name, "gif") == 0) {
    171169        fImageFileType = B_GIF_FORMAT;
    172         fTranslator = 3;
    173170    } else if (strcmp(name, "jpg") == 0) {
    174171        fImageFileType = B_JPEG_FORMAT;
    175         fTranslator = 6;
    176172    } else if (strcmp(name, "ppm") == 0) {
    177173        fImageFileType = B_PPM_FORMAT;
    178         fTranslator = 9;
    179174    } else if (strcmp(name, "targa") == 0) {
    180175        fImageFileType = B_TGA_FORMAT;
    181         fTranslator = 14;
    182176    } else if (strcmp(name, "tif") == 0) {
    183177        fImageFileType = B_TIFF_FORMAT;
    184         fTranslator = 15;
    185178    } else { //png
    186179        fImageFileType = B_PNG_FORMAT;
    187         fTranslator = 8;
    188180    }
    189181}