dockapps/wmframepic/src/main.c
2017-08-20 16:12:14 +01:00

209 lines
5.3 KiB
C

#include "main.h"
#include "age_calc.h"
#include "arg_parser.h"
#include <signal.h>
static int offset_w, offset_h;
static char name[200];
static char *file;
static int day, month, year;
static Pixmap *background_pixmap;
void free_resources() {
XFreeGC(display, gc_core);
XFreeGC(display, gc_border);
}
void sig_int() {
free_resources();
printf("\nThank you for using wmframepic\n");
exit(1);
}
void draw_screen_with_mask() {
XNextEvent(display, &event);
while(event.type != Expose)
;
XCopyArea(display, *background_pixmap, iconwin, gc_border, 0, 0, 64, 64, offset_w, offset_h);
XCopyArea(display, pic_pixmap, iconwin, gc_core, 0, 0, 64, 64, offset_w, offset_h);
XFlush(display);
}
void mainloop() {
XButtonPressedEvent *bevent;
for (;;) {
XNextEvent(display, &event);
switch (event.type) {
case Expose:
XCopyArea(display, *background_pixmap, iconwin, gc_border, 0, 0, 64, 64, offset_w, offset_h);
XCopyArea(display, pic_pixmap, iconwin, gc_core, 0, 0, 64, 64, offset_w, offset_h);
break;
case ButtonPress:
bevent = (XButtonPressedEvent *) &event;
switch (bevent->button & 0xff) {
case Button1:
case Button2:
case Button3:
if(show_pic) {
XCopyArea(display, pic_pixmap, iconwin, gc_core, 0, 0, 64, 64, offset_w, offset_h);
show_pic = False;
} else {
restore_background();
draw_text(name, 3, 8, False);
char **phrases = get_phrases(day, month, year);
int i;
for(i = 0; i < NUMBER_OF_ROWS; i++) {
draw_text(phrases[i], 3, 23 + 10 * i, False);
}
clear_phrases(phrases);
flush_background();
show_pic = True;
}
break;
default:
break;
}
break;
default:
break;
}
}
}
int main(int argc, char **argv) {
int ww, wh, w, h;
w = SIZE;
h = SIZE;
Bool dockapp_iswindowed = False;
int error;
XWMHints *wmHints;
XClassHint *classHint;
if(signal(SIGINT, sig_int) == SIG_ERR)
fprintf(stderr, "signal error\n");
error = get_values_from_command_line(argc, argv, name, &file, &day, &month, &year);
if(COMMAND_LINE_FAIL == error || COMMAND_LINE_HELP == error) {
return 1;
}
//_Xdebug = 1;
if( ( display = XOpenDisplay(NULL) ) == NULL ){
fprintf(stderr, "Error: XOpenDisplay\n");
exit(1);
}
root = RootWindow(display, screen = DefaultScreen(display));
XGCValues values;
values.foreground = BlackPixel(display, screen);
values.background = WhitePixel(display, screen);
Pixmap pixmask_border = XCreateBitmapFromData(display, root, frame_mask_bits,
frame_mask_width,
frame_mask_height);
gc_border = XCreateGC(display, root, GCForeground | GCBackground, &values);
XSetClipMask(display, gc_border, pixmask_border);
Pixmap pixmask_core = XCreateBitmapFromData(display, root, core_mask_bits,
core_mask_width,
core_mask_height);
gc_core = XCreateGC(display, root, GCForeground | GCBackground, &values);
XSetClipMask(display, gc_core, pixmask_core);
XFreePixmap(display, pixmask_border);
XFreePixmap(display, pixmask_core);
if (dockapp_iswindowed) {
offset_w = (WINDOWED_SIZE_W - w) / 2;
offset_h = (WINDOWED_SIZE_H - h) / 2;
ww = WINDOWED_SIZE_W;
wh = WINDOWED_SIZE_H;
} else {
offset_w = offset_h = 0;
ww = w;
wh = h;
}
sizehints.flags = USSize | USPosition;
if (!dockapp_iswindowed) {
sizehints.flags |= USPosition;
sizehints.x = sizehints.y = 0;
} else {
sizehints.flags |= PMinSize | PMaxSize;
sizehints.min_width = sizehints.max_width = WINDOWED_SIZE_W;
sizehints.min_height = sizehints.max_height = WINDOWED_SIZE_H;
}
sizehints.width = ww;
sizehints.height = wh;
win = XCreateSimpleWindow(display, root, 0, 0, ww, wh, depth, values.foreground,
values.background);
iconwin = XCreateSimpleWindow(display, root, 0, 0, ww, wh, depth, values.foreground,
values.background);
XSetWMNormalHints(display, win, &sizehints);
wmHints = XAllocWMHints();
if (wmHints == NULL) {
fprintf(stderr, "%s: can't allocate memory for wm hints!\n", argv[0]);
exit(1);
}
wmHints->initial_state = WithdrawnState;
wmHints->icon_window = iconwin;
wmHints->icon_x = sizehints.x;
wmHints->icon_y = sizehints.y;
wmHints->window_group = win;
wmHints->flags = StateHint|IconWindowHint|IconPositionHint|WindowGroupHint;
XSetWMHints(display, win, wmHints);
XFree(wmHints);
classHint = XAllocClassHint();
if (classHint == NULL) {
fprintf(stderr, "%s: can't allocate memory for wm hints!\n", argv[0]);
exit(1);
}
classHint->res_name = argv[0];
classHint->res_class = argv[0];
XSetClassHint(display, win, classHint);
XFree(classHint);
// Let the window manager know about the link of commands
XSetCommand(display, win, argv, argc);
//XpmCreatePixmapFromData(display, root, kid_xpm, &pic_pixmap,NULL,NULL);
char **xpm_file_data;
if(-1 == XpmReadFileToData(file, &xpm_file_data)) {
printf("could not read from file %s\nplease check file path\n", file);
return 1;
}
XpmCreatePixmapFromData(display, root, xpm_file_data, &pic_pixmap,NULL,NULL);
XSelectInput(display, win, eventmask);
XSelectInput(display,iconwin, eventmask);
XMapWindow(display, win);
init_variables(display, gc_core, iconwin, offset_w, offset_h, &background_pixmap);
draw_screen_with_mask();
show_pic = False;
mainloop();
return 0;
}