aboutsummaryrefslogtreecommitdiff
path: root/Src/resources/skins/Winamp Modern/scripts/drawer.m
diff options
context:
space:
mode:
Diffstat (limited to 'Src/resources/skins/Winamp Modern/scripts/drawer.m')
-rw-r--r--Src/resources/skins/Winamp Modern/scripts/drawer.m1059
1 files changed, 1059 insertions, 0 deletions
diff --git a/Src/resources/skins/Winamp Modern/scripts/drawer.m b/Src/resources/skins/Winamp Modern/scripts/drawer.m
new file mode 100644
index 00000000..7e5c3698
--- /dev/null
+++ b/Src/resources/skins/Winamp Modern/scripts/drawer.m
@@ -0,0 +1,1059 @@
+// -----------------------------------------------------------------------
+// Generic Video/Vis Application Drawer, by Nullsoft.
+//
+// Please #include this script, and override the appropriate events
+// (see end of file), rather than modifying this script into your own
+// version.
+//
+// *You should not have to edit this file*, it's just a bad idea, period.
+// If you need something that is not supported in this version, we
+// recommend that you contact Nullsoft to suggest the feature.
+//
+// Satisfying user experience depends on *fully working* scripts, if you
+// insist on taking this file and modifying it for yourself, be sure to
+// *thoroughly* test its behavior once you are done.
+//
+// If you do add a feature, please contact us so that your extention can
+// be made available to others without each skin developper making its
+// own (potentially broken) implementation.
+//
+// Note: this script requires mc 1.1.2+ to compile, and wa5.8+ to run.
+// -----------------------------------------------------------------------
+
+#ifndef included
+#error This script can only be compiled as a #include
+#endif
+
+#include <lib/std.mi>
+#include <lib/config.mi>
+#include <lib/winampconfig.mi>
+
+// call these -- the first two are mandatory
+Function initDrawer(Layout lay, String id); // call in your onScriptLoaded();
+Function shutdownDrawer(); // call in your onScriptUnloading();
+Function openDrawer(); // opens the drawer to the last page unless video plays, in which case it opens to it. does animations according to attribs
+Function openDrawerForVideo(); // opens the drawer to the video page, does animations according to attribs
+Function openDrawerForVis(); // opens the drawer to the vis page, does animations according to attribs
+Function openDrawerForNothing(); // opens the drawer without putting anything in it, does animations according to attribs
+Function closeDrawer(); // closes the drawer, does animations according to attribs
+Function detachVis();
+Function attachVis();
+Function detachVideo();
+Function attachVideo();
+Function switchToVis();
+Function switchToVideo();
+Function Int getDrawerState(); // returns OPEN or CLOSED
+Function Int getDrawerContent(); // returns CONTENT_VIDEO, CONTENT_VIS or CONTENT_NOTHING
+Function maximizeWindow();
+Function restoreWindow();
+Function Int isDrawerToTop(); // returns 1 if the drawer will open to the top or will close from the top, rather than the normal to/from bottom
+// whenever the main window is resized while its drawer is closed, you should compute a new layout
+// height for the next opening of the drawer, this will avoid opening to a gigantic height after
+// closing a big video and resizing the player horizontally. return -1 if you do not want this feature
+Function Int getDrawerOpenAutoHeight(int layoutwidth);
+
+// implement these -- mandatory
+Function WindowHolder getVideoWindowHolder();
+Function WindowHolder getVisWindowHolder();
+Function Int getDrawerClosedHeight();
+Function Int getDefaultDrawerOpenHeight();
+
+// override these -- optional
+Function onBeforeOpeningDrawer();
+Function onBeforeClosingDrawer();
+Function onDoneOpeningDrawer();
+Function onDoneClosingDrawer();
+Function onShowVis();
+Function onHideVis();
+Function onShowVideo();
+Function onHideVideo();
+Function onAttachVideo();
+Function onDetachVideo();
+Function onAttachVis();
+Function onDetachVis();
+Function onBeforeMaximize();
+Function onAfterMaximize();
+Function onBeforeRestore();
+Function onAfterRestore();
+Function onCancelMaximize();
+
+// bind these -- mandatory (they don't have to be exposed in the menus)
+Global ConfigAttribute __drawer_directiontop_attrib;
+Global ConfigAttribute __scrolldrawerattrib;
+Global ConfigAttribute __drawer_directionbypass_attrib;
+Global ConfigAttribute __vis_detach_attrib;
+Global ConfigAttribute __video_detach_attrib;
+
+// -----------------------------------------------------------------------
+
+#define VIDEO_GUID "{F0816D7B-FFFC-4343-80F2-E8199AA15CC3}"
+#define VIS_GUID "{0000000A-000C-0010-FF7B-01014263450C}"
+
+// this is used to temporarilly disable playback stop on video window close, in case it's set
+#define SKINTWEAKS_CFGPAGE "{0542AFA4-48D9-4c9f-8900-5739D52C114F}"
+
+// this is used to handle video auto fullscreen on play when the video window is attached to the drawer
+#define VIDEO_CONFIG_GROUP "{2135E318-6919-4bcf-99D2-62BE3FCA8FA6}"
+
+#define DEBUG
+
+#ifdef FALSE
+#undef FALSE
+#endif
+#define FALSE 0
+#ifdef TRUE
+#undef TRUE
+#endif
+#define TRUE -1
+
+#define CLOSED 0
+#define OPEN 1
+
+#define DIRECTION_NONE 0
+#define DIRECTION_OPENING 1
+#define DIRECTION_CLOSING 2
+
+#define CONTENT_NOTHING 0
+#define CONTENT_VIDEO 1
+#define CONTENT_VIS 2
+
+#define DETACHED_VIS 1
+#define DETACHED_VIDEO 2
+
+// avoid calling these functions directly. if you do so, be sure to know what
+// you're doing, and to test your script thoroughly.
+
+Function drawer_expandWindow(int withdrawer);
+Function drawer_reduceWindow(int withdrawer);
+Function drawer_showWindowContent();
+Function drawer_hideWindowContent();
+Function drawer_hideVis();
+Function drawer_showVis();
+Function drawer_hideVideo();
+Function drawer_showVideo();
+Function drawer_dc_showVis();
+Function drawer_dc_showVideo();
+Function drawer_dc_hideVis();
+Function drawer_dc_hideVideo();
+Function drawer_dc_linkup_showVis();
+Function drawer_dc_linkup_showVideo();
+Function drawer_doDetachVis();
+Function drawer_doAttachVis();
+Function drawer_doDetachVideo();
+Function drawer_doAttachVideo();
+Function drawer_disablePSOVC();
+Function drawer_enablePSOVC();
+Function drawer_linkup_showVis();
+Function drawer_linkup_showVideo();
+Function drawer_doMaximizeWindow(int notif);
+
+Global Int __drawer_direction;
+
+Global Timer __callbackTimer;
+Global Int __callback_vis_show, __callback_video_show, __callback_vis_hide, __callback_video_hide;
+Global Timer __callbackTimer2;
+Global Int __callback2_what;
+Global Timer __PSOVCTimer;
+Global Int __bypasscancel;
+Global Int __isinited;
+Global Int __play_auto_fs_video;
+
+Global Int __hiding_video, __hiding_vis, __showing_vis, __showing_video;
+Global Int __last_forcedbottom, __last_forcedtop;
+Global Timer __tempDisable;
+
+Global Layout __main;
+Global Container __maincontainer;
+
+Global String __myname;
+Global Int __windowshade_openvid;
+Global Int __windowshade_openvis;
+
+Global int __maximized;
+Global int __oldx,__oldy,__oldw,__oldh;
+
+// -----------------------------------------------------------------------
+initDrawer(Layout lay, String name) {
+ // todo: test all attribs assigned
+
+ __isinited = 0;
+ __play_auto_fs_video = 0;
+
+ __main = lay;
+ __maincontainer = __main.getContainer();
+
+ if (name == "") __myname = "Drawer";
+ else __myname = name;
+ __drawer_direction = DIRECTION_NONE;
+
+ drawer_hideVis();
+ drawer_hideVideo();
+
+ __callbackTimer = new Timer;
+ __callbackTimer.setDelay(1);
+ __callbackTimer2 = new Timer;
+ __callbackTimer2.setDelay(1);
+ __PSOVCTimer = new Timer;
+ __PSOVCTimer.setDelay(1000);
+ __tempDisable = new Timer;
+ __tempDisable.setDelay(50);
+
+ __maximized = getPrivateInt("winamp5", __myname+"Maximized", 0);
+ if (__maximized) {
+ onBeforeMaximize();
+ onAfterMaximize();
+ }
+
+ __oldx=getPrivateInt("winamp5", __myname+"ox", 0);
+ __oldy=getPrivateInt("winamp5", __myname+"oy", 0);
+ __oldw=getPrivateInt("winamp5", __myname+"ow", 0);
+ __oldh=getPrivateInt("winamp5", __myname+"oh", 0);
+ __last_forcedtop = getPrivateInt("winamp5", __myname+"ForcedTop", 0);
+ __last_forcedbottom = getPrivateInt("winamp5", __myname+"ForcedBottom", 0);
+}
+
+// -----------------------------------------------------------------------
+shutdownDrawer() {
+ delete __callbackTimer;
+ delete __callbackTimer2;
+ delete __PSOVCTimer;
+ delete __tempDisable;
+}
+
+// -----------------------------------------------------------------------
+Int isDrawerToTop() {
+ int fromtop = 0;
+ if (__drawer_directiontop_attrib.getData() =="1") fromtop = 1;
+ if (__drawer_directionbypass_attrib.getData() == "0") return fromtop;
+
+ int curstate = getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ if (curstate != CLOSED) return __last_forcedtop;
+
+ int h=getPrivateInt("winamp5", __myname+"Height", getDefaultDrawerOpenHeight());
+ if (h == getDrawerClosedHeight()) h = getDefaultDrawerOpenHeight();
+ if (__maximized) h = getViewportHeight()+__main.getSnapAdjustBottom();
+
+ __last_forcedbottom = 0;
+ __last_forcedtop = 0;
+
+ // clienttoscreen auto adjusts for render ratio
+ if (fromtop) {
+ int y = __main.getGuiY();
+ int curh = __main.clientToScreenH(__main.getGuiH());
+ if (y + curh < __main.clientToScreenH(h) + getViewportTop()) {
+ int offset = __main.getSnapAdjustBottom();
+ if (!(y + __main.clientToScreenH(h-offset) > getViewPortTop()+getViewPortHeight())) {
+ __last_forcedbottom = 1;
+ return 0;
+ }
+ }
+ } else {
+ int offset = __main.getSnapAdjustBottom();
+ int y = __main.getGuiY();
+ if (y + __main.clientToScreenH(h-offset) > getViewPortTop()+getViewPortHeight()) {
+ int curh = __main.clientToScreenH(__main.getGuiH());
+ if (!(y + curh < __main.clientToScreenH(h) + getViewportTop())) {
+ __last_forcedtop = 1;
+ return 1;
+ }
+ }
+ }
+ return fromtop;
+}
+
+// -----------------------------------------------------------------------
+__main.onTargetReached() {
+ unlockUI();
+ if (__drawer_directiontop_attrib.getData() =="1") __main.reverseTarget(0);
+ if (__drawer_direction == DIRECTION_OPENING) {
+ setPrivateInt("winamp5", __myname+"OpenState", OPEN);
+ drawer_showWindowContent();
+ onDoneOpeningDrawer();
+ } else if (__drawer_direction == DIRECTION_CLOSING) {
+ setPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ onDoneClosingDrawer();
+ }
+ __drawer_direction = DIRECTION_NONE;
+}
+
+// -----------------------------------------------------------------------
+drawer_expandWindow(int withdrawer) {
+ int curstate = getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+#ifdef DEBUG
+ debugstring("expand - curstate = " + integertostring(curstate), 0);
+#endif
+ if (curstate == OPEN) {
+ drawer_showWindowContent();
+ onBeforeOpeningDrawer();
+ onDoneOpeningDrawer();
+ return;
+ }
+ int fromtop = isDrawerToTop();
+ setPrivateInt("winamp5", __myname+"OpenState", OPEN);
+
+ int h=getPrivateInt("winamp5", __myname+"Height", getDefaultDrawerOpenHeight());
+ if (h == getDrawerClosedHeight()) h = getDefaultDrawerOpenHeight();
+ if (__maximized) h = getViewportHeight()+__main.getSnapAdjustBottom();
+ int w = __main.getGuiW();
+
+ if (h == __main.getHeight()) withdrawer = 0;
+
+ onBeforeOpeningDrawer();
+
+ int delay = 0;
+ if (!__main.isLayoutAnimationSafe()) withdrawer = 0;
+ if (withdrawer && StringToInteger(__scrolldrawerattrib.getData())) delay = 1;
+
+ __drawer_direction = DIRECTION_OPENING;
+ __main.setTargetX(__main.getGuiX());
+ __main.setTargetY(__main.getGuiY());
+ __main.setTargetW(w);
+ __main.setTargetH(h);
+ __main.reverseTarget(fromtop);
+ __main.setTargetSpeed(delay);
+ __main.gotoTarget();
+ lockUI();
+
+ if (!__maximized)
+ setPrivateInt("winamp5", __myname+"Height", h);
+ setPrivateInt("winamp5", __myname+"ForcedBottom", __last_forcedBottom);
+ setPrivateInt("winamp5", __myname+"ForcedTop", __last_forcedtop);
+}
+
+// -----------------------------------------------------------------------
+drawer_reduceWindow(int withdrawer) {
+#ifdef DEBUG
+ debugstring("reduce", 0);
+#endif
+ drawer_hideVis();
+ drawer_hideVideo();
+ setPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ if (__drawer_direction == DIRECTION_NONE && !__maximized) { // avoid saving new size if we're currenly opening
+ int h=__main.getHeight();
+ setPrivateInt("winamp5", __myname+"Height", h);
+ }
+
+ drawer_hideWindowContent();
+ onBeforeClosingDrawer();
+
+ int fromtop=0;
+ if (__drawer_directiontop_attrib.getData() =="1") fromtop = 1;
+
+ int delay = 0;
+ if (!__main.isLayoutAnimationSafe()) withdrawer = 0;
+ if (withdrawer && StringToInteger(__scrolldrawerattrib.getData())) delay = 1;
+
+ if (__drawer_directionbypass_attrib.getData() == "1") {
+ if (__last_forcedtop) fromtop = 1;
+ if (__last_forcedbottom) fromtop = 0;
+ }
+
+ __drawer_direction = DIRECTION_CLOSING;
+ __main.setTargetX(__main.getGuiX());
+ __main.setTargetY(__main.getGuiY());
+ __main.setTargetW(__main.getGuiW());
+ __main.setTargetH(getDrawerClosedHeight());
+ __main.reverseTarget(fromtop);
+ __main.setTargetSpeed(delay);
+ __main.gotoTarget();
+ lockUI();
+ __last_forcedtop = 0;
+ __last_forcedbottom = 0;
+ setPrivateInt("winamp5", __myname+"ForcedBottom", 0);
+ setPrivateInt("winamp5", __myname+"ForcedTop", 0);
+}
+
+// -----------------------------------------------------------------------
+openDrawer() {
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ int s = getStatus();
+ if (s == STATUS_PLAYING || s == STATUS_PAUSED) {
+ if (!isVideo()) {
+ if (__vis_detach_attrib.getData() == "0") {
+ openDrawerForVis();
+ } else if (__video_detach_attrib.getData() == "0") {
+ openDrawerForVideo();
+ } else {
+ openDrawerForNothing();
+ }
+ } else {
+ if (__video_detach_attrib.getData() == "0") {
+ openDrawerForVideo();
+ } else if (__vis_detach_attrib.getData() == "0") {
+ openDrawerForVis();
+ } else {
+ openDrawerForNothing();
+ }
+ }
+ } else {
+ int Window_Content=getPrivateInt("winamp5", __myname+"State", CONTENT_VIS);
+ if (window_content == CONTENT_VIS && __vis_detach_attrib.getData() == "0") {
+ openDrawerForVis();
+ } else if (window_content == CONTENT_VIDEO && __video_detach_attrib.getData() == "0") {
+ openDrawerForVideo();
+ } else if (__vis_detach_attrib.getData() == "0") {
+ openDrawerForVis();
+ } else if (__video_detach_attrib.getData() == "0") {
+ openDrawerForVideo();
+ } else {
+ openDrawerForNothing();
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+closeDrawer() {
+ drawer_reduceWindow(1);
+}
+
+// -----------------------------------------------------------------------
+System.onPlay() {
+ // needed to handle video auto fullscreen on play in drawer_showVideo()
+ WinampConfigGroup vidwcg = WinampConfig.getGroup(VIDEO_CONFIG_GROUP);
+ boolean auto_fs = vidwcg.getBool("auto_fs");
+ if (auto_fs && __video_detach_attrib.getData() == "0") __play_auto_fs_video = 1;
+ else __play_auto_fs_video = 0;
+}
+
+System.onTitleChange(String newtitle) {
+ // needed to handle video auto fullscreen on play in drawer_showVideo()
+ WinampConfigGroup vidwcg = WinampConfig.getGroup(VIDEO_CONFIG_GROUP);
+ boolean auto_fs = vidwcg.getBool("auto_fs");
+ if (auto_fs && __video_detach_attrib.getData() == "0") __play_auto_fs_video = 1;
+ else __play_auto_fs_video = 0;
+}
+
+// -----------------------------------------------------------------------
+System.onPause() {
+ __play_auto_fs_video = 0;
+}
+
+// -----------------------------------------------------------------------
+System.onResume() {
+ __play_auto_fs_video = 0;
+}
+
+// -----------------------------------------------------------------------
+System.onStop() {
+ __play_auto_fs_video = 0;
+}
+
+// -----------------------------------------------------------------------
+// The heart of the machine, here we detect when a window wants to open
+// or close, and we decide what to do about it. When we return FALSE, the
+// window performs what it notified us about. When we return TRUE, the
+// showing/hiding of the window is cancelled, and it is now up to us to
+// show or hide the window once we're done with our animations.
+// To show the window ourselves, we later show a windowholder with the
+// autoopen="1" param, and to hide the window, we simply hide the
+// windowholder, and its autoclose="1" param will do the rest
+// -----------------------------------------------------------------------
+System.onGetCancelComponent(String guid, boolean goingvisible) {
+#ifdef DEBUG
+ DebugString("+", 0);
+#endif
+
+ // fix for when the UI sometimes is locked after switching video file in fullscreen
+ unlockUI();
+
+ // isVideo() hasn't been set yet in System.onPlay and System.onTitleChange, so we check it here instead.
+ if (__play_auto_fs_video && !isVideo()) __play_auto_fs_video = 0;
+
+ if (__bypasscancel) return FALSE;
+ if (guid == VIDEO_GUID && !goingvisible && __hiding_video) return FALSE;
+ if (guid == VIS_GUID && !goingvisible && __hiding_vis) return FALSE;
+ if (guid == VIDEO_GUID && goingvisible && __showing_video) return FALSE;
+ if (guid == VIS_GUID && goingvisible && __showing_vis) return FALSE;
+
+#ifdef DEBUG
+ DebugString("--------------- onGetCancelComponent ----------------", 0);
+ DebugString(" GUID : " + guid, 0);
+ if (goingvisible) DebugString(" Going Visible", 0); else DebugString(" Going Invisible", 0);
+ DebugString(" Last Content : " + IntegerToString(getPrivateInt("winamp5", __myname+"State", CONTENT_VIS)), 0);
+ DebugString(" Drawer State : " + IntegerToString(getPrivateInt("winamp5", __myname+"OpenState", CLOSED)), 0);
+ DebugString("-----------------------------------------------------", 0);
+#endif
+
+ if (!__main.isVisible()) return FALSE;
+
+ int Window_Content=getPrivateInt("winamp5", __myname+"State", CONTENT_VIS);
+ int window_status =getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+
+ if (window_status == CLOSED) {
+ if (guid == VIDEO_GUID) {
+ if (__video_detach_attrib.getData() == "0") {
+ if (goingvisible) {
+ openDrawerForVideo();
+ return TRUE;
+ }
+ }
+ }
+ if (guid == VIS_GUID) {
+ if (__vis_detach_attrib.getData() == "0") {
+ if (goingvisible) {
+ openDrawerForVis();
+ return TRUE;
+ }
+ }
+ }
+ } else if (window_status == OPEN) {
+ if (goingvisible) {
+ if (guid == VIDEO_GUID && window_content == CONTENT_VIS) {
+ if (__video_detach_attrib.getData() == "0") {
+ window_content = CONTENT_VIDEO;
+ drawer_hideVis();
+ drawer_dc_showVideo();
+ return TRUE;
+ }
+ } else if (guid == VIS_GUID && window_content == CONTENT_VIDEO) {
+ if (__vis_detach_attrib.getData() == "0") {
+ window_content = CONTENT_VIS;
+ drawer_disablePSOVC();
+ drawer_hideVideo();
+ drawer_dc_showVis();
+ return TRUE;
+ }
+ }
+ }
+ }
+ if (!goingvisible && window_status == OPEN) {
+#ifdef DEBUG
+ DebugString("closing " + guid, 0);
+#endif
+ if (guid == VIDEO_GUID && window_content == CONTENT_VIDEO) {
+ drawer_hideVideo();
+ drawer_reduceWindow(1);
+ return FALSE;
+ }
+ if (guid == VIS_GUID && window_content == CONTENT_VIS) {
+ drawer_hideVis();
+ if ((getStatus() == STATUS_PLAYING ||
+ getStatus() == STATUS_PAUSED) &&
+ isVideo() &&
+ __video_detach_attrib.getData() == "0") {
+ drawer_dc_showVideo();
+ } else {
+ drawer_reduceWindow(1);
+ }
+ return FALSE;
+ }
+ }
+#ifdef DEBUG
+ DebugString("Went thru", 0);
+#endif
+ return FALSE;
+}
+
+// -----------------------------------------------------------------------
+drawer_showVis() {
+#ifdef DEBUG
+ DebugString("drawer_showVis",0 );
+#endif
+ __showing_vis = 1;
+ setPrivateInt("winamp5", __myname+"OpenState", OPEN);
+ setPrivateInt("winamp5", __myname+"State", CONTENT_VIS);
+ GuiObject o = getVisWindowHolder();
+ if (o != NULL) { __bypasscancel = 1; o.show(); __bypasscancel = 0; }
+#ifdef DEBUG
+ else DebugString("vis object not provided (show)", 0);
+#endif
+ onShowVis();
+ __showing_vis = 0;
+}
+
+// -----------------------------------------------------------------------
+drawer_hideVis() {
+ __callback_vis_show = 0;
+#ifdef DEBUG
+ DebugString("drawer_hideVis",0 );
+#endif
+ __hiding_vis = 1;
+ GuiObject o = getVisWindowHolder();
+ if (o != NULL) { __bypasscancel = 1; o.hide(); __bypasscancel = 0; }
+#ifdef DEBUG
+ else DebugString("video object not found (hide)", 0);
+#endif
+ onHideVis();
+ __hiding_vis = 0;
+}
+
+// -----------------------------------------------------------------------
+drawer_showVideo() {
+#ifdef DEBUG
+ DebugString("drawer_showVideo",0 );
+#endif
+ __showing_video = 1;
+ setPrivateInt("winamp5", __myname+"OpenState", OPEN);
+ setPrivateInt("winamp5", __myname+"State", CONTENT_VIDEO);
+ GuiObject o = getVideoWindowHolder();
+ if (o != NULL) {
+ __bypasscancel = 1;
+
+ // hack to fix bug for auto fullscreen on play
+ if (__play_auto_fs_video) setVideoFullscreen(FALSE);
+
+ o.show();
+
+ // hack to fix bug for auto fullscreen on play
+ if (__play_auto_fs_video) setVideoFullscreen(TRUE);
+
+ __bypasscancel = 0;
+ }
+#ifdef DEBUG
+ else DebugString("vis object not found (show)", 0);
+#endif
+ onShowVideo();
+ __play_auto_fs_video = 0;
+ __showing_video = 0;
+}
+
+// -----------------------------------------------------------------------
+drawer_hideVideo() {
+ __callback_video_show = 0;
+#ifdef DEBUG
+ DebugString("drawer_hideVideo",0 );
+#endif
+ __hiding_video = 1;
+ GuiObject o = getVideoWindowHolder();
+ if (o != NULL) { __bypasscancel = 1; o.hide(); __bypasscancel = 0; }
+#ifdef DEBUG
+ else DebugString("video object not found (hide)", 0);
+#endif
+ onHideVideo();
+ __hiding_video = 0;
+}
+
+// -----------------------------------------------------------------------
+__callbackTimer.onTimer() {
+ stop();
+ int cvds = __callback_video_show;
+ int cvss = __callback_vis_show;
+ int cvdh = __callback_video_hide;
+ int cvsh = __callback_vis_hide;
+ __callback_video_show = 0;
+ __callback_vis_show = 0;
+ __callback_video_hide = 0;
+ __callback_vis_hide = 0;
+ if (cvds == 1) drawer_showVideo();
+ if (cvss == 1) drawer_showVis();
+ if (cvsh == 1) drawer_hideVis();
+ if (cvdh == 1) drawer_hideVideo();
+}
+
+// -----------------------------------------------------------------------
+drawer_dc_showVideo() {
+ __callback_video_show = 1;
+ __callback_video_hide = 0;
+ __callbackTimer.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_dc_showVis() {
+ __callback_vis_show = 1;
+ __callback_vis_hide = 0;
+ __callbackTimer.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_dc_hideVideo() {
+ __callback_video_show = 0;
+ __callback_video_hide = 1;
+ __callbackTimer.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_dc_hideVis() {
+ __callback_vis_show = 0;
+ __callback_vis_hide = 1;
+ __callbackTimer.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_showWindowContent() {
+ int lastWindowContent=getPrivateInt("winamp5", __myname+"State", 2);
+#ifdef DEBUG
+ DebugString("drawer_showWindowContent = " + IntegerToString(lastWindowContent), 0);
+#endif
+ if (lastWindowContent==CONTENT_VIDEO) drawer_dc_showVideo();
+ if (lastWindowContent==CONTENT_VIS) drawer_dc_showVis();
+}
+
+// -----------------------------------------------------------------------
+drawer_hideWindowContent() {
+ int lastWindowContent=getPrivateInt("winamp5", __myname+"State", 2);
+#ifdef DEBUG
+ DebugString("drawer_hideWindowContent = " + IntegerToString(lastWindowContent), 0);
+#endif
+ /*if (lastWindowContent==CONTENT_VIDEO)*/ drawer_hideVideo();
+ /*if (lastWindowContent==CONTENT_VIS)*/ drawer_hideVis();
+}
+
+// -----------------------------------------------------------------------
+OpenDrawerForVideo() {
+ setPrivateInt("winamp5", __myname+"State", CONTENT_VIDEO);
+ drawer_expandWindow(1);
+}
+
+// -----------------------------------------------------------------------
+OpenDrawerForVis() {
+ setPrivateInt("winamp5", __myname+"State", CONTENT_VIS);
+ drawer_expandWindow(1);
+}
+
+// -----------------------------------------------------------------------
+OpenDrawerForNothing() {
+ setPrivateInt("winamp5", __myname+"State", CONTENT_NOTHING);
+ drawer_expandWindow(1);
+}
+
+// -----------------------------------------------------------------------
+__main.onResize(int x, int y, int w, int h) {
+ if (!isGoingToTarget() && !__isinited) {
+ __isinited = 1;
+ if (h > getDrawerClosedHeight()) { setPrivateInt("winamp5", __myname+"OpenState", OPEN); drawer_expandWindow(0); }
+ else setPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ }
+}
+
+// -----------------------------------------------------------------------
+__main.onUserResize(int x, int y, int w, int h) {
+ int window_status=getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ if (window_status == OPEN) {
+ int h = getHeight();
+ if (h != getDrawerClosedHeight()) {
+#ifdef DEBUG
+ DebugString("h = "+integerTostring(h), 0);
+#endif
+ if (!__maximized)
+ setPrivateInt("winamp5", __myname+"Height", h);
+ }
+ } else if (window_status == CLOSED) {
+ int h = getDrawerOpenAutoHeight(w);
+ if (h != -1) {
+ setPrivateInt("winamp5", __myname+"Height", h);
+ }
+ }
+ if (__maximized) {
+ __maximized = 0;
+ setPrivateInt("winamp5", __myname+"Maximized", 0);
+ onCancelMaximize();
+ }
+}
+
+// -----------------------------------------------------------------------
+switchToVideo() {
+ if (__callbackTimer.isRunning()) return;
+ if (__callbackTimer2.isRunning()) return;
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ drawer_hideVis();
+ drawer_showVideo();
+}
+
+// -----------------------------------------------------------------------
+switchToVis() {
+ if (__callbackTimer.isRunning()) return;
+ if (__callbackTimer2.isRunning()) return;
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ drawer_disablePSOVC();
+ drawer_hideVideo();
+ drawer_showVis();
+}
+
+// -----------------------------------------------------------------------
+__tempDisable.onTimer() {
+ stop();
+}
+
+// -----------------------------------------------------------------------
+detachVis() {
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ __vis_detach_attrib.setData("1");
+}
+
+// -----------------------------------------------------------------------
+detachVideo() {
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ __video_detach_attrib.setData("1");
+}
+
+// -----------------------------------------------------------------------
+attachVis() {
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ __vis_detach_attrib.setData("0");
+}
+
+// -----------------------------------------------------------------------
+attachVideo() {
+ if (__tempDisable.isRunning()) return;
+ __tempDisable.start();
+ __video_detach_attrib.setData("0");
+}
+
+// -----------------------------------------------------------------------
+__video_detach_attrib.onDataChanged() {
+#ifdef DEBUG
+ DebugString("detach video changed", 0);
+#endif
+ if (getData() == "1") {
+ drawer_doDetachVideo();
+ onDetachVideo();
+ } else {
+ if (getData() == "0") {
+ drawer_doAttachVideo();
+ onAttachVideo();
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+__vis_detach_attrib.onDataChanged() {
+#ifdef DEBUG
+ DebugString("detach vis changed", 0);
+#endif
+ if (getData() == "1") {
+ drawer_doDetachVis();
+ onDetachVis();
+ } else {
+ if (getData() == "0") {
+ drawer_doAttachVis();
+ onAttachVis();
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+drawer_doDetachVideo() {
+ int wasvisible = isNamedWindowVisible(VIDEO_GUID);
+ int lastWindowContent=getPrivateInt("winamp5", __myname+"State", 2);
+ int window_status =getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ if (!wasvisible) return;
+ if (lastWindowContent != CONTENT_VIDEO) return;
+ if (window_status == OPEN) {
+ drawer_disablePSOVC();
+ drawer_reduceWindow(1);
+ }
+ drawer_dc_linkup_showVideo();
+}
+
+// -----------------------------------------------------------------------
+drawer_doDetachVis() {
+ int lastWindowContent=getPrivateInt("winamp5", __myname+"State", 2);
+ int window_status =getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ if (lastWindowContent != CONTENT_VIS) return;
+ int wasvisible = isNamedWindowVisible(VIS_GUID);
+ if (!wasvisible) return;
+ if (window_status == OPEN) {
+ drawer_hideVis();
+ if ((getStatus() == STATUS_PLAYING ||
+ getStatus() == STATUS_PAUSED) && isVideo() &&
+ __video_detach_attrib.getData() == "0") {
+ setPrivateInt("winamp5", __myname+"State", CONTENT_VIDEO);
+ drawer_dc_showVideo();
+ } else {
+ drawer_reduceWindow(1);
+ }
+ }
+ drawer_dc_linkup_showVis();
+}
+
+// -----------------------------------------------------------------------
+drawer_doAttachVideo() {
+ drawer_disablePSOVC();
+ int wasvisible = isNamedWindowVisible(VIDEO_GUID);
+ if (wasvisible) {
+ hideNamedWindow(VIDEO_GUID);
+ int window_status =getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ int window_content=getPrivateInt("winamp5", __myname+"State", 2);
+ if (window_content == CONTENT_VIS) drawer_hideVis();
+ if (window_status == CLOSED) openDrawerForVideo();
+ else drawer_dc_showVideo();
+ }
+}
+
+// -----------------------------------------------------------------------
+drawer_doAttachVis() {
+ drawer_disablePSOVC();
+ int wasvisible = isNamedWindowVisible(VIS_GUID);
+ if (wasvisible) {
+ hideNamedWindow(VIS_GUID);
+ int window_status =getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ int window_content=getPrivateInt("winamp5", __myname+"State", 2);
+ if (window_content == CONTENT_VIDEO) drawer_hideVideo();
+ if (window_status == CLOSED) openDrawerForVis();
+ else drawer_dc_showVis();
+ }
+}
+
+// -----------------------------------------------------------------------
+__callbackTimer2.onTimer() {
+ stop();
+ if (__callback2_what == DETACHED_VIDEO) drawer_linkup_showVideo();
+ if (__callback2_what == DETACHED_VIS) drawer_linkup_showVis();
+}
+
+// -----------------------------------------------------------------------
+drawer_dc_linkup_showVis() {
+ __callback2_what = DETACHED_VIS;
+ __callbackTimer2.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_dc_linkup_showVideo() {
+ __callback2_what = DETACHED_VIDEO;
+ __callbackTimer2.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_linkup_showVis() {
+#ifdef DEBUG
+ DebugString("show detached vis",0 );
+#endif
+ showWindow(VIS_GUID, "", 0);
+}
+
+// -----------------------------------------------------------------------
+drawer_linkup_showVideo() {
+#ifdef DEBUG
+ DebugString("show detached video",0 );
+#endif
+ showWindow(VIDEO_GUID, "", 0);
+ drawer_enablePSOVC();
+}
+
+// -----------------------------------------------------------------------
+drawer_disablePSOVC() {
+#ifdef DEBUG
+ DebugString("disabling stop on video close",0 );
+#endif
+ ConfigItem item = Config.getItem(SKINTWEAKS_CFGPAGE);
+ if (item) {
+ ConfigAttribute attr = item.getAttribute("Prevent video playback Stop on video window Close");
+ if (attr) attr.setData("1");
+ }
+ __PSOVCTimer.start();
+}
+
+// -----------------------------------------------------------------------
+drawer_enablePSOVC() {
+#ifdef DEBUG
+ DebugString("enabling stop on video close",0 );
+#endif
+ __PSOVCTimer.stop();
+ ConfigItem item = Config.getItem(SKINTWEAKS_CFGPAGE);
+ if (item) {
+ ConfigAttribute attr = item.getAttribute("Prevent video playback Stop on video window Close");
+ if (attr) attr.setData("0");
+ }
+}
+
+// -----------------------------------------------------------------------
+__PSOVCTimer.onTimer() {
+ drawer_enablePSOVC();
+}
+
+// -----------------------------------------------------------------------
+__maincontainer.onBeforeSwitchToLayout(Layout oldl, Layout newl) {
+ int window_status =getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+ int window_content=getPrivateInt("winamp5", __myname+"State", 2);
+ if (oldl == __main && window_status == OPEN && window_content == CONTENT_VIDEO && getStatus() == STATUS_PLAYING && isVideo()) {
+ drawer_disablePSOVC();
+ __windowshade_openvid = 1;
+ }
+ if (oldl == __main && window_status == OPEN && window_content == CONTENT_VIS) {
+ __windowshade_openvis = 1;
+ }
+}
+
+// -----------------------------------------------------------------------
+__maincontainer.onSwitchToLayout(Layout newl) {
+ // these do not call drawer_doDetachVis or drawer_doDetachVideo but showDetachVis and showDetachVideo so that the change is temporary
+ if (__windowshade_openvid) {
+ __windowshade_openvid = 0;
+ drawer_linkup_showVideo();
+ }
+ if (__windowshade_openvis) {
+ __windowshade_openvis = 0;
+ drawer_linkup_showVis();
+ }
+}
+
+// -----------------------------------------------------------------------
+Int getDrawerState() {
+ return getPrivateInt("winamp5", __myname+"OpenState", CLOSED);
+}
+
+// -----------------------------------------------------------------------
+Int getDrawerContent() {
+ return getPrivateInt("winamp5", __myname+"State", CONTENT_VIS);
+}
+
+// -----------------------------------------------------------------------
+maximizeWindow() {
+ __oldx=__main.getGuiX();
+ __oldy=__main.getGuiY();
+ __oldw=__main.getGuiW();
+ __oldh=__main.getGuiH();
+
+ setPrivateInt("winamp5", __myname+"ox", __oldx);
+ setPrivateInt("winamp5", __myname+"oy", __oldy);
+ setPrivateInt("winamp5", __myname+"ow", __oldw);
+ setPrivateInt("winamp5", __myname+"oh", __oldh);
+
+ drawer_doMaximizeWindow(1);
+}
+
+// -----------------------------------------------------------------------
+drawer_doMaximizeWindow(int notif) {
+ int vx=getViewportLeft();
+ int vy=getViewportTop();
+ int vw=getViewportWidth();
+ int vh=getViewportHeight();
+
+ if (notif) onBeforeMaximize();
+ __maximized = 1;
+ setPrivateInt("winamp5", __myname+"Maximized", 1);
+ __main.resize(vx, vy, vw, vh+__main.getSnapAdjustBottom());
+ if (notif) onAfterMaximize();
+}
+
+// -----------------------------------------------------------------------
+__main.onSnapAdjustChanged() {
+ if (__maximized)
+ drawer_doMaximizeWindow(0);
+}
+
+// -----------------------------------------------------------------------
+restoreWindow() {
+ onBeforeRestore();
+ __maximized = 0;
+ setPrivateInt("winamp5", __myname+"Maximized", 0);
+ __main.resize(__oldx, __oldy, __oldw, __oldh);
+ onAfterRestore();
+}
+
+// -----------------------------------------------------------------------
+// default events implementations - override them in your script
+// -----------------------------------------------------------------------
+onBeforeOpeningDrawer() {}
+onBeforeClosingDrawer() {}
+onDoneOpeningDrawer() {}
+onDoneClosingDrawer() {}
+onShowVis() {}
+onHideVis() {}
+onShowVideo() {}
+onHideVideo() {}
+onAttachVideo() {}
+onDetachVideo() {}
+onAttachVis() {}
+onDetachVis() {}
+onBeforeMaximize() {}
+onBeforeRestore() {}
+onAfterMaximize() {}
+onAfterRestore() {}
+onCancelMaximize() {}