diff options
author | enselic <enselic@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2008-09-14 13:06:20 +0000 |
---|---|---|
committer | enselic <enselic@f606c939-3180-4ac9-a4b8-4b8779d57d0a> | 2008-09-14 13:06:20 +0000 |
commit | e5cdc6d4fbec00a52d06414ca243664bb8b40942 (patch) | |
tree | 60f4145527722c135e72cbe451b63f7499dd32a5 /recordmydesktop/src/rmd_poll_events.c | |
parent | 187945d42050c99c614ccf76099944b338461a19 (diff) |
src/*.[ch]: Rename files so that the name becomes
rmd_some_file.[ch]. The exceptions are recordmydesktop.c which is the
main file and skeleton.[ch] which are external files.
src/Makefile.am: Adapt.
git-svn-id: https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk@546 f606c939-3180-4ac9-a4b8-4b8779d57d0a
Diffstat (limited to 'recordmydesktop/src/rmd_poll_events.c')
-rw-r--r-- | recordmydesktop/src/rmd_poll_events.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/recordmydesktop/src/rmd_poll_events.c b/recordmydesktop/src/rmd_poll_events.c new file mode 100644 index 0000000..bfe96c9 --- /dev/null +++ b/recordmydesktop/src/rmd_poll_events.c @@ -0,0 +1,208 @@ +/****************************************************************************** +* recordMyDesktop * +******************************************************************************* +* * +* Copyright (C) 2006,2007,2008 John Varouhakis * +* * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * +* * +* * +* * +* For further information contact me at johnvarouhakis@gmail.com * +******************************************************************************/ + +#include "config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <X11/Xlib.h> +#include <X11/Xlibint.h> +#include <X11/extensions/Xdamage.h> +#include <signal.h> +#include <pthread.h> + +#include "rmd_frame.h" +#include "rmd_macro.h" +#include "rmd_poll_events.h" +#include "rmd_rectinsert.h" +#include "rmd_types.h" + + +#define CLIP_EVENT_AREA(e,brwin,wgeom){\ + if(((e)->area.x<=(brwin)->rgeom.x)&&((e)->area.y<=(brwin)->rgeom.y)&&\ + ((e)->area.width>=(brwin)->rgeom.width)&&\ + ((e)->area.height<(brwin)->rgeom.height)){\ + (wgeom)->x=(brwin)->rgeom.x;\ + (wgeom)->y=(brwin)->rgeom.y;\ + (wgeom)->width=(brwin)->rgeom.width;\ + (wgeom)->height=(brwin)->rgeom.height;\ + }\ + else{\ + (wgeom)->x=((((e)->area.x+(e)->area.width>=(brwin)->rgeom.x)&&\ + ((e)->area.x<=(brwin)->rgeom.x+(brwin)->rgeom.width))?\ + (((e)->area.x<=(brwin)->rgeom.x)?(brwin)->rgeom.x:(e)->area.x):-1);\ + \ + (wgeom)->y=((((e)->area.y+(e)->area.height>=(brwin)->rgeom.y)&&\ + ((e)->area.y<=(brwin)->rgeom.y+(brwin)->rgeom.height))?\ + (((e)->area.y<=(brwin)->rgeom.y)?(brwin)->rgeom.y:(e)->area.y):-1);\ + \ + (wgeom)->width=((e)->area.x<=(brwin)->rgeom.x)?\ + (e)->area.width-((brwin)->rgeom.x-(e)->area.x):\ + ((e)->area.x<=(brwin)->rgeom.x+(brwin)->rgeom.width)?\ + (((brwin)->rgeom.width-(e)->area.x+(brwin)->rgeom.x<(e)->area.width)?\ + (brwin)->rgeom.width-(e)->area.x+(brwin)->rgeom.x:e->area.width):-1;\ + \ + (wgeom)->height=((e)->area.y<=(brwin)->rgeom.y)?\ + (e)->area.height-((brwin)->rgeom.y-(e)->area.y):\ + ((e)->area.y<=(brwin)->rgeom.y+(brwin)->rgeom.height)?\ + (((brwin)->rgeom.height-(e)->area.y+\ + (brwin)->rgeom.y<(e)->area.height)?\ + (brwin)->rgeom.height-(e)->area.y+\ + (brwin)->rgeom.y:(e)->area.height):-1;\ + \ + if((wgeom)->width>(brwin)->rgeom.width)\ + (wgeom)->width=(brwin)->rgeom.width;\ + if((wgeom)->height>(brwin)->rgeom.height)\ + (wgeom)->height=(brwin)->rgeom.height;\ + }\ +} + + +void InitEventsPolling(ProgData *pdata){ + Window root_return, + parent_return, + *children; + unsigned int i, + nchildren; + + + XSelectInput (pdata->dpy,pdata->specs.root, SubstructureNotifyMask); + + + if(!pdata->args.full_shots){ + XQueryTree (pdata->dpy, + pdata->specs.root, + &root_return, + &parent_return, + &children, + &nchildren); + + for (i = 0; i < nchildren; i++){ + XWindowAttributes attribs; + if (XGetWindowAttributes (pdata->dpy,children[i],&attribs)){ + if(!attribs.override_redirect && + attribs.depth==pdata->specs.depth) + XDamageCreate(pdata->dpy, + children[i], + XDamageReportRawRectangles); + } + } + XFree(children); + XDamageCreate(pdata->dpy, + pdata->specs.root, + XDamageReportRawRectangles); + } + + + +} + + +void EventLoop(ProgData *pdata){ + int inserts=0; + + XEvent event; + + while(XPending(pdata->dpy)){ + XNextEvent(pdata->dpy,&event); + if(event.type == KeyPress){ + XKeyEvent *e=(XKeyEvent *)(&event); + if(e->keycode == pdata->pause_key.key){ + int i=0; + int found=0; + for(i=0;i<pdata->pause_key.modnum;i++){ + if(pdata->pause_key.mask[i]==e->state){ + found=1; + break; + } + } + if(found){ + raise(SIGUSR1); + continue; + } + } + if(e->keycode == pdata->stop_key.key){ + int i=0; + int found=0; + for(i=0;i<pdata->stop_key.modnum;i++){ + if(pdata->stop_key.mask[i]==e->state){ + found=1; + break; + } + } + if(found){ + raise(SIGINT); + continue; + } + } + } + else if(event.type == Expose){ + + if(event.xexpose.count!=0) + continue; + else if(!pdata->args.noframe){ + rmdDrawFrame(pdata->dpy, + pdata->specs.screen, + pdata->shaped_w, + pdata->brwin.rgeom.width, + pdata->brwin.rgeom.height); + + } + + } + else if(!pdata->args.full_shots){ + if(event.type == MapNotify ){ + XWindowAttributes attribs; + if (!((XMapEvent *)(&event))->override_redirect&& + XGetWindowAttributes(pdata->dpy, + event.xcreatewindow.window, + &attribs)){ + if(!attribs.override_redirect&& + attribs.depth==pdata->specs.depth) + XDamageCreate(pdata->dpy, + event.xcreatewindow.window, + XDamageReportRawRectangles); + } + } + else if(event.type == pdata->damage_event + XDamageNotify ){ + XDamageNotifyEvent *e =(XDamageNotifyEvent *)( &event ); + WGeometry wgeom; + CLIP_EVENT_AREA(e,&(pdata->brwin),&wgeom); + if((wgeom.x>=0)&&(wgeom.y>=0)&& + (wgeom.width>0)&&(wgeom.height>0)){ + + inserts+=RectInsert(&pdata->rect_root,&wgeom); + + } + } + } + + } + + +} + + |