{"action":"closed","number":15,"pull_request":{"url":"https://api.github.com/repos/danakj/openbox/pulls/15","id":26747295,"html_url":"https://github.com/danakj/openbox/pull/15","diff_url":"https://github.com/danakj/openbox/pull/15.diff","patch_url":"https://github.com/danakj/openbox/pull/15.patch","issue_url":"https://api.github.com/repos/danakj/openbox/issues/15","number":15,"state":"closed","locked":false,"title":"Add action to bring focus to the window at a specific point","user":{"login":"brainwater","id":1165833,"avatar_url":"https://avatars.githubusercontent.com/u/1165833?v=3","gravatar_id":"","url":"https://api.github.com/users/brainwater","html_url":"https://github.com/brainwater","followers_url":"https://api.github.com/users/brainwater/followers","following_url":"https://api.github.com/users/brainwater/following{/other_user}","gists_url":"https://api.github.com/users/brainwater/gists{/gist_id}","starred_url":"https://api.github.com/users/brainwater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brainwater/subscriptions","organizations_url":"https://api.github.com/users/brainwater/orgs","repos_url":"https://api.github.com/users/brainwater/repos","events_url":"https://api.github.com/users/brainwater/events{/privacy}","received_events_url":"https://api.github.com/users/brainwater/received_events","type":"User","site_admin":false},"body":"With the recent introduction of 4k monitors, the usable screen space on a single screen has increased significantly. I found that I spent an increased amount of time switching between windows because I was able to have more windows open on one desktop than ever before. I wanted to have a way to switch to another window in O(1) time. I decided that a way to select which window to go to based on the position in the screen in a 4x3 grid using the letters qwer,asdf,zxcv in order to select which position to go to the window. Unfortunately that functionallity was not available in openbox, so I modified it to allow this. So I added a new command \"FocusOnPoint\" that would bring the focus to the window at the specified point. An example of what it can be used for is in this snippet of my config file:\r\n```XML\r\n    <!-- Keybindings for focusing on a window in a grid -->\r\n    <keybind key=\"W-C-q\"><action name=\"FocusOnPoint\"><x>1/8</x><y>1/6</y></action></keybind>\r\n    <keybind key=\"W-C-w\"><action name=\"FocusOnPoint\"><x>3/8</x><y>1/6</y></action></keybind>\r\n    <keybind key=\"W-C-e\"><action name=\"FocusOnPoint\"><x>5/8</x><y>1/6</y></action></keybind>\r\n    <keybind key=\"W-C-r\"><action name=\"FocusOnPoint\"><x>7/8</x><y>1/6</y></action></keybind>\r\n    \r\n    <keybind key=\"W-C-a\"><action name=\"FocusOnPoint\"><x>1/8</x><y>3/6</y></action></keybind>\r\n    <keybind key=\"W-C-s\"><action name=\"FocusOnPoint\"><x>3/8</x><y>3/6</y></action></keybind>\r\n    <keybind key=\"W-C-d\"><action name=\"FocusOnPoint\"><x>5/8</x><y>3/6</y></action></keybind>\r\n    <keybind key=\"W-C-f\"><action name=\"FocusOnPoint\"><x>7/8</x><y>3/6</y></action></keybind>\r\n    \r\n    <keybind key=\"W-C-z\"><action name=\"FocusOnPoint\"><x>1/8</x><y>5/6</y></action></keybind>\r\n    <keybind key=\"W-C-x\"><action name=\"FocusOnPoint\"><x>3/8</x><y>5/6</y></action></keybind>\r\n    <keybind key=\"W-C-c\"><action name=\"FocusOnPoint\"><x>5/8</x><y>5/6</y></action></keybind>\r\n    <keybind key=\"W-C-v\"><action name=\"FocusOnPoint\"><x>7/8</x><y>5/6</y></action></keybind>\r\n```\r\n\r\nThe FocusOnPoint action takes 2 mandatory parameters \"x\" and \"y\", and one optional parameter, \"raise\". The x and y parameters take either an absolute position, or a fractional position based on the width or height of the screen, or a percentage based on the width or height of the screen. \"raise\" when set to true will cause the window that is being focused to also be raised to the front of the z-order.\r\n\r\nI had also added the following to my openbox config file for resizing and moving windows based on that same 4x3 grid using the same letters:\r\n```XML\r\n <!-- Keybindings for resizing windows in a grid -->\r\n    <keybind key=\"W-S-q\">\r\n      <keybind key=\"q\"><action name=\"MoveResizeTo\"><width>1/4</width><height>1/3</height></action></keybind>\r\n      <keybind key=\"w\"><action name=\"MoveResizeTo\"><width>2/4</width><height>1/3</height></action></keybind>\r\n      <keybind key=\"e\"><action name=\"MoveResizeTo\"><width>3/4</width><height>1/3</height></action></keybind>\r\n      <keybind key=\"r\"><action name=\"MoveResizeTo\"><width>4/4</width><height>1/3</height></action></keybind>\r\n      \r\n      <keybind key=\"a\"><action name=\"MoveResizeTo\"><width>1/4</width><height>2/3</height></action></keybind>\r\n      <keybind key=\"s\"><action name=\"MoveResizeTo\"><width>2/4</width><height>2/3</height></action></keybind>\r\n      <keybind key=\"d\"><action name=\"MoveResizeTo\"><width>3/4</width><height>2/3</height></action></keybind>\r\n      <keybind key=\"f\"><action name=\"MoveResizeTo\"><width>4/4</width><height>2/3</height></action></keybind>\r\n      \r\n      <keybind key=\"z\"><action name=\"MoveResizeTo\"><width>1/4</width><height>3/3</height></action></keybind>\r\n      <keybind key=\"x\"><action name=\"MoveResizeTo\"><width>2/4</width><height>3/3</height></action></keybind>\r\n      <keybind key=\"c\"><action name=\"MoveResizeTo\"><width>3/4</width><height>3/3</height></action></keybind>\r\n      <keybind key=\"v\"><action name=\"MoveResizeTo\"><width>4/4</width><height>3/3</height></action></keybind>\r\n    </keybind>\r\n    <!-- Keybindings for moving windows in a grid -->\r\n    <keybind key=\"W-S-w\">\r\n      <keybind key=\"q\"><action name=\"MoveResizeTo\"><x>0/4</x><y>0/3</y></action></keybind>\r\n      <keybind key=\"w\"><action name=\"MoveResizeTo\"><x>1/4</x><y>0/3</y></action></keybind>\r\n      <keybind key=\"e\"><action name=\"MoveResizeTo\"><x>2/4</x><y>0/3</y></action></keybind>\r\n      <keybind key=\"r\"><action name=\"MoveResizeTo\"><x>3/4</x><y>0/3</y></action></keybind>\r\n      \r\n      <keybind key=\"a\"><action name=\"MoveResizeTo\"><x>0/4</x><y>1/3</y></action></keybind>\r\n      <keybind key=\"s\"><action name=\"MoveResizeTo\"><x>1/4</x><y>1/3</y></action></keybind>\r\n      <keybind key=\"d\"><action name=\"MoveResizeTo\"><x>2/4</x><y>1/3</y></action></keybind>\r\n      <keybind key=\"f\"><action name=\"MoveResizeTo\"><x>3/4</x><y>1/3</y></action></keybind>\r\n      \r\n      <keybind key=\"z\"><action name=\"MoveResizeTo\"><x>0/4</x><y>2/3</y></action></keybind>\r\n      <keybind key=\"x\"><action name=\"MoveResizeTo\"><x>1/4</x><y>2/3</y></action></keybind>\r\n      <keybind key=\"c\"><action name=\"MoveResizeTo\"><x>2/4</x><y>2/3</y></action></keybind>\r\n      <keybind key=\"v\"><action name=\"MoveResizeTo\"><x>3/4</x><y>2/3</y></action></keybind>\r\n    </keybind>\r\n```\r\nHere are some screenshots that show the problem that I was running into with a 4k screen:\r\n![dtscreenshot-1](https://cloud.githubusercontent.com/assets/1165833/5593440/1b4fea14-91dd-11e4-9994-6f0fcae50a4b.jpg)\r\n![dtscreenshot-2](https://cloud.githubusercontent.com/assets/1165833/5593441/1b51d69e-91dd-11e4-9a9b-203c438c91d8.jpg)\r\n\r\n\r\n","created_at":"2015-01-01T22:55:08Z","updated_at":"2015-10-06T23:07:23Z","closed_at":"2015-10-06T23:07:23Z","merged_at":null,"merge_commit_sha":"1732ad9e7cbaa45dcd5c75d5a1f348569d6190db","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/danakj/openbox/pulls/15/commits","review_comments_url":"https://api.github.com/repos/danakj/openbox/pulls/15/comments","review_comment_url":"https://api.github.com/repos/danakj/openbox/pulls/comments{/number}","comments_url":"https://api.github.com/repos/danakj/openbox/issues/15/comments","statuses_url":"https://api.github.com/repos/danakj/openbox/statuses/9e8813e111cbe6c1088f6abbc771a29470f05fc2","head":{"label":"brainwater:master","ref":"master","sha":"9e8813e111cbe6c1088f6abbc771a29470f05fc2","user":{"login":"brainwater","id":1165833,"avatar_url":"https://avatars.githubusercontent.com/u/1165833?v=3","gravatar_id":"","url":"https://api.github.com/users/brainwater","html_url":"https://github.com/brainwater","followers_url":"https://api.github.com/users/brainwater/followers","following_url":"https://api.github.com/users/brainwater/following{/other_user}","gists_url":"https://api.github.com/users/brainwater/gists{/gist_id}","starred_url":"https://api.github.com/users/brainwater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brainwater/subscriptions","organizations_url":"https://api.github.com/users/brainwater/orgs","repos_url":"https://api.github.com/users/brainwater/repos","events_url":"https://api.github.com/users/brainwater/events{/privacy}","received_events_url":"https://api.github.com/users/brainwater/received_events","type":"User","site_admin":false},"repo":{"id":28696226,"name":"openbox","full_name":"brainwater/openbox","owner":{"login":"brainwater","id":1165833,"avatar_url":"https://avatars.githubusercontent.com/u/1165833?v=3","gravatar_id":"","url":"https://api.github.com/users/brainwater","html_url":"https://github.com/brainwater","followers_url":"https://api.github.com/users/brainwater/followers","following_url":"https://api.github.com/users/brainwater/following{/other_user}","gists_url":"https://api.github.com/users/brainwater/gists{/gist_id}","starred_url":"https://api.github.com/users/brainwater/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brainwater/subscriptions","organizations_url":"https://api.github.com/users/brainwater/orgs","repos_url":"https://api.github.com/users/brainwater/repos","events_url":"https://api.github.com/users/brainwater/events{/privacy}","received_events_url":"https://api.github.com/users/brainwater/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/brainwater/openbox","description":"Openbox Window Manager (OpenboxWM)","fork":true,"url":"https://api.github.com/repos/brainwater/openbox","forks_url":"https://api.github.com/repos/brainwater/openbox/forks","keys_url":"https://api.github.com/repos/brainwater/openbox/keys{/key_id}","collaborators_url":"https://api.github.com/repos/brainwater/openbox/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/brainwater/openbox/teams","hooks_url":"https://api.github.com/repos/brainwater/openbox/hooks","issue_events_url":"https://api.github.com/repos/brainwater/openbox/issues/events{/number}","events_url":"https://api.github.com/repos/brainwater/openbox/events","assignees_url":"https://api.github.com/repos/brainwater/openbox/assignees{/user}","branches_url":"https://api.github.com/repos/brainwater/openbox/branches{/branch}","tags_url":"https://api.github.com/repos/brainwater/openbox/tags","blobs_url":"https://api.github.com/repos/brainwater/openbox/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/brainwater/openbox/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/brainwater/openbox/git/refs{/sha}","trees_url":"https://api.github.com/repos/brainwater/openbox/git/trees{/sha}","statuses_url":"https://api.github.com/repos/brainwater/openbox/statuses/{sha}","languages_url":"https://api.github.com/repos/brainwater/openbox/languages","stargazers_url":"https://api.github.com/repos/brainwater/openbox/stargazers","contributors_url":"https://api.github.com/repos/brainwater/openbox/contributors","subscribers_url":"https://api.github.com/repos/brainwater/openbox/subscribers","subscription_url":"https://api.github.com/repos/brainwater/openbox/subscription","commits_url":"https://api.github.com/repos/brainwater/openbox/commits{/sha}","git_commits_url":"https://api.github.com/repos/brainwater/openbox/git/commits{/sha}","comments_url":"https://api.github.com/repos/brainwater/openbox/comments{/number}","issue_comment_url":"https://api.github.com/repos/brainwater/openbox/issues/comments{/number}","contents_url":"https://api.github.com/repos/brainwater/openbox/contents/{+path}","compare_url":"https://api.github.com/repos/brainwater/openbox/compare/{base}...{head}","merges_url":"https://api.github.com/repos/brainwater/openbox/merges","archive_url":"https://api.github.com/repos/brainwater/openbox/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/brainwater/openbox/downloads","issues_url":"https://api.github.com/repos/brainwater/openbox/issues{/number}","pulls_url":"https://api.github.com/repos/brainwater/openbox/pulls{/number}","milestones_url":"https://api.github.com/repos/brainwater/openbox/milestones{/number}","notifications_url":"https://api.github.com/repos/brainwater/openbox/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/brainwater/openbox/labels{/name}","releases_url":"https://api.github.com/repos/brainwater/openbox/releases{/id}","created_at":"2015-01-01T21:34:01Z","updated_at":"2015-01-01T22:33:50Z","pushed_at":"2015-10-06T23:07:23Z","git_url":"git://github.com/brainwater/openbox.git","ssh_url":"git@github.com:brainwater/openbox.git","clone_url":"https://github.com/brainwater/openbox.git","svn_url":"https://github.com/brainwater/openbox","homepage":"http://openbox.org","size":11521,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"danakj:master","ref":"master","sha":"9e8813e111cbe6c1088f6abbc771a29470f05fc2","user":{"login":"danakj","id":342377,"avatar_url":"https://avatars.githubusercontent.com/u/342377?v=3","gravatar_id":"","url":"https://api.github.com/users/danakj","html_url":"https://github.com/danakj","followers_url":"https://api.github.com/users/danakj/followers","following_url":"https://api.github.com/users/danakj/following{/other_user}","gists_url":"https://api.github.com/users/danakj/gists{/gist_id}","starred_url":"https://api.github.com/users/danakj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danakj/subscriptions","organizations_url":"https://api.github.com/users/danakj/orgs","repos_url":"https://api.github.com/users/danakj/repos","events_url":"https://api.github.com/users/danakj/events{/privacy}","received_events_url":"https://api.github.com/users/danakj/received_events","type":"User","site_admin":false},"repo":{"id":990804,"name":"openbox","full_name":"danakj/openbox","owner":{"login":"danakj","id":342377,"avatar_url":"https://avatars.githubusercontent.com/u/342377?v=3","gravatar_id":"","url":"https://api.github.com/users/danakj","html_url":"https://github.com/danakj","followers_url":"https://api.github.com/users/danakj/followers","following_url":"https://api.github.com/users/danakj/following{/other_user}","gists_url":"https://api.github.com/users/danakj/gists{/gist_id}","starred_url":"https://api.github.com/users/danakj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danakj/subscriptions","organizations_url":"https://api.github.com/users/danakj/orgs","repos_url":"https://api.github.com/users/danakj/repos","events_url":"https://api.github.com/users/danakj/events{/privacy}","received_events_url":"https://api.github.com/users/danakj/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/danakj/openbox","description":"Openbox Window Manager (OpenboxWM)","fork":false,"url":"https://api.github.com/repos/danakj/openbox","forks_url":"https://api.github.com/repos/danakj/openbox/forks","keys_url":"https://api.github.com/repos/danakj/openbox/keys{/key_id}","collaborators_url":"https://api.github.com/repos/danakj/openbox/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/danakj/openbox/teams","hooks_url":"https://api.github.com/repos/danakj/openbox/hooks","issue_events_url":"https://api.github.com/repos/danakj/openbox/issues/events{/number}","events_url":"https://api.github.com/repos/danakj/openbox/events","assignees_url":"https://api.github.com/repos/danakj/openbox/assignees{/user}","branches_url":"https://api.github.com/repos/danakj/openbox/branches{/branch}","tags_url":"https://api.github.com/repos/danakj/openbox/tags","blobs_url":"https://api.github.com/repos/danakj/openbox/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/danakj/openbox/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/danakj/openbox/git/refs{/sha}","trees_url":"https://api.github.com/repos/danakj/openbox/git/trees{/sha}","statuses_url":"https://api.github.com/repos/danakj/openbox/statuses/{sha}","languages_url":"https://api.github.com/repos/danakj/openbox/languages","stargazers_url":"https://api.github.com/repos/danakj/openbox/stargazers","contributors_url":"https://api.github.com/repos/danakj/openbox/contributors","subscribers_url":"https://api.github.com/repos/danakj/openbox/subscribers","subscription_url":"https://api.github.com/repos/danakj/openbox/subscription","commits_url":"https://api.github.com/repos/danakj/openbox/commits{/sha}","git_commits_url":"https://api.github.com/repos/danakj/openbox/git/commits{/sha}","comments_url":"https://api.github.com/repos/danakj/openbox/comments{/number}","issue_comment_url":"https://api.github.com/repos/danakj/openbox/issues/comments{/number}","contents_url":"https://api.github.com/repos/danakj/openbox/contents/{+path}","compare_url":"https://api.github.com/repos/danakj/openbox/compare/{base}...{head}","merges_url":"https://api.github.com/repos/danakj/openbox/merges","archive_url":"https://api.github.com/repos/danakj/openbox/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/danakj/openbox/downloads","issues_url":"https://api.github.com/repos/danakj/openbox/issues{/number}","pulls_url":"https://api.github.com/repos/danakj/openbox/pulls{/number}","milestones_url":"https://api.github.com/repos/danakj/openbox/milestones{/number}","notifications_url":"https://api.github.com/repos/danakj/openbox/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/danakj/openbox/labels{/name}","releases_url":"https://api.github.com/repos/danakj/openbox/releases{/id}","created_at":"2010-10-15T17:40:26Z","updated_at":"2015-10-03T05:01:14Z","pushed_at":"2015-10-06T21:36:07Z","git_url":"git://github.com/danakj/openbox.git","ssh_url":"git@github.com:danakj/openbox.git","clone_url":"https://github.com/danakj/openbox.git","svn_url":"https://github.com/danakj/openbox","homepage":"http://openbox.org","size":12334,"stargazers_count":120,"watchers_count":120,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":40,"mirror_url":null,"open_issues_count":9,"forks":40,"open_issues":9,"watchers":120,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/danakj/openbox/pulls/15"},"html":{"href":"https://github.com/danakj/openbox/pull/15"},"issue":{"href":"https://api.github.com/repos/danakj/openbox/issues/15"},"comments":{"href":"https://api.github.com/repos/danakj/openbox/issues/15/comments"},"review_comments":{"href":"https://api.github.com/repos/danakj/openbox/pulls/15/comments"},"review_comment":{"href":"https://api.github.com/repos/danakj/openbox/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/danakj/openbox/pulls/15/commits"},"statuses":{"href":"https://api.github.com/repos/danakj/openbox/statuses/9e8813e111cbe6c1088f6abbc771a29470f05fc2"}},"merged":false,"mergeable":null,"mergeable_state":"unknown","merged_by":null,"comments":2,"review_comments":0,"commits":0,"additions":0,"deletions":0,"changed_files":0}}