[Pkg-wmaker-commits] [wmaker] 15/40: Added wGetHeadRelativeToCurrentHead function
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Sat Mar 11 13:08:18 UTC 2017
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch upstream
in repository wmaker.
commit 014a315f3a41b04028b3c1c3a8f612f73516dd8b
Author: gryf <gryf73 at gmail.com>
Date: Tue Feb 7 21:05:15 2017 +0100
Added wGetHeadRelativeToCurrentHead function
A new function for obtaining possible heads (displays) was added. It
allow to query for a head in four directions relative to the current
one.
---
src/xinerama.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/xinerama.h | 9 ++++++++
2 files changed, 79 insertions(+)
diff --git a/src/xinerama.c b/src/xinerama.c
index 3d26139..483046c 100644
--- a/src/xinerama.c
+++ b/src/xinerama.c
@@ -18,6 +18,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <stdlib.h>
+
#include "wconfig.h"
#include "xinerama.h"
@@ -236,6 +238,74 @@ int wGetHeadForWindow(WWindow * wwin)
return wGetHeadForRect(wwin->screen_ptr, rect);
}
+/* Find head on left, right, up or down direction relative to current
+head. If there is no screen available on pointed direction, -1 will be
+returned.*/
+int wGetHeadRelativeToCurrentHead(WScreen *scr, int current_head, int direction)
+{
+ short int found = 0;
+ int i;
+ int distance = 0;
+ int smallest_distance = 0;
+ int nearest_head = scr->xine_info.primary_head;
+ WMRect crect = wGetRectForHead(scr, current_head);
+
+ for (i = 0; i < scr->xine_info.count; i++) {
+ if (i == current_head)
+ continue;
+
+ WMRect *rect = &scr->xine_info.screens[i];
+
+ /* calculate distance from the next screen to current one */
+ switch (direction) {
+ case DIRECTION_LEFT:
+ if (rect->pos.x < crect.pos.x) {
+ found = 1;
+ distance = abs((rect->pos.x + rect->size.width)
+ - crect.pos.x) + abs(rect->pos.y + crect.pos.y);
+ }
+ break;
+ case DIRECTION_RIGHT:
+ if (rect->pos.x > crect.pos.x) {
+ found = 1;
+ distance = abs((crect.pos.x + crect.size.width)
+ - rect->pos.x) + abs(rect->pos.y + crect.pos.y);
+ }
+ break;
+ case DIRECTION_UP:
+ if (rect->pos.y < crect.pos.y) {
+ found = 1;
+ distance = abs((rect->pos.y + rect->size.height)
+ - crect.pos.y) + abs(rect->pos.x + crect.pos.x);
+ }
+ break;
+ case DIRECTION_DOWN:
+ if (rect->pos.y > crect.pos.y) {
+ found = 1;
+ distance = abs((crect.pos.y + crect.size.height)
+ - rect->pos.y) + abs(rect->pos.x + crect.pos.x);
+ }
+ break;
+ }
+
+ if (found && distance == 0)
+ return i;
+
+ if (smallest_distance == 0)
+ smallest_distance = distance;
+
+ if (abs(distance) <= smallest_distance) {
+ smallest_distance = distance;
+ nearest_head = i;
+ }
+ }
+
+ if (found && smallest_distance != 0 && nearest_head != current_head)
+ return nearest_head;
+
+ return -1;
+}
+
int wGetHeadForPoint(WScreen * scr, WMPoint point)
{
int i;
diff --git a/src/xinerama.h b/src/xinerama.h
index fd1d469..2910325 100644
--- a/src/xinerama.h
+++ b/src/xinerama.h
@@ -35,12 +35,21 @@ void wInitXinerama(WScreen *scr);
#define XFLAG_MULTIPLE 0x02
#define XFLAG_PARTIAL 0x04
+enum {
+ DIRECTION_LEFT,
+ DIRECTION_RIGHT,
+ DIRECTION_UP,
+ DIRECTION_DOWN
+};
+
int wGetRectPlacementInfo(WScreen *scr, WMRect rect, int *flags);
int wGetHeadForRect(WScreen *scr, WMRect rect);
int wGetHeadForWindow(WWindow *wwin);
+int wGetHeadRelativeToCurrentHead(WScreen *scr, int current_head, int direction);
+
int wGetHeadForPoint(WScreen *scr, WMPoint point);
int wGetHeadForPointerLocation(WScreen *scr);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmaker.git
More information about the Pkg-wmaker-commits
mailing list