[Xfce4-commits] <orage:master> 4.9.5.0 Enhancement 9011 improve tooltip behaviour

Juha noreply at xfce.org
Tue Feb 12 14:02:01 CET 2013


Updating branch refs/heads/master
         to bd4d460ed7ecf50362696ac9b723ad880a1d52cd (commit)
       from 88ed9186ea9a35a241ebf068ac953df5e5f8219b (commit)

commit bd4d460ed7ecf50362696ac9b723ad880a1d52cd
Author: Juha <juha at xfce.org>
Date:   Tue Feb 12 14:58:52 2013 +0200

    4.9.5.0 Enhancement 9011 improve tooltip behaviour
    
    Limited note text tooltip size to fixed 50 x 10 chars (= 10 lines max
    and each line max length is 50).
    Also changed orage_message timestamp location. And added formatted
    tooltip to day view.

 configure.in.in |    2 +-
 src/day-view.c  |   30 +++++++++++------
 src/functions.c |   94 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 src/functions.h |    5 ++-
 src/mainbox.c   |    3 +-
 src/reminder.c  |    7 +++-
 6 files changed, 116 insertions(+), 25 deletions(-)

diff --git a/configure.in.in b/configure.in.in
index d314ba0..95683c4 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -9,7 +9,7 @@ dnl Written for Xfce by Juha Kautto <juha at xfce.org>
 dnl
 
 dnl Version information
-m4_define([orage_version], [4.9.4.1-git])
+m4_define([orage_version], [4.9.5.0-git])
 
 m4_define([gtk_minimum_version], [2.14.0])
 m4_define([xfce_minimum_version], [4.8.0])
diff --git a/src/day-view.c b/src/day-view.c
index 46ae886..5cd2f03 100644
--- a/src/day-view.c
+++ b/src/day-view.c
@@ -511,10 +511,12 @@ static void add_row(day_win *dw, xfical_appt *appt)
     gint row, start_row, end_row, days;
     gint col, start_col, end_col, first_col, last_col;
     gint height, start_height, end_height;
-    gchar *tip, *start_date, *end_date, *tmp_title, *tmp_note;
+    gchar *tip, *start_date, *end_date, *tmp_title, *tip_title;
+    gchar *tmp_note, *tip_note;
     GtkWidget *ev, *lab, *hb;
     struct tm tm_start, tm_end, tm_first;
     GdkColor *color;
+    gchar *format_bold = "<b> %s </b>";
 
     /* First clarify timings */
     tm_start = orage_icaltime_to_tm_time(appt->starttimecur, FALSE);
@@ -545,7 +547,12 @@ static void add_row(day_win *dw, xfical_appt *appt)
     /* then add the appointment */
     tmp_title = orage_process_text_commands(
             appt->title ? appt->title : _("Unknown"));
-    tmp_note = orage_process_text_commands(appt->note);
+    tip_title = g_markup_printf_escaped(format_bold, tmp_title);
+    tmp_note = orage_process_text_commands(
+            appt->note ? appt->note : "");
+    tmp_note = orage_limit_text(tmp_note, 50, 10);
+    tip_note = g_markup_escape_text(tmp_note, strlen(tmp_note));
+    g_free(tmp_note);
     ev = gtk_event_box_new();
     lab = gtk_label_new(tmp_title);
     gtk_container_add(GTK_CONTAINER(ev), lab);
@@ -568,13 +575,13 @@ static void add_row(day_win *dw, xfical_appt *appt)
         start_date = g_strdup(orage_tm_date_to_i18_date(&tm_start));
         if (days == 0)
             tip = g_strdup_printf("%s\n%s\n%s"
-                    , tmp_title, start_date, tmp_note);
+                    , tip_title, start_date, tip_note);
         else {
             tm_end.tm_year -= 1900;
             tm_end.tm_mon -= 1;
             end_date = g_strdup(orage_tm_date_to_i18_date(&tm_end));
             tip = g_strdup_printf("%s\n%s - %s\n%s"
-                    , tmp_title, start_date, end_date, tmp_note);
+                    , tip_title, start_date, end_date, tip_note);
             g_free(end_date);
         }
         g_free(start_date);
@@ -596,8 +603,8 @@ static void add_row(day_win *dw, xfical_appt *appt)
         }
         if (days == 0)
             tip = g_strdup_printf("%s\n%02d:%02d-%02d:%02d\n%s"
-                    , tmp_title, tm_start.tm_hour, tm_start.tm_min
-                    , tm_end.tm_hour, tm_end.tm_min, tmp_note);
+                    , tip_title, tm_start.tm_hour, tm_start.tm_min
+                    , tm_end.tm_hour, tm_end.tm_min, tip_note);
         else {
     /* we took the date in unnormalized format, so we need to do that now */
             tm_start.tm_year -= 1900;
@@ -607,14 +614,14 @@ static void add_row(day_win *dw, xfical_appt *appt)
             start_date = g_strdup(orage_tm_date_to_i18_date(&tm_start));
             end_date = g_strdup(orage_tm_date_to_i18_date(&tm_end));
             tip = g_strdup_printf("%s\n%s %02d:%02d - %s %02d:%02d\n%s"
-                    , tmp_title
+                    , tip_title
                     , start_date, tm_start.tm_hour, tm_start.tm_min
-                    , end_date, tm_end.tm_hour, tm_end.tm_min, tmp_note);
+                    , end_date, tm_end.tm_hour, tm_end.tm_min, tip_note);
             g_free(start_date);
             g_free(end_date);
         }
     }
-    gtk_widget_set_tooltip_text(ev, tip);
+    gtk_widget_set_tooltip_markup(ev, tip);
     /*
     gtk_box_pack_start(GTK_BOX(hb2), ev, FALSE, FALSE, 0);
     gtk_box_pack_start(GTK_BOX(hb), hb2, TRUE, TRUE, 0);
@@ -623,9 +630,10 @@ static void add_row(day_win *dw, xfical_appt *appt)
     g_object_set_data_full(G_OBJECT(ev), "UID", g_strdup(appt->uid), g_free);
     g_signal_connect((gpointer)ev, "button-press-event"
             , G_CALLBACK(on_button_press_event_cb), dw);
-    g_free(tip);
     g_free(tmp_title);
-    g_free(tmp_note);
+    g_free(tip);
+    g_free(tip_title);
+    g_free(tip_note);
 
     /* and finally draw the line to show how long the appointment is,
      * but only if it is Busy type event (=availability != 0) 
diff --git a/src/functions.c b/src/functions.c
index b70e7e3..e32ea2b 100644
--- a/src/functions.c
+++ b/src/functions.c
@@ -1,6 +1,6 @@
 /*      Orage - Calendar and alarm handler
  *
- * Copyright (c) 2005-2011 Juha Kautto  (juha at xfce.org)
+ * Copyright (c) 2005-2013 Juha Kautto  (juha at xfce.org)
  * Copyright (c) 2003-2005 Mickael Graf (korbinus at xfce.org)
  *
  * This program is free software; you can redistribute it and/or modify
@@ -89,7 +89,7 @@ void program_log (const char *format, ...)
 void orage_message(gint level, const char *format, ...)
 {
     va_list args;
-    char *formatted;
+    char *formatted, time_stamp[10];
     struct tm *t = orage_localtime();
 
     if (level < g_log_level)
@@ -98,17 +98,17 @@ void orage_message(gint level, const char *format, ...)
     formatted = g_strdup_vprintf(format, args);
     va_end(args);
 
-    g_print("%02d:%02d:%02d ", t->tm_hour, t->tm_min, t->tm_sec);
+    g_sprintf(time_stamp, "%02d:%02d:%02d ", t->tm_hour, t->tm_min, t->tm_sec);
     if (level < 0)
-        g_debug("%s", formatted);
+        g_debug("%s%s", time_stamp, formatted);
     else if (level < 100) 
-        g_message("Orage **: %s", formatted);
+        g_message("Orage **: %s %s", time_stamp, formatted);
     else if (level < 200) 
-        g_warning("%s", formatted);
+        g_warning("%s%s", time_stamp, formatted);
     else if (level < 300) 
-        g_critical("%s", formatted);
+        g_critical("%s%s", time_stamp, formatted);
     else
-        g_error("Orage **: %s", formatted);
+        g_error("Orage **: %s%s", time_stamp, formatted);
     g_free(formatted);
 }
 
@@ -334,7 +334,7 @@ char *orage_replace_text(char *text, char *old, char *new)
 {
 #undef P_N
 #define P_N "orage_replace_text: "
-    /* these point to the original string and travel it until no more commands 
+    /* these point to the original string and travel it until no more olds 
      * are found:
      * cur points to the current head (after each old if any found)
      * cmd points to the start of next old in text */
@@ -370,6 +370,82 @@ char *orage_replace_text(char *text, char *old, char *new)
     return(beq);
 }
 
+/* This is helper function for orage_limit_text. It takes char pointer
+   to string start and length and adds that "line" to the beginning of 
+   old_result and returns the new_result.
+*/
+static char* add_line(char *old_result, char *start, int line_len
+        , int max_line_len)
+{
+    char *tmp;
+    char *line;          /* new line to add */
+    char *new_result;
+
+    if (line_len > max_line_len) {
+        tmp = g_strndup(start, max_line_len-3);
+        if (*(start+line_len-1) == '\n') { /* need to add line change */
+            line = g_strjoin("", tmp, "...\n", NULL);
+        }
+        else {
+            line = g_strjoin("", tmp, "...", NULL);
+        }
+        g_free(tmp);
+    }
+    else {
+        line = g_strndup(start, line_len);
+    }
+    /* note that old_result can be NULL */
+    new_result = g_strjoin("", line, old_result, NULL);
+    g_free(line);
+    g_free(old_result);
+    return(new_result);
+}
+
+/* cuts text to fit in a box defined with max_line_len and max_lines.
+   This is usefull for example in tooltips to avoid too broad and too may lines
+   to be visible.
+   You can always use this like 
+   str=orage_limit_text(str, max_line_len, max_lines);
+   but it may point to new place.
+*/
+char *orage_limit_text(char *text, int max_line_len, int max_lines)
+{
+#undef P_N
+#define P_N "orage_limit_text: "
+    /* these point to the original string and travel it until no more cuts 
+     * are needed:
+     * cur points to the current end of text character.
+     * eol is pointing to the end of current line */
+    char *cur, *eol;
+    char *result=NULL;   /* end result is collected to this */
+    int text_len=strlen(text);
+    int line_cnt=0;
+
+    if (text_len < 2) /* nothing to do */
+        return(text);
+    /* we start from the end and collect upto max_lines to a new buffer, but
+     * cut them to max_line_len before accepting */
+    for (cur = text+text_len-2, eol = text+text_len-1;
+         (cur > text) && (line_cnt < max_lines); cur--) {
+        if (*cur == '\n') {
+            /* line found, collect the line */
+            result = add_line(result, cur+1, eol-cur, max_line_len);
+            line_cnt++;
+            eol = cur;
+        }
+    }
+    /* Need to process first line also as it does not start with line end */
+    if ((cur == text) && (line_cnt < max_lines)) {
+        result = add_line(result, cur, eol-cur+1, max_line_len);
+    }
+    if (result) {
+        g_free(text);
+        return(result);
+    }
+    else 
+        return(text);
+}
+
 /* this will change <&Xnnn> type commands to numbers or text as defined.
  * Currently the only command is 
  * <&Ynnnn> which calculates years between current year and nnnn */
diff --git a/src/functions.h b/src/functions.h
index fe59350..e2ac50d 100644
--- a/src/functions.h
+++ b/src/functions.h
@@ -1,6 +1,6 @@
 /*      Orage - Calendar and alarm handler
  *
- * Copyright (c) 2006-2011 Juha Kautto  (juha at xfce.org)
+ * Copyright (c) 2006-2013 Juha Kautto  (juha at xfce.org)
  * Copyright (c) 2005-2006 Mickael Graf (korbinus at xfce.org)
  *
  * This program is free software; you can redistribute it and/or modify
@@ -84,8 +84,11 @@ GtkWidget *orage_image_menu_item_new_from_stock(const gchar *stock_id
 GtkWidget *orage_separator_menu_item_new(GtkWidget *menu);
 GtkWidget *orage_menu_item_new_with_mnemonic(const gchar *label
         , GtkWidget *menu);
+
 char *orage_replace_text(char *text, char *old, char *new);
+char *orage_limit_text(char *text, int max_line_len, int max_lines);
 char *orage_process_text_commands(char *text);
+
 GtkWidget *orage_period_hbox_new(gboolean head_space, gboolean tail_space
         , GtkWidget *spin_dd, GtkWidget *dd_label
         , GtkWidget *spin_hh, GtkWidget *hh_label
diff --git a/src/mainbox.c b/src/mainbox.c
index 85ca122..ca82d5b 100644
--- a/src/mainbox.c
+++ b/src/mainbox.c
@@ -381,7 +381,7 @@ static void add_info_row(xfical_appt *appt, GtkBox *parentBox, gboolean todo)
     CalWin *cal = (CalWin *)g_par.xfcal;
     gchar *tip, *tmp, *tmp_title, *tmp_note;
     gchar *tip_title, *tip_location, *tip_note;
-    gchar *format_bold = "<span weight=\"bold\"> %s </span>";
+    gchar *format_bold = "<b> %s </b>";
     struct tm *t;
     char  *l_time, *s_time, *s_timeonly, *e_time, *c_time, *na, *today;
     gint  len;
@@ -458,6 +458,7 @@ static void add_info_row(xfical_appt *appt, GtkBox *parentBox, gboolean todo)
     }
     if (appt->note) {
         tmp_note = orage_process_text_commands(appt->note);
+        tmp_note = orage_limit_text(tmp_note, 50, 10);
         tmp = g_markup_escape_text(tmp_note, strlen(tmp_note));
         tip_note = g_strdup_printf(_("\n Note:\n%s"), tmp);
         g_free(tmp);
diff --git a/src/reminder.c b/src/reminder.c
index eeb6934..980cb5b 100644
--- a/src/reminder.c
+++ b/src/reminder.c
@@ -1078,6 +1078,7 @@ static gboolean orage_tooltip_update(gpointer user_data)
     gint year, month, day, hour, minute, second;
     gint dd, hh, min;
     GDate *g_now, *g_alarm;
+    gchar *tmp;
 
 #ifdef ORAGE_DEBUG
     orage_message(-100, P_N);
@@ -1132,8 +1133,10 @@ static gboolean orage_tooltip_update(gpointer user_data)
             if (cur_alarm->temporary) { /* let's add a small mark */
                 g_string_append_c(tooltip_highlight_helper, '[');
             }
-            g_string_append_printf(tooltip_highlight_helper, 
-                    "%s", cur_alarm->title);
+            tmp = g_markup_escape_text(cur_alarm->title
+                    , strlen(cur_alarm->title));
+            g_string_append_printf(tooltip_highlight_helper, "%s", tmp);
+            g_free(tmp);
             if (cur_alarm->temporary) { /* let's add a small mark */
                 g_string_append_c(tooltip_highlight_helper, ']');
             }


More information about the Xfce4-commits mailing list