⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magnifier.c

📁 在Linux下实现magnification功能
💻 C
📖 第 1 页 / 共 4 页
字号:
						magnifier->priv->w->window,						&x, &y);					gdk_drawable_get_size (						magnifier->priv->w->window,						&over_w, &over_h);					gdk_window_move_resize (						magnifier->priv->overlay,						x, y, over_w, over_h);					gdk_window_reparent (						magnifier->priv->w->window,						magnifier->priv->overlay,						0, 0);#ifdef HAVE_SHAPEINPUT								XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (magnifier->priv->w->window), GDK_WINDOW_XID (magnifier->priv->overlay), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded);#endif /* HAVE_SHAPEINPUT */#else#ifdef HAVE_SHAPEINPUT					XShapeCombineRectangles (GDK_WINDOW_XDISPLAY (magnifier->priv->w->window), GDK_WINDOW_XID (magnifier->priv->w->window), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded);#endif /* HAVE_SHAPEINPUT */#endif /* HAVE_OVERLAY */					return FALSE;				}		}	} else		return FALSE;	return TRUE;#endif	return FALSE;}static gboolean magnifier_reset_struts_at_idle (gpointer data){	if (data)	{		Magnifier *magnifier = MAGNIFIER (data);		if (magnifier->priv && GTK_WIDGET_REALIZED (magnifier->priv->w) && 		    magnifier_check_set_struts (magnifier))		{			return FALSE;		}	}	return TRUE;}static gbooleanmagnifier_check_set_struts (Magnifier *magnifier){#ifdef HAVE_COMPOSITE	if (!g_getenv ("MAGNIFIER_IGNORE_COMPOSITE"))		return TRUE;#endif	if (magnifier &&	    magnifier->priv && magnifier->priv->w && GTK_WIDGET_REALIZED (magnifier->priv->w) &&	    magnifier->priv->w->window) 	{		Atom atom_strut = gdk_x11_get_xatom_by_name ("_NET_WM_STRUT");		Atom atom_strut_partial = gdk_x11_get_xatom_by_name ("_NET_WM_STRUT_PARTIAL");		guint32 struts[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};		GtkWidget *widget = magnifier->priv->w;		gint width = gdk_screen_get_width (			gdk_display_get_screen (magnifier->target_display,						magnifier->target_screen_num));		gint height = gdk_screen_get_height (			gdk_display_get_screen (magnifier->target_display,						magnifier->target_screen_num));		gint right_margin, left_margin, top_margin, bottom_margin;		gint wx, wy, ww, wh;		gtk_window_get_position (GTK_WINDOW (magnifier->priv->w), &wx, &wy);		gtk_window_get_size (GTK_WINDOW (magnifier->priv->w), &ww, &wh);		left_margin = wx;		right_margin = (width - ww) - wx;		top_margin = wy;		bottom_margin = (height - wh) - wy;		/* set the WM_STRUT properties on the appropriate side */		if (bottom_margin > top_margin && 		    bottom_margin > left_margin &&		    bottom_margin > right_margin)		{			struts[STRUT_TOP] = wh + wy;			struts[STRUT_TOP_START] = wx;			struts[STRUT_TOP_END] = wx + ww;		} 		else if (top_margin > bottom_margin && 			 top_margin > left_margin &&			 top_margin > right_margin)		{			struts[STRUT_BOTTOM] = height - wy;			struts[STRUT_BOTTOM_START] = wx;			struts[STRUT_BOTTOM_END] = wx + ww;		}		else if (right_margin > left_margin &&			 right_margin > top_margin &&			 right_margin > bottom_margin)		{			struts[STRUT_LEFT] = wx;			struts[STRUT_LEFT_START] = wy;			struts[STRUT_LEFT_END] = wh + wy;		}		else 		{			struts[STRUT_RIGHT] = width - wx;			struts[STRUT_RIGHT_START] = wy;			struts[STRUT_RIGHT_END] = wy + wh;		}				gdk_error_trap_push ();		XChangeProperty (GDK_WINDOW_XDISPLAY (widget->window), 				 GDK_WINDOW_XWINDOW (widget->window), 				 atom_strut,				 XA_CARDINAL, 32, PropModeReplace,				 (guchar *) &struts, 4);		XChangeProperty (GDK_WINDOW_XDISPLAY (widget->window), 				 GDK_WINDOW_XWINDOW (widget->window), 				 atom_strut_partial,				 XA_CARDINAL, 32, PropModeReplace,				 (guchar *) &struts, 12); 		gdk_error_trap_pop ();#ifdef DEBUG_STRUTS		g_message ("struts TOP %d (%d - %d)", struts[STRUT_TOP], struts[STRUT_TOP_START], struts[STRUT_TOP_END]);		g_message ("struts BOTTOM %d (%d - %d)", struts[STRUT_BOTTOM], struts[STRUT_BOTTOM_START], struts[STRUT_BOTTOM_END]);		g_message ("struts LEFT %d (%d - %d)", struts[STRUT_LEFT], struts[STRUT_LEFT_START], struts[STRUT_LEFT_END]);		g_message ("struts RIGHT %d (%d - %d)", struts[STRUT_RIGHT], struts[STRUT_RIGHT_START], struts[STRUT_RIGHT_END]);#endif		return TRUE;	}	return FALSE;}static voidmagnifier_get_property (BonoboPropertyBag *bag,			BonoboArg *arg,			guint arg_id,			CORBA_Environment *ev,			gpointer user_data){	Magnifier *magnifier = user_data;	int csize = 0;	DBG (fprintf (stderr, "Get property: \t%s\n", mag_prop_names[arg_id]));		switch (arg_id) {	case MAGNIFIER_SOURCE_SIZE_PROP:		BONOBO_ARG_SET_GENERAL (arg, magnifier->source_bounds,					TC_GNOME_Magnifier_RectBounds,					GNOME_Magnifier_RectBounds, NULL);		break;	case MAGNIFIER_TARGET_SIZE_PROP:	    	BONOBO_ARG_SET_GENERAL (arg, magnifier->target_bounds,					TC_GNOME_Magnifier_RectBounds,					GNOME_Magnifier_RectBounds, NULL);		break;	case MAGNIFIER_CURSOR_SET_PROP:		BONOBO_ARG_SET_STRING (arg, magnifier->cursor_set);		break;	case MAGNIFIER_CURSOR_SIZE_PROP:		BONOBO_ARG_SET_INT (arg, magnifier->cursor_size_x);		BONOBO_ARG_SET_INT (arg, magnifier->cursor_size_y);		break;	case MAGNIFIER_CURSOR_ZOOM_PROP:		BONOBO_ARG_SET_FLOAT (arg, magnifier->cursor_scale_factor);		break;	case MAGNIFIER_CURSOR_COLOR_PROP:		BONOBO_ARG_SET_GENERAL (arg, magnifier->cursor_color,					TC_CORBA_unsigned_long,					CORBA_unsigned_long, NULL);		break;	case MAGNIFIER_CURSOR_HOTSPOT_PROP:		BONOBO_ARG_SET_GENERAL (arg, magnifier->cursor_hotspot,					TC_GNOME_Magnifier_Point,					GNOME_Magnifier_Point, NULL);		break;	case MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP:		if (magnifier->priv->cursor)			gdk_drawable_get_size (magnifier->priv->cursor,					       &csize, &csize);		BONOBO_ARG_SET_INT (arg, csize);		break;	case MAGNIFIER_CROSSWIRE_SIZE_PROP:		BONOBO_ARG_SET_INT (arg, magnifier->crosswire_size);		break;	case MAGNIFIER_CROSSWIRE_CLIP_PROP:		BONOBO_ARG_SET_BOOLEAN (arg, magnifier->crosswire_clip);		break;	case MAGNIFIER_CROSSWIRE_COLOR_PROP:		BONOBO_ARG_SET_LONG (arg, magnifier->crosswire_color);		break;        case MAGNIFIER_SOURCE_DISPLAY_PROP:		BONOBO_ARG_SET_STRING (arg, magnifier->source_display_name);	        break;	case MAGNIFIER_TARGET_DISPLAY_PROP:		BONOBO_ARG_SET_STRING (arg, magnifier->target_display_name);	        break;	default:		bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);	};}static voidmagnifier_set_property (BonoboPropertyBag *bag,			BonoboArg *arg,			guint arg_id,			CORBA_Environment *ev,			gpointer user_data){	Magnifier *magnifier = user_data;	gchar *full_display_string;	switch (arg_id) {	case MAGNIFIER_SOURCE_DISPLAY_PROP:		full_display_string = BONOBO_ARG_GET_STRING (arg);		if (can_open_display (full_display_string))		{		    GSList *zoom_region_params = NULL;		    magnifier->source_screen_num =			magnifier_parse_display_name (magnifier,						      full_display_string,						      NULL);		    magnifier->source_display =			gdk_display_open (full_display_string);		    magnifier->source_display_name = g_strdup (full_display_string);		    zoom_region_params = magnifier_zoom_regions_save (magnifier);		    magnifier->priv->root =			gdk_screen_get_root_window (			    gdk_display_get_screen (				magnifier->source_display,				magnifier->source_screen_num));	             /* attach listeners for DAMAGE, "dirty region", XFIXES cursor changes */	            magnifier_set_extension_listeners (magnifier, magnifier_get_root (magnifier));		    magnifier_get_display_rect_bounds (magnifier, &magnifier->source_bounds, FALSE);		    magnifier_zoom_regions_restore (magnifier, zoom_region_params);		    magnifier_warp_cursor_to_screen (magnifier);		    magnifier_check_set_struts (magnifier);		}		DBG(fprintf (stderr, "Set source display: \t%s\n", full_display_string));		break;	case MAGNIFIER_TARGET_DISPLAY_PROP:		full_display_string = BONOBO_ARG_GET_STRING (arg);		if (can_open_display (full_display_string))		{		    magnifier->target_screen_num =			magnifier_parse_display_name (magnifier,						      full_display_string,						      NULL);		    magnifier->target_display =			gdk_display_open (full_display_string);		    magnifier->target_display_name = g_strdup (full_display_string);		    if (GTK_IS_WINDOW (magnifier->priv->w)) 		    {#ifdef REPARENT_GTK_WINDOW_WORKS			gtk_window_set_screen (GTK_WINDOW (magnifier->priv->w), 					       gdk_display_get_screen (						   magnifier->target_display,						   magnifier->target_screen_num));#else			GSList *zoom_region_params = NULL;			/* disconnect from the old window's destroy signal */			g_object_disconnect (magnifier->priv->w,				  "any_signal::realize", magnifier_realize, NULL,				  "any_signal::size_allocate", magnifier_size_allocate, NULL,				  "any_signal::destroy", magnifier_exit, NULL,			          NULL);			/* save the old zoom region state */		        zoom_region_params = magnifier_zoom_regions_save (magnifier);			/* destroy the old window */			gtk_widget_destroy (magnifier->priv->w);			/* and re-initialize... */			magnifier_init_window (magnifier, gdk_display_get_screen (						   magnifier->target_display,						   magnifier->target_screen_num));			/* restore the zoom regions in their new host magnifier window */			magnifier_zoom_regions_restore (magnifier, zoom_region_params);#endif		    }		    magnifier_get_display_rect_bounds (magnifier, &magnifier->source_bounds, FALSE);		    magnifier_init_cursor_set (magnifier, magnifier->cursor_set); /* needed to reset pixmaps */		    gtk_window_move (GTK_WINDOW (magnifier->priv->w),				     magnifier->target_bounds.x1,				     magnifier->target_bounds.y1);		    		    if ((magnifier->target_bounds.x2 - magnifier->target_bounds.x1 > 0) &&			(magnifier->target_bounds.y2 - magnifier->target_bounds.y1) > 0)		    {			gtk_window_resize (GTK_WINDOW (magnifier->priv->w),				       magnifier->target_bounds.x2 - magnifier->target_bounds.x1,				       magnifier->target_bounds.y2 - magnifier->target_bounds.y1);		    DBG(fprintf (stderr, "Set target size: \t%d,%d to %d,%d\n", 			     magnifier->target_bounds.x1, magnifier->target_bounds.y1, magnifier->target_bounds.x2, magnifier->target_bounds.y2));		    }		    /* N. B. we don't reset the target bounds to the limits of the new display, because */		    /* doing so would override the client-specified magnifier size */		    /* magnifier_get_display_rect_bounds (magnifier, &magnifier->target_bounds, TRUE); */		    magnifier_check_set_struts (magnifier);		}		DBG(fprintf (stderr, "Set target display: \t%s (screen %d)\n", 			      full_display_string, magnifier->target_screen_num));		break;	case MAGNIFIER_SOURCE_SIZE_PROP:	        magnifier->source_bounds = BONOBO_ARG_GET_GENERAL (arg,								   TC_GNOME_Magnifier_RectBounds,								   GNOME_Magnifier_RectBounds,								   NULL);		DBG (fprintf (stderr, "Set source size: \t%d,%d to %d,%d\n", 			      magnifier->source_bounds.x1, magnifier->source_bounds.y1, magnifier->source_bounds.x2, magnifier->source_bounds.y2));		break;	case MAGNIFIER_TARGET_SIZE_PROP:	        magnifier->target_bounds = BONOBO_ARG_GET_GENERAL (arg,								   TC_GNOME_Magnifier_RectBounds,								   GNOME_Magnifier_RectBounds,								   NULL);		gtk_window_move (GTK_WINDOW (magnifier->priv->w),				 magnifier->target_bounds.x1,				 magnifier->target_bounds.y1);				gtk_window_resize (GTK_WINDOW (magnifier->priv->w),				   magnifier->target_bounds.x2 - magnifier->target_bounds.x1,				   magnifier->target_bounds.y2 - magnifier->target_bounds.y1);		magnifier_check_set_struts (magnifier);		DBG(fprintf (stderr, "Set target size: \t%d,%d to %d,%d\n", 			      magnifier->target_bounds.x1, magnifier->target_bounds.y1, magnifier->target_bounds.x2, magnifier->target_bounds.y2));		if (!strcmp (magnifier->target_display_name, magnifier->source_display_name) && 		    (magnifier->target_screen_num == magnifier->source_screen_num)) 		    magnifier_adjust_source_size (magnifier);		break;	case MAGNIFIER_CURSOR_SET_PROP:		magnifier_init_cursor_set (magnifier, g_strdup (BONOBO_ARG_GET_STRING (arg)));		DBG (fprintf (stderr, "Setting cursor set: \t%s\n", BONOBO_ARG_GET_STRING (arg)));		break;	case MAGNIFIER_CURSOR_SIZE_PROP:		magnifier->cursor_size_x = BONOBO_ARG_GET_INT (arg);		magnifier->cursor_size_y = BONOBO_ARG_GET_INT (arg);		magnifier_transform_cursor (magnifier);		DBG (fprintf (stderr, "Setting cursor size: \t%d\n", magnifier->cursor_size_x));		break;	case MAGNIFIER_CURSOR_ZOOM_PROP:		magnifier->cursor_scale_factor = BONOBO_ARG_GET_FLOAT (arg);		DBG (fprintf (stderr, "Setting cursor scale factor: \t%f\n", (float) magnifier->cursor_scale_factor));		magnifier_transform_cursor (magnifier);		break;	case MAGNIFIER_CURSOR_COLOR_PROP:		magnifier->cursor_color = BONOBO_ARG_GET_GENERAL (arg,								  TC_CORBA_unsigned_long, 								  CORBA_unsigned_long, 								  NULL);		magnifier_transform_cursor (magnifier);		DBG (fprintf (stderr, "Setting cursor color: \t%u\n", (unsigned) magnifier->cursor_color));		break;	case MAGNIFIER_CURSOR_HOTSPOT_PROP:		magnifier->cursor_hotspot = BONOBO_ARG_GET_GENERAL (arg,								    TC_GNOME_Magnifier_Point,								    GNOME_Magnifier_Point,								    NULL);		/* TODO: notify zoomers */                /* FIXME: don't call init_cursor, it overwrites this property! */		magnifier_transform_cursor (magnifier); 		break;	case MAGNIFIER_CURSOR_DEFAULT_SIZE_PROP:		bonobo_exception_set (ev, ex_Bonobo_PropertyBag_ReadOnly);		break;	case MAGNIFIER_CROSSWIRE_SIZE_PROP:		magnifier->crosswire_size = BONOBO_ARG_GET_INT (arg);		DBG (fprintf (stderr, "Setting crosswire size: \t%d\n", magnifier->crosswire_size));		/* TODO: notify zoomers */		break;	case MAGNIFIER_CROSSWIRE_CLIP_PROP:		magnifier->crosswire_clip = BONOBO_ARG_GET_BOOLEAN (arg);		DBG (fprintf (stderr, "Setting crosswire clip: \t%s\n", magnifier->crosswire_clip ? "true" : "false"));		break;	case MAGNIFIER_CROSSWIRE_COLOR_PROP:		magnifier->crosswire_color = BONOBO_ARG_GET_LONG (arg);		DBG (fprintf (stderr, "Setting crosswire size: \t%ld\n", (long) magnifier->crosswire_color));		break;	default:		bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);		break;	};}static voidmagnifier_do_dispose (Magnifier *magnifier){	/* FIXME: this is dead ropey code structuring */	bonobo_activation_active_server_unregister (		MAGNIFIER_OAFIID, BONOBO_OBJREF (magnifier));	if (magnifier->zoom_regions)		g_list_free (magnifier->zoom_regions);	magnifier->zoom_regions = NULL;		bonobo_main_quit ();}static voidmagnifier_gobject_dispose (GObject *object){	magnifier_do_dispose (MAGNIFIER (object));	BONOBO_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));}static voidimpl_magnifier_set_source_display (PortableServer_Servant servant,				   const CORBA_char *display,				   CORBA_Environment *ev){	Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));	BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);	BONOBO_ARG_SET_STRING (arg, display);		DBG (fprintf (stderr, "Set source display: \t%s\n", display));	if (strcmp (display, magnifier->source_display_name)) {	    magnifier_set_property (magnifier->property_bag,				    arg,				    MAGNIFIER_SOURCE_DISPLAY_PROP,				    ev,				    magnifier);	}	else	{	    DBG (fprintf (stderr, "Attempt to set source to same value as previous: %s\n",			  display));	}	bonobo_arg_release (arg);}static voidimpl_magnifier_set_target_display (PortableServer_Servant servant,				   const CORBA_char *display,				   CORBA_Environment *ev){	Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));	BonoboArg *arg = bonobo_arg_new (BONOBO_ARG_STRING);	BONOBO_ARG_SET_STRING (arg, display);		DBG (fprintf (stderr, "Set target display: \t%s\n", display));	if (strcmp (display, magnifier->target_display_name)) 	{	    magnifier_set_property (magnifier->property_bag,				    arg,				    MAGNIFIER_TARGET_DISPLAY_PROP,				    ev,				    magnifier);	}	else	{	    DBG (fprintf (stderr, "Attempt to set target to same value as previous: %s\n",			  display));	}	bonobo_arg_release (arg);}static CORBA_stringimpl_magnifier_get_source_display (PortableServer_Servant servant,				   CORBA_Environment *ev){        Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));	DBG (fprintf (stderr, "Get source display: \t%s\n", magnifier->source_display_name));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -