Пример #1
0
void history_push(notification *n)
{
    if (settings.history_length > 0 && history->length >= settings.history_length) {
        notification *to_free = g_queue_pop_head(history);
        notification_free(to_free);
    }

    g_queue_push_tail(history, n);
}
int _bt_insert_notification(notification_h noti,
				char *title,
				char *content,
				char *icon_path)
{
	DBG("+\n");
	if (!noti)
		return -1;

	DBG("Insert noti : %d \n", noti);
	notification_error_e ret = NOTIFICATION_ERROR_NONE;

	ret = notification_set_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, icon_path);
	if (ret != NOTIFICATION_ERROR_NONE) {
		ERR("Fail to notification_set_image\n");
	}

	if (title) {
		ret = notification_set_text(noti, NOTIFICATION_TEXT_TYPE_TITLE,
								title, NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
		if (ret != NOTIFICATION_ERROR_NONE) {
			ERR("Fail to notification_set_text\n");
		}
	}

	if (content) {
		ret = notification_set_text(noti, NOTIFICATION_TEXT_TYPE_CONTENT,
								content, NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
		if (ret != NOTIFICATION_ERROR_NONE) {
			ERR("Fail to notification_set_text\n");
		}
	}

	ret = notification_insert(noti, NULL);
	if (ret != NOTIFICATION_ERROR_NONE) {
		ERR("Fail to notification_insert\n");
	}

	ret = notification_free(noti);
	if (ret != NOTIFICATION_ERROR_NONE) {
		ERR("Fail to notification_free\n");
	}

	DBG("-\n");
	return ret;
}
Пример #3
0
        /*
         * Close the notification that has id.
         *
         * reasons:
         * -1 -> notification is a replacement, no NotificationClosed signal emitted
         *  1 -> the notification expired
         *  2 -> the notification was dismissed by the user_data
         *  3 -> The notification was closed by a call to CloseNotification
         */
int notification_close_by_id(int id, int reason)
{
        int free = 0;
        notification *target = NULL;

        for (GList * iter = g_queue_peek_head_link(displayed); iter;
             iter = iter->next) {
                notification *n = iter->data;
                if (n->id == id) {
                        g_queue_remove(displayed, n);
                        if(reason != 4) {
                            history_push(n);
                        }
                        else free =1 ;
                        target = n;
                        break;
                }
        }

        for (GList * iter = g_queue_peek_head_link(queue); iter;
             iter = iter->next) {
                notification *n = iter->data;
                if (n->id == id) {
                        g_queue_remove(queue, n);
                        if(reason != 4) {
                            history_push(n);
                        }
                        else free =1 ;
                        target = n;
                        break;
                }
        }

        if (reason > 0 && reason < 5 && target != NULL) {
                notificationClosed(target, reason);
        }
        if(free) {
            notification_free(target);
        }

        wake_up();
        return reason;
}
Пример #4
0
/*
 * Initialize the given notification and add it to
 * the queue. Replace notification with id if id > 0.
 */
int notification_init(notification * n, int id)
{

    if (n == NULL)
        return -1;

    if (strcmp("DUNST_COMMAND_PAUSE", n->summary) == 0) {
        pause_display = true;
        return 0;
    }

    if (strcmp("DUNST_COMMAND_RESUME", n->summary) == 0) {
        pause_display = false;
        return 0;
    }

    n->script = NULL;
    n->text_to_render = NULL;

    n->format = settings.format;

    rule_apply_all(n);

    n->urls = notification_extract_markup_urls(&(n->body));

    n->msg = string_replace("%a", n->appname, g_strdup(n->format));
    n->msg = string_replace("%s", n->summary, n->msg);
    if (n->icon) {
        n->msg = string_replace("%I", basename(n->icon), n->msg);
        n->msg = string_replace("%i", n->icon, n->msg);
    }
    n->msg = string_replace("%b", n->body, n->msg);
    if (n->progress) {
        char pg[10];
        sprintf(pg, "[%3d%%]", n->progress - 1);
        n->msg = string_replace("%p", pg, n->msg);
    } else {
        n->msg = string_replace("%p", "", n->msg);
    }

    if (!settings.allow_markup)
        n->msg = notification_fix_markup(n->msg);
    else if (!settings.ignore_newline) {
        n->msg = string_replace("<br>", "\n", n->msg);
        n->msg = string_replace("<br />", "\n", n->msg);
    }

    while (strstr(n->msg, "\\n") != NULL)
        n->msg = string_replace("\\n", "\n", n->msg);

    if (settings.ignore_newline)
        while (strstr(n->msg, "\n") != NULL)
            n->msg = string_replace("\n", " ", n->msg);

    n->msg = g_strstrip(n->msg);

    n->dup_count = 0;

    /* check if n is a duplicate */
    if (settings.stack_duplicates) {
        for (GList * iter = g_queue_peek_head_link(queue); iter;
                iter = iter->next) {
            notification *orig = iter->data;
            if (strcmp(orig->appname, n->appname) == 0
                    && strcmp(orig->summary, n->summary) == 0
                    && strcmp(orig->body, n->body) == 0) {
                /* If the progress differs this was probably intended to replace the notification
                 * but notify-send was used. So don't increment dup_count in this case
                 */
                if (orig->progress == n->progress) {
                    orig->dup_count++;
                } else {
                    orig->progress = n->progress;
                }
                /* notifications that differ only in progress hints should be expected equal,
                 * but we want the latest message, with the latest hint value
                 */
                free(orig->msg);
                orig->msg = strdup(n->msg);
                notification_free(n);
                wake_up();
                return orig->id;
            }
        }

        for (GList * iter = g_queue_peek_head_link(displayed); iter;
                iter = iter->next) {
            notification *orig = iter->data;
            if (strcmp(orig->appname, n->appname) == 0
                    && strcmp(orig->summary, n->summary) == 0
                    && strcmp(orig->body, n->body) == 0) {
                /* notifications that differ only in progress hints should be expected equal,
                 * but we want the latest message, with the latest hint value
                 */
                free(orig->msg);
                orig->msg = strdup(n->msg);
                /* If the progress differs this was probably intended to replace the notification
                 * but notify-send was used. So don't increment dup_count in this case
                 */
                if (orig->progress == n->progress) {
                    orig->dup_count++;
                } else {
                    orig->progress = n->progress;
                }
                orig->start = time(NULL);
                notification_free(n);
                wake_up();
                return orig->id;
            }
        }
    }

    /* urgency > CRIT -> array out of range */
    n->urgency = n->urgency > CRIT ? CRIT : n->urgency;

    if (!n->color_strings[ColFG]) {
        n->color_strings[ColFG] = xctx.color_strings[ColFG][n->urgency];
    }

    if (!n->color_strings[ColBG]) {
        n->color_strings[ColBG] = xctx.color_strings[ColBG][n->urgency];
    }

    n->timeout =
        n->timeout == -1 ? settings.timeouts[n->urgency] : n->timeout;
    n->start = 0;

    if (n->icon == NULL) {
        n->icon = settings.icons[n->urgency];
    }
    else if (strlen(n->icon) <= 0) {
        free(n->icon);
        n->icon = settings.icons[n->urgency];
    }

    if (n->category == NULL) {
        n->category = "";
    }

    n->timestamp = time(NULL);

    n->redisplayed = false;

    n->first_render = true;

    if (id == 0) {
        n->id = ++next_notification_id;
    } else {
        notification_close_by_id(id, -1);
        n->id = id;
    }

    if (strlen(n->msg) == 0) {
        notification_close(n, 2);
        printf("skipping notification: %s %s\n", n->body, n->summary);
    } else {
        g_queue_insert_sorted(queue, n, notification_cmp_data, NULL);
    }

    char *tmp = g_strconcat(n->summary, " ", n->body, NULL);

    char *tmp_urls = extract_urls(tmp);
    if (tmp_urls != NULL) {
        if (n->urls != NULL) {
            n->urls = string_append(n->urls, tmp_urls, "\n");
            free(tmp_urls);
        } else {
            n->urls = tmp_urls;
        }
    }

    if (n->actions) {
        n->actions->dmenu_str = NULL;
        for (int i = 0; i < n->actions->count; i += 2) {
            char *human_readable = n->actions->actions[i + 1];
            string_replace_char('[', '(', human_readable); // kill square brackets
            string_replace_char(']', ')', human_readable);

            n->actions->dmenu_str =
                string_append(n->actions->dmenu_str,
                              g_strdup_printf("#%s [%s]", human_readable,
                                              n->appname),
                              "\n");
        }
    }

    free(tmp);

    if (settings.print_notifications)
        notification_print(n);

    return n->id;
}
Пример #5
0
static void teardown_notification(gpointer data)
{
        notification *n = data;
        notification_free(n);
}