Rebuilt after standard.action file removal.
[privoxy.git] / w32log.c
index 0948e4b..9c92131 100644 (file)
--- a/w32log.c
+++ b/w32log.c
@@ -1,4 +1,4 @@
-const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster Exp $";
+const char w32log_rcs[] = "$Id: w32log.c,v 1.29 2008/12/20 15:27:40 ler762 Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32log.c,v $
@@ -32,6 +32,53 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
  *
  * Revisions   :
  *    $Log: w32log.c,v $
+ *    Revision 1.29  2008/12/20 15:27:40  ler762
+ *    The crunch log message format changed, so update the strings to highlight
+ *    in the log window.
+ *
+ *    Revision 1.28  2008/11/02 14:37:47  ler762
+ *    commit the part of the patches I've been using that were written by torford and gjmurphy
+ *      [ 1824315 ] Minor code cleanup
+ *      [ 1781135 ] Patch - Add clear log, select all, and Accelerators for w32
+ *        http://sourceforge.net/tracker/?func=detail&atid=311118&aid=1781135&group_id=11118
+ *    The full patch adds control keys A(select all), C(copy) and D(delete all) to the
+ *    Privoxy log window menu.  Select all and copy work for me without the patch
+ *    (albeit without showing the accelerator keys on the menu), so the only part of the
+ *    patch I've been using for the last year or so has been the ctrl-d to delete
+ *    everything in the Privoxy log window.
+ *
+ *    Revision 1.27  2006/07/18 14:48:48  david__schmidt
+ *    Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
+ *    with what was really the latest development (the v_3_0_branch branch)
+ *
+ *    Revision 1.25.2.5  2003/04/04 12:48:51  oes
+ *    Fixed bug #711865:
+ *     - Made tray menu correctly reflect initial window visibility state
+ *     - Hopefully fixed problem where log window contents wasn't visible
+ *       until vertical scroll bar was clicked. Thanks to Guy for the fix!
+ *
+ *    Revision 1.25.2.4  2003/03/11 11:53:59  oes
+ *    Cosmetic: Renamed cryptic variable
+ *
+ *    Revision 1.25.2.3  2002/11/20 14:39:05  oes
+ *    Fixed compiler warning
+ *
+ *    Revision 1.25.2.2  2002/09/25 15:23:10  oes
+ *    Uncheck the "Show Privoxy Window" taskbar menu item when window gets minimized. Fixes bug #606804
+ *
+ *    Revision 1.25.2.1  2002/08/21 17:59:05  oes
+ *     - "Show Privoxy Window" now a toggle
+ *     - Temp kludge to let user and default action file be edited through win32 GUI (FR 592080)
+ *
+ *    Revision 1.25  2002/04/04 00:36:36  gliptak
+ *    always use pcre for matching
+ *
+ *    Revision 1.24  2002/03/31 17:19:00  jongfoster
+ *    Win32 only: Enabling STRICT to fix a VC++ compile warning.
+ *
+ *    Revision 1.23  2002/03/26 22:57:10  jongfoster
+ *    Web server name should begin www.
+ *
  *    Revision 1.22  2002/03/24 12:48:23  jongfoster
  *    Fixing doc links
  *
@@ -150,6 +197,9 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
 #include <assert.h>
 #include <stdio.h>
 
+#ifndef STRICT
+#define STRICT
+#endif
 #include <windows.h>
 #include <richedit.h>
 
@@ -212,6 +262,9 @@ const char w32log_h_rcs[] = W32LOG_H_VERSION;
 /* Indicates whether task bar shows activity animation */
 BOOL g_bShowActivityAnimation = 1;
 
+/* Indicates whether the log window is shown */
+BOOL g_bShowLogWindow = 1;
+
 /* Indicates if the log window appears on the task bar */
 BOOL g_bShowOnTaskBar = 0;
 
@@ -239,7 +292,8 @@ int g_nFontSize = DEFAULT_LOG_FONT_SIZE;
 
 /* FIXME: this is a kludge */
 
-const char * g_actions_file = NULL;
+const char * g_default_actions_file = NULL;
+const char * g_user_actions_file = NULL;
 const char * g_re_filterfile = NULL;
 #ifdef FEATURE_TRUST
 const char * g_trustfile = NULL;
@@ -247,8 +301,6 @@ const char * g_trustfile = NULL;
 
 /* FIXME: end kludge */
 
-
-#ifdef REGEX
 /* Regular expression for detected URLs */
 #define RE_URL "http:[^ \n\r]*"
 
@@ -266,7 +318,16 @@ static struct _Pattern
    { RE_URL,                STYLE_LINK },
 /* { "[a-zA-Z0-9]+\\.[a-zA-Z0-9]+\\.[a-zA-Z0-9]+\\.[^ \n\r]*", STYLE_LINK }, */
    /* interesting text to highlight */
-   { "crunch!",           STYLE_HIGHLIGHT },
+   /*   see jcc.c crunch_reason for the full list */
+   { "Crunch: Blocked:",            STYLE_HIGHLIGHT },
+   { "Crunch: Untrusted",           STYLE_HIGHLIGHT },
+   { "Crunch: Redirected:",         STYLE_HIGHLIGHT },
+   { "Crunch: DNS failure",         STYLE_HIGHLIGHT },
+   { "Crunch: Forwarding failed",   STYLE_HIGHLIGHT },
+   { "Crunch: Connection failure",  STYLE_HIGHLIGHT },
+   { "Crunch: Out of memory",       STYLE_HIGHLIGHT },
+   /* what are all the possible error strings?? */
+   { "Error:",                      STYLE_HIGHLIGHT },
    /* http headers */
    { "referer:",            STYLE_HEADER },
    { "proxy-connection:",   STYLE_HEADER },
@@ -294,13 +355,12 @@ static struct _Pattern
    /* this is the terminator statement - do not delete! */
    { NULL,                  STYLE_NONE }
 };
-#endif /* def REGEX */
-
 
 /*
  * Public variables
  */
 HWND g_hwndLogFrame;
+HICON g_hiconApp;
 
 /*
  * Private variables
@@ -311,7 +371,7 @@ static HWND g_hwndLogBox;
 static WNDPROC g_fnLogBox;
 static HICON g_hiconAnim[ANIM_FRAMES];
 static HICON g_hiconIdle;
-static HICON g_hiconApp;
+static HICON g_hiconOff;
 static int g_nAnimFrame;
 static BOOL g_bClipPending = FALSE;
 static int g_nRichEditVersion = 0;
@@ -329,6 +389,7 @@ static void LogClipBuffer(void);
 static void LogCreatePatternMatchingBuffers(void);
 static void LogDestroyPatternMatchingBuffers(void);
 static int LogPutStringNoMatch(const char *pszText, int style);
+static void SetIdleIcon(void);
 
 
 /*********************************************************************
@@ -348,6 +409,7 @@ BOOL InitLogWindow(void)
 
    /* Load the icons */
    g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE));
+   g_hiconOff  = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_OFF));
    for (i = 0; i < ANIM_FRAMES; i++)
    {
       g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i));
@@ -390,6 +452,7 @@ void TermLogWindow(void)
    TrayDeleteIcon(g_hwndTray, 1);
    DeleteObject(g_hiconApp);
    DeleteObject(g_hiconIdle);
+   DeleteObject(g_hiconOff);
    for (i = 0; i < ANIM_FRAMES; i++)
    {
       DeleteObject(g_hiconAnim[i]);
@@ -411,14 +474,11 @@ void TermLogWindow(void)
  *********************************************************************/
 void LogCreatePatternMatchingBuffers(void)
 {
-#ifdef REGEX
    int i;
    for (i = 0; patterns_to_highlight[i].str != NULL; i++)
    {
       regcomp(&patterns_to_highlight[i].buffer, patterns_to_highlight[i].str, REG_ICASE);
    }
-#endif
-
 }
 
 
@@ -435,14 +495,11 @@ void LogCreatePatternMatchingBuffers(void)
  *********************************************************************/
 void LogDestroyPatternMatchingBuffers(void)
 {
-#ifdef REGEX
    int i;
    for (i = 0; patterns_to_highlight[i].str != NULL; i++)
    {
       regfree(&patterns_to_highlight[i].buffer);
    }
-#endif
-
 }
 
 
@@ -460,7 +517,6 @@ void LogDestroyPatternMatchingBuffers(void)
 char *LogGetURLUnderCursor(void)
 {
    char *szResult = NULL;
-#ifdef REGEX
    regex_t re;
    POINT ptCursor;
    POINTL ptl;
@@ -503,7 +559,6 @@ char *LogGetURLUnderCursor(void)
 
       regfree(&re);
    }
-#endif
    return szResult;
 
 }
@@ -514,7 +569,7 @@ char *LogGetURLUnderCursor(void)
  * Function    :  LogPutString
  *
  * Description :  Inserts text into the logging window.  This is really
- *                a REGEXP aware wrapper function to `LogPutStringNoMatch'.
+ *                a regexp aware wrapper function to `LogPutStringNoMatch'.
  *
  * Parameters  :
  *          1  :  pszText = pointer to string going to the log window
@@ -526,9 +581,7 @@ char *LogGetURLUnderCursor(void)
  *********************************************************************/
 int LogPutString(const char *pszText)
 {
-#ifdef REGEX
    int i;
-#endif
    int result = 0;
 
    if (pszText == NULL || strlen(pszText) == 0)
@@ -546,7 +599,6 @@ int LogPutString(const char *pszText)
     */
    EnterCriticalSection(&g_criticalsection);
 
-#ifdef REGEX
    if (g_bHighlightMessages)
    {
       regmatch_t match;
@@ -601,13 +653,10 @@ int LogPutString(const char *pszText)
          }
       }
    }
-#endif
 
    result = LogPutStringNoMatch(pszText, STYLE_NONE);
 
-#ifdef REGEX
 end:
-#endif
    LeaveCriticalSection(&g_criticalsection);
 
    return result;
@@ -757,10 +806,17 @@ void LogClipBuffer(void)
       SendMessage(g_hwndLogBox, EM_REPLACESEL, FALSE, (LPARAM) "");
       SendMessage(g_hwndLogBox, EM_SETOPTIONS, ECOOP_XOR, ECO_AUTOVSCROLL);
 
-      /* Restore old selection */
+      /* reposition (back to) the end of the log content */
+      range.cpMin = SendMessage (g_hwndLogBox, WM_GETTEXTLENGTH, 0, 0);
+      range.cpMax = -1;
+      SendMessage(g_hwndLogBox, EM_EXSETSEL, 0, (LPARAM) &range);
+      /* restore vertical ScrollBar stuff (messed up by AUTOVSCROLL) */
+      SendMessage (g_hwndLogBox, EM_SCROLL, SB_LINEDOWN, 0);
    }
 
-}
+}                                        
 
 
 /*********************************************************************
@@ -889,12 +945,14 @@ HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow)
           nCmdShow == SW_MINIMIZE ||
           nCmdShow == SW_SHOWMINNOACTIVE))
    {
+      g_bShowLogWindow = FALSE;
       nCmdShow = SW_HIDE;
    }
 
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
+
    GetClientRect(g_hwndLogFrame, &rcClient);
    SetWindowPos(g_hwndLogBox, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, SWP_NOZORDER);
 
@@ -960,6 +1018,7 @@ void ShowLogWindow(BOOL bShow)
    {
       SetForegroundWindow(g_hwndLogFrame);
       SetWindowPos(g_hwndLogFrame, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
+      
    }
    else if (g_bShowOnTaskBar)
    {
@@ -969,7 +1028,6 @@ void ShowLogWindow(BOOL bShow)
    {
       ShowWindow(g_hwndLogFrame, SW_HIDE);
    }
-
 }
 
 
@@ -1059,8 +1117,10 @@ void OnLogCommand(int nCommand)
 {
    switch (nCommand)
    {
-      case ID_SHOWWINDOW:
-         ShowLogWindow(TRUE);
+      case ID_TOGGLE_SHOWWINDOW:
+         g_bShowLogWindow = !g_bShowLogWindow;
+
+         ShowLogWindow(g_bShowLogWindow);
          break;
 
       case ID_FILE_EXIT:
@@ -1098,8 +1158,8 @@ void OnLogCommand(int nCommand)
 #ifdef FEATURE_TOGGLE
       /* by haroon - change toggle to its opposite value */
       case ID_TOGGLE_ENABLED:
-         g_bToggleIJB = !g_bToggleIJB;
-         if (g_bToggleIJB)
+         global_toggle_state = !global_toggle_state;
+         if (global_toggle_state)
          {
             log_error(LOG_LEVEL_INFO, "Now toggled ON.");
          }
@@ -1107,6 +1167,7 @@ void OnLogCommand(int nCommand)
          {
             log_error(LOG_LEVEL_INFO, "Now toggled OFF.");
          }
+         SetIdleIcon();
          break;
 #endif /* def FEATURE_TOGGLE */
 
@@ -1114,8 +1175,12 @@ void OnLogCommand(int nCommand)
          EditFile(configfile);
          break;
 
-      case ID_TOOLS_EDITACTIONS:
-         EditFile(g_actions_file);
+      case ID_TOOLS_EDITDEFAULTACTIONS:
+         EditFile(g_default_actions_file);
+         break;
+
+      case ID_TOOLS_EDITUSERACTIONS:
+         EditFile(g_user_actions_file);
          break;
 
       case ID_TOOLS_EDITFILTERS:
@@ -1172,7 +1237,8 @@ void OnLogCommand(int nCommand)
 void OnLogInitMenu(HMENU hmenu)
 {
    /* Only enable editors if there is a file to edit */
-   EnableMenuItem(hmenu, ID_TOOLS_EDITACTIONS, MF_BYCOMMAND | (g_actions_file ? MF_ENABLED : MF_GRAYED));
+   EnableMenuItem(hmenu, ID_TOOLS_EDITDEFAULTACTIONS, MF_BYCOMMAND | (g_default_actions_file ? MF_ENABLED : MF_GRAYED));
+   EnableMenuItem(hmenu, ID_TOOLS_EDITUSERACTIONS, MF_BYCOMMAND | (g_user_actions_file ? MF_ENABLED : MF_GRAYED));
    EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED));
 #ifdef FEATURE_TRUST
    EnableMenuItem(hmenu, ID_TOOLS_EDITTRUST, MF_BYCOMMAND | (g_trustfile ? MF_ENABLED : MF_GRAYED));
@@ -1185,8 +1251,9 @@ void OnLogInitMenu(HMENU hmenu)
    CheckMenuItem(hmenu, ID_VIEW_ACTIVITYANIMATION, MF_BYCOMMAND | (g_bShowActivityAnimation ? MF_CHECKED : MF_UNCHECKED));
 #ifdef FEATURE_TOGGLE
    /* by haroon - menu item for Enable toggle on/off */
-   CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED));
+   CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (global_toggle_state ? MF_CHECKED : MF_UNCHECKED));
 #endif /* def FEATURE_TOGGLE */
+   CheckMenuItem(hmenu, ID_TOGGLE_SHOWWINDOW, MF_BYCOMMAND | (g_bShowLogWindow ? MF_CHECKED : MF_UNCHECKED));
 
 }
 
@@ -1213,7 +1280,7 @@ void OnLogTimer(int nTimer)
 
       case TIMER_ANIMSTOP_ID:
          g_nAnimFrame = 0;
-         TraySetIcon(g_hwndTray, 1, g_hiconIdle);
+         SetIdleIcon();
          KillTimer(g_hwndLogFrame, TIMER_ANIM_ID);
          KillTimer(g_hwndLogFrame, TIMER_ANIMSTOP_ID);
          break;
@@ -1234,6 +1301,31 @@ void OnLogTimer(int nTimer)
 }
 
 
+/*********************************************************************
+ *
+ * Function    :  SetIdleIcon
+ *
+ * Description :  Sets the tray icon to either idle or off
+ *
+ * Parameters  :  none
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void SetIdleIcon()
+{
+#ifdef FEATURE_TOGGLE
+         if (!global_toggle_state)
+         {
+            TraySetIcon(g_hwndTray, 1, g_hiconOff);
+            /* log_error(LOG_LEVEL_INFO, "Privoxy OFF icon selected."); */
+         }
+         else
+#endif /* def FEATURE_TOGGLE */
+         TraySetIcon(g_hwndTray, 1, g_hiconIdle);
+}
+
+
 /*********************************************************************
  *
  * Function    :  LogRichEditProc
@@ -1260,8 +1352,16 @@ LRESULT CALLBACK LogRichEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa
          pt.y = HIWORD(lParam);
          ClientToScreen(hwnd, &pt);
          OnLogRButtonUp(wParam, pt.x, pt.y);
+         return 0;
+      }
+      case WM_CHAR:
+      {
+         if ((GetKeyState(VK_CONTROL) != 0) && (wParam == 4)) /* ctrl+d */
+         {
+             OnLogCommand(ID_VIEW_CLEARLOG);
+             return 0;
+         }
       }
-      return 0;
    }
    return CallWindowProc(g_fnLogBox, hwnd, uMsg, wParam, lParam);
 
@@ -1301,6 +1401,7 @@ LRESULT CALLBACK LogWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara
          return 0;
 
       case WM_SHOWWINDOW:
+         g_bShowLogWindow = wParam;
       case WM_SIZE:
          /* Resize the logging window to fit the new frame */
          if (g_hwndLogBox)
@@ -1338,6 +1439,14 @@ LRESULT CALLBACK LogWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara
                return 0;
          }
          break;
+
+      case WM_CHAR:
+         if ((GetKeyState(VK_CONTROL) != 0) && (wParam == 4)) /* ctrl+d */
+         {
+             OnLogCommand(ID_VIEW_CLEARLOG);
+             return 0;
+         }
+         break;
    }
 
    return DefWindowProc(hwnd, uMsg, wParam, lParam);