Skip to content

Commit

Permalink
Handle titlebar clicks
Browse files Browse the repository at this point in the history
Note: this does not work because app-region seems to swallow all mouse
events
  • Loading branch information
inukshuk committed Jun 29, 2023
1 parent 510caf6 commit 618edc3
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 36 deletions.
41 changes: 33 additions & 8 deletions src/browser/wm.js
Expand Up @@ -256,13 +256,14 @@ export class WindowManager extends EventEmitter {
}

// eslint-disable-next-line complexity
handleIpcMessage = (event, type, ...args) => {
handleIpcMessage = async (event, type, ...args) => {
trace({ args }, `ipc.${type} received`)
let win = BrowserWindow.fromWebContents(event.sender)

if (type === 'double-click')
type = WindowManager.getActionOnDoubleClick()
if (type === 'titlebar-action')
type = await WindowManager.getTitlebarActionFor(args.shift())

console.log(type)
switch (type) {
case 'close':
win.close()
Expand All @@ -285,12 +286,14 @@ export class WindowManager extends EventEmitter {
case 'preview':
win.previewFile(...args)
break
case 'toggle-maximize':
case 'maximize':
if (win.isMaximized())
win.unmaximize()
else
win.maximize()
break
case 'toggle-minimize':
case 'minimize':
if (win.isMinimized())
win.restore()
Expand All @@ -306,6 +309,9 @@ export class WindowManager extends EventEmitter {
case 'show-menu':
this.emit('show-menu', win, ...args)
break
case 'raise':
win.moveTop()
break
default:
win.emit(type, ...args)
}
Expand Down Expand Up @@ -659,11 +665,30 @@ export class WindowManager extends EventEmitter {
prefs.getUserDefault('AppleShowScrollBars', 'string') === 'WhenScrolling'
}

static getActionOnDoubleClick() {
return !darwin ? 'maximize' :
prefs
.getUserDefault('AppleActionOnDoubleClick', 'string')
.toLowerCase()
static async getTitlebarActionFor(trigger) {
try {
if (darwin) {
if (trigger === 'double-click')
return prefs
.getUserDefault('AppleActionOnDoubleClick', 'string')
.toLowerCase()
}

if (linux) {
return await get(
`org.gnome.desktop.wm.preferences.action-${trigger}-titlebar`
)
}
} catch (e) {
warn({
stack: e.stack
}, `failed to resolve titlebar action for ${trigger}`)
}

if (trigger === 'double-click')
return 'maximize'
else
return 'raise'
}

static async getButtonLayout() {
Expand Down
66 changes: 38 additions & 28 deletions src/components/toolbar.js
@@ -1,25 +1,26 @@
import React from 'react'
import { WindowContext } from './window'
import { forwardRef } from 'react'
import { bool, func, node, string } from 'prop-types'
import cx from 'classnames'
import { has } from '../dom'
import { useWindow } from '../hooks/use-window.js'
import { useEvent } from '../hooks/use-event.js'
import { has } from '../dom.js'

export const Toolbar = React.forwardRef((props, ref) =>
export const Toolbar = forwardRef((props, ref) => (
<div
ref={ref}
className={cx('toolbar', 'tb-target', props.className)}
onDoubleClick={props.onDoubleClick}>
{props.children}
</div>
)
))

Toolbar.propTypes = {
children: node,
className: string,
onDoubleClick: func
}

Toolbar.Context = React.forwardRef((props, ref) => (
Toolbar.Context = forwardRef((props, ref) => (
<div
ref={ref}
className={cx('toolbar-context', 'tb-target', props.className, {
Expand Down Expand Up @@ -78,27 +79,36 @@ ToolGroup.propTypes = {
}


export class Titlebar extends React.PureComponent {

handleDoubleClick = (event) => {
if (this.context.args.frameless && has(event.target, 'tb-target'))
this.context.send('double-click')
}

render() {
return (this.props.isOptional && !this.context.args.frameless) ? null : (
<Toolbar
className="titlebar"
onDoubleClick={this.handleDoubleClick}>
{this.props.children}
</Toolbar>
)
}

static contextType = WindowContext
export const Titlebar = ({ children, isOptional }) => {
let win = useWindow()

let handleDoubleClick = useEvent((event) => {
if (win.args.frameless && has(event.target, 'tb-target'))
win.send('titlebar-action', 'double-click')
})

let handleMouseDown = useEvent((event) => {
if (win.args.frameless && has(event.target, 'tb-target'))
if (event.button === 2)
win.send('titlebar-action', 'right-click')
else if (event.button === 1)
win.send('titlebar-action', 'middle-click')
})

if (isOptional && !win.args.frameless)
return null

return (
<Toolbar
className="titlebar"
onMouseDown={handleMouseDown}
onDoubleClick={handleDoubleClick}>
{children}
</Toolbar>
)
}

static propTypes = {
children: node,
isOptional: bool
}
Titlebar.propTypes = {
children: node,
isOptional: bool
}

0 comments on commit 618edc3

Please sign in to comment.