// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/base/window_open_disposition.h"

#include "build/build_config.h"
#include "ui/events/event_constants.h"

namespace ui {

WindowOpenDisposition DispositionFromClick(bool middle_button,
                                           bool alt_key,
                                           bool ctrl_key,
                                           bool meta_key,
                                           bool shift_key) {
  // MacOS uses meta key (Command key) to spawn new tabs.
#if defined(OS_MACOSX)
  if (middle_button || meta_key)
#else
  if (middle_button || ctrl_key)
#endif
    return shift_key ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
  if (shift_key)
    return NEW_WINDOW;
  if (alt_key)
    return SAVE_TO_DISK;
  return CURRENT_TAB;
}

WindowOpenDisposition DispositionFromEventFlags(int event_flags) {
  return DispositionFromClick(
      (event_flags & ui::EF_MIDDLE_MOUSE_BUTTON) != 0,
      (event_flags & ui::EF_ALT_DOWN) != 0,
      (event_flags & ui::EF_CONTROL_DOWN) != 0,
      (event_flags & ui::EF_COMMAND_DOWN) != 0,
      (event_flags & ui::EF_SHIFT_DOWN) != 0);
}

}  // namespace ui
