-const char w32log_rcs[] = "$Id: w32log.c,v 1.21 2002/03/24 12:07:35 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 $
* ouputting strings, processing messages and so on.
*
* Copyright : Written by and Copyright (C) 2001-2002 members of
- * the Privoxy team. http://privoxy.org/
+ * the Privoxy team. http://www.privoxy.org/
*
* Written by and Copyright (C) 1999 Adam Lock
* <locka@iol.ie>
*
* 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
+ *
* Revision 1.21 2002/03/24 12:07:35 jongfoster
* Consistern name for filters file
*
#include <assert.h>
#include <stdio.h>
+#ifndef STRICT
+#define STRICT
+#endif
#include <windows.h>
#include <richedit.h>
/* 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;
/* 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;
/* FIXME: end kludge */
-
-#ifdef REGEX
/* Regular expression for detected URLs */
#define RE_URL "http:[^ \n\r]*"
{ 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 },
/* this is the terminator statement - do not delete! */
{ NULL, STYLE_NONE }
};
-#endif /* def REGEX */
-
/*
* Public variables
*/
HWND g_hwndLogFrame;
+HICON g_hiconApp;
/*
* Private variables
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;
static void LogCreatePatternMatchingBuffers(void);
static void LogDestroyPatternMatchingBuffers(void);
static int LogPutStringNoMatch(const char *pszText, int style);
+static void SetIdleIcon(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));
TrayDeleteIcon(g_hwndTray, 1);
DeleteObject(g_hiconApp);
DeleteObject(g_hiconIdle);
+ DeleteObject(g_hiconOff);
for (i = 0; i < ANIM_FRAMES; i++)
{
DeleteObject(g_hiconAnim[i]);
*********************************************************************/
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
-
}
*********************************************************************/
void LogDestroyPatternMatchingBuffers(void)
{
-#ifdef REGEX
int i;
for (i = 0; patterns_to_highlight[i].str != NULL; i++)
{
regfree(&patterns_to_highlight[i].buffer);
}
-#endif
-
}
char *LogGetURLUnderCursor(void)
{
char *szResult = NULL;
-#ifdef REGEX
regex_t re;
POINT ptCursor;
POINTL ptl;
regfree(&re);
}
-#endif
return szResult;
}
* 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
*********************************************************************/
int LogPutString(const char *pszText)
{
-#ifdef REGEX
int i;
-#endif
int result = 0;
if (pszText == NULL || strlen(pszText) == 0)
*/
EnterCriticalSection(&g_criticalsection);
-#ifdef REGEX
if (g_bHighlightMessages)
{
regmatch_t match;
}
}
}
-#endif
result = LogPutStringNoMatch(pszText, STYLE_NONE);
-#ifdef REGEX
end:
-#endif
LeaveCriticalSection(&g_criticalsection);
return result;
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);
+
}
-}
+}
/*********************************************************************
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);
{
SetForegroundWindow(g_hwndLogFrame);
SetWindowPos(g_hwndLogFrame, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
+
}
else if (g_bShowOnTaskBar)
{
{
ShowWindow(g_hwndLogFrame, SW_HIDE);
}
-
}
{
switch (nCommand)
{
- case ID_SHOWWINDOW:
- ShowLogWindow(TRUE);
+ case ID_TOGGLE_SHOWWINDOW:
+ g_bShowLogWindow = !g_bShowLogWindow;
+
+ ShowLogWindow(g_bShowLogWindow);
break;
case ID_FILE_EXIT:
#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.");
}
{
log_error(LOG_LEVEL_INFO, "Now toggled OFF.");
}
+ SetIdleIcon();
break;
#endif /* def FEATURE_TOGGLE */
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:
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));
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));
}
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;
}
+/*********************************************************************
+ *
+ * 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
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);
return 0;
case WM_SHOWWINDOW:
+ g_bShowLogWindow = wParam;
case WM_SIZE:
/* Resize the logging window to fit the new frame */
if (g_hwndLogBox)
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);