/* Copyright (c) 2002, Thomas Kurschel Part of Radeon driver Multi-Monitor Settings interface */ #include "multimon.h" #include "accelerant_ext.h" #include #include #include #include #include // prepare parameters so they recognized as tunneled settings static void PrepareTunnel( display_mode *mode, display_mode *low, display_mode *high ) { memset( mode, 0, sizeof( *mode )); // mark modes as settings tunnel mode->space = low->space = high->space = 0; low->virtual_width = 0xffff; low->virtual_height = 0xffff; high->virtual_width = 0; high->virtual_height = 0; mode->timing.pixel_clock = 0; low->timing.pixel_clock = 'TKTK'; high->timing.pixel_clock = 'KTKT'; } // retrieve value of setting "code" static status_t GetSetting( BScreen *screen, uint16 code, uint32 *setting ) { display_mode mode, low, high; status_t result; result = TestMultiMonSupport( screen ); if( result != B_OK ) return result; PrepareTunnel( &mode, &low, &high ); mode.h_display_start = code; mode.v_display_start = 0; result = screen->ProposeMode( &mode, &low, &high ); if( result != B_OK ) return result; *setting = mode.timing.flags; return B_OK; } // set setting "code" to "value" static status_t SetSetting( BScreen *screen, uint16 code, uint32 value ) { display_mode mode, low, high; status_t result; result = TestMultiMonSupport( screen ); if( result != B_OK ) return result; PrepareTunnel( &mode, &low, &high ); mode.h_display_start = code; mode.v_display_start = 1; mode.timing.flags = value; return screen->ProposeMode( &mode, &low, &high ); } // retrieve n-th supported value of setting "code" static status_t GetNthSupportedSetting( BScreen *screen, uint16 code, int32 idx, uint32 *setting ) { display_mode mode, low, high; status_t result; result = TestMultiMonSupport( screen ); if( result != B_OK ) return result; PrepareTunnel( &mode, &low, &high ); mode.h_display_start = code; mode.v_display_start = 2; mode.timing.flags = idx; result = screen->ProposeMode( &mode, &low, &high ); if( result != B_OK ) return result; *setting = mode.timing.flags; return B_OK; } // get current Swap Displays settings status_t GetSwapDisplays( BScreen *screen, bool *swap ) { status_t result; uint32 tmp; result = GetSetting( screen, ms_swap, &tmp ); if( result != B_OK ) return result; *swap = tmp != 0; return B_OK; } // set "Swap Displays" status_t SetSwapDisplays( BScreen *screen, bool swap ) { return SetSetting( screen, ms_swap, swap ); } // get current "Use Laptop Panel" settings status_t GetUseLaptopPanel( BScreen *screen, bool *use ) { status_t result; uint32 tmp; result = GetSetting( screen, ms_use_laptop_panel, &tmp ); if( result != B_OK ) return result; *use = tmp != 0; return B_OK; } // set "Use Laptop Panel" status_t SetUseLaptopPanel( BScreen *screen, bool use ) { return SetSetting( screen, ms_use_laptop_panel, use ); } // get n-th supported TV standard status_t GetNthSupportedTVStandard( BScreen *screen, int idx, uint32 *standard ) { return GetNthSupportedSetting( screen, ms_tv_standard, (int32)idx, standard ); } // get current TV Standard settings status_t GetTVStandard( BScreen *screen, uint32 *standard ) { return GetSetting( screen, ms_tv_standard, standard ); } // set TV Standard status_t SetTVStandard( BScreen *screen, uint32 standard ) { return SetSetting( screen, ms_tv_standard, standard ); } // Verify existence of Multi-Monitor Settings Tunnel status_t TestMultiMonSupport(BScreen *screen) { display_mode *modeList = NULL; display_mode low, high; uint32 count; status_t result; // take any valid mode result = screen->GetModeList(&modeList, &count); if (result != B_OK) return result; if (count < 1) return B_ERROR; // set request bits modeList[0].timing.flags |= RADEON_MODE_MULTIMON_REQUEST; modeList[0].timing.flags &= ~RADEON_MODE_MULTIMON_REPLY; low = high = modeList[0]; result = screen->ProposeMode(&modeList[0], &low, &high); if (result != B_OK) goto out; // check reply bits if ((modeList[0].timing.flags & RADEON_MODE_MULTIMON_REQUEST) == 0 && (modeList[0].timing.flags & RADEON_MODE_MULTIMON_REPLY) != 0) result = B_OK; else result = B_ERROR; out: free(modeList); return result; }