This source file includes following definitions.
- BeginRun
- EndRun
- IsRunningDialogForOwner
- DisableOwner
- CreateDialogThread
- EnableOwner
#include "ui/shell_dialogs/base_shell_dialog_win.h"
#include <algorithm>
#include "base/threading/thread.h"
#include "base/win/scoped_com_initializer.h"
namespace ui {
BaseShellDialogImpl::Owners BaseShellDialogImpl::owners_;
int BaseShellDialogImpl::instance_count_ = 0;
BaseShellDialogImpl::BaseShellDialogImpl() {
++instance_count_;
}
BaseShellDialogImpl::~BaseShellDialogImpl() {
if (--instance_count_ == 0)
DCHECK(owners_.empty());
}
BaseShellDialogImpl::RunState BaseShellDialogImpl::BeginRun(HWND owner) {
DCHECK(!IsRunningDialogForOwner(owner));
DCHECK(!owner || owner == GetAncestor(owner, GA_ROOT));
RunState run_state;
run_state.dialog_thread = CreateDialogThread();
run_state.owner = owner;
if (owner) {
owners_.insert(owner);
DisableOwner(owner);
}
return run_state;
}
void BaseShellDialogImpl::EndRun(RunState run_state) {
if (run_state.owner) {
DCHECK(IsRunningDialogForOwner(run_state.owner));
EnableOwner(run_state.owner);
DCHECK(owners_.find(run_state.owner) != owners_.end());
owners_.erase(run_state.owner);
}
DCHECK(run_state.dialog_thread);
delete run_state.dialog_thread;
}
bool BaseShellDialogImpl::IsRunningDialogForOwner(HWND owner) const {
return (owner && owners_.find(owner) != owners_.end());
}
void BaseShellDialogImpl::DisableOwner(HWND owner) {
if (IsWindow(owner))
EnableWindow(owner, FALSE);
}
base::Thread* BaseShellDialogImpl::CreateDialogThread() {
base::Thread* thread = new base::Thread("Chrome_ShellDialogThread");
thread->init_com_with_mta(false);
bool started = thread->Start();
DCHECK(started);
return thread;
}
void BaseShellDialogImpl::EnableOwner(HWND owner) {
if (IsWindow(owner))
EnableWindow(owner, TRUE);
}
}