- case LFUN_BRANCH_DEACTIVATE: {
- // FIXME: I do not like this cast, but have no other idea...
- Buffer const * buf = buffer().masterBuffer();
- BranchList const & branchlist = buf->params().branchlist();
- Branch * our_branch = const_cast<Branch *>(branchlist.find(params_.branch));
- if (!our_branch) {
- // child only?
- our_branch = buffer().params().branchlist().find(params_.branch);
- if (!our_branch)
- break;
+ case LFUN_BRANCH_DEACTIVATE:
+ case LFUN_BRANCH_MASTER_ACTIVATE:
+ case LFUN_BRANCH_MASTER_DEACTIVATE: {
+ bool const master = (cmd.action() == LFUN_BRANCH_MASTER_ACTIVATE
+ || cmd.action() == LFUN_BRANCH_MASTER_DEACTIVATE);
+ Buffer * buf = master ? const_cast<Buffer *>(buffer().masterBuffer())
+ : &buffer();
+
+ Branch * our_branch = buf->params().branchlist().find(params_.branch);
+ if (!our_branch)
+ break;
+
+ bool const activate = (cmd.action() == LFUN_BRANCH_ACTIVATE
+ || cmd.action() == LFUN_BRANCH_MASTER_ACTIVATE);
+ if (our_branch->isSelected() != activate) {
+ // FIXME If the branch is in the master document, we cannot
+ // call recordUndo..., because the master may be hidden, and
+ // the code presently assumes that hidden documents can never
+ // be dirty. See GuiView::closeBufferAll(), for example.
+ if (!master)
+ buffer().undo().recordUndoFullDocument(cur);
+ our_branch->setSelected(activate);
+ cur.forceBufferUpdate();