diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-01-13 12:43:09 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-01-13 12:45:22 +0000 |
commit | ebf541f7c5f080fa3a6f363ec8e823cc37c0c6b2 (patch) | |
tree | 2bde9d3af7ac896fce147bcc7ecfc5d2285e5df3 /desktop | |
parent | f424c8f053797bc9d559865f52822d9cbf33ae3f (diff) |
refactor this to open the display just once
and use the https://wiki.gnome.org/HowDoI/HiDpi
HiDPI detection rules.
all of this does nothing in practice, cause there is
no hidpi splashscreen image
Change-Id: I609faab0f207d71fd4a17bb54ef688bdd623eaea
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/unx/source/splashx.c | 182 |
1 files changed, 96 insertions, 86 deletions
diff --git a/desktop/unx/source/splashx.c b/desktop/unx/source/splashx.c index c4740993cd50..43b178bc2e4b 100644 --- a/desktop/unx/source/splashx.c +++ b/desktop/unx/source/splashx.c @@ -43,6 +43,10 @@ struct splash Display* display; int screen; int depth; + int display_width; + int display_height; + int display_x_pos; + int display_y_pos; Visual* visual; int width; @@ -388,24 +392,14 @@ static void suppress_decorations(struct splash* splash) } /** - * Create the window for the splash screen + * Connects to the display and initiales splash with the screen details * * @return Success: 1; Failure: 0 */ -static int splash_create_window( struct splash* splash, int argc, char** argv ) +static int splash_init_display( struct splash* splash, int argc, char** argv ) { char *display_name = NULL; int i; - Window root_win; - int display_width = 0; - int display_height = 0; - int display_x_pos = 0; - int display_y_pos = 0; - unsigned long value_mask = 0; - XGCValues values; - const char* name = "LibreOffice"; - const char* icon = "icon"; // FIXME - XSizeHints size_hints; #ifdef USE_XINERAMA int n_xinerama_screens = 1; XineramaScreenInfo* p_screens = NULL; @@ -437,9 +431,10 @@ static int splash_create_window( struct splash* splash, int argc, char** argv ) splash->color_map = DefaultColormap( splash->display, splash->screen ); splash->visual = DefaultVisual( splash->display, splash->screen ); - root_win = RootWindow( splash->display, splash->screen ); - display_width = DisplayWidth( splash->display, splash->screen ); - display_height = DisplayHeight( splash->display, splash->screen ); + splash->display_width = DisplayWidth( splash->display, splash->screen ); + splash->display_height = DisplayHeight( splash->display, splash->screen ); + splash->display_x_pos = 0; + splash->display_y_pos = 0; #ifdef USE_XINERAMA p_screens = XineramaQueryScreens( splash->display, &n_xinerama_screens ); @@ -449,20 +444,38 @@ static int splash_create_window( struct splash* splash, int argc, char** argv ) { if ( p_screens[i].screen_number == splash->screen ) { - display_width = p_screens[i].width; - display_height = p_screens[i].height; - display_x_pos = p_screens[i].x_org; - display_y_pos = p_screens[i].y_org; + splash->display_width = p_screens[i].width; + splash->display_height = p_screens[i].height; + splash->display_x_pos = p_screens[i].x_org; + splash->display_y_pos = p_screens[i].y_org; break; } } XFree( p_screens ); } #endif + return 1; +} + +/** + * Create the window for the splash screen + * + * @return Success: 1; Failure: 0 + */ +static int splash_create_window(struct splash* splash) +{ + Window root_win; + unsigned long value_mask = 0; + XGCValues values; + const char* name = "LibreOffice"; + const char* icon = "icon"; // FIXME + XSizeHints size_hints; + + root_win = RootWindow( splash->display, splash->screen ); splash->win = XCreateSimpleWindow( splash->display, root_win, - (display_x_pos + (display_width - splash->width)/2), - (display_y_pos + (display_height - splash->height)/2), + (splash->display_x_pos + (splash->display_width - splash->width)/2), + (splash->display_y_pos + (splash->display_height - splash->height)/2), splash->width, splash->height, 0, BlackPixel( splash->display, splash->screen ), BlackPixel( splash->display, splash->screen ) ); @@ -481,8 +494,8 @@ static int splash_create_window( struct splash* splash, int argc, char** argv ) splash->gc = XCreateGC( splash->display, splash->win, value_mask, &values ); size_hints.flags = PPosition | PSize | PMinSize | PMaxSize; - size_hints.x = display_x_pos; - size_hints.y = display_y_pos; + size_hints.x = splash->display_x_pos; + size_hints.y = splash->display_y_pos; size_hints.width = splash->width; size_hints.height = splash->height; size_hints.min_width = splash->width; @@ -531,29 +544,28 @@ static rtl_String* ustr_to_str( rtl_uString* pStr ) return pOut; } -static sal_Bool getScreenSize(int* display_width, int* display_height) +static sal_Bool isHiDPI(struct splash* splash) { - Display* bDisplay = NULL; - Screen* bScreen = NULL; + const char* pValStr; + double nDPI; - bDisplay = XOpenDisplay( NULL ); - if ( !bDisplay ) - { - fprintf( stderr, "Failed to open default display.\n" ); + /* + * GNOME currently enables hi-dpi support when the screen resolution is at least 192 dpi + * and the screen height (in device pixels) is at least 1200. + */ + + if (splash->display_height < 1200) return sal_False; - } - bScreen = DefaultScreenOfDisplay( bDisplay ); - if ( !bScreen ) - { - fprintf( stderr, "Failed to obtain the default screen of given display.\n" ); + pValStr = XGetDefault(splash->display, "Xft", "dpi"); + /* if its too old to have this, assume its not hidpi */ + if (!pValStr) return sal_False; - } - *display_width = bScreen->width; - *display_height = bScreen->height; + nDPI = strtod(pValStr, NULL); + if (nDPI < 192) + return sal_False; - XCloseDisplay( bDisplay ); return sal_True; } @@ -566,7 +578,7 @@ static void splash_load_image( struct splash* splash, rtl_uString* pUAppPath ) * now the splash screen will have to get along with language-territory. */ char *pBuffer, *pSuffix, *pLocale; - int nLocSize, display_width, display_height; + int nLocSize; rtl_Locale *pLoc = NULL; rtl_String *pLang, *pCountry, *pAppPath; @@ -594,26 +606,20 @@ static void splash_load_image( struct splash* splash, rtl_uString* pUAppPath ) strcat (pSuffix, pLocale); strcat (pSuffix, IMG_SUFFIX); if ( splash_load_bmp( splash, pBuffer ) ) - goto cleanup; + goto cleanup; /* success */ - if ( getScreenSize( &display_width, &display_height ) == sal_True ) + /* load high resolution splash image */ + if (isHiDPI(splash)) { - //load high resolution splash image - if ( display_width > 1920 && display_height > 1024 ) // suggest better display size limits? - { - //TODO- change progress bar parameters after getting size of intro-highres.png - strcpy (pSuffix, "intro-highres" IMG_SUFFIX); - if ( splash_load_bmp( splash, pBuffer ) ) - goto cleanup; - } - //load low resolution splash image - else - { - strcpy (pSuffix, "intro" IMG_SUFFIX); - if ( splash_load_bmp( splash, pBuffer ) ) - goto cleanup; - } + /* TODO- change progress bar parameters after getting size of intro-highres.png */ + strcpy (pSuffix, "intro-highres" IMG_SUFFIX); + if ( splash_load_bmp( splash, pBuffer ) ) + goto cleanup; /* success */ } + /* load standard resolution splash image */ + strcpy (pSuffix, "intro" IMG_SUFFIX); + if ( splash_load_bmp( splash, pBuffer ) ) + goto cleanup; /* success */ fprintf (stderr, "Failed to find intro image\n"); @@ -729,37 +735,41 @@ struct splash* splash_create(rtl_uString* pAppPath, int argc, char** argv) sal_Bool bNoDefaults = sal_False; splash = calloc(1, sizeof(struct splash)); - if(splash) + if (splash && !splash_init_display(splash, argc, argv)) { - splash->width = WINDOW_WIDTH; - splash->height = WINDOW_HEIGHT; - - splash->tlx = 212; - splash->tly = 216; - splash->barwidth = 263; - splash->barheight = 8; - splash->barspace = PROGRESS_BARSPACE; - splash->barcol.b = 18; - splash->barcol.g = 202; - splash->barcol.r = 157; - splash->framecol.b = 0xD3; - splash->framecol.g = 0xD3; - splash->framecol.r = 0xD3; - - splash_load_image( splash, pAppPath ); - splash_load_defaults( splash, pAppPath, &bNoDefaults ); - - if (!bNoDefaults && splash_create_window( splash, argc, argv ) ) - { - splash_draw_progress( splash, 0 ); - } - else - { - splash_destroy(splash); - splash = NULL; - } + splash_destroy(splash); + splash = NULL; } - return splash; + + if (!splash) + return NULL; + + splash->width = WINDOW_WIDTH; + splash->height = WINDOW_HEIGHT; + + splash->tlx = 212; + splash->tly = 216; + splash->barwidth = 263; + splash->barheight = 8; + splash->barspace = PROGRESS_BARSPACE; + splash->barcol.b = 18; + splash->barcol.g = 202; + splash->barcol.r = 157; + splash->framecol.b = 0xD3; + splash->framecol.g = 0xD3; + splash->framecol.r = 0xD3; + + splash_load_image( splash, pAppPath ); + splash_load_defaults( splash, pAppPath, &bNoDefaults ); + + if (!bNoDefaults && splash_create_window(splash)) + { + splash_draw_progress( splash, 0 ); + return splash; + } + + splash_destroy(splash); + return NULL; } #else /* not ENABLE_QUICKSTART_LIBPNG */ |