diff options
author | Dave Airlie <airlied@redhat.com> | 2011-09-06 13:18:16 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-09-06 13:18:16 +0100 |
commit | 7c2e632527471defdbf5e4173f152d923e7a277c (patch) | |
tree | a24439c3009bbdba15630220a771516fa2347c7e | |
parent | 3a2a07a12832c92daf67bb5e9ecabf1cb3a12e9f (diff) |
drv/imped: add screen notifierdrvmodelv2wip2
this is used to signal drv screens when screens are attached/detached
-rw-r--r-- | drv/drv_scrnintstr.h | 11 | ||||
-rw-r--r-- | drv/impedplug.c | 9 | ||||
-rw-r--r-- | drv/impedscrn.c | 7 |
3 files changed, 27 insertions, 0 deletions
diff --git a/drv/drv_scrnintstr.h b/drv/drv_scrnintstr.h index 12192b8e9..53ae0b532 100644 --- a/drv/drv_scrnintstr.h +++ b/drv/drv_scrnintstr.h @@ -91,6 +91,15 @@ typedef void (* DrvStoreColorsProcPtr)( int /*ndef*/, xColorItem * /*pdef*/); +#define DRV_ACTION_BIND_SCREEN 1 +#define DRV_ACTION_UNBIND_SCREEN 2 +#define DRV_ACTION_SCREEN_NUM_CHANGE 3 + +typedef void (*DrvScreenNotifier)( + DrvScreenPtr, + ScreenPtr, + int action, int num_screens); + typedef struct _DrvScreen { /* new driver interface */ @@ -128,6 +137,8 @@ typedef struct _DrvScreen ResolveColorProcPtr ResolveColor; DrvSetScreenPixmapProcPtr SetScreenPixmap; + + DrvScreenNotifier ScreenChange; pointer blockData; pointer wakeupData; diff --git a/drv/impedplug.c b/drv/impedplug.c index b4c6a0a03..892cdcb77 100644 --- a/drv/impedplug.c +++ b/drv/impedplug.c @@ -157,4 +157,13 @@ Bool impedRemoveDrvScreen(ScreenPtr pScreen, DrvScreenPtr pDrvScreen) imped_screen->num_gpu--; + if (pDrvScreen->ScreenChange) + (*pDrvScreen->ScreenChange)(pDrvScreen, pScreen, DRV_ACTION_UNBIND_SCREEN, imped_screen->num_gpu); + + for (i = 0; i < imped_screen->num_gpu; i++) { + if (imped_screen->gpu[i]->ScreenChange) { + (*imped_screen->gpu[i]->ScreenChange)(imped_screen->gpu[i], pScreen, DRV_ACTION_SCREEN_NUM_CHANGE, imped_screen->num_gpu); + } + } + } diff --git a/drv/impedscrn.c b/drv/impedscrn.c index a32297181..803a5339c 100644 --- a/drv/impedscrn.c +++ b/drv/impedscrn.c @@ -537,6 +537,13 @@ void impedAttachDrvScreen(ScreenPtr pScreen, DrvScreenPtr pDrvScreen) imped_screen->gpu[i] = pDrvScreen; pDrvScreen->pScreen = pScreen; imped_screen->num_gpu++; + + for (i = 0; i < imped_screen->num_gpu; i++) { + if (imped_screen->gpu[i]->ScreenChange) { + int action = (imped_screen->gpu[i] == pDrvScreen) ? DRV_ACTION_BIND_SCREEN : DRV_ACTION_SCREEN_NUM_CHANGE; + (*imped_screen->gpu[i]->ScreenChange)(pDrvScreen, pScreen, action, imped_screen->num_gpu); + } + } } struct list drvscreen_list; |