aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/GammaManagerAPI.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/GammaManagerAPI.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/GammaManagerAPI.cpp')
-rw-r--r--Src/Winamp/GammaManagerAPI.cpp361
1 files changed, 361 insertions, 0 deletions
diff --git a/Src/Winamp/GammaManagerAPI.cpp b/Src/Winamp/GammaManagerAPI.cpp
new file mode 100644
index 00000000..7c873115
--- /dev/null
+++ b/Src/Winamp/GammaManagerAPI.cpp
@@ -0,0 +1,361 @@
+#include "GammaManagerAPI.h"
+#include "api.h"
+#include <api/syscb/callbacks/skincb.h>
+
+GammaManagerAPI::GammaManagerAPI()
+{
+ curSetSel = NULL;
+ inTransaction=0;
+}
+
+void GammaManagerAPI::StartTransaction()
+{
+ inTransaction++;
+}
+
+ void GammaManagerAPI::EndTransaction()
+ {
+ inTransaction--;
+ if (inTransaction == 0)
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::COLORTHEMESLISTCHANGED);
+ }
+
+size_t GammaManagerAPI::getNumGammaSets()
+{
+ return gammasets.size();
+}
+
+const wchar_t *GammaManagerAPI::enumGammaSet(size_t n)
+{
+ return gammasets[n]->name;
+}
+
+int GammaManagerAPI::getNumGammaGroups(const wchar_t *gammaset)
+{
+ if (gammaset == NULL || !*gammaset) return 0;
+ for (size_t i = 0;i != gammasets.size();i++)
+ {
+ if (IsKeyword(gammasets[i]->name, gammaset))
+ return (int)gammasets[i]->gammagroups.size();
+
+ }
+ return -1;
+}
+
+const wchar_t *GammaManagerAPI::enumGammaGroup(const wchar_t *gammaset, int n)
+{
+ if (gammaset == NULL || !*gammaset) return 0;
+ for (size_t i = 0;i != gammasets.size();i++)
+ {
+ if (IsKeyword(gammaset, gammasets[i]->name))
+ {
+ if (n < 0 || n >= (int)gammasets[i]->gammagroups.size())
+ {
+ return gammasets[i]->generalgroup.getName();
+ }
+ const wchar_t * ret = gammasets[i]->gammagroups[n]->getName();
+ return ret;
+ }
+ }
+ return NULL;
+}
+
+ColorThemeGroup *GammaManagerAPI::enumColorThemeGroup(int colorset, int colorgroup)
+{
+ GammaSet *set = gammasets[colorset];
+ if (set != NULL)
+ {
+ if (colorgroup < 0 || colorgroup >= (int)set->gammagroups.size())
+ {
+ return &set->generalgroup;
+ }
+ ColorThemeGroup *grp = set->gammagroups[colorgroup];
+ return grp;
+ }
+ return NULL;
+}
+
+ColorThemeGroup *GammaManagerAPI::getColorThemeGroup(const wchar_t *colorset, const wchar_t *colorgroup)
+{
+ for (size_t i = 0;i < gammasets.size();i++)
+ {
+ GammaSet *s = gammasets[i];
+ if (IsKeyword(s->name, colorset))
+ {
+ if (IsKeyword(s->generalgroup.getName(), colorgroup))
+ {
+ ColorThemeGroupI *g = &s->generalgroup;
+ return g;
+ }
+ for (size_t j = 0;j < s->gammagroups.size();j++)
+ {
+ ColorThemeGroupI *g = s->gammagroups[j];
+ if (IsKeyword(g->getName(), colorgroup))
+ {
+ return g;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+void GammaManagerAPI::deleteAllGammaSets()
+{
+ //gammasets.deleteAll();
+ for (auto obj : gammasets)
+ {
+ delete obj;
+ }
+ gammasets.clear();
+
+ curSetSel = NULL;
+}
+
+void GammaManagerAPI::deleteGammaSet(const wchar_t *set)
+{
+ for (size_t i = 0;i < gammasets.size();i++)
+ {
+ if (IsKeyword(gammasets[i]->name, set))
+ {
+ GammaSet *s = gammasets[i];
+ delete s;
+ gammasets.erase(gammasets.begin() + i);
+ i--;
+ }
+ }
+ if (!inTransaction)
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::COLORTHEMESLISTCHANGED);
+}
+
+void GammaManagerAPI::renameGammaSet( const wchar_t *set, const wchar_t *newname )
+{
+ for ( GammaSet *l_gammaset : gammasets )
+ {
+ if ( IsKeyword( l_gammaset->name, set ) )
+ {
+ l_gammaset->SetName( newname );
+ if ( !inTransaction )
+ WASABI_API_SYSCB->syscb_issueCallback( SysCallback::SKINCB, SkinCallback::COLORTHEMESLISTCHANGED );
+
+ return;
+ }
+ }
+}
+
+size_t GammaManagerAPI::newGammaSet(const wchar_t *set)
+{
+ for (size_t i = 0;i != gammasets.size();i++)
+ {
+ if (IsKeyword(gammasets[i]->name, set))
+ return i;
+ }
+
+ GammaSet *curset = new GammaSet(set);/*
+ for (size_t i = 0;i < gammasets.size();i++)
+ {
+ for (size_t j = 0;j < gammasets[i]->gammagroups.size();j++)
+ {
+ ColorThemeGroup * g = gammasets[i]->gammagroups[j];
+ if (curset->haveGroup(g->getName()))
+ continue;
+ curset->gammagroups.push_back(new ColorThemeGroupI(g->getName(), 0, 0, 0, 0, 0));
+ }
+ }*/
+ size_t index = gammasets.size();
+ gammasets.push_back(curset); //Martin> better add set after the loop than before
+ if (!inTransaction)
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::COLORTHEMESLISTCHANGED);
+ return index;
+}
+
+void GammaManagerAPI::updateGammaSet(const wchar_t *set)
+{
+ for (size_t i = 0;i < gammasets.size();i++)
+ {
+ GammaSet *s = gammasets[i];
+ if (IsKeyword(s->name, set))
+ {
+ for (size_t i = 0;i < gammasets.size();i++)
+ {
+ for (size_t j = 0;j < gammasets[i]->gammagroups.size();j++)
+ {
+ ColorThemeGroup * g = gammasets[i]->gammagroups[j];
+ if (s->haveGroup(g->getName())) continue;
+ s->gammagroups.push_back(new ColorThemeGroupI(g->getName(), 0, 0, 0, 0, 0));
+ }
+ }
+ }
+ }
+}
+
+void GammaManagerAPI::setGammaSet(const wchar_t *set)
+{
+ size_t i;
+ for (i = 0;i != gammasets.size();i++)
+ {
+ if (IsKeyword(gammasets[i]->name, set))
+ {
+ setGammaSetInternal(gammasets[i]);
+ return ;
+ }
+ }
+
+ if (i) // i will still be 0 if getNumItems() was 0
+ setGammaSetInternal(gammasets[0]);
+}
+
+void GammaManagerAPI::setGammaSetInternal(GammaSet *set)
+{
+ //if (curSetSel == set) return;
+ curSetSel = set;
+
+ //PORT
+#ifdef WIN32
+ SetCursor(LoadCursor(NULL, IDC_WAIT));
+#endif
+#ifdef LINUX
+ XDefineCursor( Linux::getDisplay(), WASABI_API_WND->main_getRootWnd()->gethWnd(),
+ XCreateFontCursor( Linux::getDisplay(), XC_watch ) );
+#endif
+
+ if (WASABI_API_SKIN)
+ WASABI_API_SKIN->reapplySkinFilters();
+ //PORT
+#ifdef WIN32
+ SetCursor(LoadCursor(NULL, IDC_ARROW));
+#endif
+#ifdef LINUX
+ XUndefineCursor( Linux::getDisplay(), WASABI_API_WND->main_getRootWnd()->gethWnd() );
+#endif
+ WASABI_API_SYSCB->syscb_issueCallback(SysCallback::SKINCB, SkinCallback::COLORTHEMECHANGED);
+}
+
+int GammaManagerAPI::getGammaForGroup(const wchar_t *group, int *r, int *g, int *b, int *gray, int *boost)
+{
+ if (curSetSel)
+ {
+ size_t l = curSetSel->gammagroups.size();
+ for (size_t i = 0;i < l;i++)
+ {
+ if (group && IsKeyword(group, curSetSel->gammagroups[i]->getName()))
+ {
+ *r = min(4095, max( -4095, curSetSel->gammagroups[i]->getRed() + curSetSel->generalgroup.getRed()));
+ *g = min(4095, max( -4095, curSetSel->gammagroups[i]->getGreen() + curSetSel->generalgroup.getGreen()));
+ *b = min(4095, max( -4095, curSetSel->gammagroups[i]->getBlue() + curSetSel->generalgroup.getBlue()));
+ *gray = curSetSel->gammagroups[i]->getGray() | curSetSel->generalgroup.getGray();
+ *boost = curSetSel->gammagroups[i]->getBoost() || curSetSel->generalgroup.getBoost();
+ return 1;
+ }
+ }
+ *r = min(4095, max( -4095, curSetSel->generalgroup.getRed()));
+ *g = min(4095, max( -4095, curSetSel->generalgroup.getGreen()));
+ *b = min(4095, max( -4095, curSetSel->generalgroup.getBlue()));
+ *gray = curSetSel->generalgroup.getGray();
+ *boost = curSetSel->generalgroup.getBoost();
+ return 1;
+ }
+ return 0;
+}
+
+void GammaManagerAPI::resetGammaSet( const wchar_t *set )
+{
+ for ( GammaSet *l_gammaset : gammasets )
+ {
+ if ( IsKeyword( l_gammaset->name, set ) )
+ {
+ //gammasets[i]->gammagroups.deleteAll();
+ for ( ColorThemeGroupI *obj : l_gammaset->gammagroups )
+ delete obj;
+
+ l_gammaset->gammagroups.clear();
+
+ break;
+ }
+ }
+}
+
+void GammaManagerAPI::addGammaGroup( const wchar_t *set, ColorThemeGroup *group )
+{
+ for ( GammaSet *l_gammaset : gammasets )
+ {
+ if ( IsKeyword( l_gammaset->name, set ) )
+ {
+ for ( size_t j = 0; j < l_gammaset->gammagroups.size(); j++ )
+ {
+ ColorThemeGroupI *g = l_gammaset->gammagroups[ j ];
+ if ( IsKeyword( g->getName(), group->getName() ) )
+ {
+ l_gammaset->gammagroups[ j ] = new ColorThemeGroupI( *group );
+ delete g;
+
+ return;
+ }
+ }
+
+ l_gammaset->gammagroups.push_back( new ColorThemeGroupI( *group ) );
+ break;
+ }
+ }
+}
+
+void GammaManagerAPI::addGammaGroup2(size_t i, ColorThemeGroup *group)
+{
+ for (size_t j = 0;j < gammasets[i]->gammagroups.size();j++)
+ {
+ ColorThemeGroupI * g = gammasets[i]->gammagroups[j];
+ if (IsKeyword(g->getName(), group->getName()))
+ {
+ gammasets[i]->gammagroups[j] = new ColorThemeGroupI(*group);
+ delete g;
+ return;
+ }
+ }
+ gammasets[i]->gammagroups.push_back(new ColorThemeGroupI(*group));
+}
+
+const wchar_t *GammaManagerAPI::getGammaSet()
+{
+ return curSetSel ? curSetSel->name : NULL;
+}
+
+#define CBCLASS ColorThemeGroupI
+START_DISPATCH;
+CB(COLORTHEMEGROUPGETNAME, getName);
+CB(COLORTHEMEGROUPGETRED, getRed);
+CB(COLORTHEMEGROUPGETGREEN, getGreen);
+CB(COLORTHEMEGROUPGETBLUE, getBlue);
+CB(COLORTHEMEGROUPGETGRAY, getGray);
+CB(COLORTHEMEGROUPGETBOOST, getBoost);
+VCB(COLORTHEMEGROUPSETNAME, setName);
+VCB(COLORTHEMEGROUPSETRED, setRed);
+VCB(COLORTHEMEGROUPSETGREEN, setGreen);
+VCB(COLORTHEMEGROUPSETBLUE, setBlue);
+VCB(COLORTHEMEGROUPSETGRAY, setGray);
+VCB(COLORTHEMEGROUPSETBOOST, setBoost);
+END_DISPATCH;
+#undef CBCLASS
+
+#define CBCLASS GammaManagerAPI
+START_DISPATCH;
+CB(API_COLORTHEMES_GETNUMGAMMASETS, getNumGammaSets);
+CB(API_COLORTHEMES_ENUMGAMMASET, enumGammaSet);
+VCB(API_COLORTHEMES_DELETEGAMMASET, deleteGammaSet);
+VCB(API_COLORTHEMES_DELETEALLGAMMASETS, deleteAllGammaSets);
+VCB(API_COLORTHEMES_RESETGAMMASET, resetGammaSet);
+VCB(API_COLORTHEMES_RENAMEGAMMASET, renameGammaSet);
+CB(API_COLORTHEMES_NEWGAMMASET, newGammaSet);
+VCB(API_COLORTHEMES_UPDATEGAMMASET, updateGammaSet);
+CB(API_COLORTHEMES_GETNUMGAMMAGROUPS, getNumGammaGroups);
+CB(API_COLORTHEMES_ENUMGAMMAGROUP, enumGammaGroup);
+CB(API_COLORTHEMES_ENUMCOLORTHEMEGROUP, enumColorThemeGroup);
+CB(API_COLORTHEMES_GETCOLORTHEMEGROUP, getColorThemeGroup);
+CB(API_COLORTHEMES_GETGAMMAFORGROUP, getGammaForGroup);
+VCB(API_COLORTHEMES_ADDGAMMAGROUP, addGammaGroup);
+VCB(API_COLORTHEMES_ADDGAMMAGROUP2, addGammaGroup2);
+CB(API_COLORTHEMES_GETGAMMASET, getGammaSet);
+VCB(API_COLORTHEMES_SETGAMMASET, setGammaSet);
+VCB(API_COLORTHEMES_STARTTRANSACTION, StartTransaction);
+VCB(API_COLORTHEMES_ENDTRANSACTION, EndTransaction);
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file