Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 114 additions & 0 deletions types/webscreens-window-placement/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
// Type definitions for non-npm package webscreens multi screen window placement 0.1
// Project: https://webscreens.github.io/window-placement/
// Definitions by: Colin Richardson <https://github.com/WORMSS>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped

/// <reference lib="dom" />

interface ScreenDetailsEventHandlersEventMap {
currentscreenchange: Event;
screenschange: Event;
}

interface ScreenEventHandlersEventMap {
change: Event;
}

interface ScreenDetailedEventHandlersEventMap {
change: Event;
}

interface ScreenDetailsEventHandlers extends EventTarget {
oncurrentscreenchange: ((this: ScreenDetails, ev: Event) => any) | null;
onscreenschange: ((this: ScreenDetails, ev: Event) => any) | null;
addEventListener<K extends keyof ScreenDetailsEventHandlersEventMap>(
type: K,
listener: (this: ScreenDetails, ev: ScreenDetailsEventHandlersEventMap[K]) => any,
options?: boolean | AddEventListenerOptions,
): void;
addEventListener(
type: string,
callback: EventListenerOrEventListenerObject | null,
options?: AddEventListenerOptions | boolean,
): void;
}

interface ScreenEventHandlers extends EventTarget {
onchange: ((this: Screen, ev: Event) => any) | null;
addEventListener<K extends keyof ScreenEventHandlersEventMap>(
type: K,
listener: (this: Screen, ev: ScreenEventHandlersEventMap[K]) => any,
options?: boolean | AddEventListenerOptions,
): void;
addEventListener(
type: string,
callback: EventListenerOrEventListenerObject | null,
options?: AddEventListenerOptions | boolean,
): void;
}

interface ScreenDetailedEventHandlers extends EventTarget {
onchange: ((this: ScreenDetailed, ev: Event) => any) | null;
addEventListener<K extends keyof ScreenDetailedEventHandlersEventMap>(
type: K,
listener: (this: Screen, ev: ScreenDetailedEventHandlersEventMap[K]) => any,
options?: boolean | AddEventListenerOptions,
): void;
addEventListener(
type: string,
callback: EventListenerOrEventListenerObject | null,
options?: AddEventListenerOptions | boolean,
): void;
}

// enhance window.Window with getScreenDetails method.
interface Window {
getScreenDetails(): Promise<ScreenDetails>;
}

// enhance window.Screen with isExtended property
// enhance window.Screen with event handling
interface Screen extends ScreenEventHandlers {
isExtended: boolean;
}

// enhance element.requestFullScreen(options)
interface FullscreenOptions {
screen?: ScreenDetailed;
}

interface ScreenDetails extends ScreenDetailsEventHandlers {
screens: ScreenDetailed[];
currentScreen: ScreenDetailed;
}

// Extend window.Screen
// This should ideally extend ScreenDetailsEventHandlers also, but TS doesn't like it.
interface ScreenDetailed extends Screen /*, ScreenDetailsEventHandlers*/ {
left: number;
top: number;
isPrimary: boolean;
isInternal: boolean;
devicePixelRatio: number;
label: string;
}

// enhance window.navigator.permissions.query({ name });
// Failed Attempts on adding an additional value to PermissionName type
// // TSError Duplicate identifier 'PermissionName'.
// type PermissionName = PermissionName | 'window-placement';
//
// interface PermissionDescriptor {
// // TSError Subsequent property declarations must have the same type.
// name: PermissionName | 'window-placement';
// }
//
// How I achieved it, but I am not happy about it.
type PermissionDescriptorWithWindowPlacement =
| PermissionDescriptor
| {
name: 'window-placement';
};
interface Permissions {
query(permissionDesc: PermissionDescriptorWithWindowPlacement): Promise<PermissionStatus>;
}
24 changes: 24 additions & 0 deletions types/webscreens-window-placement/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6",
"dom"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"webscreens-window-placement-tests.ts"
]
}
1 change: 1 addition & 0 deletions types/webscreens-window-placement/tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "extends": "@definitelytyped/dtslint/dt.json" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* Test Screen Details
*/

window.getScreenDetails().then((screenDetails: ScreenDetails) => {
const currentScreen: ScreenDetailed = screenDetails.currentScreen;

const screens: ScreenDetailed[] = screenDetails.screens;

screenDetails.oncurrentscreenchange = (ev: Event) => console.log(ev);
screenDetails.onscreenschange = (ev: Event) => console.log(ev);

screenDetails.addEventListener('screenschange', (ev: Event) => console.log(ev));
screenDetails.addEventListener('screenschange', (ev: Event) => console.log(ev));

console.log(currentScreen);
console.log(screens);
});

/**
* Test Request Fullscreen
*/

window.document.body.requestFullscreen({});
window.getScreenDetails().then(screenDetails => {
window.document.body.requestFullscreen({
screen: screenDetails.currentScreen,
});
window.document.body.requestFullscreen({
screen: screenDetails.screens[0],
});
});