小さな通知システムである dunst にいくつかの機能を追加しようとしています。私は C で実際に何もしたことがありませんが、小さなファイルで基本的にやりたいことを行うことができました。
#include<stdio.h>
#include<string.h>
main()
{
char str1[128];
char str2[128];
sprintf(str1,"Hello");
sprintf(str2,"world!");
printf("%s %s\n",str1,str2);
}
strcat は、指定された最初の文字列を変更しますが、これは私が望むものではありません。プログラムでは、指定されたテキストでウィンドウの幅を計算し、通知メッセージ (cur_msg->msg) にテキスト (非表示) を追加したいと考えています。
コードは次のようになります。
#define MAX(a,b) ((a) > (b) ? (a) : (b))
void
drawmsg(void) {
int width, x, y, height, drawn_msg_count, i;
unsigned int len = list_len(msgqueue);
msg_queue_t *cur_msg = msgqueue;
char hidden[128];
int hidden_count = 0;
int hidden_color_idx = NORM;
dc->x = 0;
dc->y = 0;
dc->h = 0;
/* a height of 0 doesn't make sense, so we define it as 1 */
if(geometry.h == 0) {
geometry.h = 1;
}
height = MIN(geometry.h, len);
drawn_msg_count = height;
hidden_count = len - height;
hidden_count = indicate_hidden && hidden_count > 0 ? hidden_count : 0;
sprintf(hidden, "(%d more)", hidden_count);
if(hidden_count && !single_line)
height++;
if(geometry.mask & WidthValue) {
if(geometry.w == 0) {
width = 0;
for(i = 0; i < height; i++){
width = MAX(width, textw(dc, cur_msg->msg));
if(hidden_count && !single_line)
width = MAX(width, textw(dc,("%s %s",cur_msg->msg,hidden)));
cur_msg = cur_msg->next;
}
} else {
width = geometry.w;
}
} else {
width = scr.dim.w;
}
cur_msg = msgqueue;
if(geometry.mask & XNegative) {
x = (scr.dim.x + (scr.dim.w - width)) + geometry.x;
} else {
x = scr.dim.x + geometry.x;
}
if(geometry.mask & YNegative) {
y = (scr.dim.h + geometry.y) - height*font_h;
} else {
y = 0 + geometry.y;
}
resizedc(dc, width, height*font_h);
XResizeWindow(dc->dpy, win, width, height*font_h);
drawrect(dc, 0, 0, width, height*font_h, True, colors[NORM]->BG);
for(i = 0; i < drawn_msg_count; i++) {
if(cur_msg->start == 0)
cur_msg->start = now;
drawrect(dc, 0, dc->y, width, font_h, True, cur_msg->colors->BG);
if(hidden_count && single_line){
drawtext(dc, ("%s %s",cur_msg->msg,hidden), cur_msg->colors);
} else {
drawtext(dc, cur_msg->msg, cur_msg->colors);
}
dc->y += font_h;
hidden_color_idx = cur_msg->urgency;
cur_msg = cur_msg->next;
}
if(hidden_count && !single_line) {
drawrect(dc, 0, dc->y, width, font_h, True, colors[NORM]->BG);
drawtext(dc, hidden, colors[hidden_color_idx]);
dc->y += font_h;
}
XMoveWindow(dc->dpy, win, x, y);
mapdc(dc, win, width, height*font_h);
}
これは、私が推測していることからコンマ演算子として使用しています.%sを文字列に置き換えるために、printfのように使用したいと思います:/
これを適切に行うにはどうすればよいですか?それを手に入れることができれば、働きたい変化を手に入れることができると思います。
コードを短くしてください。本当に保持する必要があるものと、これについて助けが必要な場合は削除してもよいものがわからない.