Emoji picker

FossilOrigin-Name: d4a425913d5f30b4ee9660b08d16190da751d4a28614bc36bf3464a35674d446
This commit is contained in:
me@ow.nekobit.net 2022-05-09 06:05:47 +00:00
parent 2c0c69e765
commit 09a00d6e1f
18 changed files with 285 additions and 187 deletions

40
dist/treebird20.css vendored
View file

@ -51,7 +51,7 @@ ul
}
#main-page
{
margin: 8px;
v margin: 8px;
margin-top: 0;
width: 1000px;
border-top: 0 !important;
@ -1064,7 +1064,8 @@ svg.in-reply-to-icon
}
/* Emoji */
.emoji
.status-content .emoji,
.notification-content .emoji
{
font-family: monospace;
display: inline;
@ -1075,12 +1076,14 @@ svg.in-reply-to-icon
transition: transform .2s;
}
.emoji:hover
.status-content .emoji:hover,
.notification-content .emoji:hover
{
transform: scale(1.5);
}
.emoji:active
.status-content .emoji:active,
.notification-content .emoji:active
{
transform: scale(2.7);
}
@ -1091,6 +1094,35 @@ svg.in-reply-to-icon
border: 1px solid #cacaca;
}
/* Emojo picker */
.emoji-picker
{
position: absolute;
margin-left: -15px;
width: 260px;
border: 1px solid #cacaca;
background-color: #fff;
background: linear-gradient(#fff, #f3f3f3);
border-radius: 8px;
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.2);
}
.emoji-picker .emoji
{
font-size: 18px;
text-align: center;
vertical-align: center;
padding: 8px 0;
}
.emoji-picker-emojos
{
display: grid;
grid-template-columns: repeat(8, 1fr);
padding: 0px 8px;
z-index: 999;
}
.form-group
{
padding: 5px;

View file

@ -80,7 +80,7 @@ static char* account_statuses_cb(struct session* ssn,
statuses_html = construct_error(storage.error, E_ERROR, 1, NULL);
}
else {
statuses_html = construct_statuses(api, statuses, statuses_len, NULL, NULL);
statuses_html = construct_statuses(ssn, api, statuses, statuses_len, NULL, NULL);
if (!statuses_html)
statuses_html = construct_error("No statuses", E_NOTICE, 1, NULL);
}
@ -487,7 +487,7 @@ void content_account_bookmarks(struct session* ssn, mastodont_t* api, char** dat
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -547,7 +547,7 @@ void content_account_favourites(struct session* ssn, mastodont_t* api, char** da
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}

View file

@ -71,7 +71,7 @@ void render_base_page(struct base_page* page, struct session* ssn, mastodont_t*
};
if (mastodont_get_notifications(api, &args, &storage, &notifs, &notifs_len) == 0)
sidebar_str = construct_notifications_compact(api, notifs, notifs_len, NULL);
sidebar_str = construct_notifications_compact(ssn, api, notifs, notifs_len, NULL);
mstdnt_cleanup_notifications(notifs, notifs_len);
}

View file

@ -58,11 +58,18 @@ char* emojify(char* content, struct mstdnt_emoji* emos, size_t emos_len)
return res;
}
char* construct_emoji(struct emoji_info* emoji, size_t* size)
struct construct_emoji_picker_args
{
char* status_id;
unsigned index;
};
char* construct_emoji(struct emoji_info* emoji, char* status_id, int* size)
{
char* emoji_html;
size_t s = easprintf(&emoji_html, data_emoji_html, emoji->codes);
size_t s = easprintf(&emoji_html, data_emoji_html,
status_id, emoji->codes, emoji->codes);
if (size) *size = s;
return emoji_html;
@ -70,18 +77,31 @@ char* construct_emoji(struct emoji_info* emoji, size_t* size)
static char* construct_emoji_voidwrap(void* passed, size_t index, int* res)
{
return construct_emoji((struct emoji_info*)passed + index, 0);
struct construct_emoji_picker_args* args = passed;
size_t calc_index = index + args->index;
return calc_index < 0 || calc_index > emojos_size ? NULL :
construct_emoji(emojos + calc_index, args->status_id, res);
}
char* construct_emoji_picker(enum emoji_picker_cat cat, unsigned index, size_t* size)
char* construct_emoji_picker(char* status_id, unsigned index, size_t* size)
{
struct construct_emoji_picker_args args = {
.status_id = status_id,
.index = index
};
char* emoji_picker_html;
char* emojis;
emojis = construct_func_strings(construct_emoji_voidwrap, emojos, 8, NULL);
emojis = construct_func_strings(construct_emoji_voidwrap, &args, EMOJI_FACTOR_NUM, NULL);
size_t s = easprintf(&emoji_picker_html, data_emoji_picker_html,
emojis);
emojis ? emojis : "",
status_id,
// Index movements
index > 0 ? index - EMOJI_FACTOR_NUM : 0,
0 > index - EMOJI_FACTOR_NUM ? "disabled" : "",
status_id,
index + EMOJI_FACTOR_NUM);
free(emojis);
if (size) *size = s;

View file

@ -21,7 +21,9 @@
#include <mastodont.h>
#include "emoji_codes.h"
#define EMOJI_FACTOR_NUM 32
// No use?
enum emoji_picker_cat
{
EMOJI_CAT_CUSTOM,
@ -29,7 +31,7 @@ enum emoji_picker_cat
};
char* emojify(char* content, struct mstdnt_emoji* emos, size_t emos_len);
char* construct_emoji(struct emoji_info* emoji, size_t* size);
char* construct_emoji_picker(enum emoji_picker_cat cat, unsigned index, size_t* size);
char* construct_emoji(struct emoji_info* emoji, char* status_id, int* size);
char* construct_emoji_picker(char* status_id, unsigned index, size_t* size);
#endif // EMOJI_H

View file

@ -3,140 +3,139 @@
#define EMOJOS_H
#include "emoji_info.h"
struct emoji_info emojos[] = {
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ NULL, NULL, NULL },
#define emojos_size 130
static struct emoji_info emojos[] = {
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
{ "☺️", "smile", "Smiles" },
};
#endif

View file

@ -21,9 +21,9 @@
struct emoji_info
{
char* codes;
char* name;
char* group;
const char* codes;
const char* name;
const char* group;
};
#endif /* EMOJI_INFO_H */

View file

@ -39,11 +39,13 @@
struct notification_args
{
struct session* ssn;
mastodont_t* api;
struct mstdnt_notification* notifs;
};
char* construct_notification(mastodont_t* api,
char* construct_notification(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notif,
int* size)
{
@ -53,7 +55,7 @@ char* construct_notification(mastodont_t* api,
if (notif->status)
{
// Construct status with notification_info
notif_html = construct_status(api, notif->status, &s, notif, NULL, 0);
notif_html = construct_status(ssn, api, notif->status, &s, notif, NULL, 0);
}
else {
notif_html = construct_notification_action(notif, &s);
@ -82,7 +84,8 @@ char* construct_notification_action(struct mstdnt_notification* notif, int* size
return notif_html;
}
char* construct_notification_compact(mastodont_t* api,
char* construct_notification_compact(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notif,
int* size)
{
@ -132,33 +135,37 @@ char* construct_notification_compact(mastodont_t* api,
static char* construct_notification_voidwrap(void* passed, size_t index, int* res)
{
struct notification_args* args = passed;
return construct_notification(args->api, args->notifs + index, res);
return construct_notification(args->ssn, args->api, args->notifs + index, res);
}
static char* construct_notification_compact_voidwrap(void* passed, size_t index, int* res)
{
struct notification_args* args = passed;
return construct_notification_compact(args->api, args->notifs + index, res);
return construct_notification_compact(args->ssn, args->api, args->notifs + index, res);
}
char* construct_notifications(mastodont_t* api,
char* construct_notifications(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notifs,
size_t size,
size_t* ret_size)
{
struct notification_args args = {
.ssn = ssn,
.api = api,
.notifs = notifs
};
return construct_func_strings(construct_notification_voidwrap, &args, size, ret_size);
}
char* construct_notifications_compact(mastodont_t* api,
char* construct_notifications_compact(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notifs,
size_t size,
size_t* ret_size)
{
struct notification_args args = {
.ssn = ssn,
.api = api,
.notifs = notifs
};
@ -194,7 +201,7 @@ void content_notifications(struct session* ssn, mastodont_t* api, char** data)
if (mastodont_get_notifications(api, &args, &storage, &notifs, &notifs_len) == 0)
{
notif_html = construct_notifications(api, notifs, notifs_len, NULL);
notif_html = construct_notifications(ssn, api, notifs, notifs_len, NULL);
start_id = ssn->post.start_id ? ssn->post.start_id : notifs[0].id;
navigation_box = construct_navigation_box(start_id,
notifs[0].id,

View file

@ -22,18 +22,22 @@
#include "session.h"
#include "type_string.h"
char* construct_notification(mastodont_t* api,
char* construct_notification(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notif,
int* size);
char* construct_notification_action(struct mstdnt_notification* notif, int* size);
char* construct_notification_compact(mastodont_t* api,
char* construct_notification_compact(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notif,
int* size);
char* construct_notifications(mastodont_t* api,
char* construct_notifications(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notifs,
size_t size,
size_t* ret_size);
char* construct_notifications_compact(mastodont_t* api,
char* construct_notifications_compact(struct session* ssn,
mastodont_t* api,
struct mstdnt_notification* notifs,
size_t size,
size_t* ret_size);

View file

@ -116,6 +116,7 @@ char* read_post_data(struct query_values* post)
{ "start_id", &(post->start_id), key_string },
{ "instance", &(post->instance), key_string },
{ "visibility", &(post->visibility), key_string },
{ "emojoindex", &(post->emojoindex), key_int },
{ "file", &(post->files), key_files }
};
// END Query references

View file

@ -59,6 +59,7 @@ struct query_values
char* replyid;
char* visibility;
char* instance;
int emojoindex;
// Navigation
char* min_id;

View file

@ -89,7 +89,7 @@ void content_search_statuses(struct session* ssn, mastodont_t* api, char** data)
struct construct_statuses_args statuses_args = {
.highlight_word = ssn->query.query,
};
statuses_html = construct_statuses(api, results.statuses, results.statuses_len, &statuses_args, NULL);
statuses_html = construct_statuses(ssn, api, results.statuses, results.statuses_len, &statuses_args, NULL);
if (!statuses_html)
statuses_html = construct_error("No statuses", E_ERROR, 1, NULL);
}

View file

@ -51,6 +51,7 @@ struct status_args
mastodont_t* api;
struct mstdnt_status* status;
struct construct_statuses_args* args;
struct session* ssn;
};
int try_post_status(struct session* ssn, mastodont_t* api)
@ -105,7 +106,7 @@ int try_react_status(struct session* ssn, mastodont_t* api, char* id, char* emoj
mstdnt_cleanup_status(&status);
mastodont_storage_cleanup(&storage);
return 1;
return 0;
}
void content_status_create(struct session* ssn, mastodont_t* api, char** data)
@ -366,7 +367,8 @@ char* greentextify(char* content)
return res;
}
char* construct_status(mastodont_t* api,
char* construct_status(struct session* ssn,
mastodont_t* api,
struct mstdnt_status* local_status,
int* size,
struct mstdnt_notification* local_notif,
@ -402,7 +404,7 @@ char* construct_status(mastodont_t* api,
// Emojo picker
if ((flags & STATUS_EMOJI_PICKER) == STATUS_EMOJI_PICKER)
{
emoji_picker_html = construct_emoji_picker(EMOJI_CAT_FACES, 0, NULL);
emoji_picker_html = construct_emoji_picker(status->id, ssn->post.emojoindex, NULL);
}
// If focused, show status interactions
@ -526,10 +528,11 @@ char* construct_status(mastodont_t* api,
status->id,
config_url_prefix,
status->id,
status->id,
emoji_picker_html ? emoji_picker_html : "",
config_url_prefix,
status->id,
status->id,
emoji_picker_html);
status->id);
if (size) *size = s;
// Cleanup
@ -549,10 +552,11 @@ char* construct_status(mastodont_t* api,
static char* construct_status_voidwrap(void* passed, size_t index, int* res)
{
struct status_args* args = passed;
return construct_status(args->api, args->status + index, res, NULL, args->args, 0);
return construct_status(args->ssn, args->api, args->status + index, res, NULL, args->args, 0);
}
char* construct_statuses(mastodont_t* api,
char* construct_statuses(struct session* ssn,
mastodont_t* api,
struct mstdnt_status* statuses,
size_t size,
struct construct_statuses_args* args,
@ -563,6 +567,7 @@ char* construct_statuses(mastodont_t* api,
.api = api,
.status = statuses,
.args = args,
.ssn = ssn,
};
return construct_func_strings(construct_status_voidwrap, &stat_args, size, ret_size);
}
@ -617,10 +622,10 @@ void content_status(struct session* ssn, mastodont_t* api, char** data, uint8_t
stat_html = construct_error("Status not found", E_ERROR, 1, NULL);
}
else {
before_html = construct_statuses(api, statuses_before, stat_before_len, NULL, 0);
before_html = construct_statuses(ssn, api, statuses_before, stat_before_len, NULL, 0);
// Current status
stat_html = construct_status(api, &status, NULL, NULL, NULL, flags);
stat_html = construct_status(ssn, api, &status, NULL, NULL, NULL, flags);
if ((flags & STATUS_REPLY) == STATUS_REPLY)
{
stat_reply = reply_status(data[0],
@ -629,7 +634,7 @@ void content_status(struct session* ssn, mastodont_t* api, char** data, uint8_t
}
// After...
after_html = construct_statuses(api, statuses_after, stat_after_len, NULL, 0);
after_html = construct_statuses(ssn, api, statuses_after, stat_after_len, NULL, 0);
easprintf(&output, "%s%s%s%s",
before_html ? before_html : "",

View file

@ -50,13 +50,15 @@ void content_status_react(struct session* ssn, mastodont_t* api, char** data);
char* construct_post_box(char* reply_id,
char* default_content,
int* size);
char* construct_status(mastodont_t* api,
char* construct_status(struct session* ssn,
mastodont_t* api,
struct mstdnt_status* status,
int* size,
struct mstdnt_notification* notif,
struct construct_statuses_args* args,
uint8_t flags);
char* construct_statuses(mastodont_t* api,
char* construct_statuses(struct session* ssn,
mastodont_t* api,
struct mstdnt_status* statuses,
size_t size,
struct construct_statuses_args* args,

View file

@ -62,7 +62,7 @@ void tl_home(struct session* ssn, mastodont_t* api, int local)
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -127,7 +127,7 @@ void tl_direct(struct session* ssn, mastodont_t* api)
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -197,7 +197,7 @@ void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_categ
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -260,7 +260,7 @@ void tl_list(struct session* ssn, mastodont_t* api, char* list_id)
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("No statuses", E_ERROR, 1, NULL);
}
@ -320,7 +320,7 @@ void tl_tag(struct session* ssn, mastodont_t* api, char* tag_id)
status_format = construct_error(storage.error, E_ERROR, 1, NULL);
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
status_format = construct_statuses(ssn, api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("No statuses", E_ERROR, 1, NULL);
}

View file

@ -1 +1 @@
<span class="emoji">%s</span>
<a href="/status/%s/react/%s" class="emoji">%s</a>

View file

@ -1,3 +1,28 @@
<div class="emoji-picker">
%s
<div class="emoji-picker-emojos">
%s
</div>
<table class="navigation ui-table">
<tr>
<td class="nav-prev btn">
<form action="#id-%s" method="post">
<label class="pointer">
<input type="hidden" name="emojoindex" value="%u">
<span class="nav-btn %s">Previous</span>
<input type="submit" class="hidden">
</label>
</form>
</td>
<td class="nav-next btn">
<form action="#id-%s" method="post">
<label class="pointer">
<input type="hidden" name="emojoindex" value="%u">
<span class="nav-btn">Next</span>
<input type="submit" class="hidden">
</label>
</form>
</td>
</tr>
</table>
</div>

View file

@ -86,12 +86,13 @@
</form>
</td>
<td>
<form action="%s/status/%s/react" method="post">
<form action="%s/status/%s/react#id-%s" method="post">
<label class="pointer">
<svg class="emoji-btn" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="8" y1="12" x2="16" y2="12"></line></svg>
<input class="hidden" type="submit" value="Emoji">
</label>
</form>
%s
</td>
<td>
<form action="%s/status/%s#id-%s" method="post">
@ -110,4 +111,3 @@
</td>
</tr>
</table>
%s