Skip to content
Snippets Groups Projects
winwidget.c 33.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • static void winwidget_register(winwidget win)
    
    	D(("window %p\n", win));
    
    	window_num++;
    	if (windows)
    		windows = erealloc(windows, window_num * sizeof(winwidget));
    	else
    		windows = emalloc(window_num * sizeof(winwidget));
    	windows[window_num - 1] = win;
    
    	XSaveContext(disp, win->win, xid_context, (XPointer) win);
    
    static void winwidget_unregister(winwidget win)
    
    	int i, j;
    
    	for (i = 0; i < window_num; i++) {
    		if (windows[i] == win) {
    			for (j = i; j < window_num - 1; j++)
    				windows[j] = windows[j + 1];
    			window_num--;
    			if (window_num > 0)
    				windows = erealloc(windows, window_num * sizeof(winwidget));
    			else {
    				free(windows);
    				windows = NULL;
    			}
    		}
    	}
    	XDeleteContext(disp, win->win, xid_context);
    
    winwidget winwidget_get_from_window(Window win)
    
    	if (XFindContext(disp, win, xid_context, (XPointer *) & ret) != XCNOENT)
    
    void winwidget_rename(winwidget winwid, char *newname)
    
    	/* newname == NULL -> update current title */
    	char *p_str;
    
    	if (newname == NULL)
    		newname = estrdup(winwid->name ? winwid->name : "");
    
    
    	winwid->name = emalloc(strlen(newname) + 10);
    	strcpy(winwid->name, newname);
    
    	if (strlen(winwid->name) > 9)
    		p_str = winwid->name + strlen(winwid->name) - 9;
    	else
    		p_str = winwid->name;
    
    	if (opt.paused && strcmp(p_str, " [Paused]") != 0)
    		strcat(winwid->name, " [Paused]");
    	else if (!opt.paused && strcmp(p_str, " [Paused]") == 0)
    		*p_str = '\0';
    
    
    void winwidget_free_image(winwidget w)
    
    	if (w->im)
    		gib_imlib_free_image_and_decache(w->im);
    	w->im = NULL;
    	w->im_w = 0;
    	w->im_h = 0;
    
    void feh_debug_print_winwid(winwidget w)
    
    	printf("winwid_debug:\n" "winwid = %p\n" "win = %ld\n" "w = %d\n"
    	       "h = %d\n" "im_w = %d\n" "im_h = %d\n" "im_angle = %f\n"
    	       "type = %d\n" "had_resize = %d\n" "im = %p\n" "GC = %p\n"
    	       "pixmap = %ld\n" "name = %s\n" "file = %p\n" "mode = %d\n"
    
    	       "im_x = %d\n" "im_y = %d\n" "zoom = %f\n" "old_zoom = %f\n"
    
    	       "click_offset_x = %d\n" "click_offset_y = %d\n"
    
    	       "has_rotated = %d\n", (void *)w, w->win, w->w, w->h, w->im_w,
    	       w->im_h, w->im_angle, w->type, w->had_resize, w->im, (void *)w->gc,
    	       w->bg_pmap, w->name, (void *)w->file, w->mode, w->im_x, w->im_y,
    
    	       w->zoom, w->old_zoom, w->click_offset_x, w->click_offset_y,
    	       w->has_rotated);
    
    void winwidget_reset_image(winwidget winwid)
    
    	winwid->im_x = 0;
    	winwid->im_y = 0;
    	winwid->im_angle = 0.0;
    	winwid->has_rotated = 0;
    
    void winwidget_center_image(winwidget winwid)
    {
    	int scr_width, scr_height;
    
    	scr_width = scr->width;
    	scr_height = scr->height;
    
    #ifdef HAVE_LIBXINERAMA
    	if (opt.xinerama && xinerama_screens) {
    		scr_width = xinerama_screens[xinerama_screen].width;
    		scr_height = xinerama_screens[xinerama_screen].height;
    	}
    #endif				/* HAVE_LIBXINERAMA */
    
    	if (winwid->full_screen) {
    		winwid->im_x = (scr_width - lround(winwid->im_w * winwid->zoom)) >> 1;
    		winwid->im_y = (scr_height - lround(winwid->im_h * winwid->zoom)) >> 1;
    	} else {
    		if (opt.geom_flags & WidthValue)
    
    			winwid->im_x = ((int)opt.geom_w - lround(winwid->im_w * winwid->zoom)) >> 1;
    
    		else
    			winwid->im_x = 0;
    		if (opt.geom_flags & HeightValue)
    
    			winwid->im_y = ((int)opt.geom_h - lround(winwid->im_h * winwid->zoom)) >> 1;
    
    void winwidget_sanitise_offsets(winwidget winwid)
    
    	int far_left, far_top;
    	int min_x, max_x, max_y, min_y;
    
    	far_left = winwid->w - (winwid->im_w * winwid->zoom);
    	far_top = winwid->h - (winwid->im_h * winwid->zoom);
    
    	if ((winwid->im_w * winwid->zoom) > winwid->w) {
    		min_x = far_left;
    		max_x = 0;
    	} else {
    		min_x = 0;
    		max_x = far_left;
    	}
    	if ((winwid->im_h * winwid->zoom) > winwid->h) {
    		min_y = far_top;
    		max_y = 0;
    	} else {
    		min_y = 0;
    		max_y = far_top;
    	}
    	if (winwid->im_x > max_x)
    		winwid->im_x = max_x;
    	if (winwid->im_x < min_x)
    		winwid->im_x = min_x;
    	if (winwid->im_y > max_y)
    		winwid->im_y = max_y;
    	if (winwid->im_y < min_y)
    		winwid->im_y = min_y;
    
    
    void winwidget_size_to_image(winwidget winwid)
    
    	winwidget_resize(winwid, winwid->im_w * winwid->zoom, winwid->im_h * winwid->zoom, 1);
    
    	winwidget_render_image(winwid, 0, 0);
    
    void winwidget_set_pointer(winwidget winwid, int visible)
    {
    	Cursor no_ptr;
    	XColor black, dummy;
    	Pixmap bm_no;
    	static char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
    
    	if (visible)
    		XUndefineCursor(disp, winwid->win);
    	else {
    		bm_no = XCreateBitmapFromData(disp, winwid->win, bm_no_data, 8, 8);
    		XAllocNamedColor(disp, DefaultColormapOfScreen(DefaultScreenOfDisplay(disp)), "black", &black, &dummy);
    
    		no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0);
    		XDefineCursor(disp, winwid->win, no_ptr);
    	}
    }
    
    
    int winwidget_get_width(winwidget winwid)
    {
    	int rect[4];
    	winwidget_get_geometry(winwid, rect);
    
    int winwidget_get_height(winwidget winwid)
    {
    	int rect[4];
    	winwidget_get_geometry(winwid, rect);
    
    void winwidget_get_geometry(winwidget winwid, int *rect)
    {
    
    	XGetGeometry(disp, winwid->win, &root, &(rect[0]), &(rect[1]), (unsigned
    				int *)&(rect[2]), (unsigned int *)&(rect[3]), &bw, &bp);
    
    
    	XTranslateCoordinates(disp, winwid->win, root, 0, 0, &(rect[0]), &(rect[1]), &child);
    
    	/* update the window geometry (in case it's inaccurate) */
    	winwid->x = rect[0];
    	winwid->y = rect[1];
    	winwid->w = rect[2];
    	winwid->h = rect[3];
    
    void winwidget_show_menu(winwidget winwid)
    {
    	int x, y, b;
    	unsigned int c;
    	Window r;
    
    	XQueryPointer(disp, winwid->win, &r, &r, &x, &y, &b, &b, &c);
    
    	if (winwid->type == WIN_TYPE_SINGLE) {
    
    		if (!menu_single_win)
    			feh_menu_init_single_win();
    		feh_menu_show_at_xy(menu_single_win, winwid, x, y);
    	} else if (winwid->type == WIN_TYPE_THUMBNAIL) {
    		if (!menu_thumbnail_win)
    			feh_menu_init_thumbnail_win();
    		feh_menu_show_at_xy(menu_thumbnail_win, winwid, x, y);
    	} else if (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER) {
    		if (!menu_single_win)
    			feh_menu_init_thumbnail_viewer();
    		feh_menu_show_at_xy(menu_thumbnail_viewer, winwid, x, y);
    	} else {
    		if (!menu_main)
    			feh_menu_init_main();
    		feh_menu_show_at_xy(menu_main, winwid, x, y);
    	}