3 messages in net.sourceforge.lists.courier-sqwebmail[sqwebmail] Flag message display enha...
FromSent OnAttachments
Milan ObuchJun 4, 2009 7:55 am.c, .css, .c, 1 more
Sam VarshavchikJun 4, 2009 5:47 pm 
Milan ObuchJun 4, 2009 10:05 pm 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:[sqwebmail] Flag message display enhancementActions...
From:Milan Obuch (cour@dino.sk)
Date:Jun 4, 2009 7:55:02 am
List:net.sourceforge.lists.courier-sqwebmail
Attachments:

Hi,

there is lack of display of message flag in sqwebmail. Message could be flagged with R (replied to), S (seen), T (tag for deletion) and F (flag). Last one is often available in mail programs as 'important message' flag or some such. I use IMAP client normally (KMail with IMAP account set up), but at times, webmail comes handy. As I use F flag sometimes, it would help me if its presence could be seen in webmail too.

Luckily, it was not that hard to patch this feature in. I decide to show F flag presence with red exclamation mark put before message selection checkbox. I did not succeed to align checboxes properly other way, so I put in two new table cells and adjusted styles and colspans accordingly.

Please review and comment attached patches. Ignore naming - I tested it as an optional FreeBSD port feature, thus the 'extra-' prefix (and I was lazy to make another copy of it just for thicase :) )

Regards, Milan

--- webmail/folder.c.orig 2008-07-20 19:00:33.000000000 +0200 +++ webmail/folder.c 2009-06-04 08:32:54.000000000 +0200 @@ -247,6 +247,18 @@ return (maildir_msgmovefile(folder, file, cgi("moveto"), pos)); }

+static int groupmark(const char *folder, const char *file, size_t pos) +{ + maildir_msgmarkfile(folder, file, pos); + return (0); +} + +static int groupunmark(const char *folder, const char *file, size_t pos) +{ + maildir_msgunmarkfile(folder, file, pos); + return (0); +} + void folder_delmsgs(const char *dir, size_t pos) { int rc=0; @@ -317,6 +329,16 @@ rc=group_movedel( dir, &groupmove ); maildir_savefoldermsgs(dir); } + else if (*cgi("cmdmark")) + { + rc=group_movedel( dir, &groupmark ); + maildir_savefoldermsgs(dir); + } + else if (*cgi("cmdunmark")) + { + rc=group_movedel( dir, &groupunmark ); + maildir_savefoldermsgs(dir); + }

maildir_cleanup();

@@ -441,7 +463,7 @@

folder_navigate(dir, pos, highend, morebefore, moreafter);

- printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\"
cellpadding=\"4\"><tr class=\"folder-index-header\"><th
align=\"center\">%s</th><th>&nbsp;</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n", + printf("<table width=\"100%%\" border=\"0\" cellspacing=\"0\"
cellpadding=\"4\"><tr class=\"folder-index-header\"><th
align=\"center\">%s</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n", getarg("NUM"), getarg("DATE"), (strncmp(dir, INBOX "." SENT, sizeof(INBOX)+sizeof(SENT)-1) && @@ -486,12 +508,13 @@ if ((q=strrchr(p, '/')) != 0) p=q+1;

- printf("<tr class=\"folder-index-bg-%d\" id=\"row%d\"><td align=\"right\"
class=\"message-number\">%s%ld.%s</td><td class=\"message-status\"><input
type=\"checkbox\" name=\"MOVE-%ld\" id=\"MOVE-%ld", + printf("<tr class=\"folder-index-bg-%d\" id=\"row%d\"><td align=\"right\"
class=\"message-number\">%s%ld.%s</td><td class=\"message-flag\">%s</td><td
class=\"message-select\"><input type=\"checkbox\" name=\"MOVE-%ld\"
id=\"MOVE-%ld", (i & 1)+1, i, folder_index_entry_start, (long)(i+pos+1), folder_index_entry_end, + maildirfile_flag(MSGINFO_FILENAME(contents[i])) ? "<font
color=\"red\">!</font>" : "", (long) (pos+i), (long) (pos+i)); printf("\" onchange=\"setsel('MOVE-%ld', 'row%d', 'folder-index-bg-%d');\"%s
/><input type=\"hidden\" name=\"MOVEFILE-%ld\" value=\"", @@ -499,7 +522,7 @@ (type[0] == MSGTYPE_DELETED ? " disabled=\"disabled\"":""), (long)(pos+i)); output_attrencoded(p); - printf("\" />&nbsp;%s%s%s</td><td class=\"message-date\">%s", + printf("\" /></td><td class=\"message-status\">%s%s%s</td><td
class=\"message-date\">%s", folder_index_entry_start, type, folder_index_entry_end, @@ -545,9 +568,9 @@

if (found) { - puts("<tr class=\"folder-index-bg-1\"><td colspan=\"6\"><hr /></td></tr>"); - puts("<tr class=\"folder-index-bg-2\"><td>&nbsp;</td>"); - puts("<td colspan=\"5\">"); + puts("<tr class=\"folder-index-bg-3\"><td colspan=\"8\"><hr /></td></tr>"); + puts("<tr class=\"folder-index-bg-4\"><td>&nbsp;</td>"); + puts("<td colspan=\"7\">");

puts("<script type=\"text/javascript\">"); puts("/* <![CDATA[ */"); @@ -578,7 +601,7 @@ } if (!found && nomsg) { - puts("<tr class=\"folder-index-bg-1\"><td colspan=\"6\" align=\"left\"><p>"); + puts("<tr class=\"folder-index-bg-1\"><td colspan=\"8\" align=\"left\"><p>"); puts(nomsg); puts("<br /></p></td></tr>"); printf("</table>\n"); @@ -3364,7 +3387,7 @@ if ((strcmp(sqwebmail_folder, INBOX "." TRASH) == 0) &&
(strlen(getarg("PURGEALL")))) printf("<input type=\"submit\" name=\"cmdpurgeall\" value=\"%s\"
onclick=\"javascript: return deleteAll();\" />", getarg("PURGEALL")); - printf("<input type=\"submit\" name=\"cmddel\" value=\"%s\" />%s<select
name=\"moveto\">", + printf("<input type=\"submit\" name=\"cmddel\" value=\"%s\" />, <input
type=\"submit\" name=\"cmdmark\" value=\"Mark\" />, <input type=\"submit\"
name=\"cmdunmark\" value=\"Unmark\" />%s<select name=\"moveto\">", strcmp(sqwebmail_folder, INBOX "." TRASH) == 0 ? purgelab:deletelab, movelab);

--- webmail/images/sqwebmail.css.orig 2009-06-04 08:27:30.000000000 +0200 +++ webmail/images/sqwebmail.css 2009-06-04 08:33:54.000000000 +0200 @@ -142,6 +142,9 @@ .folder-index-bg-1:hover { background-color: #bbbbbb } .folder-index-bg-2 { background-color: #ddddbb } .folder-index-bg-2:hover { background-color: #bbbbbb } +/* for <HR> and buttons under message list */ +.folder-index-bg-3 { background-color: #ffffff } +.folder-index-bg-4 { background-color: #eeeecc }

/* Selected message */

@@ -159,11 +162,13 @@ */

.message-number { } -.message-status { } +.message-flag { padding: 0} +.message-select { padding: 0 } +.message-status { padding: 0 } .message-date { } .message-from { } .message-subject { } -.message-size { font-family: monospace} +.message-size { font-family: monospace }

/***************************** Folder permissions ***********************/

--- webmail/maildir.c.orig 2008-07-20 05:15:08.000000000 +0200 +++ webmail/maildir.c 2009-06-03 22:41:49.000000000 +0200 @@ -1091,6 +1091,42 @@ return (rc); }

+void maildir_msgmarkfile(const char *folder, const char *file, size_t pos) +{ +char *filename=maildir_find(folder, file); +char *new_filename; + + if (filename) + { + if ((new_filename=maildir_addflagfilename(filename, 'F')) != 0) + { + rename(filename, new_filename); + update_foldermsgs(folder, new_filename, pos); + free(new_filename); + } + + free(filename); + } +} + +void maildir_msgunmarkfile(const char *folder, const char *file, size_t pos) +{ +char *filename=maildir_find(folder, file); +char *new_filename; + + if (filename) + { + if ((new_filename = strdup(filename)) != 0) + { + maildir_remflagname(new_filename, 'F'); + rename(filename, new_filename); + update_foldermsgs(folder, new_filename, pos); + free(new_filename); + } + free(filename); + } +} + static char *foldercountfilename(const char *folder) { char *f=malloc(sizeof(MAILDIRCURCACHE "/cnt.") + strlen(folder)); @@ -1604,6 +1640,29 @@ return (MSGTYPE_NEW); }

+/* +** maildirfile_flag(directory, filename) - boolean: +** +*/ + +int maildirfile_flag(const char *p) +{ +const char *q=strrchr(p, '/'); +int seen_flag=0; + + if (q) p=q; + + if ( !(p=strchr(p, ':')) || *++p != '2' || *++p != ',') + return (0); /* No :2,info */ + + ++p; + while (p && isalpha((int)(unsigned char)*p)) + if (*p++ == 'F') + seen_flag=1; + + return (seen_flag); +} + static int docount(const char *fn, unsigned *new_cnt, unsigned *other_cnt) { const char *filename=strrchr(fn, '/');

--- webmail/maildir.h.orig 2004-02-17 01:58:24.000000000 +0100 +++ webmail/maildir.h 2009-06-04 08:40:43.000000000 +0200 @@ -35,12 +35,15 @@ extern int maildir_name2pos(const char *, const char *, size_t *);

extern char maildirfile_type(const char *); +extern int maildirfile_flag(const char *); extern void maildir_markread(const char *, size_t); extern void maildir_markreplied(const char *, const char *); extern void maildir_msgdeletefile(const char *, const char *, size_t); extern void maildir_msgpurge(const char *, size_t); extern void maildir_msgpurgefile(const char *, const char *); extern void maildir_purgemimegpg(); +extern void maildir_msgmarkfile(const char *, const char *, size_t); +extern void maildir_msgunmarkfile(const char *, const char *, size_t);

extern int maildir_msgmove(const char *, size_t, const char *); extern int maildir_msgmovefile(const char *, const char *, const char *,
size_t);

------------------------------------------------------------------------------ OpenSolaris 2009.06 is a cutting edge operating system for enterprises looking to deploy the next generation of Solaris that includes the latest innovations from Sun and the OpenSource community. Download a copy and enjoy capabilities such as Networking, Storage and Virtualization. Go to: http://p.sf.net/sfu/opensolaris-get