Commit graph

480 commits

Author SHA1 Message Date
Chris Feng
a50058be78 Add Customize interface for global keys
* exwm-input.el (exwm-input--set-key): New function for actually
setting the binding.
(exwm-input-global-keys): New user option for customizing global keys.
(exwm-input-set-key): Update `exwm-input-global-keys' and call
`exwm-input--set-key'
(exwm-input--init): Initialize global keys.
2018-02-26 00:15:44 +08:00
Chris Feng
c719c3f54b Bump version to 0.17 2018-02-24 22:49:39 +08:00
Chris Feng
1b6272e458 Hide blocked frames (they are visible with a compositor)
* exwm-workspace.el (exwm-workspace--set-active): New function for
setting the 'exwm-active' frame parameter and show/hide frames BTW.
(exwm-workspace--active-p): New function checking whether a frame is
active.
(exwm-workspace--set-fullscreen, exwm-workspace-switch)
(exwm-workspace-move-window):
* exwm-randr.el (exwm-randr--refresh): Use them.

* exwm-workspace.el (exwm-workspace-attach-minibuffer)
(exwm-workspace--show-minibuffer, exwm-workspace--hide-minibuffer):
Show/Hide the minibuffer frame.
2018-02-22 22:21:54 +08:00
Chris Feng
32b88f4bd0 Mark active workspaces on each output
* exwm-randr.el (exwm-randr--refresh): Mark active workspaces.
* exwm-workspace.el (exwm-workspace-switch): Use the marks to
show/hide X windows when switching workspace; do not update timestamp.
(exwm-workspace-move-window): Use the marks to hide X windows after
moving them.
(exwm-workspace--init): Update `frameset-filter-alist'.
2018-02-22 00:31:57 +08:00
Chris Feng
6200417697 Grab global keys on top-level X windows
* exwm-input.el (exwm-input--on-CreateNotify): New function for
grabbing global keys on newly created X windows.
(exwm-input--update-global-prefix-keys): Grab global keys on top-level
X windows instead of the root window.
(exwm-input--grab-global-prefix-keys): New function for grabbing
global keys on X windows.
(exwm-input--release-keyboard): Grab global keys in char-mode.
(exwm-input--init): Select CreateNotify events.

* exwm-core.el (exwm--unlock):
* exwm-input.el (exwm-input--on-FocusIn, exwm-input--init): Do not
handle FocusIn events on the root window.
2018-02-22 00:26:04 +08:00
Chris Feng
86f2215be3 Fix unexpected focus change after a global key binding is activated
* exwm-core.el (exwm--unlock): Select FocusChange events on the root
window.

* exwm-input.el (exwm-input--on-FocusIn): Input focus should stay on
the current workspace when the root window receives a FocusIn event.
2018-02-20 22:24:26 +08:00
Chris Feng
c821f76dfe Use the 'exwm-randr-output' frame parameter to determine the output
* exwm-randr.el (exwm-randr--refresh): Always set the name of primary
output.

* exwm-workspace.el (exwm-workspace-switch)
(exwm-workspace-move-window): Use 'exwm-randr-output' frame parameter
to check if two frames are on the same output.
2018-02-20 22:17:22 +08:00
Chris Feng
bfa35c0e38 Remove redundant code for fullscreen mode
* exwm-manage.el (exwm-manage--unmanage-window)
(exwm--on-ClientMessage): No need to modify workspace when an X window
enters/leaves fullscreen mode.
2018-02-20 22:09:27 +08:00
Chris Feng
7d4c57a6ab Add Customize interface for simulation keys
* exwm-input.el (exwm-input-simulation-keys): New user option for
setting simulation keys.
(exwm-input--init): Initialize simulation keys from this variable.

* exwm-input.el (exwm-input--simulation-prefix-keys)
(exwm-input--on-KeyPress-line-mode)
(exwm-input--update-simulation-prefix-keys)
(exwm-input-set-simulation-keys, exwm-input-set-local-simulation-keys)
(exwm-input-send-simulation-key): `exwm-input--simulation-keys' is now
a hash table storing both simulation keys and prefix keys.
(exwm-input--unset-simulation-keys): Clear the hash table.
(exwm-input--exit): Use `exwm-input--unset-simulation-keys'.
* exwm-core.el (exwm--kmacro-map, exwm-mode-menu): Adapt to the
change of `exwm-input--simulation-keys'.

* exwm-config.el (exwm-config-default): Update the example.
2018-02-20 21:57:49 +08:00
Chris Feng
5c5729c0d4 Fix various issues with multi-monitor support
* exwm-workspace.el (exwm-workspace-switch): Do not hide X windows
when switching to a workspace on another output; update the
timestamp (last switched to) of a workspace frame.
(exwm-workspace-move-window): Do not hide an X window when moving it
to an active workspace on another output.

* exwm-floating.el (exwm-floating--set-floating):
* exwm-layout.el (exwm-layout-set-fullscreen):
* exwm-manage.el (exwm-manage--manage-window)
(exwm-manage--on-ConfigureRequest):
* exwm-systemtray.el (exwm-systemtray--refresh)
(exwm-systemtray--init):
Correct coordinate calculations.

* exwm-workspace.el (exwm-workspace--current-width): Removed since no
longer used.
2018-02-19 22:40:27 +08:00
Chris Feng
b8ce20b4f3 Support displaying floating X windows on all workspaces
; Setting _NET_WM_DESKTOP to 0xffffffff makes an X windows appearing
; on all desktops (EWMH).  It's tricky to do it for tiling X windows
; so it's not implemented.

* exwm-core.el (exwm--desktop): New buffer-local variable recording
the value of _NET_WM_DESKTOP.
* exwm-layout.el (exwm-layout--hide): Do not hide X windows with this
property set to 0xffffffff.

* exwm.el (exwm--update-desktop): New function for fetching the value
of _NET_WM_DESKTOP and setting `exwm--desktop'.
* exwm-manage.el (exwm-manage--manage-window): Use it.

* exwm-workspace.el (exwm-workspace--set-desktop): Also update
`exwm--desktop'.
2018-02-19 22:34:03 +08:00
Chris Feng
d22e6740d7 Add customization settings
; Also fix documentations.
2018-02-19 00:04:27 +08:00
Chris Feng
7823eb988c Make X windows container-less
; This is an attempt to make (managed) X windows container-less, i.e. direct children of the root window.  This is mainly to make EXWM compatible with third-party compositors.  Other issues like wrong absolute position should also get resolved by the way.  The workspace containers ("virtual roots") are also removed.  However Emacs frames are still wrapped in containers to avoid unexpected stack reordering.

* exwm-cm.el: Make this module obsolete as EXWM supports third-party compositors now.

* exwm-core.el (exwm--container):
* exwm-floating.el (exwm-floating--set-floating)
(exwm-floating--unset-floating, exwm-floating-hide)
(exwm-floating--start-moveresize, exwm-floating--stop-moveresize)
(exwm-floating--do-moveresize, exwm-floating-move):
* exwm-input.el (exwm-input--update-focus):
* exwm-layout.el (exwm-layout--show, exwm-layout--hide)
(exwm-layout-set-fullscreen, exwm-layout-unset-fullscreen):
* exwm-manage.el (exwm-manage--manage-window, exwm-manage--unmanage-window)
(exwm-manage--kill-buffer-query-function, exwm-manage--kill-client):
* exwm-workspace.el (exwm-workspace--set-fullscreen, exwm-workspace-switch)
(exwm-workspace-move-window, exwm-workspace--add-frame-as-workspace)
(exwm-workspace--remove-frame-as-workspace): Make adaptions for container-less X windows.

* exwm-workspace.el (exwm-workspace--update-ewmh-props):
* exwm.el (exwm--init-icccm-ewmh, exwm--exit-icccm-ewmh): No longer use virtual roots.

* exwm-input.el (exwm-input--on-workspace-list-change)
(exwm-input--update-global-prefix-keys, exwm-input--init, exwm-input--exit): From now on global key bindings are grabbed on the root window so it's no long required to re-grab them each time the workspace list changes.  As a result `exwm-input--on-workspace-list-change' and its corresponding references are discarded.  It remains to be seen if this change will raise input focus issues.

* exwm-manage.el (exwm-manage--manage-window): Explicitly set the workspace for newly managed X windows.
* exwm-floating.el (exwm-floating--set-floating): Avoid implicit reference to the current workspace.

* exwm-core.el (exwm--set-geometry): New function for setting the geometry of an X window.
* exwm-layout.el (exwm-layout--resize-container): Replaced by `exwm-layout--resize-container'.

* exwm-core.el (exwm--guide-window): New global variable recording the guide X window.
* exwm.el (exwm--init-icccm-ewmh): Set it.

* exwm-input.el (exwm-input--post-init): New function containing staffs for initialization but should better get called after the event loop starts.
* exwm.el (exwm-init): Use it.
2018-02-18 01:04:04 +08:00
Chris Feng
83c0a2db34 Avoid crashing Emacs by resizing its frame into 0x0
* exwm-floating.el (exwm-floating--do-moveresize):
* exwm-layout.el (exwm-layout-enlarge-window): Resizing a frame into
0x0 crashes Emacs so additional checks are required.
2018-02-04 22:38:02 +08:00
Chris Feng
6b4bfad87b Support key translation in line-mode
* exwm-input.el (exwm-input--translate): New function for translating
keys according to `input-decode-map', `local-function-key-map' and
`key-translation-map'.
(exwm-input--cache-event): Use it.
2018-01-14 23:48:29 +08:00
Chris Feng
895633fe61 Raise docks after quitting full screen mode
* exwm-layout.el (exwm-layout-unset-fullscreen): Raise docks lowered
when entering full screen mode.
2018-01-14 23:46:04 +08:00
Chris Feng
46c4036306 ; Add missing autoload cookies. 2017-12-31 21:01:23 +08:00
Chris Feng
dd0a62c405 Add support for `mouse-autoselect-window'
; This feature requires both `mouse-autoselect-window` and
; `focus-follows-mouse' being set.  Delaying autoselection is not
; supported yet.

* exwm-core.el (exwm--client-event-mask): Select the EnterNotify event
on each X window when `mouse-autoselect-window' is set.
* exwm-input.el (exwm-input--on-EnterNotify): New function for making
`mouse-autoselect-window' work on X windows.
(exwm-input--init): Listen to EnterNotify event when
`mouse-autoselect-window' is set.
2017-12-31 20:53:58 +08:00
Chris Feng
76d6f608bc Update copyright year to 2018 2017-12-31 20:49:37 +08:00
Chris Feng
a145445da6 ; Eliminate a compilation warning. 2017-12-10 17:58:13 +08:00
Chris Feng
2b183f2212 Re-grab global keys on keyboard update
* exwm-input.el (exwm-input--on-keysyms-update): New function for
re-grabbing global keys.
(exwm-input--init): Register it to XELB.
2017-11-26 20:26:57 +08:00
Chris Feng
76b567dddb Bump version to 0.16 2017-11-26 11:18:31 +08:00
Chris Feng
dd6596b1f4 Another fix for input focus issues
* exwm-core.el (exwm--defer):
* exwm-input.el (exwm-input--update-focus-defer): Avoid unnecessarily
long delay.

* exwm-input.el (exwm-input--on-FocusIn): Filter out FocusIn events
generated as a result of grab/ungrab or when the keyboard is grabbed.
2017-11-24 22:47:42 +08:00
Chris Feng
589b840409 Fix possible wrong context when killing buffers
* exwm-manage.el (exwm-manage--unmanage-window): Make sure to use the
correct context to read/set buffer-local variables when killing
buffers.
2017-11-24 22:43:16 +08:00
Chris Feng
71a39840b2 Fix various input focus issues
* exwm-input.el (exwm-input--on-buffer-list-update): Cancel the frame
redirection introduced by 421c0512f7.

* exwm-input.el (exwm-input--on-buffer-list-update): Only ignore temp
buffers just switched from.

* exwm-input.el (exwm-input--update-focus-commit): New function for
ensuring the input focus lock can always be released.
(exwm-input--update-focus-defer, exwm-input--update-focus): Use it.

* exwm-input.el (exwm-input--update-focus): No need to select frames;
only transfer X input focus.

* exwm-core.el (exwm--defer): New macro for correcting the use of
`run-with-idle-timer' by taking `current-idle-time' into account.
* exwm-input.el (exwm-input--update-focus-defer)
(exwm-input--update-focus):
* exwm-layout.el (exwm-layout--on-minibuffer-setup)
(exwm-layout--on-echo-area-change):
* exwm-manage.el (exwm-manage--unmanage-window)
(exwm-workspace--prompt-delete):
* exwm-workspace.el (exwm-workspace-switch)
(exwm-workspace--add-frame-as-workspace):
Use it.
2017-11-19 14:51:45 +08:00
Chris Feng
55626530f4 Free unused X resources
* exwm-cm.el (exwm-cm--paint-tree): Make sure the clip can be
destroyed even the X window is in full screen mode.
(exwm-cm--paint-transparent, exwm-cm--paint-background): Free pixmaps
after creating pictures.
2017-11-19 14:46:35 +08:00
Chris Feng
0106dd69c7 Correct the detection of emacsclient
* exwm.el (exwm-enable): Use `daemonp' instead of `display-graphic-p'.
2017-11-19 14:44:28 +08:00
Chris Feng
61274e0953 Merge branch 'kriyative/bugfix-selecting-deleted-buffer-error' into externals/exwm 2017-11-19 14:41:15 +08:00
Chris Feng
21351f6be3 Be more precise when choosing the init hook
* exwm.el (exwm-enable): Run `exwm-init' in
`after-make-frame-functions' only for emacsclient and
`window-setup-hook' only for ordinary sessions.
2017-11-09 01:28:50 +08:00
Chris Feng
088818fedb Update the workarounds for `unread-command-events'
* exwm-input.el (exwm-input--unread-event): Update the note.
(exwm-input-send-next-key): Remove the workaround.
2017-11-09 01:17:58 +08:00
Ram Krishnan
93d96757b6 Fix for "Selecting deleted buffer" exception 2017-11-05 08:13:09 -08:00
Chris Feng
dea874e240 Filter out events relating to temp buffers
* exwm-input.el (exwm-input--on-buffer-list-update): Filter out events
relating to temp buffers by detecting if temp-buffer is present.
2017-11-05 22:34:05 +08:00
Chris Feng
3edf2e8880 Fix systemtray applications crash when restarting
* exwm-systemtray.el (exwm-systemtray--exit): Reparent out the tray
embedder to protect tray icons.
2017-10-09 00:29:05 +08:00
Chris Feng
75eb43e1e0 Avoid comparing raw button events
* exwm-input.el (exwm-input--move-keysym, exwm-input--move-mask)
(exwm-input--resize-keysym, exwm-input--resize-mask): Removed.
(exwm-input--on-ButtonPress): Compare using Emacs events rather than
raw X11 events or it would fail with num-lock no.
(exwm-input--init): No longer cache raw keysym/state for button events.
2017-09-10 18:00:01 +08:00
Chris Feng
7bc4ea5a6e Update systemtray when initializing
* exwm-systemtray.el (exwm-systemtray--init): Systemtray is not placed
correctly when there's a panel launched before EXWM.
2017-08-31 01:00:51 +08:00
Chris Feng
46dfaeb031 Avoid reusing dedicated window
* exwm-floating.el (exwm-floating--unset-floating):
* exwm-manage.el (exwm-manage--on-MapRequest):
Do not select a dedicated window for displaying a buffer.
2017-08-31 00:58:39 +08:00
Chris Feng
4eda6dde41 Bump version to 0,15 2017-08-02 23:05:57 +08:00
Chris Feng
7d967e7361 Allow customizing workspace indexes
* exwm-workspace.el (exwm-workspace-index-map): New variable for
customizing workspace indexes.
(exwm-workspace--update-switch-history): Use it.
2017-07-16 17:08:24 +08:00
Chris Feng
19515dc074 Allow switching to a workspace by selecting one X window on it
* exwm-workspace.el (exwm-workspace-switch-to-buffer): Only allows it
when `exwm-layout-show-all-buffers' is nil.
2017-05-31 00:12:22 +08:00
Chris Feng
851ed8c280 Fix X display name comparison
* exwm-workspace--add-frame-as-workspace
(exwm-workspace--add-frame-as-workspace): Manually compare X display
names as there's no built-in function handles this correctly.
2017-05-30 01:25:58 +08:00
Chris Feng
2babc8d070 Bump version to 0.14 2017-05-07 18:43:42 +08:00
Chris Feng
267ebd7f55 Force repositioning floating Emacs frames
* exwm-floating.el (exwm-floating--set-floating): Ditto.
2017-05-07 18:40:08 +08:00
Chris Feng
2b7449ea42 ; Do not cache events for non-`exwm-mode' buffers 2017-04-23 23:39:06 +08:00
Chris Feng
d4cfa564be Avoid comparing X display names
* exwm-workspace.el (exwm-workspace--add-frame-as-workspace): An X
display name set by XELB can be different from (but equivalent with)
the one set by Emacs.
2017-04-16 21:46:07 +08:00
Chris Feng
7a5bb1156d Only add graphic frames to `exwm-manage--frame-outer-id-list'
* exwm-manage.el (exwm-manage--add-frame, exwm-manage--remove-frame):
Add checks for graphic frames.
2017-04-10 00:30:43 +08:00
Chris Feng
52dc261624 Manually run focus-in-hook' and focus-out-hook'
; Since X windows are managed by EXWM, the current Emacs frame should
always be considered focused logically.

* exwm-workspace.el (exwm-workspace-switch): Manually run
`focus-in-hook' and `focus-out-hook'.
(exwm-workspace--handle-focus-in, exwm-workspace--handle-focus-out):
New functions for overriding `handle-focus-in' and `handle-focus-out'.
(exwm-workspace--init, exwm-workspace--exit): Override
`handle-focus-in' and `handle-focus-out'
2017-03-05 01:10:43 +08:00
Chris Feng
eebf764edd ; Update the workaround for bug#23980 2017-03-05 01:09:26 +08:00
Chris Feng
b79a3c52a5 Merge branch 'Stebalien/expose-line-mode-passthrough' into externals/exwm 2017-02-24 23:30:02 +08:00
Chris Feng
d0e9895748 ; Expose `exwm-input-line-mode-passthrough' as a public interface. 2017-02-24 23:25:02 +08:00
Chris Feng
f299ca5ed7 Fix systemtray position
* exwm-workspace.el (exwm-workspace--update-workareas-hook): New hook
run when workareas get updated.
(exwm-workspace--update-workareas): Run the hook.
* exwm-systemtray.el (exwm-systemtray--on-workspace-switch)
(exwm-systemtray--on-randr-refresh): Take struts into account when
calculating the position for systemtray.
(exwm-systemtray--on-struts-update): Alias of
`exwm-systemtray--on-randr-refresh'.
(exwm-systemtray--init, exwm-systemtray--exit): Manipulate
`exwm-workspace--update-workareas-hook'.
2017-02-24 23:13:52 +08:00