2020-01-04 22:21:39 -05:00
|
|
|
package zenity
|
|
|
|
|
|
|
|
import (
|
2020-01-30 09:14:42 -05:00
|
|
|
"context"
|
2022-06-18 07:37:39 -04:00
|
|
|
|
|
|
|
"github.com/ncruces/zenity/internal/win"
|
2020-01-04 22:21:39 -05:00
|
|
|
)
|
|
|
|
|
2021-04-29 11:05:28 -04:00
|
|
|
func message(kind messageKind, text string, opts options) error {
|
2022-06-18 07:37:39 -04:00
|
|
|
var flags uint32
|
2020-01-04 22:21:39 -05:00
|
|
|
|
|
|
|
switch {
|
2021-03-03 22:25:45 -05:00
|
|
|
case kind == questionKind && opts.extraButton != nil:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_YESNOCANCEL
|
2021-03-03 22:32:55 -05:00
|
|
|
case kind == questionKind:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_OKCANCEL
|
2021-03-03 22:32:55 -05:00
|
|
|
case opts.extraButton != nil:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_YESNO
|
2022-06-18 11:12:03 -04:00
|
|
|
default:
|
|
|
|
opts.cancelLabel = opts.okLabel
|
2020-01-04 22:21:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
switch opts.icon {
|
|
|
|
case ErrorIcon:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONERROR
|
2020-01-04 22:21:39 -05:00
|
|
|
case QuestionIcon:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONQUESTION
|
2020-01-04 22:21:39 -05:00
|
|
|
case WarningIcon:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONWARNING
|
2020-01-04 22:21:39 -05:00
|
|
|
case InfoIcon:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONINFORMATION
|
2022-05-18 09:48:09 -04:00
|
|
|
case NoIcon:
|
|
|
|
//
|
|
|
|
default:
|
2022-03-25 22:56:06 -04:00
|
|
|
switch kind {
|
|
|
|
case errorKind:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONERROR
|
2022-03-25 22:56:06 -04:00
|
|
|
case questionKind:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONQUESTION
|
2022-03-25 22:56:06 -04:00
|
|
|
case warningKind:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONWARNING
|
2022-03-25 22:56:06 -04:00
|
|
|
case infoKind:
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_ICONINFORMATION
|
2022-03-25 22:56:06 -04:00
|
|
|
}
|
2020-01-04 22:21:39 -05:00
|
|
|
}
|
|
|
|
|
2020-01-24 07:52:45 -05:00
|
|
|
if kind == questionKind && opts.defaultCancel {
|
2021-03-03 22:25:45 -05:00
|
|
|
if opts.extraButton == nil {
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_DEFBUTTON2
|
2020-01-07 19:44:26 -05:00
|
|
|
} else {
|
2022-06-18 07:37:39 -04:00
|
|
|
flags |= win.MB_DEFBUTTON3
|
2020-01-07 19:44:26 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-28 09:52:02 -04:00
|
|
|
owner, _ := opts.attach.(win.HWND)
|
|
|
|
defer setup(owner)()
|
2022-06-23 09:49:08 -04:00
|
|
|
unhook, err := hookMessageDialog(opts)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2020-01-07 19:44:26 -05:00
|
|
|
}
|
2022-06-23 09:49:08 -04:00
|
|
|
defer unhook()
|
2020-01-07 19:44:26 -05:00
|
|
|
|
2021-09-15 08:54:35 -04:00
|
|
|
var title *uint16
|
2021-03-03 22:25:45 -05:00
|
|
|
if opts.title != nil {
|
2022-06-20 11:05:11 -04:00
|
|
|
title = strptr(*opts.title)
|
2021-03-03 22:25:45 -05:00
|
|
|
}
|
|
|
|
|
2022-06-20 11:05:11 -04:00
|
|
|
s, err := win.MessageBox(owner, strptr(text), title, flags)
|
2020-01-04 22:21:39 -05:00
|
|
|
|
2020-01-30 09:14:42 -05:00
|
|
|
if opts.ctx != nil && opts.ctx.Err() != nil {
|
2021-04-29 11:05:28 -04:00
|
|
|
return opts.ctx.Err()
|
2020-01-30 09:14:42 -05:00
|
|
|
}
|
2021-03-03 22:32:55 -05:00
|
|
|
switch s {
|
2022-06-18 07:37:39 -04:00
|
|
|
case win.IDOK, win.IDYES:
|
2021-04-29 11:05:28 -04:00
|
|
|
return nil
|
2022-06-18 07:37:39 -04:00
|
|
|
case win.IDCANCEL:
|
2021-04-29 11:05:28 -04:00
|
|
|
return ErrCanceled
|
2022-06-18 07:37:39 -04:00
|
|
|
case win.IDNO:
|
2021-04-29 11:05:28 -04:00
|
|
|
return ErrExtraButton
|
2021-03-03 22:32:55 -05:00
|
|
|
default:
|
2021-04-29 11:05:28 -04:00
|
|
|
return err
|
2020-01-07 19:44:26 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-26 09:49:49 -04:00
|
|
|
func hookMessageDialog(opts options) (context.CancelFunc, error) {
|
2022-06-23 09:49:08 -04:00
|
|
|
var init func(wnd win.HWND)
|
2022-07-26 09:49:49 -04:00
|
|
|
var icon icon
|
2022-06-23 09:49:08 -04:00
|
|
|
if opts.okLabel != nil || opts.cancelLabel != nil || opts.extraButton != nil || opts.icon != nil {
|
|
|
|
init = func(wnd win.HWND) {
|
|
|
|
if opts.okLabel != nil {
|
|
|
|
win.SetDlgItemText(wnd, win.IDOK, strptr(*opts.okLabel))
|
|
|
|
win.SetDlgItemText(wnd, win.IDYES, strptr(*opts.okLabel))
|
|
|
|
}
|
|
|
|
if opts.cancelLabel != nil {
|
|
|
|
win.SetDlgItemText(wnd, win.IDCANCEL, strptr(*opts.cancelLabel))
|
|
|
|
}
|
|
|
|
if opts.extraButton != nil {
|
|
|
|
win.SetDlgItemText(wnd, win.IDNO, strptr(*opts.extraButton))
|
|
|
|
}
|
2022-05-09 10:49:32 -04:00
|
|
|
|
2022-06-23 09:49:08 -04:00
|
|
|
if icon.handle != 0 {
|
|
|
|
ctl, _ := win.GetDlgItem(wnd, win.IDC_STATIC_OK)
|
|
|
|
win.SendMessage(ctl, win.STM_SETICON, uintptr(icon.handle), 0)
|
|
|
|
}
|
2021-09-13 08:17:15 -04:00
|
|
|
}
|
|
|
|
}
|
2022-07-26 09:49:49 -04:00
|
|
|
unhook, err := hookDialog(opts.ctx, opts.windowIcon, nil, init)
|
|
|
|
if err != nil || opts.icon == nil {
|
|
|
|
return unhook, err
|
|
|
|
}
|
|
|
|
icon = getIcon(opts.icon)
|
|
|
|
return func() {
|
|
|
|
icon.delete()
|
|
|
|
unhook()
|
|
|
|
}, nil
|
2021-09-13 08:17:15 -04:00
|
|
|
}
|