**Is your feature request related to a problem? Please describe.**
The following cause a bad effect with the window appearing/exploding (glitch?) from top-left :
```
//user clicks on tray-icon => context-menu => show and I'm supposed to pop-up the app window
app.dock.show();
window.show();
```
This happens because app.dock.show() is not synchronous thus genie effect from the dockbar can't take place because the dock icon is not yet created when we call window.show().

**Describe the solution you'd like**
app.dock.show() should return a promise fullfilled when the icon is in the dock.

**Describe alternatives you've considered**
Right now I'm doing this and it works:
```
app.dock.show();
app.dock.setIcon(appIcon);
setTimeout(window.show, 500);
```

Another is to provide a way to disable system animation (OSX) for window.show() / window.hide().

**Additional context**
Of course I have no idea about internal API availability/functionality. If not possible we can just close this issue and other people will have a reference about it! :)
atom/browser/browser.h
bool RemoveAsDefaultProtocolClient(const std::string& protocol,
                                     mate::Arguments* args);
  
  bool SetAsDefaultProtocolClient(const std::string& protocol,
                                  mate::Arguments* args);
  
  bool IsDefaultProtocolClient(const std::string& protocol,
                               mate::Arguments* args);
  
  bool SetBadgeCount(int count);
  int GetBadgeCount();
  
  struct LoginItemSettings {
    bool open_at_login = false;
    bool open_as_hidden = false;
    bool restore_state = false;
    bool opened_at_login = false;
    bool opened_as_hidden = false;
    base::string16 path;
    std::vector<base::string16> args;
    LoginItemSettings();
    ~LoginItemSettings();
    LoginItemSettings(const LoginItemSettings&);
  };
  void SetLoginItemSettings(LoginItemSettings settings);
  LoginItemSettings GetLoginItemSettings(const LoginItemSettings& options);
#if defined(OS_MACOSX)
  
  void SetShutdownHandler(base::Callback<bool()> handler);