comparison pidgin/plugins/timestamp_format.c @ 30191:446f208e5765

timestamp formats: Allow forcing 12-hour time formats. Closes #11667. Patch from Jonathan "jemaltz" Maltz. I modified it a bit and changed the preference from an int-enum to a string. committer: Paul Aurich <paul@darkrain42.org>
author jemaltz@gmail.com
date Sat, 24 Apr 2010 23:06:17 +0000
parents 4e7a9940627e
children 43c58f23c4b0
comparison
equal deleted inserted replaced
30189:53dd827e6bb2 30191:446f208e5765
10 #include "gtkplugin.h" 10 #include "gtkplugin.h"
11 #include "gtkimhtml.h" 11 #include "gtkimhtml.h"
12 12
13 #include <time.h> 13 #include <time.h>
14 14
15 static const char *format_12hour_hour(const struct tm *tm)
16 {
17 static char hr[3];
18 int hour = tm->tm_hour % 12;
19 if (hour == 0)
20 hour = 12;
21
22 g_snprintf(hr, sizeof(hr), "%d", hour);
23 return hr;
24 }
25
15 static PurplePluginPrefFrame * 26 static PurplePluginPrefFrame *
16 get_plugin_pref_frame(PurplePlugin *plugin) 27 get_plugin_pref_frame(PurplePlugin *plugin)
17 { 28 {
18 PurplePluginPrefFrame *frame; 29 PurplePluginPrefFrame *frame;
19 PurplePluginPref *ppref; 30 PurplePluginPref *ppref;
22 frame = purple_plugin_pref_frame_new(); 33 frame = purple_plugin_pref_frame_new();
23 34
24 ppref = purple_plugin_pref_new_with_label(_("Timestamp Format Options")); 35 ppref = purple_plugin_pref_new_with_label(_("Timestamp Format Options"));
25 purple_plugin_pref_frame_add(frame, ppref); 36 purple_plugin_pref_frame_add(frame, ppref);
26 37
27 tmp = g_strdup_printf(_("_Force 24-hour time format")); 38 tmp = g_strdup_printf(_("_Force timestamp format:"));
28 ppref = purple_plugin_pref_new_with_name_and_label( 39 ppref = purple_plugin_pref_new_with_name_and_label(
29 "/plugins/gtk/timestamp_format/force_24hr", 40 "/plugins/gtk/timestamp_format/force",
30 tmp); 41 tmp);
42 purple_plugin_pref_set_type(ppref, PURPLE_PLUGIN_PREF_CHOICE);
43 purple_plugin_pref_add_choice(ppref, _("Use system default"), "default");
44 purple_plugin_pref_add_choice(ppref, _("12 hour time format"), "force12");
45 purple_plugin_pref_add_choice(ppref, _("24 hour time format"), "force24");
31 purple_plugin_pref_frame_add(frame, ppref); 46 purple_plugin_pref_frame_add(frame, ppref);
32 g_free(tmp); 47 g_free(tmp);
33 48
34 ppref = purple_plugin_pref_new_with_label(_("Show dates in...")); 49 ppref = purple_plugin_pref_new_with_label(_("Show dates in..."));
35 purple_plugin_pref_frame_add(frame, ppref); 50 purple_plugin_pref_frame_add(frame, ppref);
56 } 71 }
57 72
58 static char *timestamp_cb_common(PurpleConversation *conv, 73 static char *timestamp_cb_common(PurpleConversation *conv,
59 time_t t, 74 time_t t,
60 gboolean show_date, 75 gboolean show_date,
61 gboolean force, 76 const char *force,
62 const char *dates, 77 const char *dates,
63 gboolean parens) 78 gboolean parens)
64 { 79 {
80 struct tm *tm;
81
65 g_return_val_if_fail(dates != NULL, NULL); 82 g_return_val_if_fail(dates != NULL, NULL);
83
84 tm = localtime(&t);
66 85
67 if (show_date || 86 if (show_date ||
68 !strcmp(dates, "always") || 87 !strcmp(dates, "always") ||
69 (conv != NULL && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT && !strcmp(dates, "chats"))) 88 (conv != NULL && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT && !strcmp(dates, "chats")))
70 { 89 {
71 struct tm *tm = localtime(&t); 90 if (g_str_equal(force, "force24"))
72 if (force)
73 return g_strdup_printf("%s%s%s", parens ? "(" : "", purple_utf8_strftime("%Y-%m-%d %H:%M:%S", tm), parens ? ")" : ""); 91 return g_strdup_printf("%s%s%s", parens ? "(" : "", purple_utf8_strftime("%Y-%m-%d %H:%M:%S", tm), parens ? ")" : "");
74 else 92 else if (g_str_equal(force, "force12")) {
93 char *date = g_strdup_printf("%s", purple_utf8_strftime("%Y-%m-%d ", tm));
94 char *remtime = g_strdup_printf("%s", purple_utf8_strftime(":%M:%S %p", tm));
95 const char *hour = format_12hour_hour(tm);
96 char *output;
97
98 output = g_strdup_printf("%s%s%s%s%s",
99 parens ? "(" : "", date,
100 hour, remtime, parens ? ")" : "");
101
102 g_free(date);
103 g_free(remtime);
104
105 return output;
106 } else
75 return g_strdup_printf("%s%s%s", parens ? "(" : "", purple_date_format_long(tm), parens ? ")" : ""); 107 return g_strdup_printf("%s%s%s", parens ? "(" : "", purple_date_format_long(tm), parens ? ")" : "");
76 } 108 }
77 109
78 if (force) 110 if (g_str_equal(force, "force24"))
79 {
80 struct tm *tm = localtime(&t);
81 return g_strdup_printf("%s%s%s", parens ? "(" : "", purple_utf8_strftime("%H:%M:%S", tm), parens ? ")" : ""); 111 return g_strdup_printf("%s%s%s", parens ? "(" : "", purple_utf8_strftime("%H:%M:%S", tm), parens ? ")" : "");
112 else if (g_str_equal(force, "force12")) {
113 const char *hour = format_12hour_hour(tm);
114 char *remtime = g_strdup_printf("%s", purple_utf8_strftime(":%M:%S %p", tm));
115 char *output = g_strdup_printf("%s%s%s%s", parens ? "(" : "", hour, remtime, parens ? ")" : "");
116
117 g_free(remtime);
118
119 return output;
82 } 120 }
83 121
84 return NULL; 122 return NULL;
85 } 123 }
86 124
87 static char *conversation_timestamp_cb(PurpleConversation *conv, 125 static char *conversation_timestamp_cb(PurpleConversation *conv,
88 time_t t, gboolean show_date, gpointer data) 126 time_t t, gboolean show_date, gpointer data)
89 { 127 {
90 gboolean force = purple_prefs_get_bool( 128 const char *force = purple_prefs_get_string(
91 "/plugins/gtk/timestamp_format/force_24hr"); 129 "/plugins/gtk/timestamp_format/force");
92 const char *dates = purple_prefs_get_string( 130 const char *dates = purple_prefs_get_string(
93 "/plugins/gtk/timestamp_format/use_dates/conversation"); 131 "/plugins/gtk/timestamp_format/use_dates/conversation");
94 132
95 g_return_val_if_fail(conv != NULL, NULL); 133 g_return_val_if_fail(conv != NULL, NULL);
96 134
97 return timestamp_cb_common(conv, t, show_date, force, dates, TRUE); 135 return timestamp_cb_common(conv, t, show_date, force, dates, TRUE);
98 } 136 }
99 137
100 static char *log_timestamp_cb(PurpleLog *log, time_t t, gboolean show_date, gpointer data) 138 static char *log_timestamp_cb(PurpleLog *log, time_t t, gboolean show_date, gpointer data)
101 { 139 {
102 gboolean force = purple_prefs_get_bool( 140 const char *force = purple_prefs_get_string(
103 "/plugins/gtk/timestamp_format/force_24hr"); 141 "/plugins/gtk/timestamp_format/force");
104 const char *dates = purple_prefs_get_string( 142 const char *dates = purple_prefs_get_string(
105 "/plugins/gtk/timestamp_format/use_dates/log"); 143 "/plugins/gtk/timestamp_format/use_dates/log");
106 144
107 g_return_val_if_fail(log != NULL, NULL); 145 g_return_val_if_fail(log != NULL, NULL);
108 146
262 init_plugin(PurplePlugin *plugin) 300 init_plugin(PurplePlugin *plugin)
263 { 301 {
264 purple_prefs_add_none("/plugins/gtk"); 302 purple_prefs_add_none("/plugins/gtk");
265 purple_prefs_add_none("/plugins/gtk/timestamp_format"); 303 purple_prefs_add_none("/plugins/gtk/timestamp_format");
266 304
267 purple_prefs_add_bool("/plugins/gtk/timestamp_format/force_24hr", TRUE); 305 if (!purple_prefs_exists("/plugins/gtk/timestamp_format/force") &&
306 purple_prefs_exists("/plugins/gtk/timestamp_format/force_24hr"))
307 {
308 if (purple_prefs_get_bool(
309 "/plugins/gtk/timestamp_format/force_24hr"))
310 purple_prefs_add_string("/plugins/gtk/timestamp_format/force", "force24");
311 else
312 purple_prefs_add_string("/plugins/gtk/timestamp_format/force", "force12");
313 }
314 else
315 purple_prefs_add_string("/plugins/gtk/timestamp_format/force", "default");
268 316
269 purple_prefs_add_none("/plugins/gtk/timestamp_format/use_dates"); 317 purple_prefs_add_none("/plugins/gtk/timestamp_format/use_dates");
270 purple_prefs_add_string("/plugins/gtk/timestamp_format/use_dates/conversation", "automatic"); 318 purple_prefs_add_string("/plugins/gtk/timestamp_format/use_dates/conversation", "automatic");
271 purple_prefs_add_string("/plugins/gtk/timestamp_format/use_dates/log", "automatic"); 319 purple_prefs_add_string("/plugins/gtk/timestamp_format/use_dates/log", "automatic");
272 } 320 }