#include <popt.h>
#include <gdk/gdkwindow.h>
-#include <bonobo/Bonobo.h>
+#include <libbonobo.h>
#include "magnifier.h"
#include "mag_image.h"
struct sockaddr_un mag_server = { AF_UNIX , "/tmp/magnifier_socket" };
typedef struct {
- GdkRectangle extents;
- GdkRectangle roi;
- float zoom_x;
- float zoom_y;
- int contrast;
- gboolean is_managed;
- gboolean is_dirty;
-} ZoomRegionData;
-
-typedef struct {
gchar *target_display;
gchar *source_display;
int vertical_split;
int min_refresh_time;
int no_bonobo;
int fast_cmap_convert;
- GList *zoom_regions;
+ int no_initial_region;
} MagnifierOptions;
static MagnifierOptions global_options = { ":0.0",
2.0,
200,
0,
+ 0,
0
};
/* {"invert image", 'i', POPT_ARG_NONE, &global_options.invert_image, 'i', "invert the image colormap", NULL}, */
{"fast-colormap-conversion", 'c', POPT_ARG_NONE, &global_options.fast_cmap_convert, 'c', "use faster colormap conversion algorithm (fails for 6 bit color)", NULL},
{"no-bonobo", '\0', POPT_ARG_NONE, &global_options.no_bonobo, '\0', "don't use bonobo for controls, use sockets", NULL},
+ {"no-initial-region", '\0', POPT_ARG_NONE, &global_options.no_initial_region, '\0', "don't create an initial zoom region", NULL},
{NULL, 0, 0, NULL, 0, 0}
};
}
+static void
+magnifier_pack_regions (Magnifier *magnifier)
+{
+ /*
+ * this call prevents resizing, which is a bother, but required to
+ * work around dtwm incompatibilities. Perhaps a better workaround will
+ * be found, or we can make this a runtime option.
+ */
+ gtk_widget_set_size_request (magnifier->mag_data->output_window,
+ magnifier->mag_data->mag_width,
+ magnifier->mag_data->mag_height);
+
+ gdk_window_move(magnifier->mag_data->output_window->window,
+ magnifier->mag_data->mag_x,
+ magnifier->mag_data->mag_y);
+
+}
+
int main (int argc, char** argv){
GIOChannel *mag_channel;
char *dpyname;
/* TODO: finish replacing socket connection IPC with bonobo service. */
Magnifier *magnifier;
char * obj_id;
+ GdkGeometry geometry;
x_cmap = NULL;
global_options.mouse_follow;
magnifier->mag_data->color_inverted =
global_options.invert_image;
- magnifier->mag_data->factor_x =
- (int) global_options.zoom_factor;
- magnifier->mag_data->factor_y =
- (int) global_options.zoom_factor;
-
- /* TODO: enable fractional magnifications ? */
+ if (!global_options.no_initial_region)
+ {
+ magnifier->mag_data->zoom_regions =
+ g_list_prepend (magnifier->mag_data->zoom_regions,
+ g_new0 (ZoomRegionData, 1));
+ magnifier->mag_data->factor_x = (int) global_options.zoom_factor;
+ magnifier->mag_data->factor_y = (int) global_options.zoom_factor;
+ }
+ else {
+ g_print ("starting magnifier with no initial zoom region\n");
+ magnifier->mag_data->mag_width = 0;
+ magnifier->mag_data->mag_height = 0;
+ }
+ /* TODO: enable fractional magnifications option? */
if (global_options.target_display) {
- snprintf (env_string, (size_t) (ENV_STRING_MAX_SIZE-1), "DISPLAY=%s", global_options.target_display);
+ g_snprintf (env_string, (size_t) (ENV_STRING_MAX_SIZE-1), "DISPLAY=%s", global_options.target_display);
putenv (env_string);
}
gtk_init (&argc, &argv);
DisplayWidth (magnifier->mag_data->target_display,screen_num),
DisplayHeight(magnifier->mag_data->target_display,screen_num));
if (global_options.vertical_split)
- magnifier->mag_data->mag_width = DisplayWidth (magnifier->mag_data->target_display,screen_num)/2;
- else
- magnifier->mag_data->mag_width = DisplayWidth (magnifier->mag_data->target_display, screen_num);
- if (global_options.horizontal_split)
- magnifier->mag_data->mag_height = DisplayHeight (magnifier->mag_data->target_display,screen_num)/2;
- else magnifier->mag_data->mag_height = DisplayHeight (magnifier->mag_data->target_display, screen_num);
- gtk_window_set_decorated(GTK_WINDOW (window), FALSE);
- gtk_widget_show_all (window);
+ {
+ magnifier->mag_data->mag_width =
+ DisplayWidth (magnifier->mag_data->target_display,screen_num)/2;
+ magnifier->mag_data->mag_height =
+ DisplayHeight (magnifier->mag_data->target_display, screen_num);
+ }
+ else if (global_options.horizontal_split)
+ {
+ magnifier->mag_data->mag_width =
+ DisplayWidth (magnifier->mag_data->target_display, screen_num);
+ magnifier->mag_data->mag_height =
+ DisplayHeight (magnifier->mag_data->target_display,screen_num)/2;
+ }
+ else if (global_options.fullscreen)
+ {
+ magnifier->mag_data->mag_width =
+ DisplayWidth (magnifier->mag_data->target_display, screen_num);
+ magnifier->mag_data->mag_height =
+ DisplayHeight (magnifier->mag_data->target_display,screen_num);
+ }
+ magnifier->mag_data->mag_x =
+ DisplayWidth (magnifier->mag_data->target_display, screen_num)
+ - magnifier->mag_data->mag_width;
+ magnifier->mag_data->mag_y =
+ DisplayHeight (magnifier->mag_data->target_display, screen_num)
+ - magnifier->mag_data->mag_height;
- gdk_window_move(window->window,
- gdk_screen_width() - magnifier->mag_data->mag_width,
- gdk_screen_height() - magnifier->mag_data->mag_height);
- gdk_window_resize (window->window, magnifier->mag_data->mag_width, magnifier->mag_data->mag_height);
magnifier->mag_data->output_window = window;
- if (global_options.fullscreen) gdk_window_stick (window->window);
+ gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
+ gtk_widget_show_all (window);
+
+ magnifier_pack_regions (magnifier);
+
+ /* if (global_options.fullscreen) */
+ gdk_window_stick (window->window);
gdk_window_set_functions(window->window, 0);
gdk_window_raise(window->window);
if (! global_options.no_bonobo)
{
- bonobo_activation_active_server_register (
- obj_id,
- bonobo_object_corba_objref (bonobo_object (magnifier)));
+ int ret = bonobo_activation_active_server_register (
+ obj_id, BONOBO_OBJREF (magnifier));
- bonobo_main ();
+ if (ret == Bonobo_ACTIVATION_REG_SUCCESS)
+ {
+ bonobo_main ();
+ }
}
else
{
static void
impl_magnifier_mark_dirty (PortableServer_Servant servant,
const CORBA_short zoom_region,
+ const CORBA_long x1,
+ const CORBA_long y1,
+ const CORBA_long x2,
+ const CORBA_long y2,
CORBA_Environment *ev)
{
Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));
CORBA_Environment *ev)
{
Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));
- return -1;
+ if (magnifier->mag_data->zoom_regions == NULL)
+ {
+ magnifier->mag_data->zoom_regions =
+ g_list_prepend (magnifier->mag_data->zoom_regions,
+ g_new0 (ZoomRegionData, 1));
+ magnifier->mag_data->factor_x = (int) zx;
+ magnifier->mag_data->factor_y = (int) zy;
+ magnifier->mag_data->mag_x = x1;
+ magnifier->mag_data->mag_y = y1;
+ magnifier->mag_data->mag_width = (x2 - x1);
+ magnifier->mag_data->mag_height = (y2 - y1);
+ magnifier_pack_regions (magnifier);
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
}
static CORBA_boolean
}
static void
-impl_magnifier_resize_zoom_region (PortableServer_Servant _servant,
+impl_magnifier_resize_zoom_region (PortableServer_Servant servant,
const CORBA_short zoom_region,
const CORBA_long x1, const CORBA_long y1,
const CORBA_long x2, const CORBA_long y2,
CORBA_Environment * ev)
{
+ Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));
+ if (zoom_region == 0)
+ {
+ magnifier->mag_data->mag_x = x1;
+ magnifier->mag_data->mag_y = y1;
+ magnifier->mag_data->mag_width = (x2 - x1);
+ magnifier->mag_data->mag_height = (y2 - y1);
+ magnifier_pack_regions (magnifier);
+ }
}
static void
-impl_magnifier_destroy_zoom_region (PortableServer_Servant _servant,
+impl_magnifier_destroy_zoom_region (PortableServer_Servant servant,
const CORBA_short zoom_region,
CORBA_Environment * ev)
{
+ Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));
+ if (zoom_region == 0)
+ {
+ g_list_free (magnifier->mag_data->zoom_regions);
+ }
}
static void
-impl_magnifier_clear_all_zoom_regions (PortableServer_Servant _servant,
+impl_magnifier_clear_all_zoom_regions (PortableServer_Servant servant,
CORBA_Environment * ev)
{
+ Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));
+ g_list_free (magnifier->mag_data->zoom_regions);
+ magnifier->mag_data->zoom_regions = NULL;
}
static void
impl_magnifier_exit (PortableServer_Servant servant, CORBA_Environment *ev)
{
- ;
+ Magnifier *magnifier = MAGNIFIER (bonobo_object_from_servant (servant));
+ if (magnifier->mag_data->zoom_regions)
+ g_list_free (magnifier->mag_data->zoom_regions);
+ g_free (magnifier->mag_data);
+ magnifier_exit();
}
static void
magnifier->mag_data->fast_rgb_convert = FALSE;
magnifier->mag_data->center.x = 0;
magnifier->mag_data->center.y = 0;
+ magnifier->mag_data->zoom_regions = NULL;
}
GType
}
Magnifier *
-magnifier_new(int argc, char **argv)
+magnifier_new (int argc, char **argv)
{
poptContext ctx;
Magnifier *magnifier =
return magnifier;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-