Ticket #693: 693.diff

File 693.diff, 8.0 KB (added by anevilyak, 16 years ago)

Preliminary patch

  • src/servers/app/Desktop.cpp

     
    879879
    880880
    881881/*!
     882    Returns the virtual screen frame of the workspace specified by \a index.
     883*/
     884BRect
     885Desktop::WorkspaceFrame(int32 index) const
     886{
     887    BRect frame;
     888    if (index == fCurrentWorkspace)
     889        frame = fVirtualScreen.Frame();
     890    else if (index >= 0 && index < fSettings->WorkspacesCount()) {
     891        BMessage screenData;
     892        int32 width;
     893        int32 height;
     894        fSettings->WorkspacesMessage(index)->FindMessage("screen", &screenData);
     895        if (screenData.FindInt32("width", &width) != B_OK || screenData.FindInt32("height", &height) != B_OK)
     896            frame = fVirtualScreen.Frame();
     897        else
     898            frame.Set(0.0, 0.0, width - 1, height - 1);
     899    }
     900    return frame;
     901}
     902
     903
     904/*!
    882905    Changes the current workspace to the one specified by \a index.
    883906*/
    884907void
     
    923946    int32 previousIndex = fCurrentWorkspace;
    924947    rgb_color previousColor = fWorkspaces[fCurrentWorkspace].Color();
    925948    bool movedMouseEventWindow = false;
     949    display_mode previousMode, newMode;
     950    fVirtualScreen.ScreenAt(0)->GetMode(&previousMode);
     951    fVirtualScreen.RestoreConfiguration(*this, fSettings->WorkspacesMessage(index));
     952    fVirtualScreen.ScreenAt(0)->GetMode(&newMode);
     953    // We only need to invalidate the entire desktop if we changed display modes
     954    if (memcmp(&previousMode, &newMode, sizeof(display_mode)))
     955        ScreenChanged(fVirtualScreen.ScreenAt(0), false);
    926956
    927957    if (fMouseEventWindow != NULL) {
    928958        if (fMouseEventWindow->IsNormal()) {
     
    10951125    BRegion dirty(screen->Frame());
    10961126    // update our cached screen region
    10971127    fScreenRegion.Set(screen->Frame());
    1098 
     1128    gInputManager->UpdateScreenBounds(screen->Frame());
     1129   
    10991130    BRegion background;
    11001131    _RebuildClippingForAllWindows(background);
    11011132
     
    11221153    fVirtualScreen.UpdateFrame();
    11231154
    11241155    if (makeDefault) {
     1156        StoreConfiguration(fCurrentWorkspace);
     1157    }
     1158}
     1159
     1160
     1161status_t
     1162Desktop::StoreConfiguration(int32 workspace)
     1163{
     1164    if (workspace >= 0 && workspace < fSettings->WorkspacesCount()) {
    11251165        // store settings
    11261166        BMessage settings;
    11271167        fVirtualScreen.StoreConfiguration(settings);
    1128         fWorkspaces[fCurrentWorkspace].StoreConfiguration(settings);
     1168        fWorkspaces[workspace].StoreConfiguration(settings);
    11291169
    1130         fSettings->SetWorkspacesMessage(fCurrentWorkspace, settings);
     1170        fSettings->SetWorkspacesMessage(workspace, settings);
    11311171        fSettings->Save(kWorkspacesSettings);
     1172        return B_OK;
    11321173    }
     1174   
     1175    return B_BAD_VALUE;
    11331176}
    11341177
    1135 
    11361178//  #pragma mark - Methods for Window manipulation
    11371179
    11381180
  • src/servers/app/Desktop.h

     
    9191        void                    GetLastMouseState(BPoint* position,
    9292                                    int32* buttons) const;
    9393                                    // for use by ServerWindow
    94 
    9594        void                    ScreenChanged(Screen* screen, bool makeDefault);
    96 
    9795        void                    ScreenRemoved(Screen* screen) {}
    9896        void                    ScreenAdded(Screen* screen) {}
    9997        bool                    ReleaseScreen(Screen* screen) { return false; }
     98        status_t                StoreConfiguration(int32 workspace);
    10099
    101100        const ::VirtualScreen&  VirtualScreen() const { return fVirtualScreen; }
    102101        DrawingEngine*          GetDrawingEngine() const
     
    113112        Workspace::Private&     WorkspaceAt(int32 index)
    114113                                    { return fWorkspaces[index]; }
    115114        status_t                SetWorkspacesCount(int32 newCount);
     115        BRect                   WorkspaceFrame(int32 index) const;
    116116
    117117        // Window methods
    118118
  • src/servers/app/Screen.cpp

     
    2222#include <stdlib.h>
    2323#include <stdio.h>
    2424
    25 
    2625static float
    2726get_mode_frequency(const display_mode& mode)
    2827{
     
    9190status_t
    9291Screen::SetMode(const display_mode& mode, bool makeDefault)
    9392{
     93    display_mode current;
     94    GetMode(&current);
     95    current.flags = mode.flags;
     96    if (!memcmp(&mode, &current, sizeof(display_mode)))
     97        return B_OK;
     98   
    9499    gBitmapManager->SuspendOverlays();
    95100
    96101    status_t status = fHWInterface->SetMode(mode);
     
    162167            * mode.timing.v_total / 10 * int32(frequency * 10)) / 1000;
    163168        adjusted = true;
    164169    }
    165 
    166170    status = SetMode(mode, false);
    167171    if (status < B_OK && adjusted) {
    168172        // try again with the unchanged mode
  • src/servers/app/ServerApp.cpp

     
    21672167            // 2) workspace index
    21682168            // 3) display_mode to set
    21692169            // 4) 'makeDefault' boolean
    2170             // TODO: See above: workspaces support, etc.
    21712170
    21722171            screen_id id;
    21732172            link.Read<screen_id>(&id);
     
    21832182
    21842183            if (status == B_OK && fDesktop->LockAllWindows()) {
    21852184                display_mode oldMode;
    2186                 fDesktop->ScreenAt(0)->GetMode(&oldMode);
    2187                 if (memcmp(&oldMode, &mode, sizeof(display_mode))) {
    2188                     status = fDesktop->ScreenAt(0)->SetMode(mode, makeDefault);
    2189                     if (status == B_OK) {
    2190                         gInputManager->UpdateScreenBounds(fDesktop->ScreenAt(0)->Frame());
    2191                         fDesktop->ScreenChanged(fDesktop->ScreenAt(0), makeDefault);
    2192                     }
    2193                 } else
    2194                     status = B_OK;
     2185                if (workspace == (uint32)fDesktop->CurrentWorkspace()) {
     2186                    fDesktop->ScreenAt(0)->GetMode(&oldMode);
     2187                    if (memcmp(&oldMode, &mode, sizeof(display_mode))) {
     2188                        status = fDesktop->ScreenAt(0)->SetMode(mode, makeDefault);
     2189                        if (status == B_OK) {
     2190                            fDesktop->ScreenChanged(fDesktop->ScreenAt(0), makeDefault);
     2191                        }
     2192                    } else
     2193                        status = B_OK;
     2194                } else {
     2195                    // this is perhaps not ideal - it assumes that if the
     2196                    // workspace is not the active one, then pull the
     2197                    // configuration from active and store it to the specified
     2198                    // workspace. This is safer since it's assumed that the
     2199                    // active workspace has a display mode that's usable,
     2200                    // but at the same time the API implies that you can set
     2201                    // a non-visible workspace to whatever mode you like
     2202                    // TODO: decide what to do here.
     2203                    if (makeDefault)
     2204                        fDesktop->StoreConfiguration(workspace);
     2205                }
    21952206                fDesktop->UnlockAllWindows();
    21962207            } else
    21972208                status = B_ERROR;
  • src/servers/app/VirtualScreen.cpp

     
    167167    fDrawingEngine = screen->GetDrawingEngine();
    168168    fHWInterface = screen->HWInterface();
    169169    fFrame = screen->Frame();
     170    item->frame = fFrame;
    170171
    171172    fScreenList.AddItem(item);
    172173
  • src/servers/app/WorkspacesView.cpp

     
    8080BRect
    8181WorkspacesView::_ScreenFrame(int32 i)
    8282{
    83     return Window()->Desktop()->VirtualScreen().Frame();
     83    return Window()->Desktop()->WorkspaceFrame(i);
    8484}
    8585
    8686
  • src/preferences/screen/ScreenWindow.cpp

     
    246246    BMenuItem *item = new BMenuItem("Current Workspace",
    247247        new BMessage(WORKSPACE_CHECK_MSG));
    248248   
    249     // TODO: since per workspace settings is unimplemented (Ticket #693)
    250     //       we force the menu to "All Workspaces" for now
    251     fAllWorkspacesItem->SetMarked(true);
    252     item->SetEnabled(false);
    253    
    254249    popUpMenu->AddItem(item);
     250    fAllWorkspacesItem->SetMarked(true);
    255251
    256252    BMenuField* workspaceMenuField = new BMenuField(BRect(0, 0, 100, 15),
    257253        "WorkspaceMenu", NULL, popUpMenu, true);
     
    10081004void
    10091005ScreenWindow::_CheckApplyEnabled()
    10101006{
    1011     fApplyButton->SetEnabled(fSelected != fActive);
     1007    fApplyButton->SetEnabled(fSelected != fActive
     1008        || fAllWorkspacesItem->IsMarked());
    10121009    fRevertButton->SetEnabled(count_workspaces() != fOriginalWorkspaceCount
    10131010        || fSelected != fOriginal);
    10141011}