On Fri, Apr 17, 2020 at 06:21:18PM +0000, [email protected] wrote: > On Wed, Apr 15, 2020 at 02:23:19PM -0400, Mouse wrote: > > It would also be enough if I could force the X server to run 1280x1024 > > whether or not it has a monitor connected. Under 5.2, I added options > > to the X server, one to capture DDC info to a file and one to provide a > > file to be read to provide DDC info if none could be obtained from the > > monitor. This addressed the problem there. But, under 8.0, the use of > > 1024x768 even with a monitor connected indicates to me that it's > > getting DDC, or moral eqvuialent, from the kernel instead of the > > monitor, so I am inclined to doubt the same approach would work. (I > > can try it, certainly, but, based on the information I have now, that > > seems like an investment of my time with a low expected return.) > > > > Comments? Thoughts? If there is something else that this depends on > > that I haven't mentioned, just let me know. > > This feels like it'd be really hard to use. > > If I was working on this, I would aim for something like this: > - Report an event to userland upon a monitor hotplug. > Perhaps just "monitors changed, suggesting to re-probe" is fine. > > Currently, powerd/pmf look like good candidates for transmitting such > events to userland. > > - Have a small script that maps a monitor setup to a preferred > resolution/layout. > > In your case it will be "run this one hard-coded xrandr command". > But in the long run we could use this to have very comfortable handling > for scenarios where people connect another monitor.
With the attached patch I can write this script (would be nice if powerd was something X could listen to, but it only allows one listener). cat /etc/powerd/scripts/monitor_hotplug #!/bin/sh su fly -c "env DISPLAY=:0 /usr/X11R7/bin/xrandr --output DVI-0 --mode 1280x800" And it'll actually pick the new xrandr choice on monitor hotplug. -------------------- # HG changeset patch # User Maya Rashish <[email protected]> # Date 1587216560 -10800 # Sat Apr 18 16:29:20 2020 +0300 # Branch trunk # Node ID 18ec6488132fa5746888cc0a3de3e9ff40f315d2 # Parent 3a4ebac1a7ae7a742b0cedb6a942e3cbd85256b5 Add a powerd event for monitor hotplug. Now if you have powerd running and have a script named /etc/powerd/scripts/monitor_hotplug It will be executed on monitor hotplug. diff -r 3a4ebac1a7ae -r 18ec6488132f sys/dev/sysmon/sysmon_power.c --- a/sys/dev/sysmon/sysmon_power.c Thu Apr 16 15:58:13 2020 +0000 +++ b/sys/dev/sysmon/sysmon_power.c Sat Apr 18 16:29:20 2020 +0300 @@ -130,6 +130,7 @@ { PSWITCH_TYPE_ACADAPTER, "acadapter" }, { PSWITCH_TYPE_HOTKEY, "hotkey_button" }, { PSWITCH_TYPE_RADIO, "radio_button" }, + { PSWITCH_TYPE_MONITOR_HOTPLUG, "monitor_hotplug" }, { -1, NULL } }; diff -r 3a4ebac1a7ae -r 18ec6488132f sys/sys/power.h --- a/sys/sys/power.h Thu Apr 16 15:58:13 2020 +0000 +++ b/sys/sys/power.h Sat Apr 18 16:29:20 2020 +0300 @@ -115,7 +115,8 @@ #define PSWITCH_HK_VOLUME_DOWN "volume-down" #define PSWITCH_HK_VOLUME_MUTE "volume-mute" #endif /* THINKPAD_NORMAL_HOTKEYS */ -#define PSWITCH_TYPE_RADIO 6 /* radio switch */ +#define PSWITCH_TYPE_RADIO 6 /* radio switch */ +#define PSWITCH_TYPE_MONITOR_HOTPLUG 7 /* monitor hotplug */ #define PSWITCH_EVENT_PRESSED 0 /* button pressed, lid closed, AC off */ #define PSWITCH_EVENT_RELEASED 1 /* button released, lid open, AC on */ # HG changeset patch # User Maya Rashish <[email protected]> # Date 1587216606 -10800 # Sat Apr 18 16:30:06 2020 +0300 # Branch trunk # Node ID 3b62224d38ada8c0396699aaffe605e10ebc97e2 # Parent 18ec6488132fa5746888cc0a3de3e9ff40f315d2 Add monitor hotplug reporting for drm drivers. Currently invoked by i915 and radeon. diff -r 18ec6488132f -r 3b62224d38ad sys/external/bsd/drm2/dist/drm/drm_drv.c --- a/sys/external/bsd/drm2/dist/drm/drm_drv.c Sat Apr 18 16:29:20 2020 +0300 +++ b/sys/external/bsd/drm2/dist/drm/drm_drv.c Sat Apr 18 16:30:06 2020 +0300 @@ -660,6 +660,16 @@ kref_init(&dev->ref); dev->dev = parent; dev->driver = driver; +#ifdef __NetBSD__ + dev->sc_monitor_hotplug.smpsw_name = device_xname(dev->dev); + dev->sc_monitor_hotplug.smpsw_type = PSWITCH_TYPE_MONITOR_HOTPLUG; + + ret = sysmon_pswitch_register(&dev->sc_monitor_hotplug); + if (ret) { + kfree(dev); + return NULL; + } +#endif INIT_LIST_HEAD(&dev->filelist); INIT_LIST_HEAD(&dev->ctxlist); @@ -727,6 +737,9 @@ mutex_destroy(&dev->master_mutex); mutex_destroy(&dev->ctxlist_mutex); mutex_destroy(&dev->struct_mutex); +#ifdef __NetBSD__ + sysmon_pswitch_unregister(&dev->sc_monitor_hotplug); +#endif kfree(dev); return NULL; } @@ -739,6 +752,10 @@ if (drm_core_check_feature(dev, DRIVER_GEM)) drm_gem_destroy(dev); +#ifdef __NetBSD__ + sysmon_pswitch_unregister(&dev->sc_monitor_hotplug); +#endif + drm_legacy_ctxbitmap_cleanup(dev); drm_ht_remove(&dev->map_hash); drm_fs_inode_free(dev->anon_inode); diff -r 18ec6488132f -r 3b62224d38ad sys/external/bsd/drm2/dist/drm/drm_probe_helper.c --- a/sys/external/bsd/drm2/dist/drm/drm_probe_helper.c Sat Apr 18 16:29:20 2020 +0300 +++ b/sys/external/bsd/drm2/dist/drm/drm_probe_helper.c Sat Apr 18 16:30:06 2020 +0300 @@ -328,6 +330,9 @@ */ void drm_kms_helper_hotplug_event(struct drm_device *dev) { +#ifdef __NetBSD__ + sysmon_pswitch_event(&dev->sc_monitor_hotplug, PSWITCH_EVENT_PRESSED); +#endif /* send a uevent + call fbdev */ drm_sysfs_hotplug_event(dev); if (dev->mode_config.funcs->output_poll_changed) diff -r 18ec6488132f -r 3b62224d38ad sys/external/bsd/drm2/dist/include/drm/drmP.h --- a/sys/external/bsd/drm2/dist/include/drm/drmP.h Sat Apr 18 16:29:20 2020 +0300 +++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h Sat Apr 18 16:30:06 2020 +0300 @@ -903,6 +903,7 @@ int irq; #ifdef __NetBSD__ struct drm_bus_irq_cookie *irq_cookie; + struct sysmon_pswitch sc_monitor_hotplug; #endif /*
