
/*
           Dieses Source wurde mit der Programmier-Umgebung CSH V4.17
                   von M.Buehler und S.Gluekler geschrieben.

  #########################################################################

   Programmname : WBUhr.c
   Version      : V1.0
   Autor        : S. Gluekler / sgluekle@hsr.ch
   Datum        : 28.12.99
   Updates      : -
   Beschreibung : Kleine, nette Uhr in der Workbench-Leiste

  #########################################################################

*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <workbench/startup.h>
#include <libraries/screennotify.h>
#include <intuition/intuitionbase.h>

#include <pragma/dos_lib.h>
#include <pragma/icon_lib.h>
#include <pragma/exec_lib.h>
#include <pragma/graphics_lib.h>
#include <pragma/intuition_lib.h>
#include <pragma/screennotify_lib.h>

#define PRG_NAME    "WBUhr"
#define PRG_VERSION "V1.0"
#define PRG_AUTHOR  "Stefan Gluekler"

#define COLOR_NUMMER_HINTERGRUND  2
#define COLOR_NUMMER_TEXT         1

#define SPRACHE_DEUTSCH           0
#define SPRACHE_ENGLISCH          7

#define WINDOW_ANZ_ZEICHEN        22
#define WINDOW_BREITE             WINDOW_ANZ_ZEICHEN*8

struct GfxBase       *GfxBase;
struct IntuitionBase *IntuitionBase;
struct Library       *ScreenNotifyBase;

struct Window        *Window;
struct RastPort      *RP;

struct NewWindow NewWindow =
{
  0,0,
  WINDOW_BREITE,9,
  COLOR_NUMMER_HINTERGRUND,COLOR_NUMMER_HINTERGRUND,
  IDCMP_VANILLAKEY,
  WFLG_BORDERLESS|WFLG_WBENCHWINDOW,
  NULL,NULL,NULL,NULL,NULL,
  0,0,0,0,
  WBENCHSCREEN
};

unsigned char sprache=SPRACHE_ENGLISCH;

unsigned char WindowOpen(void);
void WriteText(char *text);
void ReadIcon(char *argument0,unsigned short arg_anz);

int main(int argc, char **argv)
{
 register unsigned char exit_flag=1;
 register unsigned short alt_sec=99;
 register struct tm *tm_zeit;
 struct IntuiMessage *my_message;
 struct MsgPort *screennotify_p;
 struct ScreenNotifyMessage *screennotify_m;
 APTR screennotify_handle;
 unsigned char screennotify_library=0;
 unsigned char window_is_open;
 unsigned long zeit;
 char textstring[WINDOW_ANZ_ZEICHEN+2];
 char *tage[]  = { "Son","Mon","Die","Mit","Don","Fre","Sam",
                   "Sun","Mon","Tue","Wed","Thu","Fri","Sat"  };

  if ((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L))==0)
    return(99);

  if ((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L))==0)
  {
    CloseLibrary(IntuitionBase);
    return(99);
  }

  if ((ScreenNotifyBase=(struct Library *)OpenLibrary(SCREENNOTIFY_NAME,0L))!=0)
  {
    if (screennotify_p=CreateMsgPort())
    {
      if (screennotify_handle=AddWorkbenchClient(screennotify_p,0))
        screennotify_library=1;
      else
      {
        DeleteMsgPort(screennotify_p);
        CloseLibrary(ScreenNotifyBase);
      }
    }
    else
      CloseLibrary(ScreenNotifyBase);
  }

  ReadIcon(argv,argc);

  if (WindowOpen()==0)
  {
    if (screennotify_library)
      CloseLibrary(ScreenNotifyBase);
    CloseLibrary(IntuitionBase);
    CloseLibrary(GfxBase);
    return(99);
  }

  window_is_open=1;

  sprintf(textstring,"%s %s",PRG_NAME,PRG_VERSION);
  WriteText(textstring);
  Delay(50);

  sprintf(textstring,"(C) %s",PRG_AUTHOR);
  WriteText(textstring);
  Delay(50);

  while(exit_flag)
  {

    if (screennotify_library)
    {
      if (screennotify_m=(struct ScreenNotifyMessage *)GetMsg(screennotify_p))
      {
        if (screennotify_m->snm_Type==SCREENNOTIFY_TYPE_WORKBENCH)
        {
          if (screennotify_m->snm_Value)
          {
            if (WindowOpen()==0)
              exit_flag=0;
            else
              window_is_open=1;
          }
          else
          {
            CloseWindow(Window);
            window_is_open=0;
          }
        }
        ReplyMsg((struct Message *)screennotify_m);
      }
    }

    if (window_is_open)
    {
      time(&zeit);
      tm_zeit=localtime(&zeit);
      if (alt_sec!=tm_zeit->tm_sec)
      {
        alt_sec=tm_zeit->tm_sec;
        sprintf(textstring," %s %02d-%02d-%02d %02d:%02d:%02d",tage[tm_zeit->tm_wday+sprache],tm_zeit->tm_mday,tm_zeit->tm_mon+1,(tm_zeit->tm_year)%100,tm_zeit->tm_hour,tm_zeit->tm_min,tm_zeit->tm_sec);
        WriteText(textstring);
        while ((my_message = (struct IntuiMessage *)GetMsg( Window->UserPort)))
        {
          if (my_message->Class==IDCMP_VANILLAKEY && my_message->Code==27)
            exit_flag=0;
          ReplyMsg( my_message );
        }
      }
    }

    Delay(10);

  }

  if (window_is_open)
    CloseWindow(Window);

  if (screennotify_library)
  {
    while (!RemWorkbenchClient(screennotify_handle)) Delay(10);
    DeleteMsgPort(screennotify_p);
    CloseLibrary(ScreenNotifyBase);
  }

  CloseLibrary(IntuitionBase);
  CloseLibrary(GfxBase);

  return(0);
}

void ReadIcon(char *argument0,unsigned short arg_anz)
{
 char PrgName[120];
 char *zeiger;
 struct DiskObject *myDiskObject;
 struct IconBase *IconBase;
 struct WBStartup *Wbs;

  if (IconBase=(struct Library *)OpenLibrary("icon.library",0))
  {
    Wbs=(struct WBStartup *)argument0;
    strcpy(PrgName,"");
    if (arg_anz==0 && Wbs && Wbs->sm_NumArgs>0 && Wbs->sm_ArgList[Wbs->sm_NumArgs-1].wa_Lock)
    {
      NameFromLock(Wbs->sm_ArgList[Wbs->sm_NumArgs-1].wa_Lock,PrgName,sizeof(PrgName));
      if (strlen(PrgName)>0 && PrgName[strlen(PrgName)-1]!=':' && PrgName[strlen(PrgName)-1]!='/')
        strcat(PrgName,"/");
      strcat(PrgName,Wbs->sm_ArgList[Wbs->sm_NumArgs-1].wa_Name);
    }
    else
      GetProgramName(PrgName,sizeof(PrgName));
    if (strlen(PrgName))
    {
      if ((myDiskObject=GetDiskObject(PrgName)))
      {
        if ((zeiger=FindToolType(myDiskObject->do_ToolTypes,"GERMAN")))
        {
          if (!strlen(zeiger) || !stricmp(zeiger,"YES") || !stricmp(zeiger,"ON") || !stricmp(zeiger,"JA"))
            sprache=SPRACHE_DEUTSCH;
        }
        FreeDiskObject(myDiskObject);
      }
    }
    CloseLibrary(IconBase);
  }
}

unsigned char WindowOpen(void)
{
  NewWindow.LeftEdge=IntuitionBase->ActiveScreen->Width-(WINDOW_BREITE+35);
  if ((Window=(struct Window *)OpenWindow(&NewWindow))==0)
    return(0);
  RP=(struct RastPort *)Window->RPort;

  SetAPen(RP,COLOR_NUMMER_HINTERGRUND);
  Move(RP,0,0);
  Draw(RP,WINDOW_BREITE,0);
  SetAPen(RP,COLOR_NUMMER_TEXT);
  SetBPen(RP,COLOR_NUMMER_HINTERGRUND);

  return(1);
}

void WriteText(char *text)
{
 char txtstring[WINDOW_ANZ_ZEICHEN+2];

  sprintf(txtstring,"%-22.22s",text);
  Move(RP,0,7);
  Text(RP,txtstring,strlen(txtstring));
}
