summary refs log blame commit diff stats
path: root/plugins/ewc/ewc.c
blob: 48336b36223515647a98478e3875688ad4bcd91c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
191
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* XChat-WDK
 * Copyright (c) 2010-2011 Berke Viktor.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <windows.h>
#include <wininet.h>

#include "xchat-plugin.h"

static xchat_plugin *ph;   /* plugin handle */
static const char name[] = &quo
/*
EasyWinampControl - A Winamp "What's playing" plugin for HexChat
Copyright (C) Yann HAMON & contributors

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

#include <windows.h>
#include "hexchat-plugin.h"

static hexchat_plugin *ph;   /* plugin handle */
static int enable = 1;

// For example, circularstrstr("winamp", "pwi", 3) would return 5 (the index of p)
int circularstrstr(char* a, char* b, int nb)
{
  int equal = 1;
  int length;
  int pos=-1;
  int i, j;

  length = strlen(a);

  for (i=0; i<length && pos == -1; ++i) {
    equal = 1;
    for (j=0; j<nb;j++) {
      if (a[(i+j)%length] != b[j])
        equal = 0;
    }
    if (equal == 1)
      pos = i;
  }

  return pos;
}

void GetCurrentSongsName(HWND hwndWinamp, char* title, int titlesize)
{
  int pos;
  char *title2;
  int i, j=0;
  int length;
  char *p;

  GetWindowText(hwndWinamp, title, titlesize);
  length = strlen(title);

  if ((pos = circularstrstr(title, "- Winamp ***", 12)) != -1) {
    // The option "scroll song title in taskbar" is on
    title2 = (char*) malloc (titlesize*sizeof(char));

    for (i=(pos+12)%length; i!=pos; i=(i+1)%length)
      title2[j++] = title[i];

    title2[j] = '\0';

    p = title2;
    while (p<title2+titlesize && *p != '.')
      p++;
    p+=2; // Delete the . and the following white space

    strcpy(title, p);
    free(title2);
  }
  else {
    p = title;
    while (p<title+titlesize && *p != '.')
      p++;
    p+=2; // Delete the . and the following white space
    if (p<title+titlesize)
      strncpy(title, p, titlesize-(p-title));

    // Delete the trailing "- winamp"
    p = title + titlesize - 1;
    while (p>title && *p != '-') p--;
    *p = '\0';
  }
}


// Controlling winamp
static int wcmd_cb(char *word[], char *word_eol[], void *userdata)
{
  // Everything's here : http://winamp.com/nsdn/winamp2x/dev/sdk/api.php
  // The previous url seems dead, see http://forums.winamp.com/showthread.php?threadid=180297
  HWND hwndWinamp = NULL;

  if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL) {
    hexchat_print(ph, "Winamp's window not found - Is winamp really running?\n");
  }
  else {
    if (strcmp(word[1], "") == 0)
      hexchat_print(ph, "Usage: wcmd [command]\n");
    else if (strcmp(word[2], "next") == 0) {
      hexchat_print(ph, "Loading next song...\n");
      SendMessage (hwndWinamp, WM_COMMAND, 40048, 0);
    }
    else if (strcmp(word[2], "prev") == 0) {
"> SendMessage (hwndWinamp, WM_COMMAND, 40044, 0); } else if (strcmp(word[2], "play") == 0) { hexchat_print(ph, "Playin'...\n"); SendMessage (hwndWinamp, WM_COMMAND, 40045, 0); } else if (strcmp(word[2], "stop") == 0) { hexchat_print(ph, "Winamp stopped!...\n"); SendMessage (hwndWinamp, WM_COMMAND, 40047, 0); } else if (strcmp(word[2], "pause") == 0) { SendMessage (hwndWinamp, WM_COMMAND, 40046, 0); } } return HEXCHAT_EAT_ALL; } // Display current song static int wp_cb(char *word[], char *word_eol[], void *userdata) { HWND hwndWinamp = NULL; int bitrate, length, elapsed, minutes, seconds, eminutes, eseconds, samplerate, nbchannels; char elapsedtime[7]; char totaltime[7]; char this_title[1024]; if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL) hexchat_print(ph, "Winamp's window not found - Is winamp really running?\n"); else { //Winamp's running // Seems buggy when winamp2's agent is running, and winamp not (or winamp3) -> crashes HexChat. SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)125); if ((samplerate = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get current song's samplerate... !?\n"); return HEXCHAT_EAT_ALL; } if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get current song's bitrate... !?\n"); return HEXCHAT_EAT_ALL; } if ((nbchannels = SendMessage(hwndWinamp, WM_USER, (WPARAM)2, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get the number of channels... !?\n"); return HEXCHAT_EAT_ALL; } if ((length = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)105)) == 0) { // Could be buggy when streaming audio or video, returned length is unexpected; // How to detect is Winamp is streaming, and display ??:?? in that case? hexchat_print(ph, "Could not get current song's length... !?\n"); return HEXCHAT_EAT_ALL; } else { minutes = length/60; seconds = length%60; if (seconds>9) wsprintf(totaltime, "%d:%d", minutes, seconds); else wsprintf(totaltime, "%d:0%d", minutes, seconds); } if ((elapsed = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)105)) == 0) { hexchat_print(ph, "Could not get current song's elapsed time... !?\n"); return HEXCHAT_EAT_ALL; } else { eminutes = (elapsed/1000)/60; /* kinda stupid sounding, but e is for elapsed */ eseconds = (elapsed/1000)%60; if (eseconds>9) wsprintf(elapsedtime, "%d:%d", eminutes, eseconds); else wsprintf(elapsedtime, "%d:0%d", eminutes, eseconds); } if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) { hexchat_print(ph, "Could not get current song's bitrate... !?\n"); return HEXCHAT_EAT_ALL; } GetCurrentSongsName(hwndWinamp, this_title, 1024); hexchat_commandf(ph, "dispcurrsong %d %d %d %s %s %s", samplerate, bitrate, nbchannels, elapsedtime, totaltime, this_title); } return HEXCHAT_EAT_ALL; /* eat this command so HexChat and other plugins can't process it */ } int hexchat_plugin_init(hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) { /* we need to save this for use with any hexchat_* functions */ ph = plugin_handle; *plugin_name = "EasyWinampControl"; *plugin_desc = "Some commands to remotely control winamp"; *plugin_version = "1.2"; hexchat_hook_command(ph, "wp", HEXCHAT_PRI_NORM, wp_cb, "Usage: wp", 0); hexchat_hook_command(ph, "wcmd", HEXCHAT_PRI_NORM, wcmd_cb, "Usage: wcmd [play|pause|stop|prev|next]", 0); hexchat_print(ph, "EasyWinampControl plugin loaded\n"); return 1; /* return 1 for success */ } int hexchat_plugin_deinit(void) { hexchat_print(ph, "EasyWinampControl plugin unloaded\n"); return 1; }