summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-09-06 13:18:16 +0100
committerDave Airlie <airlied@redhat.com>2011-09-06 13:18:16 +0100
commit7c2e632527471defdbf5e4173f152d923e7a277c (patch)
treea24439c3009bbdba15630220a771516fa2347c7e
parent3a2a07a12832c92daf67bb5e9ecabf1cb3a12e9f (diff)
drv/imped: add screen notifierdrvmodelv2wip2
this is used to signal drv screens when screens are attached/detached
-rw-r--r--drv/drv_scrnintstr.h11
-rw-r--r--drv/impedplug.c9
-rw-r--r--drv/impedscrn.c7
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;